@iqual/nuxt-icms 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +78 -20
  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 +24 -0
  101. package/components/Section/Header/MainButtons.vue +31 -0
  102. package/components/Section/Header/MenuIcon.vue +61 -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 +183 -185
  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 +75 -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
@@ -0,0 +1,170 @@
1
+ <template>
2
+ <li
3
+ v-for="child in item.children"
4
+ :key="child.id"
5
+ @mouseenter="setOpen(child, true)"
6
+ @mouseleave="setOpen(child, false)"
7
+ @focusin="setOpen(child, true)"
8
+ @focusout="setOpen(child, false)"
9
+ :class="
10
+ themedClass(
11
+ 'listItemClass',
12
+ 'relative first-of-type:pt-1 last-of-type:pb-1',
13
+ )
14
+ "
15
+ >
16
+ <component :is="elementType(child)" v-bind="componentAttrs(child)">
17
+ {{ child.label }}
18
+
19
+ <SpriteSymbol
20
+ v-if="hasSubmenu(child)"
21
+ name="chevron-down"
22
+ aria-hidden="true"
23
+ focusable="false"
24
+ :class="[
25
+ themedClass(
26
+ 'dropdownToggleClass',
27
+ 'size-5 shrink-0 -rotate-90 cursor-pointer text-black motion-safe:transition-transform motion-safe:duration-200',
28
+ ),
29
+ ]"
30
+ />
31
+ </component>
32
+
33
+ <Transition
34
+ :enter-active-class="
35
+ themedClass(
36
+ 'transitionEnterActiveClass',
37
+ 'transition-opacity duration-200 ease-in-out',
38
+ )
39
+ "
40
+ :enter-from-class="themedClass('transitionEnterFromClass', 'opacity-0')"
41
+ :enter-to-class="themedClass('transitionEnterToClass', 'opacity-100')"
42
+ :leave-active-class="
43
+ themedClass(
44
+ 'transitionLeaveActiveClass',
45
+ 'transition-opacity duration-200 ease-in-out',
46
+ )
47
+ "
48
+ :leave-from-class="themedClass('transitionLeaveFromClass', 'opacity-100')"
49
+ :leave-to-class="themedClass('transitionLeaveToClass', 'opacity-0')"
50
+ >
51
+ <ul
52
+ v-if="hasSubmenu(child) && isOpen(child)"
53
+ :id="submenuId(child)"
54
+ :class="
55
+ themedClass(
56
+ 'listClass',
57
+ 'absolute left-full top-0 -mt-px w-fit min-w-48 border border-gray-100 bg-white',
58
+ )
59
+ "
60
+ >
61
+ <DesktopMainMenuDropdown
62
+ :item="child"
63
+ :menuItemActive="menuItemActive"
64
+ />
65
+ </ul>
66
+ </Transition>
67
+ </li>
68
+ </template>
69
+
70
+ <script lang="ts" setup>
71
+ import type { MappedMenuLink } from '@iqual/nuxt-icms/plugins/initData'
72
+ import { NuxtLink } from '#components'
73
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
74
+ import cn from '@iqual/nuxt-icms/composables/useCn'
75
+
76
+ const themedClass = useTheme('SectionHeaderDesktopMainMenuDropdown')
77
+
78
+ const props = defineProps<{
79
+ item: MappedMenuLink
80
+ menuItemActive?: MappedMenuLink | undefined
81
+ }>()
82
+
83
+ const { item, menuItemActive } = props
84
+
85
+ const hasSubmenu = (child: MappedMenuLink) => (child.children?.length ?? 0) > 0
86
+
87
+ const submenuId = (child: MappedMenuLink) => `${child.id}-submenu`
88
+
89
+ const isActive = (child: MappedMenuLink) => menuItemActive?.id === child.id
90
+
91
+ const openMap = ref<Record<string, boolean>>({})
92
+ const isOpen = (child: MappedMenuLink) => !!openMap.value[child.id]
93
+ const setOpen = (child: MappedMenuLink, val: boolean) =>
94
+ (openMap.value[child.id] = val)
95
+
96
+ /**
97
+ * Determines which element type to render for a menu item.
98
+ *
99
+ * @remarks
100
+ * - Returns `NuxtLink` if the item has a navigation link.
101
+ * - Returns `'button'` if the item opens a submenu but has no link.
102
+ * - Returns `'span'` if the item is non-interactive.
103
+ *
104
+ * @returns A computed reference containing either `NuxtLink`, `'button'`, or `'span'`.
105
+ */
106
+ function elementType(child: MappedMenuLink) {
107
+ if (child.href) return NuxtLink
108
+ if (hasSubmenu(child)) return 'button'
109
+ return 'span'
110
+ }
111
+
112
+ /**
113
+ * Computes the appropriate HTML or component attributes for a menu item
114
+ * based on its computed element type.
115
+ *
116
+ * @returns A computed object containing attributes specific to the element type,
117
+ * including accessibility props and themed CSS classes.
118
+ */
119
+ function componentAttrs(child: MappedMenuLink) {
120
+ const submenu = hasSubmenu(child)
121
+ const active = isActive(child)
122
+
123
+ switch (elementType(child)) {
124
+ case NuxtLink:
125
+ return {
126
+ id: child.id,
127
+ to: child.href,
128
+ rel: child.rel,
129
+ target: child.target,
130
+ 'aria-haspopup': submenu ? 'menu' : undefined,
131
+ 'aria-expanded': submenu ? isOpen(child) : undefined,
132
+ 'aria-controls': submenu ? submenuId(child) : undefined,
133
+ 'aria-current': active ? 'page' : undefined,
134
+ tabindex: 0,
135
+ 'exact-active-class': 'text-primary',
136
+ class: cn(
137
+ themedClass(
138
+ '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',
140
+ ),
141
+ child.additionalClass,
142
+ ),
143
+ }
144
+
145
+ case 'button':
146
+ return {
147
+ id: child.id,
148
+ type: 'button',
149
+ 'aria-haspopup': 'menu',
150
+ 'aria-expanded': isOpen(child),
151
+ 'aria-controls': submenuId(child),
152
+ tabindex: 0,
153
+ class: themedClass(
154
+ 'buttonClass',
155
+ 'w-full flex items-center justify-between text-left gap-4 px-6 py-3 cursor-default whitespace-normal break-keep hyphens-none',
156
+ ),
157
+ }
158
+
159
+ default:
160
+ return {
161
+ id: child.id,
162
+ 'aria-disabled': true,
163
+ class: themedClass(
164
+ 'nolinkClass',
165
+ 'text-gray-400 px-6 py-3 flex items-center whitespace-normal break-keep hyphens-none',
166
+ ),
167
+ }
168
+ }
169
+ }
170
+ </script>
@@ -1,90 +1,121 @@
1
1
  <template>
