198 lines
7.7 KiB
Vue
198 lines
7.7 KiB
Vue
<template>
|
|
<UPageSection
|
|
id="betriebsraete"
|
|
:ui="{
|
|
root: 'scroll-mt-20'
|
|
}"
|
|
>
|
|
<template #title>
|
|
<div class="flex flex-col items-center text-center mb-4">
|
|
<span
|
|
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 text-sm font-medium mb-4"
|
|
>
|
|
<UIcon name="i-lucide-users" class="w-4 h-4" />
|
|
{{ $t('worksCouncil.badge') }}
|
|
</span>
|
|
<h2
|
|
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white"
|
|
>
|
|
{{ $t('worksCouncil.title', { highlight: '' })
|
|
}}<span class="gradient-text">{{ $t('worksCouncil.titleHighlight') }}</span>
|
|
</h2>
|
|
</div>
|
|
</template>
|
|
|
|
<template #description>
|
|
<p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
|
|
{{ $t('worksCouncil.description') }}
|
|
</p>
|
|
</template>
|
|
|
|
<!-- Toggle between pain points and benefits -->
|
|
<div class="mt-12">
|
|
<!-- Tab switcher -->
|
|
<div class="flex justify-center mb-10">
|
|
<div class="inline-flex p-1.5 rounded-2xl glass">
|
|
<button
|
|
:class="[
|
|
'px-6 py-3 rounded-xl text-sm font-semibold transition-all duration-300',
|
|
activeTab === 'pain'
|
|
? 'bg-gradient-to-r from-warning-500 to-warning-600 text-white shadow-lg'
|
|
: 'text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white'
|
|
]"
|
|
@click="activeTab = 'pain'"
|
|
>
|
|
<UIcon name="i-lucide-x-circle" class="w-4 h-4 inline mr-2" />
|
|
{{ $t('worksCouncil.tabs.awayFrom') }}
|
|
</button>
|
|
<button
|
|
:class="[
|
|
'px-6 py-3 rounded-xl text-sm font-semibold transition-all duration-300',
|
|
activeTab === 'benefit'
|
|
? 'bg-gradient-to-r from-success-500 to-success-600 text-white shadow-lg'
|
|
: 'text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white'
|
|
]"
|
|
@click="activeTab = 'benefit'"
|
|
>
|
|
<UIcon name="i-lucide-check-circle" class="w-4 h-4 inline mr-2" />
|
|
{{ $t('worksCouncil.tabs.towards') }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Cards carousel -->
|
|
<div class="relative">
|
|
<!-- Pain points cards -->
|
|
<Transition
|
|
enter-active-class="transition-all duration-500 ease-out"
|
|
enter-from-class="opacity-0 translate-x-8"
|
|
enter-to-class="opacity-100 translate-x-0"
|
|
leave-active-class="transition-all duration-300 ease-in absolute inset-0"
|
|
leave-from-class="opacity-100 translate-x-0"
|
|
leave-to-class="opacity-0 -translate-x-8"
|
|
>
|
|
<div v-if="activeTab === 'pain'" class="grid sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-5">
|
|
<div v-for="(point, index) in painPoints" :key="index" class="group">
|
|
<div
|
|
class="h-full p-5 rounded-2xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 hover:border-warning-300 dark:hover:border-warning-700 shadow-sm hover:shadow-lg transition-all duration-300"
|
|
>
|
|
<div
|
|
class="w-10 h-10 rounded-xl bg-warning-100 dark:bg-warning-900/30 flex items-center justify-center mb-4 group-hover:scale-110 transition-transform"
|
|
>
|
|
<UIcon :name="point.icon" class="w-5 h-5 text-warning-600 dark:text-warning-400" />
|
|
</div>
|
|
<p class="text-sm text-gray-700 dark:text-gray-300 leading-relaxed">{{ point.text }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
|
|
<!-- Benefits cards -->
|
|
<Transition
|
|
enter-active-class="transition-all duration-500 ease-out"
|
|
enter-from-class="opacity-0 translate-x-8"
|
|
enter-to-class="opacity-100 translate-x-0"
|
|
leave-active-class="transition-all duration-300 ease-in absolute inset-0"
|
|
leave-from-class="opacity-100 translate-x-0"
|
|
leave-to-class="opacity-0 -translate-x-8"
|
|
>
|
|
<div v-if="activeTab === 'benefit'" class="grid sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-5">
|
|
<div v-for="(benefit, index) in benefits" :key="index" class="group">
|
|
<div
|
|
class="h-full p-5 rounded-2xl bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 hover:border-success-300 dark:hover:border-success-700 shadow-sm hover:shadow-lg transition-all duration-300"
|
|
>
|
|
<div
|
|
class="w-10 h-10 rounded-xl bg-success-100 dark:bg-success-900/30 flex items-center justify-center mb-4 group-hover:scale-110 transition-transform"
|
|
>
|
|
<UIcon :name="benefit.icon" class="w-5 h-5 text-success-600 dark:text-success-400" />
|
|
</div>
|
|
<p class="text-sm text-gray-700 dark:text-gray-300 leading-relaxed">{{ benefit.text }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</Transition>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Highlights section -->
|
|
<div class="mt-12">
|
|
<div class="section-divider mb-8" />
|
|
<h3 class="font-heading text-2xl sm:text-3xl text-gray-900 dark:text-white text-center mb-10">
|
|
{{ $t('worksCouncil.highlightsTitle', { highlight: '' })
|
|
}}<span class="gradient-text">{{ $t('worksCouncil.highlightsTitleHighlight') }}</span>
|
|
</h3>
|
|
|
|
<div class="grid sm:grid-cols-3 gap-6">
|
|
<div
|
|
v-for="(highlight, index) in highlights"
|
|
:key="index"
|
|
class="group animate-fade-in-up"
|
|
:style="{ animationDelay: `${index * 150}ms` }"
|
|
>
|
|
<div
|
|
class="h-full p-6 rounded-2xl bg-gradient-to-br from-primary-50 to-cyan-50 dark:from-primary-950/50 dark:to-cyan-950/50 border border-primary-100 dark:border-primary-900 hover:shadow-xl hover:shadow-primary-500/10 transition-all"
|
|
>
|
|
<div
|
|
class="w-12 h-12 rounded-2xl bg-gradient-to-br from-primary-500 to-cyan-500 flex items-center justify-center mb-4 group-hover:scale-110 transition-transform shadow-lg shadow-primary-500/25"
|
|
>
|
|
<UIcon :name="highlight.icon" class="w-6 h-6 text-white" />
|
|
</div>
|
|
<h4 class="font-heading text-lg font-bold text-gray-900 dark:text-white mb-2">{{ highlight.title }}</h4>
|
|
<p class="text-sm text-gray-600 dark:text-gray-300">{{ highlight.description }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</UPageSection>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
const { t } = useI18n()
|
|
const activeTab = ref<'pain' | 'benefit'>('benefit')
|
|
|
|
const painPointIcons = [
|
|
'i-lucide-search',
|
|
'i-lucide-git-branch',
|
|
'i-lucide-timer',
|
|
'i-lucide-brain',
|
|
'i-lucide-eye-off',
|
|
'i-lucide-file-question',
|
|
'i-lucide-calendar-x'
|
|
]
|
|
|
|
const benefitIcons = [
|
|
'i-lucide-layout-list',
|
|
'i-lucide-route',
|
|
'i-lucide-file-check',
|
|
'i-lucide-scan-eye',
|
|
'i-lucide-git-compare',
|
|
'i-lucide-clock',
|
|
'i-lucide-shield-check',
|
|
'i-lucide-heart-handshake'
|
|
]
|
|
|
|
const highlightIcons = ['i-lucide-zap', 'i-lucide-handshake', 'i-lucide-shield']
|
|
|
|
const painPoints = computed(() =>
|
|
painPointIcons.map((icon, index) => ({
|
|
icon,
|
|
text: t(`worksCouncil.painPoints[${index}]`)
|
|
}))
|
|
)
|
|
|
|
const benefits = computed(() =>
|
|
benefitIcons.map((icon, index) => ({
|
|
icon,
|
|
text: t(`worksCouncil.benefits[${index}]`)
|
|
}))
|
|
)
|
|
|
|
const highlights = computed(() =>
|
|
highlightIcons.map((icon, index) => ({
|
|
icon,
|
|
title: t(`worksCouncil.highlights[${index}].title`),
|
|
description: t(`worksCouncil.highlights[${index}].description`)
|
|
}))
|
|
)
|
|
</script>
|