accessability check
This commit is contained in:
parent
fa1f912089
commit
5771bb7cdd
@ -2,7 +2,7 @@
|
||||
<div
|
||||
class="contactBubble"
|
||||
:class="{ active: isContactBubbleOpen }"
|
||||
aria-hidden="false"
|
||||
:aria-hidden="!isContactBubbleOpen"
|
||||
:aria-expanded="isContactBubbleOpen"
|
||||
aria-labelledby="controlIcon"
|
||||
role="dialog"
|
||||
@ -14,8 +14,9 @@
|
||||
aria-label="Toggle contact form"
|
||||
@click="toggleContactBubble"
|
||||
>
|
||||
<use :xlink:href="`/assets/icons/collection.svg#${isContactBubbleOpen ? 'times' : 'talk'}`"/>
|
||||
<use :xlink:href="`/assets/icons/collection.svg#${isContactBubbleOpen ? 'times' : 'talk'}`" />
|
||||
</svg>
|
||||
|
||||
<div
|
||||
v-show="isContactBubbleOpen"
|
||||
class="contactContainer"
|
||||
@ -23,6 +24,7 @@
|
||||
aria-labelledby="contactTitle"
|
||||
>
|
||||
<div class="row left m-2">
|
||||
<!-- Linke Seite -->
|
||||
<div id="hintBox" class="col-md-6">
|
||||
<NuxtImg
|
||||
v-if="screenWidth <= 768"
|
||||
@ -37,14 +39,17 @@
|
||||
<h2 id="contactTitle">{{ $t('contactForm.yourcontact2us') }}</h2>
|
||||
<p class="my-4">
|
||||
<svg aria-hidden="true">
|
||||
<use xlink:href="/assets/icons/collection.svg#phone"/>
|
||||
<use xlink:href="/assets/icons/collection.svg#phone" />
|
||||
</svg>
|
||||
<span>{{ companyinfo.phone }}</span>
|
||||
</p>
|
||||
|
||||
<div v-if="screenWidth > 768" class="pt-3">
|
||||
<h3>{{ $t('contactForm.ourOffice') }}</h3>
|
||||
<p class="address">
|
||||
{{ companyinfo.company }}<br>{{ companyinfo.street }} <br>{{ companyinfo.postalcode }} {{ companyinfo.city }}
|
||||
{{ companyinfo.company }}<br />
|
||||
{{ companyinfo.street }} <br />
|
||||
{{ companyinfo.postalcode }} {{ companyinfo.city }}
|
||||
</p>
|
||||
<p class="aspProf">{{ $t('contactForm.yourcontactperson') }} <b>Sabrina Hennrich</b></p>
|
||||
<div class="aspBox">
|
||||
@ -59,57 +64,92 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
|
||||
<!-- Rechte Seite -->
|
||||
<div class="col-md-6">
|
||||
<div v-if="!formSent">
|
||||
<form @submit.prevent="submitForm" novalidate>
|
||||
<div class="form-group">
|
||||
<label for="name">{{ $t('contactForm.name') }}</label>
|
||||
<input
|
||||
id="name"
|
||||
class="form-control"
|
||||
v-model="form.name"
|
||||
type="text"
|
||||
name="name"
|
||||
aria-required="true"
|
||||
required
|
||||
autocomplete="name"
|
||||
@blur="validateName"
|
||||
:aria-invalid="!!errors.name"
|
||||
:aria-describedby="errors.name ? 'error-name' : null"
|
||||
/>
|
||||
<span
|
||||
v-if="errors.name"
|
||||
id="error-name"
|
||||
class="error"
|
||||
role="alert"
|
||||
>
|
||||
<span v-if="errors.name" class="error">{{ errors.name }}</span>
|
||||
{{ errors.name }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">{{ $t('contactForm.email') }}</label>
|
||||
<input
|
||||
id="email"
|
||||
class="form-control"
|
||||
v-model="form.email"
|
||||
type="email"
|
||||
name="email"
|
||||
required
|
||||
autocomplete="email"
|
||||
@blur="validateEmail"
|
||||
:aria-invalid="!!errors.email"
|
||||
:aria-describedby="errors.email ? 'error-email' : null"
|
||||
/>
|
||||
<span
|
||||
v-if="errors.email"
|
||||
id="error-email"
|
||||
class="error"
|
||||
role="alert"
|
||||
>
|
||||
<span v-if="errors.email" class="error">{{ errors.email }}</span>
|
||||
{{ errors.email }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="phone">{{ $t('contactForm.phone') }}</label>
|
||||
<input
|
||||
id="phone"
|
||||
class="form-control"
|
||||
v-model="form.phone"
|
||||
type="tel"
|
||||
name="phone"
|
||||
autocomplete="tel"
|
||||
@blur="validatePhone"
|
||||
:aria-invalid="!!errors.phone"
|
||||
:aria-describedby="errors.phone ? 'error-phone' : null"
|
||||
/>
|
||||
<span
|
||||
v-if="errors.phone"
|
||||
id="error-phone"
|
||||
class="error"
|
||||
role="alert"
|
||||
>
|
||||
<span v-if="errors.phone" class="error">{{ errors.phone }}</span>
|
||||
{{ errors.phone }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="message">{{ $t('contactForm.message') }}</label>
|
||||
<textarea
|
||||
id="message"
|
||||
class="form-control mt-4"
|
||||
v-model="form.message"
|
||||
name="message"
|
||||
class="mt-4"
|
||||
/>
|
||||
rows="4"
|
||||
required
|
||||
></textarea>
|
||||
</div>
|
||||
|
||||
<p class="smallText">
|
||||
@ -123,27 +163,28 @@
|
||||
</NuxtLinkLocale>
|
||||
</p>
|
||||
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
:aria-label="$t('contactForm.sendMessage')"
|
||||
class="pinkBtn"
|
||||
@click="submitForm"
|
||||
:aria-label="$t('contactForm.sendMessage')"
|
||||
>
|
||||
{{ $t('contactForm.sendMessage') }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Dankeschön-Text -->
|
||||
<div v-else class="mt-5 thx">
|
||||
<h3 class="pt-5">{{ $t('contactForm.confirmation.thx') }}</h3>
|
||||
<p>{{ $t('contactForm.confirmation.info') }}</p>
|
||||
<p>{{ $t('contactForm.confirmation.salutation') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useMainStore } from '@/stores/main';
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="banner-wrapper">
|
||||
<!-- Obere Welle -->
|
||||
<svg
|
||||
@ -21,43 +20,21 @@
|
||||
<div class="container">
|
||||
<h2 class="pt-4 pb-3">{{ title }}</h2>
|
||||
|
||||
<div class="marquee marquee--hover-pause mt-5">
|
||||
<!-- Haupt-Liste -->
|
||||
<ul class="marquee__content">
|
||||
<li v-for="(item, index) in items" :key="index">
|
||||
<NuxtLink v-if="item.link" :to="item.link" class="custLogoLink">
|
||||
<NuxtImg
|
||||
provider="strapi"
|
||||
:src="item.logo.url"
|
||||
:alt="item.logo.alternativeText || 'Logo'"
|
||||
width="250"
|
||||
format="webp"
|
||||
loading="lazy"
|
||||
class="custLogo"
|
||||
/>
|
||||
</NuxtLink>
|
||||
<NuxtImg
|
||||
v-else
|
||||
provider="strapi"
|
||||
:src="item.logo.url"
|
||||
:alt="item.logo.alternativeText || 'Logo'"
|
||||
width="250"
|
||||
format="webp"
|
||||
loading="lazy"
|
||||
class="custLogo"
|
||||
/>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Duplizierte Liste für Endlos-Scroll -->
|
||||
<ul class="marquee__content duplicate" aria-hidden="true">
|
||||
<li v-for="(item, index) in items" :key="'dup-' + index">
|
||||
<div class="marquee">
|
||||
<div class="marquee-track">
|
||||
<ul class="marquee-list">
|
||||
<li
|
||||
v-for="(item, index) in items"
|
||||
:key="index"
|
||||
class="marquee-item"
|
||||
>
|
||||
<NuxtLink v-if="item.link" :to="item.link" class="custLogoLink">
|
||||
<NuxtImg
|
||||
provider="strapi"
|
||||
:src="item.logo.url"
|
||||
:alt="item.logo.alternativeText || 'Logo'"
|
||||
width="250"
|
||||
height="50"
|
||||
format="webp"
|
||||
loading="lazy"
|
||||
class="custLogo"
|
||||
@ -69,6 +46,7 @@
|
||||
:src="item.logo.url"
|
||||
:alt="item.logo.alternativeText || 'Logo'"
|
||||
width="250"
|
||||
height="50"
|
||||
format="webp"
|
||||
loading="lazy"
|
||||
class="custLogo"
|
||||
@ -78,8 +56,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Untere Wellen -->
|
||||
<!-- Wellen unten -->
|
||||
<div class="waveBox">
|
||||
<div id="waver">
|
||||
<div class="waveWrapper waveAnimation">
|
||||
@ -105,48 +84,34 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const runtimeConfig = useRuntimeConfig()
|
||||
const cmsUrl = computed(() => runtimeConfig.public.cmsBaseUrl)
|
||||
|
||||
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
|
||||
// Runtime config & base CMS URL
|
||||
const runtimeConfig = useRuntimeConfig()
|
||||
const cmsUrl = computed(() => runtimeConfig.public.cmsBaseUrl)
|
||||
|
||||
// Props
|
||||
const props = defineProps({
|
||||
const props = defineProps({
|
||||
items: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
logoHeight: {
|
||||
type: Number,
|
||||
default: 50,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
link: {
|
||||
type: String,
|
||||
default: 'projekt',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="sass">
|
||||
.banner-wrapper
|
||||
<style lang="sass" scoped>
|
||||
.banner-wrapper
|
||||
position: relative
|
||||
svg
|
||||
margin: 0 0 -3px 0
|
||||
@media(max-width: $breakPointSM)
|
||||
svg
|
||||
margin: 0
|
||||
.box
|
||||
|
||||
.box
|
||||
background-color: $beige
|
||||
width: 100%
|
||||
min-height: 50px
|
||||
@ -157,49 +122,45 @@
|
||||
font-size: 1.2rem
|
||||
font-family: 'Mainfont-Bold'
|
||||
|
||||
.marquee
|
||||
--gap: 1rem
|
||||
position: relative
|
||||
display: flex
|
||||
.marquee
|
||||
overflow: hidden
|
||||
user-select: none
|
||||
gap: var(--gap)
|
||||
ul
|
||||
list-style-type: none
|
||||
&:hover .marquee__content
|
||||
animation-play-state: paused
|
||||
width: 100%
|
||||
|
||||
.marquee__content
|
||||
flex-shrink: 0
|
||||
.marquee-track
|
||||
display: flex
|
||||
justify-content: space-around
|
||||
gap: var(--gap)
|
||||
min-width: 100%
|
||||
animation: scroll 30s linear infinite
|
||||
li
|
||||
&::before
|
||||
display: none
|
||||
animation: scroll 20s linear infinite
|
||||
width: max-content
|
||||
|
||||
@keyframes scroll
|
||||
from
|
||||
transform: translateX(0)
|
||||
to
|
||||
transform: translateX(calc(-100% - var(--gap)))
|
||||
.marquee-list
|
||||
display: flex
|
||||
gap: 3rem
|
||||
list-style: none
|
||||
padding: 1rem 0
|
||||
margin: 0
|
||||
|
||||
.custLogo
|
||||
.marquee-item
|
||||
flex-shrink: 0
|
||||
|
||||
.custLogo
|
||||
width: auto
|
||||
max-width: 250px
|
||||
height: 50px
|
||||
margin: 0 3rem
|
||||
filter: grayscale(100%)
|
||||
transition: filter 0.3s ease
|
||||
&:hover
|
||||
filter: grayscale(0)
|
||||
|
||||
.waveBox
|
||||
@keyframes scroll
|
||||
from
|
||||
transform: translateX(0)
|
||||
to
|
||||
transform: translateX(-50%)
|
||||
|
||||
.waveBox
|
||||
position: relative
|
||||
height: 120px
|
||||
#waver
|
||||
|
||||
#waver
|
||||
display: block
|
||||
position: absolute
|
||||
left: 0
|
||||
@ -208,7 +169,7 @@
|
||||
padding: 0
|
||||
margin: 0
|
||||
|
||||
@keyframes move_wave
|
||||
@keyframes move_wave
|
||||
0%
|
||||
transform: translateX(0) translateZ(0) scaleY(1)
|
||||
50%
|
||||
@ -216,7 +177,7 @@
|
||||
100%
|
||||
transform: translateX(-50%) translateZ(0) scaleY(1)
|
||||
|
||||
.waveWrapper
|
||||
.waveWrapper
|
||||
overflow: hidden
|
||||
position: absolute
|
||||
left: 0
|
||||
@ -225,7 +186,7 @@
|
||||
top: 0
|
||||
margin: auto
|
||||
|
||||
.waveWrapperInner
|
||||
.waveWrapperInner
|
||||
position: absolute
|
||||
width: 100%
|
||||
overflow: hidden
|
||||
@ -233,22 +194,22 @@
|
||||
top: 0
|
||||
background-image: linear-gradient(to top, $beige 20%, $beige 80%)
|
||||
|
||||
@media (max-width: 1024px)
|
||||
@media (max-width: 1024px)
|
||||
.waveWrapperInner
|
||||
height: 50px
|
||||
|
||||
.bgTop
|
||||
.bgTop
|
||||
z-index: 15
|
||||
opacity: 0.5
|
||||
|
||||
.bgMiddle
|
||||
.bgMiddle
|
||||
z-index: 10
|
||||
opacity: 0.75
|
||||
|
||||
.bgBottom
|
||||
.bgBottom
|
||||
z-index: 5
|
||||
|
||||
.wave
|
||||
.wave
|
||||
position: absolute
|
||||
left: 0
|
||||
width: 200%
|
||||
@ -257,16 +218,15 @@
|
||||
background-position: 0 bottom
|
||||
transform-origin: center bottom
|
||||
|
||||
.waveTop
|
||||
.waveTop
|
||||
background-size: auto 100%
|
||||
animation: move_wave 18s linear infinite
|
||||
|
||||
.waveMiddle
|
||||
.waveMiddle
|
||||
background-size: auto 100%
|
||||
animation: move_wave 11s linear infinite
|
||||
|
||||
.waveBottom
|
||||
.waveBottom
|
||||
background-size: auto 100%
|
||||
animation: move_wave 15s linear infinite
|
||||
</style>
|
||||
|
||||
</style>
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 198 KiB |
Loading…
x
Reference in New Issue
Block a user