2
2
  <ClientOnly>
3
3
  <div
4
- class="group relative z-40 mb-6 flex h-full items-center 2xl:mb-0 2xl:p-0 2xl:pl-8"
5
- @mouseenter="!isMobile && (langSwitchDropdownOpen = true)"
6
- @mouseleave="!isMobile && (langSwitchDropdownOpen = false)"
7
- @click="isMobile && (langSwitchDropdownOpen = !langSwitchDropdownOpen)"
4
+ v-click-away="closeDropdown"
5
+ @keydown.esc="closeDropdown"
6
+ :class="themedClass('containerClass', 'relative py-2')"
8
7
  >
9
8
  <button
10
- class="flex items-center gap-1"
11
- aria-haspopup="true"
12
- :aria-expanded="langSwitchDropdownOpen"
9
+ type="button"
10
+ aria-haspopup="menu"
11
+ :aria-expanded="isLangDropdownOpen"
13
12
  aria-controls="language-dropdown"
13
+ @click="toggleDropdown"
14
+ :class="
15
+ themedClass(
16
+ 'currentLanguageLinkClass',
17
+ 'flex cursor-pointer flex-nowrap items-center gap-1',
18
+ )
19
+ "
14
20
  >
15
- <span
16
- class="group-hover:text-primary-500 motion-safe:duration-250 font-medium motion-safe:transition-colors motion-safe:ease-in-out"
17
- :class="{
18
- 'text-primary-500': langSwitchDropdownOpen,
19
- }"
20
- >
21
- {{ currentLanguage.toUpperCase() }}
22
- </span>
21
+ {{ currentLanguage.toUpperCase() }}
23
22
  <SpriteSymbol
24
23
  name="chevron-down"
25
- class="motion-safe:duration-250 size-4 motion-safe:transition-all motion-safe:ease-in-out"
26
- :class="{
27
- 'rotate-180': langSwitchDropdownOpen,
28
- }"
24
+ :class="[
25
+ themedClass(
26
+ 'currentLanguageLinkIconClass',
27
+ 'motion-safe:duration-250 size-4 shrink-0 motion-safe:transition-all motion-safe:ease-in-out',
28
+ ),
29
+ { 'rotate-180': isLangDropdownOpen },
30
+ ]"
29
31
  />
