@iqual/nuxt-icms 1.2.3 → 1.3.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.
- package/app.vue +3 -3
- package/components/DesignSystem/Atoms/LinkListItem.vue +1 -1
- package/components/Form/CheckboxInput.vue +3 -3
- package/components/Form/CheckboxInputs.vue +3 -3
- package/components/Form/FileUploadInput.vue +3 -3
- package/components/Form/RadioButtonsInput.vue +3 -3
- package/components/Form/SelectInput.vue +4 -4
- package/components/Form/SubmitButton.vue +1 -1
- package/components/Form/TextAreaInput.vue +2 -2
- package/components/Form/TextEmailInput.vue +2 -2
- package/components/Form/TextInput.vue +2 -2
- package/components/Form/TextPhoneInput.vue +2 -2
- package/components/Form/WebformMarkup.vue +1 -1
- package/components/Form/composables/useFormElement.ts +1 -1
- package/components/Media/Image/fragment.graphql +6 -0
- package/components/Node/Icms/Page/SearchResult/fragment.graphql +4 -2
- package/components/Node/Icms/Page/SearchResult/index.vue +2 -2
- package/components/Node/Icms/Page/fragment.graphql +0 -18
- package/components/Paragraph/Downloads/fragment.graphql +3 -2
- package/components/Paragraph/Downloads/index.vue +2 -4
- package/components/Paragraph/Tabs/Element/index.vue +1 -17
- package/components/Paragraph/Tabs/Layout/index.vue +4 -13
- package/components/Search/Facets/FacetDropdownUI.vue +235 -92
- package/components/Search/Facets/FacetedSearchUI.vue +385 -69
- package/components/Search/Facets/fragment.graphql +22 -3
- package/components/Search/Input/index.vue +67 -0
- package/components/Section/Footer/index.vue +2 -2
- package/components/Section/Header/GlobalMenu.vue +22 -24
- package/components/Section/Header/LanguageDropdown.vue +6 -8
- package/components/Section/Header/MetaMenu.vue +11 -6
- package/components/Section/Header/index.vue +20 -21
- package/composables/useImageSources.ts +2 -1
- package/composables/useIsMobile.ts +2 -6
- package/error.vue +3 -4
- package/layouts/default.vue +2 -2
- package/layouts/error.vue +2 -2
- package/package.json +1 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
query layoutOverviewFacetsSearch(
|
|
2
2
|
$facets: [String!],
|
|
3
3
|
$filter: SearchApiQueryFilterInput,
|
|
4
|
+
$keys: String
|
|
4
5
|
) {
|
|
5
6
|
searchApiQuery(
|
|
6
7
|
indexId: "content_search",
|
|
7
|
-
facets: $facets
|
|
8
|
-
filter: $filter
|
|
8
|
+
facets: $facets,
|
|
9
|
+
filter: $filter,
|
|
10
|
+
keys: $keys
|
|
9
11
|
) {
|
|
10
12
|
count
|
|
11
13
|
facets {
|
|
@@ -23,18 +25,35 @@ query layoutOverviewFacetsSearch(
|
|
|
23
25
|
query layoutOverviewResultsSearch(
|
|
24
26
|
$filter: SearchApiQueryFilterInput,
|
|
25
27
|
$limit: Int,
|
|
26
|
-
$offset: Int
|
|
28
|
+
$offset: Int,
|
|
29
|
+
$keys: String
|
|
30
|
+
$facets: [String!],
|
|
27
31
|
) {
|
|
28
32
|
searchApiQuery(
|
|
29
33
|
indexId: "content_search",
|
|
30
34
|
filter: $filter
|
|
35
|
+
facets: $facets,
|
|
31
36
|
limit: $limit
|
|
32
37
|
offset: $offset
|
|
38
|
+
keys: $keys
|
|
33
39
|
) {
|
|
34
40
|
count
|
|
35
41
|
results {
|
|
36
42
|
bundle: __typename
|
|
37
43
|
...entityTeaser
|
|
38
44
|
}
|
|
45
|
+
facets {
|
|
46
|
+
field
|
|
47
|
+
label
|
|
48
|
+
filter {
|
|
49
|
+
id
|
|
50
|
+
label
|
|
51
|
+
}
|
|
52
|
+
count
|
|
53
|
+
results {
|
|
54
|
+
bundle: __typename
|
|
55
|
+
...entityTeaser
|
|
56
|
+
}
|
|
57
|
+
}
|
|
39
58
|
}
|
|
40
59
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<label for="searchterm" class="sr-only">
|
|
3
|
+
{{ $texts('search.search_field_label', 'Suchbegriff') }}
|
|
4
|
+
</label>
|
|
5
|
+
<div v-click-away="clickAway" class="relative flex" role="search">
|
|
6
|
+
<SpriteSymbol
|
|
7
|
+
name="magnifyingglass"
|
|
8
|
+
class="absolute left-4 top-1/2 size-5 -translate-y-1/2 text-primary"
|
|
9
|
+
/>
|
|
10
|
+
<input
|
|
11
|
+
id="searchInput"
|
|
12
|
+
ref="input"
|
|
13
|
+
v-model="searchTermInternal"
|
|
14
|
+
type="search"
|
|
15
|
+
autocomplete="off"
|
|
16
|
+
name="searchterm"
|
|
17
|
+
:class="inputClass"
|
|
18
|
+
spellcheck="false"
|
|
19
|
+
role="searchbox"
|
|
20
|
+
aria-owns="searchterm-suggestions"
|
|
21
|
+
aria-label="Search input"
|
|
22
|
+
:placeholder="
|
|
23
|
+
$texts('search.search_field_placeholder', 'Suchbegriff eingeben')
|
|
24
|
+
"
|
|
25
|
+
@focus="isFocused = true"
|
|
26
|
+
@search="updateSearchTerm"
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
|
|
31
|
+
<script lang="ts" setup>
|
|
32
|
+
const props = withDefaults(
|
|
33
|
+
defineProps<{
|
|
34
|
+
modelValue?: string | null
|
|
35
|
+
inputClass?: string
|
|
36
|
+
}>(),
|
|
37
|
+
{
|
|
38
|
+
inputClass: 'rounded-lg bg-gray-50 py-3 pr-3 pl-12',
|
|
39
|
+
},
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
const searchTermInternal = ref('')
|
|
43
|
+
const isFocused = ref(false)
|
|
44
|
+
const input = ref<HTMLInputElement | null>(null)
|
|
45
|
+
const { $texts } = useNuxtApp()
|
|
46
|
+
|
|
47
|
+
const emit = defineEmits(['update:modelValue'])
|
|
48
|
+
|
|
49
|
+
watch(
|
|
50
|
+
() => props.modelValue,
|
|
51
|
+
function (newValue) {
|
|
52
|
+
searchTermInternal.value = newValue || ''
|
|
53
|
+
},
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
function updateSearchTerm() {
|
|
57
|
+
emit('update:modelValue', searchTermInternal.value)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function clickAway() {
|
|
61
|
+
isFocused.value = false
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
onMounted(() => {
|
|
65
|
+
searchTermInternal.value = props.modelValue || ''
|
|
66
|
+
})
|
|
67
|
+
</script>
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
</NuxtLink>
|
|
90
90
|
</template>
|
|
91
91
|
</div>
|
|
92
|
-
<div class="flex items-center">
|
|
92
|
+
<div v-if="footerMetaMenuLinks" class="flex items-center">
|
|
93
93
|
<ul class="flex flex-col gap-4 md:flex-row md:gap-6">
|
|
94
94
|
<li v-for="(link, index) in footerMetaMenuLinks" :key="index">
|
|
95
95
|
<NuxtLink
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
import type { NuxtSvgSpriteSymbol } from '#nuxt-svg-icon-sprite/runtime'
|
|
113
113
|
|
|
114
114
|
const { menuItems: footerMenuLinks } = await useMenu('footerMenu')
|
|
115
|
-
const { menuItems: footerMetaMenuLinks } = await useMenu('
|
|
115
|
+
const { menuItems: footerMetaMenuLinks } = await useMenu('footerMetaMenu')
|
|
116
116
|
const {
|
|
117
117
|
companyLogo,
|
|
118
118
|
companyName,
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<nav
|
|
3
3
|
ref="globalMenu"
|
|
4
|
-
class="z-30 mb-8 border-b-
|
|
4
|
+
class="border-b-1 z-30 mb-8 border-b-gray-100 py-8 2xl:mb-0 2xl:h-full 2xl:border-0 2xl:py-0 2xl:pl-12"
|
|
5
5
|
v-on="!isMobile ? { mouseleave: onNavbarMouseLeave } : {}"
|
|
6
6
|
>
|
|
7
7
|
<ul
|
|
8
8
|
role="menu"
|
|
9
|
-
class="flex flex-col flex-wrap justify-end text-base
|
|
9
|
+
class="flex flex-col flex-wrap justify-end text-base 2xl:h-full 2xl:flex-row 2xl:items-center 2xl:gap-8 2xl:border-0 2xl:font-medium"
|
|
10
10
|
>
|
|
11
11
|
<li
|
|
12
12
|
v-for="(link, mainIndex) in menuItems"
|
|
13
13
|
:key="`global_${mainIndex}`"
|
|
14
14
|
role="menuitem"
|
|
15
|
-
class="group/main relative flex flex-col items-stretch
|
|
15
|
+
class="group/main relative flex flex-col items-stretch 2xl:h-full 2xl:flex-row"
|
|
16
16
|
>
|
|
17
17
|
<VuepalLink
|
|
18
18
|
:to="link?.href"
|
|
19
19
|
:aria-controls="'firstLevel-' + mainIndex"
|
|
20
20
|
:aria-expanded="hoverMain === mainIndex"
|
|
21
21
|
:aria-haspopup="!!link.children?.length"
|
|
22
|
-
class="flex w-full items-center justify-between whitespace-nowrap
|
|
22
|
+
class="group-hover/main:text-primary-500 flex w-full items-center justify-between whitespace-nowrap motion-safe:transition-colors motion-safe:duration-200 2xl:size-auto 2xl:py-0"
|
|
23
23
|
:class="
|
|
24
24
|
link?.href === menuItemActive?.href
|
|
25
25
|
? 'text-primary-500'
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
>
|
|
32
32
|
{{ link.label }}
|
|
33
33
|
<div
|
|
34
|
-
class="grid size-10 place-content-center
|
|
34
|
+
class="grid size-10 place-content-center 2xl:size-auto"
|
|
35
35
|
@click.prevent.stop="
|
|
36
36
|
isMobile && onMenuInteraction('main', mainIndex)
|
|
37
37
|
"
|
|
@@ -45,10 +45,10 @@
|
|
|
45
45
|
: undefined
|
|
46
46
|
"
|
|
47
47
|
:aria-hidden="!isMobile"
|
|
48
|
-
class="size-5 cursor-pointer text-black transition-transform duration-300
|
|
48
|
+
class="size-5 cursor-pointer text-black transition-transform duration-300 2xl:ml-2"
|
|
49
49
|
:class="{
|
|
50
50
|
'rotate-180': isMobile ? hoverMain === mainIndex : false,
|
|
51
|
-
'
|
|
51
|
+
'2xl:rotate-180': !isMobile && hoverMain === mainIndex,
|
|
52
52
|
}"
|
|
53
53
|
/>
|
|
54
54
|
</div>
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
<div
|
|
60
60
|
v-show="link.children?.length && hoverMain === mainIndex"
|
|
61
61
|
:id="'firstLevel-' + mainIndex"
|
|
62
|
-
class="w-max min-w-full
|
|
62
|
+
class="w-max min-w-full 2xl:absolute 2xl:left-0 2xl:top-full 2xl:border 2xl:border-gray-100 2xl:bg-white 2xl:text-sm"
|
|
63
63
|
>
|
|
64
|
-
<ul role="menu" class="ml-4
|
|
64
|
+
<ul role="menu" class="ml-4 2xl:ml-0">
|
|
65
65
|
<li
|
|
66
66
|
v-for="(firstLevelLink, firstLevelIndex) in link.children"
|
|
67
67
|
:key="`firstLevel_${firstLevelIndex}`"
|
|
@@ -74,10 +74,9 @@
|
|
|
74
74
|
:aria-controls="'secondLevel-' + firstLevelIndex"
|
|
75
75
|
:aria-expanded="hoverFirst === firstLevelIndex"
|
|
76
76
|
:aria-haspopup="!!firstLevelLink?.children?.length"
|
|
77
|
-
class="flex w-full items-center justify-between whitespace-nowrap no-underline
|
|
77
|
+
class="group-hover/first:text-primary-500 flex w-full items-center justify-between whitespace-nowrap no-underline motion-safe:transition-colors motion-safe:duration-200 2xl:px-4 2xl:py-3"
|
|
78
78
|
:class="
|
|
79
|
-
firstLevelLink?.href ===
|
|
80
|
-
menuItemActiveLevel1?.href
|
|
79
|
+
firstLevelLink?.href === menuItemActiveLevel1?.href
|
|
81
80
|
? 'text-primary-500'
|
|
82
81
|
: 'text-black'
|
|
83
82
|
"
|
|
@@ -89,7 +88,7 @@
|
|
|
89
88
|
>
|
|
90
89
|
{{ firstLevelLink.label }}
|
|
91
90
|
<div
|
|
92
|
-
class="grid size-10 place-content-center
|
|
91
|
+
class="grid size-10 place-content-center 2xl:size-auto"
|
|
93
92
|
@click.prevent.stop="
|
|
94
93
|
isMobile && onMenuInteraction('first', firstLevelIndex)
|
|
95
94
|
"
|
|
@@ -103,7 +102,7 @@
|
|
|
103
102
|
: undefined
|
|
104
103
|
"
|
|
105
104
|
:aria-hidden="!isMobile"
|
|
106
|
-
class="size-5 cursor-pointer text-black transition-transform duration-300
|
|
105
|
+
class="size-5 cursor-pointer text-black transition-transform duration-300 2xl:ml-2 2xl:size-4 2xl:-rotate-90"
|
|
107
106
|
:class="{
|
|
108
107
|
'rotate-180': isMobile
|
|
109
108
|
? hoverFirst === firstLevelIndex
|
|
@@ -121,9 +120,9 @@
|
|
|
121
120
|
hoverFirst === firstLevelIndex
|
|
122
121
|
"
|
|
123
122
|
:id="'secondLevel-' + firstLevelIndex"
|
|
124
|
-
class="min-w-full
|
|
123
|
+
class="min-w-full 2xl:absolute 2xl:-top-px 2xl:left-full 2xl:border 2xl:border-gray-100 2xl:bg-white 2xl:text-sm"
|
|
125
124
|
>
|
|
126
|
-
<ul role="menu" class="ml-4
|
|
125
|
+
<ul role="menu" class="ml-4 2xl:ml-0">
|
|
127
126
|
<li
|
|
128
127
|
v-for="(
|
|
129
128
|
secondLevelLink, secondLevelIndex
|
|
@@ -137,10 +136,9 @@
|
|
|
137
136
|
:aria-controls="'thirdLevel-' + secondLevelIndex"
|
|
138
137
|
:aria-expanded="hoverSecond === secondLevelIndex"
|
|
139
138
|
:aria-haspopup="!!secondLevelLink?.children?.length"
|
|
140
|
-
class="flex w-full items-center justify-between whitespace-nowrap no-underline
|
|
139
|
+
class="group-hover/second:text-primary-500 flex w-full items-center justify-between whitespace-nowrap no-underline motion-safe:transition-colors motion-safe:duration-200 2xl:px-4 2xl:py-3"
|
|
141
140
|
:class="
|
|
142
|
-
secondLevelLink?.href ===
|
|
143
|
-
menuItemActiveLevel2?.href
|
|
141
|
+
secondLevelLink?.href === menuItemActiveLevel2?.href
|
|
144
142
|
? 'text-primary-500'
|
|
145
143
|
: 'text-black'
|
|
146
144
|
"
|
|
@@ -153,7 +151,7 @@
|
|
|
153
151
|
>
|
|
154
152
|
{{ secondLevelLink.label }}
|
|
155
153
|
<div
|
|
156
|
-
class="grid size-10 place-content-center
|
|
154
|
+
class="grid size-10 place-content-center 2xl:size-auto"
|
|
157
155
|
@click.prevent.stop="
|
|
158
156
|
isMobile &&
|
|
159
157
|
onMenuInteraction('first', firstLevelIndex)
|
|
@@ -171,7 +169,7 @@
|
|
|
171
169
|
: undefined
|
|
172
170
|
"
|
|
173
171
|
:aria-hidden="!isMobile"
|
|
174
|
-
class="size-5 cursor-pointer text-black transition-transform duration-300
|
|
172
|
+
class="size-5 cursor-pointer text-black transition-transform duration-300 2xl:ml-2 2xl:size-4 2xl:-rotate-90"
|
|
175
173
|
:class="{
|
|
176
174
|
'rotate-180': isMobile
|
|
177
175
|
? hoverSecond === secondLevelIndex
|
|
@@ -189,9 +187,9 @@
|
|
|
189
187
|
hoverSecond === secondLevelIndex
|
|
190
188
|
"
|
|
191
189
|
:id="'thirdLevel-' + secondLevelIndex"
|
|
192
|
-
class="min-w-full
|
|
190
|
+
class="min-w-full 2xl:absolute 2xl:-top-px 2xl:left-full 2xl:border 2xl:border-gray-100 2xl:bg-white 2xl:text-sm"
|
|
193
191
|
>
|
|
194
|
-
<ul role="menu" class="ml-4
|
|
192
|
+
<ul role="menu" class="ml-4 2xl:ml-0">
|
|
195
193
|
<li
|
|
196
194
|
v-for="(
|
|
197
195
|
thirdLevelLink, thirdLevelIndex
|
|
@@ -202,7 +200,7 @@
|
|
|
202
200
|
>
|
|
203
201
|
<VuepalLink
|
|
204
202
|
:to="thirdLevelLink.href"
|
|
205
|
-
class="flex h-10 w-full items-center whitespace-nowrap no-underline
|
|
203
|
+
class="group-hover/third:text-primary-500 flex h-10 w-full items-center whitespace-nowrap no-underline motion-safe:transition-colors motion-safe:duration-200 2xl:h-auto 2xl:px-4 2xl:py-3"
|
|
206
204
|
:class="
|
|
207
205
|
thirdLevelLink?.href ===
|
|
208
206
|
menuTiemActiveLevel3?.href
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<ClientOnly>
|
|
3
3
|
<div
|
|
4
|
-
class="group relative z-40 mb-6 flex h-full items-center
|
|
4
|
+
class="group relative z-40 mb-6 flex h-full items-center 2xl:mb-0 2xl:p-0 2xl:pl-8"
|
|
5
5
|
@mouseenter="!isMobile && (langSwitchDropdownOpen = true)"
|
|
6
6
|
@mouseleave="!isMobile && (langSwitchDropdownOpen = false)"
|
|
7
7
|
@click="isMobile && (langSwitchDropdownOpen = !langSwitchDropdownOpen)"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
aria-controls="language-dropdown"
|
|
14
14
|
>
|
|
15
15
|
<span
|
|
16
|
-
class="
|
|
16
|
+
class="group-hover:text-primary-500 motion-safe:duration-250 font-medium motion-safe:transition-colors motion-safe:ease-in-out"
|
|
17
17
|
:class="{
|
|
18
18
|
'text-primary-500': langSwitchDropdownOpen,
|
|
19
19
|
}"
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
</span>
|
|
23
23
|
<SpriteSymbol
|
|
24
24
|
name="chevron-down"
|
|
25
|
-
class="size-4 motion-safe:transition-all motion-safe:
|
|
25
|
+
class="motion-safe:duration-250 size-4 motion-safe:transition-all motion-safe:ease-in-out"
|
|
26
26
|
:class="{
|
|
27
27
|
'rotate-180': langSwitchDropdownOpen,
|
|
28
28
|
}"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
</button>
|
|
31
31
|
<div
|
|
32
32
|
v-show="langSwitchDropdownOpen"
|
|
33
|
-
class="absolute left-0 top-full pt-2 motion-safe:transition-all motion-safe:
|
|
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"
|
|
34
34
|
>
|
|
35
35
|
<ul
|
|
36
36
|
role="menu"
|
|
@@ -43,14 +43,14 @@
|
|
|
43
43
|
role="menuitem"
|
|
44
44
|
:to="lang.to"
|
|
45
45
|
:title="lang.label"
|
|
46
|
-
class="flex items-center px-4 py-3 text-sm font-medium
|
|
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
47
|
@click="onLangDropdownLinkClick"
|
|
48
48
|
>
|
|
49
49
|
{{ lang.label }}
|
|
50
50
|
</NuxtLink>
|
|
51
51
|
<span
|
|
52
52
|
v-else
|
|
53
|
-
class="flex items-center px-4 py-3 text-sm font-medium
|
|
53
|
+
class="flex items-center whitespace-nowrap px-4 py-3 text-sm font-medium text-gray-100"
|
|
54
54
|
>
|
|
55
55
|
{{ lang.label }}
|
|
56
56
|
</span>
|
|
@@ -60,11 +60,9 @@
|
|
|
60
60
|
<transition name="fade"> </transition>
|
|
61
61
|
</div>
|
|
62
62
|
</ClientOnly>
|
|
63
|
-
|
|
64
63
|
</template>
|
|
65
64
|
|
|
66
65
|
<script lang="ts" setup>
|
|
67
|
-
|
|
68
66
|
const links = useLanguageLinks()
|
|
69
67
|
|
|
70
68
|
const emit = defineEmits(['lang-dropdown:change'])
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<nav class="mb-8
|
|
2
|
+
<nav class="mb-8 2xl:mb-0 2xl:py-0">
|
|
3
3
|
<ul
|
|
4
4
|
role="menu"
|
|
5
|
-
class="flex size-full flex-col flex-wrap justify-end text-base
|
|
5
|
+
class="flex size-full flex-col flex-wrap justify-end text-base 2xl:flex-row 2xl:items-center 2xl:gap-8 2xl:font-medium"
|
|
6
6
|
>
|
|
7
7
|
<li
|
|
8
8
|
v-for="(menuItem, index) in menuItems"
|
|
9
9
|
:key="`meta_${index}`"
|
|
10
10
|
role="menuitem"
|
|
11
|
-
class="group/main relative flex flex-col items-stretch
|
|
11
|
+
class="group/main relative flex flex-col items-stretch 2xl:flex-row"
|
|
12
12
|
>
|
|
13
13
|
<VuepalLink
|
|
14
14
|
:to="menuItem?.href"
|
|
15
|
-
class="flex w-full items-center justify-between py-1
|
|
15
|
+
class="group-hover/main:text-primary-500 flex w-full items-center justify-between py-1 motion-safe:transition-colors motion-safe:duration-200 2xl:size-auto 2xl:py-0"
|
|
16
16
|
:class="
|
|
17
|
-
menuItem?.href === menuItemActive?.href
|
|
17
|
+
menuItem?.href === menuItemActive?.href
|
|
18
|
+
? 'text-primary-500'
|
|
19
|
+
: 'text-black'
|
|
18
20
|
"
|
|
19
21
|
@click="onLangDropdownLinkClick"
|
|
20
22
|
>
|
|
@@ -23,7 +25,10 @@
|
|
|
23
25
|
</li>
|
|
24
26
|
</ul>
|
|
25
27
|
</nav>
|
|
26
|
-
<div
|
|
28
|
+
<div
|
|
29
|
+
v-if="props.links?.length !== 0"
|
|
30
|
+
class="mb-8 flex gap-8 2xl:mb-0 2xl:ml-8"
|
|
31
|
+
>
|
|
27
32
|
<DesignSystemAtomsButton
|
|
28
33
|
v-for="(link, key) in links"
|
|
29
34
|
:key="key"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
ref="container"
|
|
4
4
|
class="z-30 flex flex-col bg-white"
|
|
5
5
|
:class="{
|
|
6
|
-
'max-h-[70px] !overflow-y-hidden
|
|
6
|
+
'max-h-[70px] !overflow-y-hidden 2xl:max-h-screen 2xl:!overflow-y-visible':
|
|
7
7
|
!isMenuOpen,
|
|
8
8
|
'max-h-screen overflow-y-auto': isMenuOpen,
|
|
9
9
|
'fixed size-full max-h-dvh': isGlobalSticky,
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
>
|
|
14
14
|
<!-- Meta menu full-width container -->
|
|
15
15
|
<!-- Hidden on mobile -->
|
|
16
|
-
<div class="
|
|
16
|
+
<div class="border-b-1 hidden border-b-gray-100 2xl:block">
|
|
17
17
|
<!-- Meta menu container -->
|
|
18
18
|
<DesignSystemAtomsGridRow
|
|
19
19
|
:class="'w-full max-w-full 2xl:max-w-screen-2xl'"
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
<!-- Desktop Language dropdown -->
|
|
30
30
|
<SectionHeaderLanguageDropdown
|
|
31
|
-
class="hidden h-full
|
|
31
|
+
class="hidden h-full 2xl:block"
|
|
32
32
|
@lang-dropdown:change="closeMenu"
|
|
33
33
|
/>
|
|
34
34
|
</div>
|
|
@@ -37,32 +37,28 @@
|
|
|
37
37
|
</div>
|
|
38
38
|
|
|
39
39
|
<!-- Main menu full-width container -->
|
|
40
|
-
<div class="h-[70px] shrink-0 border-b-
|
|
40
|
+
<div class="border-b-1 h-[70px] shrink-0 border-b-gray-100 2xl:h-[110px]">
|
|
41
41
|
<!-- Main menu container -->
|
|
42
42
|
<div
|
|
43
|
-
class="flex h-full max-w-full items-center justify-between
|
|
43
|
+
class="flex h-full max-w-full items-center justify-between 2xl:justify-start"
|
|
44
44
|
>
|
|
45
45
|
<DesignSystemAtomsGridRow
|
|
46
46
|
:class="'w-full max-w-full 2xl:max-w-screen-2xl'"
|
|
47
47
|
>
|
|
48
48
|
<div class="col-span-12 flex flex-nowrap justify-between">
|
|
49
49
|
<!-- Logo -->
|
|
50
|
-
<NuxtLink
|
|
51
|
-
:to="`/${currentLanguage}`"
|
|
52
|
-
:title="companyName"
|
|
53
|
-
prefetch
|
|
54
|
-
>
|
|
50
|
+
<NuxtLink :to="`/${currentLanguage}`" :title="companyName" prefetch>
|
|
55
51
|
<Media
|
|
56
52
|
v-if="companyLogo"
|
|
57
53
|
:media="companyLogo"
|
|
58
|
-
mediaClass="h-10
|
|
54
|
+
mediaClass="h-10 2xl:h-16"
|
|
59
55
|
/>
|
|
60
56
|
</NuxtLink>
|
|
61
57
|
|
|
62
58
|
<!-- Desktop Main navigation menu -->
|
|
63
59
|
<!-- Hidden on mobile -->
|
|
64
60
|
<SectionHeaderGlobalMenu
|
|
65
|
-
class="ml-auto hidden
|
|
61
|
+
class="ml-auto hidden 2xl:block"
|
|
66
62
|
@menu:link-click="closeMenu"
|
|
67
63
|
/>
|
|
68
64
|
|
|
@@ -70,7 +66,7 @@
|
|
|
70
66
|
<!-- Hidden on mobile -->
|
|
71
67
|
<div
|
|
72
68
|
v-if="contactButtons?.length"
|
|
73
|
-
class="ml-8 hidden items-center justify-center gap-8
|
|
69
|
+
class="ml-8 hidden items-center justify-center gap-8 2xl:flex"
|
|
74
70
|
>
|
|
75
71
|
<DesignSystemAtomsButton
|
|
76
72
|
v-for="(contactButton, key) in contactButtons"
|
|
@@ -88,14 +84,14 @@
|
|
|
88
84
|
<!-- Hamburger menu -->
|
|
89
85
|
<!-- Hidden on desktop -->
|
|
90
86
|
<button
|
|
91
|
-
class="flex items-center gap-3 leading-none
|
|
87
|
+
class="flex items-center gap-3 leading-none 2xl:hidden"
|
|
92
88
|
aria-label="Hamburger Menu"
|
|
93
89
|
@click="toggleNav"
|
|
94
90
|
>
|
|
95
91
|
<span
|
|
96
92
|
class="h-auto leading-none opacity-100"
|
|
97
93
|
:class="{
|
|
98
|
-
'opacity-0 transition-all
|
|
94
|
+
'duration-250 opacity-0 transition-all ease-in-out':
|
|
99
95
|
isMenuOpen,
|
|
100
96
|
}"
|
|
101
97
|
/>
|
|
@@ -109,12 +105,15 @@
|
|
|
109
105
|
<!-- Mobile Main/Meta menu container -->
|
|
110
106
|
<!-- Hidden on desktop -->
|
|
111
107
|
<!-- Initially hidden by overflow when menu closed -->
|
|
112
|
-
<div class="container max-w-full
|
|
108
|
+
<div class="container w-full max-w-full 2xl:hidden">
|
|
113
109
|
<!-- Mobile Main navigation menu -->
|
|
114
110
|
<SectionHeaderGlobalMenu @menu:link-click="closeMenu" />
|
|
115
111
|
|
|
116
112
|
<!-- Mobile Language dropdown -->
|
|
117
|
-
<SectionHeaderLanguageSwitcher
|
|
113
|
+
<SectionHeaderLanguageSwitcher
|
|
114
|
+
@lang-dropdown:change="closeMenu"
|
|
115
|
+
class="mb-6"
|
|
116
|
+
/>
|
|
118
117
|
|
|
119
118
|
<!-- Mobile Meta menu -->
|
|
120
119
|
<SectionHeaderMetaMenu
|
|
@@ -123,7 +122,7 @@
|
|
|
123
122
|
/>
|
|
124
123
|
|
|
125
124
|
<!-- Mobile Contact button -->
|
|
126
|
-
<div v-if="contactButtons?.length" class="flex gap-8
|
|
125
|
+
<div v-if="contactButtons?.length" class="flex gap-8 2xl:ml-8">
|
|
127
126
|
<DesignSystemAtomsButton
|
|
128
127
|
v-for="(contactButton, key) in contactButtons"
|
|
129
128
|
:key="key"
|
|
@@ -141,8 +140,8 @@
|
|
|
141
140
|
</template>
|
|
142
141
|
|
|
143
142
|
<script lang="ts" setup>
|
|
144
|
-
|
|
145
|
-
|
|
143
|
+
const { companyLogo, companyName, contactButtons, metaLinks } =
|
|
144
|
+
await useGlobalConfig()
|
|
146
145
|
|
|
147
146
|
const container = ref<HTMLElement | null>(null)
|
|
148
147
|
const metaRef = useTemplateRef('metaRef')
|
|
@@ -210,7 +209,7 @@ function hideMeta() {
|
|
|
210
209
|
}
|
|
211
210
|
|
|
212
211
|
watch(viewport.breakpoint, (newValue: string) => {
|
|
213
|
-
if (newValue === '
|
|
212
|
+
if (newValue === '2xl') {
|
|
214
213
|
isMenuOpen.value = false
|
|
215
214
|
}
|
|
216
215
|
})
|
|
@@ -168,7 +168,8 @@ export function useImageSources(options: UseImageSourcesOptions) {
|
|
|
168
168
|
width: variant._cWidth ? variant._cWidth : undefined,
|
|
169
169
|
height: variant._cHeight ? variant._cHeight : undefined,
|
|
170
170
|
fit: 'cover',
|
|
171
|
-
format: 'webp'
|
|
171
|
+
format: 'webp',
|
|
172
|
+
gravity: mediaRef.value?.focalPoint?.focalPoint ? `${mediaRef.value?.focalPoint?.focalPoint?.x}x${mediaRef.value?.focalPoint?.focalPoint?.y}` : 'auto'
|
|
172
173
|
}),
|
|
173
174
|
})
|
|
174
175
|
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
export function useIsMobile() {
|
|
2
2
|
const viewport = useViewport()
|
|
3
|
-
const isMobile = ref(viewport.isLessThan('
|
|
3
|
+
const isMobile = ref(viewport.isLessThan('2xl'))
|
|
4
4
|
|
|
5
5
|
watch(viewport.breakpoint, (newValue: string) => {
|
|
6
|
-
isMobile.value =
|
|
7
|
-
newValue === 'md' ||
|
|
8
|
-
newValue === 'sm' ||
|
|
9
|
-
newValue === 'xs' ||
|
|
10
|
-
newValue === 'ss'
|
|
6
|
+
isMobile.value = newValue !== '2xl'
|
|
11
7
|
})
|
|
12
8
|
|
|
13
9
|
return { isMobile }
|
package/error.vue
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<ClientOnly>
|
|
4
4
|
<div
|
|
5
5
|
v-if="drupalUser.accessToolbar && !isEditing"
|
|
6
|
-
class="hidden border-b border-b-gray-100 bg-white
|
|
6
|
+
class="hidden border-b border-b-gray-100 bg-white 2xl:block"
|
|
7
7
|
>
|
|
8
8
|
<VuepalAdminToolbar :key="language" />
|
|
9
9
|
<div class="flex">
|
|
@@ -22,7 +22,7 @@ const route = useRoute()
|
|
|
22
22
|
const drupalUser = useDrupalUser()
|
|
23
23
|
const language = useCurrentLanguage()
|
|
24
24
|
|
|
25
|
-
import { onMounted } from 'vue'
|
|
25
|
+
import { onMounted } from 'vue'
|
|
26
26
|
|
|
27
27
|
const isEditing = computed(
|
|
28
28
|
() =>
|
|
@@ -35,5 +35,4 @@ useHead({
|
|
|
35
35
|
lang: language.value,
|
|
36
36
|
},
|
|
37
37
|
})
|
|
38
|
-
|
|
39
|
-
</script>
|
|
38
|
+
</script>
|
package/layouts/default.vue
CHANGED
|
@@ -51,14 +51,14 @@ function menuOpen() {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
function menuCloseStart() {
|
|
54
|
-
if (viewport.isLessThan('
|
|
54
|
+
if (viewport.isLessThan('2xl')) {
|
|
55
55
|
isMenuOpen.value = false
|
|
56
56
|
hasMenuFinishedClosing.value = false
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
function menuCloseFinish() {
|
|
61
|
-
if (viewport.isLessThan('
|
|
61
|
+
if (viewport.isLessThan('2xl')) {
|
|
62
62
|
window.document.body.classList.remove('overflow-y-hidden')
|
|
63
63
|
hasMenuFinishedClosing.value = true
|
|
64
64
|
}
|
package/layouts/error.vue
CHANGED
|
@@ -81,14 +81,14 @@ function menuOpen() {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function menuCloseStart() {
|
|
84
|
-
if (viewport.isLessThan('
|
|
84
|
+
if (viewport.isLessThan('2xl')) {
|
|
85
85
|
isMenuOpen.value = false
|
|
86
86
|
hasMenuFinishedClosing.value = false
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function menuCloseFinish() {
|
|
91
|
-
if (viewport.isLessThan('
|
|
91
|
+
if (viewport.isLessThan('2xl')) {
|
|
92
92
|
window.document.body.classList.remove('overflow-y-hidden')
|
|
93
93
|
hasMenuFinishedClosing.value = true
|
|
94
94
|
}
|