30
32
  </button>
31
- <div
32
- v-show="langSwitchDropdownOpen"
33
- class="motion-safe:duration-250 absolute left-0 top-full pt-2 motion-safe:transition-all motion-safe:ease-in-out 2xl:left-auto 2xl:right-0 2xl:pt-4"
33
+ <Transition
34
+ :enter-active-class="
35
+ themedClass(
36
+ 'transitionEnterActiveClass',
37
+ 'motion-safe:transition-opacity motion-safe:duration-300',
38
+ )
39
+ "
40
+ :enter-from-class="themedClass('transitionEnterFromClass', 'opacity-0')"
41
+ :enter-to-class="themedClass('transitionEnterToClass', 'opacity-100')"
42
+ :leave-active-class="
43
+ themedClass(
44
+ 'transitionLeaveActiveClass',
45
+ 'motion-safe:transition-opacity motion-safe:duration-300',
46
+ )
47
+ "
48
+ :leave-from-class="
49
+ themedClass('transitionLeaveFromClass', 'opacity-100')
50
+ "
51
+ :leave-to-class="themedClass('transitionLeaveToClass', 'opacity-0')"
34
52
  >
35
- <ul
36
- role="menu"
37
- id="language-dropdown"
38
- class="border border-gray-100 bg-white"
53
+ <div
54
+ v-show="isLangDropdownOpen"
55
+ :class="
56
+ themedClass(
57
+ 'langDropdownContainerClass',
58
+ 'absolute left-0 top-full -mt-[1px]',
59
+ )
60
+ "
39
61
  >
40
- <li v-for="(lang, i) in links" :key="`lang_${i}`">
41
- <NuxtLink
42
- v-if="lang.enabled"
43
- role="menuitem"
44
- :to="lang.to"
45
- :title="lang.label"
46
- class="hover:text-primary-500 motion-safe:duration-250 flex items-center whitespace-nowrap px-4 py-3 text-sm font-medium motion-safe:transition-all motion-safe:ease-in-out"
47
- @click="onLangDropdownLinkClick"
48
- >
49
- {{ lang.label }}
50
- </NuxtLink>
51
- <span
52
- v-else
53
- class="flex items-center whitespace-nowrap px-4 py-3 text-sm font-medium text-gray-100"
62
+ <ul
63
+ id="language-dropdown"
64
+ :class="themedClass('listClass', 'border border-gray-100 bg-white')"
65
+ >
66
+ <li
67
+ v-for="(lang, i) in links"
68
+ :key="`lang_${i}`"
69
+ :class="themedClass('listItemClass')"
54
70
  >
55
- {{ lang.label }}
56
- </span>
57
- </li>
58
- </ul>
59
- </div>
60
- <transition name="fade"> </transition>
71
+ <NuxtLink
72
+ v-if="lang.enabled"
73
+ :to="lang.to"
74
+ :title="lang.label"
75
+ :class="
76
+ themedClass(
77
+ 'linkClass',
78
+ 'hover:text-primary motion-safe:duration-250 flex items-center whitespace-nowrap px-4 py-3 text-sm font-medium motion-safe:transition-all motion-safe:ease-in-out',
79
+ )
80
+ "
81
+ @click="closeDropdown"
82
+ >
83
+ {{ lang.label }}
84
+ </NuxtLink>
85
+ <span
86
+ v-else
87
+ aria-disabled="true"
88
+ :class="
89
+ themedClass(
90
+ 'noLinkClass',
91
+ 'flex cursor-default items-center whitespace-nowrap px-4 py-3 text-sm font-medium text-gray-300',
92
+ )
93
+ "
94
+ >
95
+ {{ lang.label }}
96
+ </span>
97
+ </li>
98
+ </ul>
99
+ </div>
100
+ </Transition>
61
101
  </div>
62
102
  </ClientOnly>
63
103
  </template>
64
104
 
65
105
  <script lang="ts" setup>
66
- const links = useLanguageLinks()
67
-
68
- const emit = defineEmits(['lang-dropdown:change'])
106
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
69
107
 
108
+ const links = useLanguageLinks()
70
109
  const currentLanguage = useCurrentLanguage()
71
- const { isMobile } = useIsMobile()
110
+ const themedClass = useTheme('SectionHeaderLanguageDropdown')
72
111
 
73
- const langSwitchDropdownOpen = ref(false)
112
+ const isLangDropdownOpen = ref(false)
74
113
 
75
- const onLangDropdownLinkClick = () => {
76
- emit('lang-dropdown:change')
77
- langSwitchDropdownOpen.value = false
114
+ const toggleDropdown = () => {
115
+ isLangDropdownOpen.value = !isLangDropdownOpen.value
78
116
  }
79
- </script>
80
117
 
81
- <style lang="postcss" scoped>
82
- .fade-enter-active,
83
- .fade-leave-active {
84
- @apply transition-opacity duration-200 ease-out;
118
+ const closeDropdown = () => {
119
+ isLangDropdownOpen.value = false
85
120
  }
86
- .fade-enter,
87
- .fade-leave-active {
88
- @apply opacity-0;
89
- }
90
- </style>
121
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <ClientOnly>
3
+ <div :class="themedClass('containerClass', 'flex items-center')">
4
+ <ul :class="themedClass('listClass', 'flex gap-4 uppercase')">
5
+ <li
6
+ v-for="(lang, i) in links"
7
+ :key="i"
8
+ :class="themedClass('listClass')"
9
+ >
10
+ <NuxtLink
11
+ v-if="lang.enabled"
12
+ :to="lang.to"
13
+ :class="[
14
+ themedClass('linkClass', 'block'),
15
+ { 'text-primary': lang.active },
16
+ ]"
17
+ @click="close()"
18
+ >
19
+ {{ lang.code }}
20
+ </NuxtLink>
21
+ <div
22
+ v-else
23
+ :class="themedClass('noLinkClass', 'cursor-default text-gray-400')"
24
+ >
25
+ {{ lang.code }}
26
+ </div>
27
+ </li>
28
+ </ul>
29
+ </div>
30
+ </ClientOnly>
31
+ </template>
32
+
33
+ <script lang="ts" setup>
34
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
35
+ const { close } = useMobileMenuOverlayBus()
36
+
37
+ const links = useLanguageLinks()
38
+ const themedClass = useTheme('SectionHeaderLanguageLinks')
39
+ </script>
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <NuxtLink
3
+ :to="`/${currentLanguage}`"
4
+ :title="companyName"
5
+ :class="themedClass('linkClass')"
6
+ @click="close()"
7
+ prefetch
8
+ >
9
+ <Media
10
+ v-if="companyLogo"
11
+ :media="companyLogo"
12
+ :mediaClass="themedClass('mediaClass', 'h-10 2xl:h-16')"
13
+ />
14
+ </NuxtLink>
15
+ </template>
16
+
17
+ <script lang="ts" setup>
18
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
19
+ const { companyLogo, companyName } = await useGlobalConfig()
20
+
21
+ const themedClass = useTheme('SectionHeaderLogo')
22
+ const currentLanguage = useCurrentLanguage()
23
+ const { close } = useMobileMenuOverlayBus()
24
+ </script>
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div
3
+ v-if="contactButtons?.length !== 0"
4
+ :class="themedClass('containerClass', 'flex flex-col gap-2')"
5
+ >
6
+ <DesignSystemAtomsButton
7
+ v-for="(link, key) in contactButtons"
8
+ :key="key"
9
+ :label="link?.label"
10
+ :subline="link?.subline"
11
+ :title="link?.title"
12
+ :link="link?.link?.uri?.path"
13
+ :params="link?.params"
14
+ :target-blank="link?.targetBlank"
15
+ :style="link?.buttonStyle"
16
+ :textAlignment="link?.textAlignment"
17
+ :buttonClass="themedClass('buttonClass', 'xs:w-fit')"
18
+ :labelClass="themedClass('labelClass')"
19
+ :sublineClass="themedClass('sublineClass')"
20
+ @click="close()"
21
+ />
22
+ </div>
23
+ </template>
24
+
25
+ <script lang="ts" setup>
26
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
27
+
28
+ const { contactButtons } = await useGlobalConfig()
29
+ const themedClass = useTheme('SectionHeaderMainButtons')
30
+ const { close } = useMobileMenuOverlayBus()
31
+ </script>
@@ -1,60 +1,72 @@
1
1
  <template>
2
- <svg
3
- viewBox="0 0 24 24"
4
- fill="none"
5
- xmlns="http://www.w3.org/2000/svg"
6
- class="size-6 overflow-visible text-black"
7
- aria-hidden
2
+ <button
3
+ :class="themedClass('hamburgerMenu', 'hamburger-menu ml-auto block')"
4
+ :aria-label="
5
+ $texts('mobile_main_menu.hamburger_menu_aria_label', 'Hamburger Menu')
6
+ "
7
+ @click="isInClosableState ? close() : open()"
8
8
  >
9
- <rect
10
- width="22"
11
- height="2"
12
- rx="2"
13
- x="2"
14
- y="4"
15
- fill="currentColor"
16
- stroke-width="0"
17
- transform-origin="12.5 5"
18
- :class="{
19
- 'close-icon-top-forwards': isInClosableState,
20
- 'close-icon-top-backwards': !isInClosableState,
21
- }"
22
- />
23
- <rect
24
- width="22"
25
- height="2"
26
- rx="2"
27
- x="2"
28
- y="11"
29
- fill="currentColor"
30
- stroke-width="0"
31
- transform-origin="12.5 12"
32
- :class="{
33
- 'close-icon-center-forwards': isInClosableState,
34
- 'close-icon-center-backwards': !isInClosableState,
35
- }"
36
- />
37
- <rect
38
- width="22"
39
- height="2"
40
- rx="2"
41
- x="2"
42
- y="18"
43
- fill="currentColor"
44
- stroke-width="0"
45
- transform-origin="12.5 19"
46
- :class="{
47
- 'close-icon-bottom-forwards': isInClosableState,
48
- 'close-icon-bottom-backwards': !isInClosableState,
49
- }"
50
- />
51
- </svg>
9
+ <svg
10
+ viewBox="0 0 24 24"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ class="size-6 overflow-visible text-black"
14
+ aria-hidden
15
+ >
16
+ <rect
17
+ width="22"
18
+ height="2"
19
+ rx="2"
20
+ x="2"
21
+ y="4"
22
+ fill="currentColor"
23
+ stroke-width="0"
24
+ transform-origin="12.5 5"
25
+ :class="{
26
+ 'close-icon-top-forwards': isInClosableState,
27
+ 'close-icon-top-backwards': !isInClosableState,
28
+ }"
29
+ />
30
+ <rect
31
+ width="22"
32
+ height="2"
33
+ rx="2"
34
+ x="2"
35
+ y="11"
36
+ fill="currentColor"
37
+ stroke-width="0"
38
+ transform-origin="12.5 12"
39
+ :class="{
40
+ 'close-icon-center-forwards': isInClosableState,
41
+ 'close-icon-center-backwards': !isInClosableState,
42
+ }"
43
+ />
44
+ <rect
45
+ width="22"
46
+ height="2"
47
+ rx="2"
48
+ x="2"
49
+ y="18"
50
+ fill="currentColor"
51
+ stroke-width="0"
52
+ transform-origin="12.5 19"
53
+ :class="{
54
+ 'close-icon-bottom-forwards': isInClosableState,
55
+ 'close-icon-bottom-backwards': !isInClosableState,
56
+ }"
57
+ />
58
+ </svg>
59
+ </button>
52
60
  </template>
53
61
 
54
62
  <script lang="ts" setup>
63
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
55
64
  defineProps<{
56
65
  isInClosableState: boolean
57
66
  }>()
67
+
68
+ const themedClass = useTheme('SectionHeaderMenuIcon')
69
+ const { close, open } = useMobileMenuOverlayBus()
58
70
  </script>
59
71
 
60
72
  <style lang="postcss">
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div
3
+ v-if="metaLinks?.length !== 0"
4
+ :class="themedClass('containerClass', 'flex flex-col gap-2')"
5
+ >
6
+ <DesignSystemAtomsButton
7
+ v-for="(link, key) in metaLinks"
8
+ :key="key"
9
+ :label="link?.label"
10
+ :subline="link?.subline"
11
+ :title="link?.title"
12
+ :link="link?.link?.uri?.path"
13
+ :params="link?.params"
14
+ :target-blank="link?.targetBlank"
15
+ :style="link?.buttonStyle"
16
+ :textAlignment="link?.textAlignment"
17
+ :buttonClass="themedClass('buttonClass', 'xs:w-fit')"
18
+ :labelClass="themedClass('labelClass')"
19
+ :sublineClass="themedClass('sublineClass')"
20
+ @click="close()"
21
+ />
22
+ </div>
23
+ </template>
24
+
25
+ <script lang="ts" setup>
26
+ import { useTheme } from '@iqual/nuxt-icms/composables/useTheme'
27
+
28
+ const { metaLinks } = await useGlobalConfig()
29
+ const themedClass = useTheme('SectionHeaderMetaButtons')
30
+ const { close } = useMobileMenuOverlayBus()
31
+ </script>