feat(landing): Add i18n

This commit is contained in:
2026-01-05 19:13:41 +01:00
parent a086763c80
commit 01df3e622e
17 changed files with 4049 additions and 406 deletions

View File

@@ -1,7 +1,7 @@
<template> <template>
<UApp> <UApp>
<!-- Skip link for accessibility --> <!-- Skip link for accessibility -->
<a href="#main-content" class="skip-link"> Zum Hauptinhalt springen </a> <a href="#main-content" class="skip-link"> {{ $t('common.skipToContent') }} </a>
<NuxtRouteAnnouncer /> <NuxtRouteAnnouncer />
@@ -40,6 +40,14 @@
/> />
<template #right> <template #right>
<USelectMenu
v-model="selectedLocale"
:items="localeItems"
class="w-[100px]"
:ui="{
base: 'text-sm'
}"
/>
<UColorModeButton <UColorModeButton
:ui="{ :ui="{
base: 'text-gray-600 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400' base: 'text-gray-600 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400'
@@ -49,7 +57,7 @@
to="#newsletter" to="#newsletter"
class="btn-gradient px-5 py-2.5 rounded-xl font-semibold shadow-lg shadow-primary-500/25 hover:shadow-primary-500/40 transition-shadow" class="btn-gradient px-5 py-2.5 rounded-xl font-semibold shadow-lg shadow-primary-500/25 hover:shadow-primary-500/40 transition-shadow"
> >
<span>Informiert bleiben</span> <span>{{ $t('common.stayInformed') }}</span>
</UButton> </UButton>
</template> </template>
@@ -64,7 +72,7 @@
/> />
<div class="mt-6 pt-6 border-t border-gray-200 dark:border-gray-800"> <div class="mt-6 pt-6 border-t border-gray-200 dark:border-gray-800">
<UButton to="#newsletter" size="lg" block class="btn-gradient rounded-xl font-semibold"> <UButton to="#newsletter" size="lg" block class="btn-gradient rounded-xl font-semibold">
Informiert bleiben {{ $t('common.stayInformed') }}
</UButton> </UButton>
</div> </div>
</template> </template>
@@ -90,7 +98,7 @@
<span class="font-heading text-xl font-bold text-gray-900 dark:text-white"> LegalConsentHub </span> <span class="font-heading text-xl font-bold text-gray-900 dark:text-white"> LegalConsentHub </span>
</NuxtLink> </NuxtLink>
<p class="text-gray-600 dark:text-gray-400 max-w-sm mb-6"> <p class="text-gray-600 dark:text-gray-400 max-w-sm mb-6">
Digitale Mitbestimmung für IT- und KI-Systeme. Strukturierte Prozesse, revisionssichere Dokumentation. {{ $t('footer.brandDescription') }}
</p> </p>
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<UButton <UButton
@@ -115,7 +123,7 @@
<!-- Links column --> <!-- Links column -->
<div> <div>
<h4 class="font-heading font-bold text-gray-900 dark:text-white mb-4">Navigation</h4> <h4 class="font-heading font-bold text-gray-900 dark:text-white mb-4">{{ $t('common.navigation') }}</h4>
<ul class="space-y-3"> <ul class="space-y-3">
<li v-for="item in navigationItems" :key="item.label"> <li v-for="item in navigationItems" :key="item.label">
<NuxtLink <NuxtLink
@@ -130,7 +138,7 @@
<!-- Legal column --> <!-- Legal column -->
<div> <div>
<h4 class="font-heading font-bold text-gray-900 dark:text-white mb-4">Rechtliches</h4> <h4 class="font-heading font-bold text-gray-900 dark:text-white mb-4">{{ $t('common.legal') }}</h4>
<ul class="space-y-3"> <ul class="space-y-3">
<li v-for="item in footerLinks" :key="item.label"> <li v-for="item in footerLinks" :key="item.label">
<NuxtLink <NuxtLink
@@ -148,16 +156,16 @@
<div class="mt-12 pt-8 border-t border-gray-200 dark:border-gray-800"> <div class="mt-12 pt-8 border-t border-gray-200 dark:border-gray-800">
<div class="flex flex-col sm:flex-row justify-between items-center gap-4"> <div class="flex flex-col sm:flex-row justify-between items-center gap-4">
<p class="text-sm text-gray-500 dark:text-gray-400"> <p class="text-sm text-gray-500 dark:text-gray-400">
© {{ new Date().getFullYear() }} LegalConsentHub. Alle Rechte vorbehalten. © {{ new Date().getFullYear() }} LegalConsentHub. {{ $t('common.allRightsReserved') }}
</p> </p>
<div class="flex items-center gap-6 text-sm text-gray-500 dark:text-gray-400"> <div class="flex items-center gap-6 text-sm text-gray-500 dark:text-gray-400">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<UIcon name="i-lucide-server" class="w-4 h-4" /> <UIcon name="i-lucide-server" class="w-4 h-4" />
<span>Hosted in Germany</span> <span>{{ $t('common.hostedInGermany') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<UIcon name="i-lucide-shield-check" class="w-4 h-4" /> <UIcon name="i-lucide-shield-check" class="w-4 h-4" />
<span>DSGVO-konform</span> <span>{{ $t('common.gdprCompliant') }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -170,6 +178,26 @@
<script setup lang="ts"> <script setup lang="ts">
import type { NavigationMenuItem } from '@nuxt/ui' import type { NavigationMenuItem } from '@nuxt/ui'
const { t, locale, locales, setLocale } = useI18n()
// Locale selector items
const localeItems = computed(() =>
(locales.value as Array<{ code: string; name: string }>).map((l) => ({
label: l.name,
value: l.code
}))
)
// Selected locale for the dropdown
const selectedLocale = computed({
get: () => localeItems.value.find((l) => l.value === locale.value),
set: (item) => {
if (item) {
setLocale(item.value as 'en' | 'de')
}
}
})
// Track scroll position for header styling // Track scroll position for header styling
const isScrolled = ref(false) const isScrolled = ref(false)
@@ -188,34 +216,34 @@ onMounted(() => {
const navigationItems = computed<NavigationMenuItem[]>(() => [ const navigationItems = computed<NavigationMenuItem[]>(() => [
{ {
label: 'Für Betriebsräte', label: t('nav.forWorksCouncils'),
to: '#betriebsraete' to: '#betriebsraete'
}, },
{ {
label: 'Für Unternehmen', label: t('nav.forCompanies'),
to: '#unternehmen' to: '#unternehmen'
}, },
{ {
label: 'Features', label: t('nav.features'),
to: '#features' to: '#features'
}, },
{ {
label: 'Kontakt', label: t('nav.contact'),
to: '#kontakt' to: '#kontakt'
} }
]) ])
const footerLinks = computed<NavigationMenuItem[]>(() => [ const footerLinks = computed<NavigationMenuItem[]>(() => [
{ {
label: 'Impressum', label: t('footer.imprint'),
to: '/impressum' to: '/impressum'
}, },
{ {
label: 'Datenschutz', label: t('footer.privacy'),
to: '/datenschutz' to: '/datenschutz'
}, },
{ {
label: 'AGB', label: t('footer.terms'),
to: '/agb' to: '/agb'
} }
]) ])

View File

@@ -10,19 +10,20 @@
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-success-100 dark:bg-success-900/30 text-success-700 dark:text-success-300 text-sm font-medium mb-4" class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-success-100 dark:bg-success-900/30 text-success-700 dark:text-success-300 text-sm font-medium mb-4"
> >
<UIcon name="i-lucide-shield" class="w-4 h-4" /> <UIcon name="i-lucide-shield" class="w-4 h-4" />
Vertrauen & Sicherheit {{ $t('additionalFeatures.badge') }}
</span> </span>
<h2 <h2
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white" class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white"
> >
Weitere <span class="gradient-text">Vorteile</span> {{ $t('additionalFeatures.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('additionalFeatures.titleHighlight') }}</span>
</h2> </h2>
</div> </div>
</template> </template>
<template #description> <template #description>
<p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto"> <p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
Alles aus einer Hand ohne Drittanbieter, mit Serverstandort in Deutschland. {{ $t('additionalFeatures.description') }}
</p> </p>
</template> </template>
@@ -74,50 +75,32 @@
<!-- Bottom CTA --> <!-- Bottom CTA -->
<div class="mt-12 text-center"> <div class="mt-12 text-center">
<p class="text-gray-500 dark:text-gray-400 mb-4">Haben Sie Fragen zu unseren Sicherheitsstandards?</p> <p class="text-gray-500 dark:text-gray-400 mb-4">{{ $t('additionalFeatures.ctaQuestion') }}</p>
<UButton to="#kontakt" variant="outline" class="btn-outline-gradient"> <UButton to="#kontakt" variant="outline" class="btn-outline-gradient">
<UIcon name="i-lucide-message-circle" class="w-4 h-4 mr-2" /> <UIcon name="i-lucide-message-circle" class="w-4 h-4 mr-2" />
Kontakt aufnehmen {{ $t('additionalFeatures.ctaButton') }}
</UButton> </UButton>
</div> </div>
</UPageSection> </UPageSection>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const features = [ const { t } = useI18n()
{
icon: 'i-lucide-puzzle', const featureIcons = [
title: 'Keine Zusatztools erforderlich', 'i-lucide-puzzle',
description: 'i-lucide-server',
'Keine externen Zusatzlösungen für Prozess, Abstimmung und Dokumentenerstellung alles läuft in einem System.' 'i-lucide-lock',
}, 'i-lucide-sparkles',
{ 'i-lucide-settings',
icon: 'i-lucide-server', 'i-lucide-headphones'
title: 'Hosting & Backups in Deutschland',
description:
'Betrieb und Datensicherung erfolgen in Deutschland transparente Datenflüsse ohne unerwartete Auslandsverarbeitung.'
},
{
icon: 'i-lucide-lock',
title: 'Verschlüsselte Übertragung',
description:
'Alle Verbindungen sind per TLS/HTTPS verschlüsselt, damit Inhalte und Zugangsdaten beim Transport geschützt sind.'
},
{
icon: 'i-lucide-sparkles',
title: 'Einfach zu bedienen',
description: 'Nutzerfreundliche, selbsterklärende Oberfläche mit geführten Eingaben reduziert Schulungsaufwand.'
},
{
icon: 'i-lucide-settings',
title: 'Hohe Anpassbarkeit',
description:
'Templates, Felder und Prozessschritte lassen sich auf Organisation und Abläufe konkret anpassen (auf Anfrage).'
},
{
icon: 'i-lucide-headphones',
title: 'Persönlicher Support',
description: 'Bei Fragen steht Ihnen unser Support-Team zur Verfügung schnell, kompetent und auf Deutsch.'
}
] ]
const features = computed(() =>
featureIcons.map((icon, index) => ({
icon,
title: t(`additionalFeatures.items[${index}].title`),
description: t(`additionalFeatures.items[${index}].description`)
}))
)
</script> </script>

View File

@@ -11,19 +11,20 @@
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent-100 dark:bg-accent-900/30 text-accent-700 dark:text-accent-300 text-sm font-medium mb-4" class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent-100 dark:bg-accent-900/30 text-accent-700 dark:text-accent-300 text-sm font-medium mb-4"
> >
<UIcon name="i-lucide-building-2" class="w-4 h-4" /> <UIcon name="i-lucide-building-2" class="w-4 h-4" />
Für Unternehmen {{ $t('company.badge') }}
</span> </span>
<h2 <h2
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white" class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white"
> >
Vorteile für <span class="gradient-text">Unternehmen</span> {{ $t('company.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('company.titleHighlight') }}</span>
</h2> </h2>
</div> </div>
</template> </template>
<template #description> <template #description>
<p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto"> <p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
Schneller zur abgestimmten Einführung von IT- und KI-Systemen mit planbaren Timelines. {{ $t('company.description') }}
</p> </p>
</template> </template>
@@ -38,8 +39,10 @@
<UIcon name="i-lucide-x" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-x" class="w-6 h-6 text-white" />
</div> </div>
<div> <div>
<h3 class="font-heading text-xl font-bold text-gray-900 dark:text-white">Weg von</h3> <h3 class="font-heading text-xl font-bold text-gray-900 dark:text-white">
<p class="text-sm text-gray-500 dark:text-gray-400">Typische Herausforderungen</p> {{ $t('company.awayFrom.title') }}
</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">{{ $t('company.awayFrom.subtitle') }}</p>
</div> </div>
</div> </div>
@@ -69,8 +72,10 @@
<UIcon name="i-lucide-check" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-check" class="w-6 h-6 text-white" />
</div> </div>
<div> <div>
<h3 class="font-heading text-xl font-bold text-gray-900 dark:text-white">Hin zu</h3> <h3 class="font-heading text-xl font-bold text-gray-900 dark:text-white">
<p class="text-sm text-gray-500 dark:text-gray-400">Mit LegalConsentHub</p> {{ $t('company.towards.title') }}
</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">{{ $t('company.towards.subtitle') }}</p>
</div> </div>
</div> </div>
@@ -96,7 +101,8 @@
<div class="mt-12"> <div class="mt-12">
<div class="section-divider mb-8" /> <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"> <h3 class="font-heading text-2xl sm:text-3xl text-gray-900 dark:text-white text-center mb-10">
So wirkt es in der <span class="gradient-text">Praxis</span> {{ $t('company.highlightsTitle', { highlight: '' })
}}<span class="gradient-text">{{ $t('company.highlightsTitleHighlight') }}</span>
</h3> </h3>
<div class="grid sm:grid-cols-3 gap-6"> <div class="grid sm:grid-cols-3 gap-6">
@@ -124,62 +130,48 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const painPoints = [ const { t } = useI18n()
{
icon: 'i-lucide-refresh-cw', const painPointIcons = [
text: 'Unkalkulierbare Schleifen im Mitbestimmungsverfahren (fehlende Infos, Nachforderungen)' 'i-lucide-refresh-cw',
}, 'i-lucide-ban',
{ icon: 'i-lucide-ban', text: 'Verzögerungen, Projektstopps und Last-Minute-Änderungen kurz vor Go-live' }, 'i-lucide-files',
{ icon: 'i-lucide-files', text: 'Hoher Koordinationsaufwand (E-Mail/Excel/Word) und Versionschaos' }, 'i-lucide-puzzle',
{ 'i-lucide-help-circle',
icon: 'i-lucide-puzzle', 'i-lucide-hourglass',
text: 'Komplexität und Reibung durch uneinheitliche Prozesse und unterschiedliche Erwartungshaltungen' 'i-lucide-wallet'
},
{ icon: 'i-lucide-help-circle', text: 'Unklarer Änderungsumfang bei Updates/Modulerweiterungen' },
{ icon: 'i-lucide-hourglass', text: 'Verlust wertvoller Zeit und begrenzter Ressourcen' },
{ icon: 'i-lucide-wallet', text: 'Vermeidbare Kosten (Einigungsstelle, externe Beratung, Eskalationen)' }
] ]
const benefits = [ const benefitIcons = [
{ 'i-lucide-calendar-check',
icon: 'i-lucide-calendar-check', 'i-lucide-users',
text: 'Planbare, schnellere Verfahren durch Standardisierung & klare Prozessschritte' 'i-lucide-gauge',
}, 'i-lucide-thumbs-up',
{ 'i-lucide-file-check-2',
icon: 'i-lucide-users', 'i-lucide-sparkles'
text: 'Bessere Zusammenarbeit mit BR/PR durch Transparenz und nachvollziehbare Dokumentation'
},
{
icon: 'i-lucide-gauge',
text: 'Risikobasierter Ansatz: Schnellverfahren für Standard-/Low-Risk-Systeme, Fokus auf High-Risk'
},
{
icon: 'i-lucide-thumbs-up',
text: 'Höhere Einigungswahrscheinlichkeit, weil die Verhandlungsgrundlage strukturiert ist'
},
{
icon: 'i-lucide-file-check-2',
text: 'Qualitativ konsistente, robuste Betriebs-/Dienstvereinbarungen (auch bei Änderungen updatefähig)'
},
{ icon: 'i-lucide-sparkles', text: 'Entlastung von Fachbereichen/IT/HR mehr Zeit für Wertschöpfung' }
] ]
const highlights = [ const highlightIcons = ['i-lucide-repeat', 'i-lucide-rocket', 'i-lucide-refresh-cw']
{
icon: 'i-lucide-repeat', const painPoints = computed(() =>
title: 'Weniger Iterationen', painPointIcons.map((icon, index) => ({
description: 'Unterlagen sind vollständig und vergleichbar Nachforderungen sinken.' icon,
}, text: t(`company.painPoints[${index}]`)
{ }))
icon: 'i-lucide-rocket', )
title: 'Schneller zur Freigabe',
description: 'Klare Schritte statt „Hauruck" und kurzfristiger Umplanungen.' const benefits = computed(() =>
}, benefitIcons.map((icon, index) => ({
{ icon,
icon: 'i-lucide-refresh-cw', text: t(`company.benefits[${index}]`)
title: 'Change-ready', }))
description: )
'Updates, neue Module oder neue Auswertungen werden strukturiert nachgezogen, ohne jedes Mal neu zu starten.'
} const highlights = computed(() =>
] highlightIcons.map((icon, index) => ({
icon,
title: t(`company.highlights[${index}].title`),
description: t(`company.highlights[${index}].description`)
}))
)
</script> </script>

View File

@@ -11,19 +11,20 @@
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" 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" /> <UIcon name="i-lucide-users" class="w-4 h-4" />
Für Betriebsräte {{ $t('worksCouncil.badge') }}
</span> </span>
<h2 <h2
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white" class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white"
> >
Vorteile für <span class="gradient-text">Betriebsräte</span> {{ $t('worksCouncil.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('worksCouncil.titleHighlight') }}</span>
</h2> </h2>
</div> </div>
</template> </template>
<template #description> <template #description>
<p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto"> <p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
Weg von Informationsjagd und Blackbox-Systemen hin zu Transparenz und belastbaren Vereinbarungen. {{ $t('worksCouncil.description') }}
</p> </p>
</template> </template>
@@ -42,7 +43,7 @@
@click="activeTab = 'pain'" @click="activeTab = 'pain'"
> >
<UIcon name="i-lucide-x-circle" class="w-4 h-4 inline mr-2" /> <UIcon name="i-lucide-x-circle" class="w-4 h-4 inline mr-2" />
Weg von {{ $t('worksCouncil.tabs.awayFrom') }}
</button> </button>
<button <button
:class="[ :class="[
@@ -54,7 +55,7 @@
@click="activeTab = 'benefit'" @click="activeTab = 'benefit'"
> >
<UIcon name="i-lucide-check-circle" class="w-4 h-4 inline mr-2" /> <UIcon name="i-lucide-check-circle" class="w-4 h-4 inline mr-2" />
Hin zu {{ $t('worksCouncil.tabs.towards') }}
</button> </button>
</div> </div>
</div> </div>
@@ -117,7 +118,8 @@
<div class="mt-12"> <div class="mt-12">
<div class="section-divider mb-8" /> <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"> <h3 class="font-heading text-2xl sm:text-3xl text-gray-900 dark:text-white text-center mb-10">
So hilft es im <span class="gradient-text">Alltag</span> {{ $t('worksCouncil.highlightsTitle', { highlight: '' })
}}<span class="gradient-text">{{ $t('worksCouncil.highlightsTitleHighlight') }}</span>
</h3> </h3>
<div class="grid sm:grid-cols-3 gap-6"> <div class="grid sm:grid-cols-3 gap-6">
@@ -145,65 +147,51 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const { t } = useI18n()
const activeTab = ref<'pain' | 'benefit'>('benefit') const activeTab = ref<'pain' | 'benefit'>('benefit')
const painPoints = [ const painPointIcons = [
{ 'i-lucide-search',
icon: 'i-lucide-search', 'i-lucide-git-branch',
text: 'Informationen zu IT-/KI-Systemen mühsam zusammensuchen (E-Mails, PDFs, PowerPoint, Excel-Chaos)' 'i-lucide-timer',
}, 'i-lucide-brain',
{ icon: 'i-lucide-git-branch', text: 'Medienbrüche, Versionschaos und wiederkehrende Rückfragen' }, 'i-lucide-eye-off',
{ icon: 'i-lucide-timer', text: 'Ad-hoc-Systemeinführungen unter Zeitdruck („Hauruck" statt Prozess)' }, 'i-lucide-file-question',
{ icon: 'i-lucide-brain', text: 'Überforderung durch Menge und Komplexität der Systeme' }, 'i-lucide-calendar-x'
{ icon: 'i-lucide-eye-off', text: 'Blackbox bei Funktionen, Auswertungen, Schnittstellen und Änderungen' },
{ icon: 'i-lucide-file-question', text: 'Verhandlungen ohne belastbare Datenbasis' },
{ icon: 'i-lucide-calendar-x', text: 'Heute geregelt, morgen veraltet' }
] ]
const benefits = [ const benefitIcons = [
{ 'i-lucide-layout-list',
icon: 'i-lucide-layout-list', 'i-lucide-route',
text: 'Strukturierte, vollständige Informationsgrundlage (einheitlich je System/Verarbeitung)' 'i-lucide-file-check',
}, 'i-lucide-scan-eye',
{ icon: 'i-lucide-route', text: 'Klarer Mitbestimmungsprozess mit bewährten Schritten und Zuständigkeiten' }, 'i-lucide-git-compare',
{ 'i-lucide-clock',
icon: 'i-lucide-file-check', 'i-lucide-shield-check',
text: 'Betriebs-/Dienstvereinbarungen auf belastbarer Grundlage schneller, konsistenter, leicht aktualisierbar' 'i-lucide-heart-handshake'
},
{
icon: 'i-lucide-scan-eye',
text: 'Transparenz über Systemfähigkeiten inkl. möglicher Leistungs-/Verhaltenskontrolle'
},
{
icon: 'i-lucide-git-compare',
text: 'Vergleichbarkeit über viele Systeme hinweg durch Standardisierung und einheitliche Templates'
},
{ icon: 'i-lucide-clock', text: 'Große Zeitersparnis gegenüber konventionellem Verfahren' },
{
icon: 'i-lucide-shield-check',
text: 'Schutzmaßnahmen konsequent dokumentiert und pro Auswertung/Verarbeitung nachvollziehbar'
},
{
icon: 'i-lucide-heart-handshake',
text: 'Spürbare Entlastung: mehr Zeit für andere Mitbestimmungsthemen und kontinuierlichen Arbeitnehmerschutz'
}
] ]
const highlights = [ const highlightIcons = ['i-lucide-zap', 'i-lucide-handshake', 'i-lucide-shield']
{
icon: 'i-lucide-zap', const painPoints = computed(() =>
title: 'Schneller prüfen', painPointIcons.map((icon, index) => ({
description: 'Relevante Funktionen und Risiken sind auf einen Blick sichtbar.' icon,
}, text: t(`worksCouncil.painPoints[${index}]`)
{ }))
icon: 'i-lucide-handshake', )
title: 'Besser verhandeln',
description: 'Klare, konsistente Unterlagen statt Interpretationsspielräumen.' const benefits = computed(() =>
}, benefitIcons.map((icon, index) => ({
{ icon,
icon: 'i-lucide-shield', text: t(`worksCouncil.benefits[${index}]`)
title: 'Nachhaltig absichern', }))
description: 'Änderungen und neue Auswertungen lassen sich strukturiert nachziehen.' )
}
] const highlights = computed(() =>
highlightIcons.map((icon, index) => ({
icon,
title: t(`worksCouncil.highlights[${index}].title`),
description: t(`worksCouncil.highlights[${index}].description`)
}))
)
</script> </script>

View File

@@ -30,16 +30,15 @@
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/20 backdrop-blur-sm text-white text-sm font-medium mb-6" class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/20 backdrop-blur-sm text-white text-sm font-medium mb-6"
> >
<UIcon name="i-lucide-users" class="w-4 h-4" /> <UIcon name="i-lucide-users" class="w-4 h-4" />
Expertennetzwerk {{ $t('expertAccess.badge') }}
</span> </span>
<h2 class="font-heading text-3xl sm:text-4xl lg:text-5xl font-bold text-white mb-6 animate-fade-in-up"> <h2 class="font-heading text-3xl sm:text-4xl lg:text-5xl font-bold text-white mb-6 animate-fade-in-up">
Externer Sachverstand direkt aus dem Verfahren {{ $t('expertAccess.title') }}
</h2> </h2>
<p class="text-lg text-white/90 mb-8 animate-fade-in-up" style="animation-delay: 100ms"> <p class="text-lg text-white/90 mb-8 animate-fade-in-up" style="animation-delay: 100ms">
Wenn Betriebsparteien bei einzelnen Fragen nicht weiterkommen, kann optional externer Sachverstand direkt im {{ $t('expertAccess.description') }}
System angefragt werden. Anfragen, Rückfragen und Ergebnisse bleiben nachvollziehbar dokumentiert.
</p> </p>
<!-- CTA buttons --> <!-- CTA buttons -->
@@ -52,7 +51,7 @@
size="xl" size="xl"
class="bg-white text-primary-700 hover:bg-white/90 px-8 py-4 text-lg font-semibold rounded-xl shadow-lg" class="bg-white text-primary-700 hover:bg-white/90 px-8 py-4 text-lg font-semibold rounded-xl shadow-lg"
> >
Kontakt aufnehmen {{ $t('expertAccess.cta.contact') }}
<UIcon name="i-lucide-arrow-right" class="w-5 h-5 ml-2" /> <UIcon name="i-lucide-arrow-right" class="w-5 h-5 ml-2" />
</UButton> </UButton>
<UButton <UButton
@@ -60,7 +59,7 @@
size="xl" size="xl"
class="bg-white/10 text-white border-2 border-white/30 hover:bg-white/20 px-8 py-4 text-lg font-semibold rounded-xl backdrop-blur-sm" class="bg-white/10 text-white border-2 border-white/30 hover:bg-white/20 px-8 py-4 text-lg font-semibold rounded-xl backdrop-blur-sm"
> >
Mehr erfahren {{ $t('expertAccess.cta.learnMore') }}
</UButton> </UButton>
</div> </div>
</div> </div>
@@ -125,8 +124,8 @@
<div class="w-12 h-12 rounded-xl bg-white/20 flex items-center justify-center mb-4"> <div class="w-12 h-12 rounded-xl bg-white/20 flex items-center justify-center mb-4">
<UIcon name="i-lucide-scale" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-scale" class="w-6 h-6 text-white" />
</div> </div>
<h4 class="font-heading font-bold text-white mb-1">Arbeitsrecht</h4> <h4 class="font-heading font-bold text-white mb-1">{{ $t('expertAccess.experts.labor.title') }}</h4>
<p class="text-sm text-white/70">Fachanwälte für Arbeitsrecht</p> <p class="text-sm text-white/70">{{ $t('expertAccess.experts.labor.description') }}</p>
</div> </div>
</div> </div>
@@ -138,8 +137,10 @@
<div class="w-12 h-12 rounded-xl bg-white/20 flex items-center justify-center mb-4"> <div class="w-12 h-12 rounded-xl bg-white/20 flex items-center justify-center mb-4">
<UIcon name="i-lucide-cpu" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-cpu" class="w-6 h-6 text-white" />
</div> </div>
<h4 class="font-heading font-bold text-white mb-1">Technik</h4> <h4 class="font-heading font-bold text-white mb-1">
<p class="text-sm text-white/70">IT-Sachverständige</p> {{ $t('expertAccess.experts.technical.title') }}
</h4>
<p class="text-sm text-white/70">{{ $t('expertAccess.experts.technical.description') }}</p>
</div> </div>
</div> </div>
@@ -156,8 +157,10 @@
<UIcon name="i-lucide-file-check" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-file-check" class="w-6 h-6 text-white" />
</div> </div>
<div> <div>
<h4 class="font-heading font-bold text-white mb-1">Direkt im Verfahren</h4> <h4 class="font-heading font-bold text-white mb-1">
<p class="text-sm text-white/70">Dokumentiert & nachvollziehbar</p> {{ $t('expertAccess.experts.process.title') }}
</h4>
<p class="text-sm text-white/70">{{ $t('expertAccess.experts.process.description') }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -171,5 +174,5 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// No additional script needed // No additional script needed - using $t() from i18n
</script> </script>

View File

@@ -10,24 +10,21 @@
<span <span
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-cyan-100 dark:bg-cyan-900/30 text-cyan-700 dark:text-cyan-300 text-sm font-medium mb-4" class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-cyan-100 dark:bg-cyan-900/30 text-cyan-700 dark:text-cyan-300 text-sm font-medium mb-4"
> >
<UIcon <UIcon name="i-lucide-sparkles" class="w-4 h-4" />
name="i-lucide-sparkles" {{ $t('features.badge') }}
class="w-4 h-4"
/>
Features
</span> </span>
<h2 <h2
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white" class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white"
> >
Features, die Mitbestimmung <span class="gradient-text">effizient</span> machen {{ $t('features.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('features.titleHighlight') }}</span>
</h2> </h2>
</div> </div>
</template> </template>
<template #description> <template #description>
<p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-3xl mx-auto"> <p class="text-center text-lg text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
Eine strukturierte Eingabelogik, klare Prozesse und revisionssichere Dokumentation damit IT-/KI-Systeme {{ $t('features.description') }}
schneller bewertet, abgestimmt und sauber vereinbart werden können.
</p> </p>
</template> </template>
@@ -49,57 +46,25 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const features = [ const { t } = useI18n()
{
icon: 'i-lucide-route', const featureIcons = [
title: 'Geführter Mitbestimmungsprozess', 'i-lucide-route',
description: 'i-lucide-shield-alert',
'Vorgegebene, erweiterbare Eingabeparameter strukturieren den gesamten Ablauf von der Systembeschreibung bis zur Vereinbarung.' 'i-lucide-gauge',
}, 'i-lucide-history',
{ 'i-lucide-message-square',
icon: 'i-lucide-shield-alert', 'i-lucide-file-text',
title: 'Risikobasierter Assistent', 'i-lucide-pen-tool',
description: 'i-lucide-bell',
'Ein regelbasierter, risikoorientierter Assistent passt die Eingabemaske an Komplexität, Umfang und Potenziale zur Leistungs-/Verhaltensauswertung an.' 'i-lucide-shield-check'
},
{
icon: 'i-lucide-gauge',
title: 'Ampelsystem & Direktfeedback',
description:
'Kritikalität wird transparent bewertet und direkt beim Ausfüllen zurückgespielt für schnelle Orientierung und weniger Schleifen.'
},
{
icon: 'i-lucide-history',
title: 'Versionierung & Audit-Trail',
description:
'Änderungen werden versioniert und lückenlos nachvollziehbar dokumentiert inklusive Historie und Vergleich.'
},
{
icon: 'i-lucide-message-square',
title: 'Zusammenarbeit per Kommentaren',
description: 'Inline-Kommentare ermöglichen Abstimmung direkt an einzelnen Inhalten ohne Medienbrüche.'
},
{
icon: 'i-lucide-file-text',
title: 'Automatische BV-/DV-Generierung',
description:
'Nach Abschluss der Eingaben erzeugt das System strukturierte, übersichtliche und signaturbereite Betriebs-/Dienstvereinbarungen.'
},
{
icon: 'i-lucide-pen-tool',
title: 'Signaturfähig mit QES (eIDAS)',
description: 'Optional rechtsverbindliche Unterzeichnung per qualifizierter elektronischer Signatur nach eIDAS.'
},
{
icon: 'i-lucide-bell',
title: 'Benachrichtigungen & News-Center',
description: 'Aktuell bleiben über Status-Updates, Änderungen und Aufgaben per Nachrichten-Center und E-Mail.'
},
{
icon: 'i-lucide-shield-check',
title: 'SSO & Governance',
description:
'SSO-Integration via SAML oder OIDC sowie ein umfangreich konfigurierbares Rollen- und Berechtigungskonzept.'
}
] ]
const features = computed(() =>
featureIcons.map((icon, index) => ({
icon,
title: t(`features.items[${index}].title`),
description: t(`features.items[${index}].description`)
}))
)
</script> </script>

View File

@@ -11,19 +11,18 @@
class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent-100 dark:bg-accent-900/30 text-accent-700 dark:text-accent-300 text-sm font-medium mb-6" class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent-100 dark:bg-accent-900/30 text-accent-700 dark:text-accent-300 text-sm font-medium mb-6"
> >
<UIcon name="i-lucide-file-text" class="w-4 h-4" /> <UIcon name="i-lucide-file-text" class="w-4 h-4" />
Optional verfügbar {{ $t('frameworkAgreement.badge') }}
</span> </span>
<h2 <h2
class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white mb-6" class="font-heading text-3xl sm:text-4xl lg:text-5xl text-pretty tracking-tight font-bold text-gray-900 dark:text-white mb-6"
> >
Rahmenbetriebsvereinbarung <span class="gradient-text">IT/KI</span> {{ $t('frameworkAgreement.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('frameworkAgreement.titleHighlight') }}</span>
</h2> </h2>
<p class="text-lg text-gray-600 dark:text-gray-300 mb-8"> <p class="text-lg text-gray-600 dark:text-gray-300 mb-8">
Für den Einstieg stellen wir auf Nachfrage eine optionale Rahmenbetriebs-/Rahmendienstvereinbarung für IT- und {{ $t('frameworkAgreement.description') }}
KI-Systeme bereit. Sie ist auf die Struktur des Tools zugeschnitten und enthält praxiserprobte
Regelungsbausteine.
</p> </p>
<!-- Animated checklist --> <!-- Animated checklist -->
@@ -54,8 +53,8 @@
<UIcon name="i-lucide-tag" class="w-5 h-5 text-white" /> <UIcon name="i-lucide-tag" class="w-5 h-5 text-white" />
</div> </div>
<div> <div>
<p class="text-sm text-gray-500 dark:text-gray-400">Preis</p> <p class="text-sm text-gray-500 dark:text-gray-400">{{ $t('common.price') }}</p>
<p class="font-heading text-lg font-bold text-gray-900 dark:text-white">Auf Anfrage</p> <p class="font-heading text-lg font-bold text-gray-900 dark:text-white">{{ $t('common.onRequest') }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -67,7 +66,7 @@
size="xl" size="xl"
class="btn-gradient px-8 py-4 text-lg font-semibold rounded-xl shadow-lg shadow-primary-500/25" class="btn-gradient px-8 py-4 text-lg font-semibold rounded-xl shadow-lg shadow-primary-500/25"
> >
<span>Mehr erfahren</span> <span>{{ $t('common.learnMore') }}</span>
<UIcon name="i-lucide-arrow-right" class="w-5 h-5 ml-2" /> <UIcon name="i-lucide-arrow-right" class="w-5 h-5 ml-2" />
</UButton> </UButton>
</div> </div>
@@ -99,8 +98,10 @@
<UIcon name="i-lucide-file-text" class="w-6 h-6 text-white" /> <UIcon name="i-lucide-file-text" class="w-6 h-6 text-white" />
</div> </div>
<div> <div>
<h4 class="font-heading font-bold text-white text-lg">Rahmen-BV IT/KI</h4> <h4 class="font-heading font-bold text-white text-lg">
<p class="text-sm text-white/80">Betriebsvereinbarung Vorlage</p> {{ $t('frameworkAgreement.document.title') }}
</h4>
<p class="text-sm text-white/80">{{ $t('frameworkAgreement.document.subtitle') }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -110,7 +111,7 @@
<!-- Table of contents --> <!-- Table of contents -->
<div class="space-y-4"> <div class="space-y-4">
<div class="text-xs uppercase tracking-wider text-gray-500 dark:text-gray-400 font-semibold"> <div class="text-xs uppercase tracking-wider text-gray-500 dark:text-gray-400 font-semibold">
Inhaltsverzeichnis {{ $t('frameworkAgreement.document.tableOfContents') }}
</div> </div>
<!-- Section items with staggered animation --> <!-- Section items with staggered animation -->
@@ -142,11 +143,13 @@
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<UIcon name="i-lucide-layers" class="w-4 h-4 text-gray-400" /> <UIcon name="i-lucide-layers" class="w-4 h-4 text-gray-400" />
<span class="text-xs text-gray-500 dark:text-gray-400">12 Regelungsbausteine</span> <span class="text-xs text-gray-500 dark:text-gray-400">{{
$t('frameworkAgreement.document.regulationBlocks')
}}</span>
</div> </div>
<UBadge color="success" variant="soft" size="sm"> <UBadge color="success" variant="soft" size="sm">
<UIcon name="i-lucide-check-circle" class="w-3 h-3 mr-1" /> <UIcon name="i-lucide-check-circle" class="w-3 h-3 mr-1" />
Praxiserprobt {{ $t('frameworkAgreement.document.fieldTested') }}
</UBadge> </UBadge>
</div> </div>
</div> </div>
@@ -159,7 +162,7 @@
class="bg-gradient-to-r from-accent-500 to-violet-500 text-white px-4 py-2 rounded-full shadow-lg text-sm font-semibold flex items-center gap-2" class="bg-gradient-to-r from-accent-500 to-violet-500 text-white px-4 py-2 rounded-full shadow-lg text-sm font-semibold flex items-center gap-2"
> >
<UIcon name="i-lucide-download" class="w-4 h-4" /> <UIcon name="i-lucide-download" class="w-4 h-4" />
Auf Anfrage {{ $t('common.onRequest') }}
</div> </div>
</div> </div>
</div> </div>
@@ -177,34 +180,21 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const { t } = useI18n()
const isHovered = ref(false) const isHovered = ref(false)
const bulletPoints = [ const bulletPointCount = 3
'Vorlage für eine Rahmen-BV/DV zu IT- und KI-Systemen', const bulletPoints = computed(() =>
'Auf die Tool-Logik und Dokumentationsstruktur zugeschnitten', Array.from({ length: bulletPointCount }, (_, index) => t(`frameworkAgreement.bulletPoints[${index}]`))
'Enthält praxiserprobte Regelungsbausteine als Startpunkt für systembezogene Vereinbarungen' )
]
const documentSections = [ const sectionIcons = ['i-lucide-target', 'i-lucide-git-branch', 'i-lucide-shield', 'i-lucide-refresh-cw']
{
title: 'Geltungsbereich', const documentSections = computed(() =>
description: 'Definition der betroffenen Systeme', sectionIcons.map((icon, index) => ({
icon: 'i-lucide-target' icon,
}, title: t(`frameworkAgreement.document.sections[${index}].title`),
{ description: t(`frameworkAgreement.document.sections[${index}].description`)
title: 'Mitbestimmungsverfahren', }))
description: 'Prozessschritte und Zuständigkeiten', )
icon: 'i-lucide-git-branch'
},
{
title: 'Datenschutz & Kontrolle',
description: 'Schutzmaßnahmen und Auswertungen',
icon: 'i-lucide-shield'
},
{
title: 'Änderungsmanagement',
description: 'Updates und Erweiterungen',
icon: 'i-lucide-refresh-cw'
}
]
</script> </script>

View File

@@ -39,17 +39,17 @@
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary-400 opacity-75" /> <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary-400 opacity-75" />
<span class="relative inline-flex rounded-full h-2 w-2 bg-primary-500" /> <span class="relative inline-flex rounded-full h-2 w-2 bg-primary-500" />
</span> </span>
Jetzt verfügbar {{ $t('hero.badge') }}
</span> </span>
</div> </div>
<!-- Title with gradient text --> <!-- Title with gradient text -->
<h1 class="font-heading text-4xl sm:text-5xl md:text-6xl lg:text-7xl tracking-tight mb-6"> <h1 class="font-heading text-4xl sm:text-5xl md:text-6xl lg:text-7xl tracking-tight mb-6">
<span class="animate-fade-in-up block text-gray-900 dark:text-white" style="animation-delay: 100ms"> <span class="animate-fade-in-up block text-gray-900 dark:text-white" style="animation-delay: 100ms">
Digitale Mitbestimmung {{ $t('hero.title1') }}
</span> </span>
<span class="animate-fade-in-up block gradient-text" style="animation-delay: 200ms"> <span class="animate-fade-in-up block gradient-text" style="animation-delay: 200ms">
für IT- und KI-Systeme {{ $t('hero.title2') }}
</span> </span>
</h1> </h1>
@@ -58,7 +58,7 @@
class="animate-fade-in-up text-lg sm:text-xl text-gray-600 dark:text-gray-300 max-w-2xl mx-auto mb-10" class="animate-fade-in-up text-lg sm:text-xl text-gray-600 dark:text-gray-300 max-w-2xl mx-auto mb-10"
style="animation-delay: 300ms" style="animation-delay: 300ms"
> >
{{ description }} {{ $t('hero.description') }}
</p> </p>
<!-- CTA Buttons --> <!-- CTA Buttons -->
@@ -69,7 +69,7 @@
trailing-icon="i-lucide-arrow-right" trailing-icon="i-lucide-arrow-right"
class="btn-gradient px-8 py-4 text-lg font-semibold rounded-xl shadow-lg shadow-primary-500/25 hover:shadow-xl hover:shadow-primary-500/30 transition-all" class="btn-gradient px-8 py-4 text-lg font-semibold rounded-xl shadow-lg shadow-primary-500/25 hover:shadow-xl hover:shadow-primary-500/30 transition-all"
> >
<span>Demo anfragen</span> <span>{{ $t('hero.cta.requestDemo') }}</span>
</UButton> </UButton>
<UButton <UButton
size="xl" size="xl"
@@ -77,7 +77,7 @@
variant="outline" variant="outline"
class="btn-outline-gradient px-8 py-4 text-lg font-semibold rounded-xl" class="btn-outline-gradient px-8 py-4 text-lg font-semibold rounded-xl"
> >
Features entdecken {{ $t('hero.cta.discoverFeatures') }}
</UButton> </UButton>
</div> </div>
</div> </div>
@@ -97,8 +97,10 @@
<UIcon name="i-lucide-alert-triangle" class="w-5 h-5 text-white" /> <UIcon name="i-lucide-alert-triangle" class="w-5 h-5 text-white" />
</div> </div>
<div> <div>
<p class="font-semibold text-gray-900 dark:text-white text-sm">Risikoprüfung</p> <p class="font-semibold text-gray-900 dark:text-white text-sm">
<p class="text-xs text-gray-500 dark:text-gray-400">3 Punkte offen</p> {{ $t('hero.cards.riskAssessment') }}
</p>
<p class="text-xs text-gray-500 dark:text-gray-400">{{ $t('hero.cards.pointsOpen') }}</p>
</div> </div>
</div> </div>
<div class="space-y-2"> <div class="space-y-2">
@@ -106,19 +108,19 @@
<div class="w-4 h-4 rounded bg-warning-100 dark:bg-warning-900/50 flex items-center justify-center"> <div class="w-4 h-4 rounded bg-warning-100 dark:bg-warning-900/50 flex items-center justify-center">
<UIcon name="i-lucide-clock" class="w-2.5 h-2.5 text-warning-600" /> <UIcon name="i-lucide-clock" class="w-2.5 h-2.5 text-warning-600" />
</div> </div>
<span class="text-xs text-gray-600 dark:text-gray-300">Datenschutz-Folgenabschätzung</span> <span class="text-xs text-gray-600 dark:text-gray-300">{{ $t('hero.cards.privacyImpact') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<div class="w-4 h-4 rounded bg-warning-100 dark:bg-warning-900/50 flex items-center justify-center"> <div class="w-4 h-4 rounded bg-warning-100 dark:bg-warning-900/50 flex items-center justify-center">
<UIcon name="i-lucide-clock" class="w-2.5 h-2.5 text-warning-600" /> <UIcon name="i-lucide-clock" class="w-2.5 h-2.5 text-warning-600" />
</div> </div>
<span class="text-xs text-gray-600 dark:text-gray-300">Leistungskontrolle prüfen</span> <span class="text-xs text-gray-600 dark:text-gray-300">{{ $t('hero.cards.performanceCheck') }}</span>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<div class="w-4 h-4 rounded bg-success-100 dark:bg-success-900/50 flex items-center justify-center"> <div class="w-4 h-4 rounded bg-success-100 dark:bg-success-900/50 flex items-center justify-center">
<UIcon name="i-lucide-check" class="w-2.5 h-2.5 text-success-600" /> <UIcon name="i-lucide-check" class="w-2.5 h-2.5 text-success-600" />
</div> </div>
<span class="text-xs text-gray-600 dark:text-gray-300">Zugriffsrechte definiert</span> <span class="text-xs text-gray-600 dark:text-gray-300">{{ $t('hero.cards.accessDefined') }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -139,10 +141,10 @@
</div> </div>
<div> <div>
<p class="font-semibold text-gray-900 dark:text-white text-sm">Microsoft 365</p> <p class="font-semibold text-gray-900 dark:text-white text-sm">Microsoft 365</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Betriebsvereinbarung</p> <p class="text-xs text-gray-500 dark:text-gray-400">{{ $t('hero.cards.operatingAgreement') }}</p>
</div> </div>
</div> </div>
<UBadge color="primary" variant="soft" size="sm">In Bearbeitung</UBadge> <UBadge color="primary" variant="soft" size="sm">{{ $t('hero.cards.inProgress') }}</UBadge>
</div> </div>
<!-- Mock content --> <!-- Mock content -->
@@ -150,7 +152,7 @@
<!-- Progress section --> <!-- Progress section -->
<div> <div>
<div class="flex justify-between text-sm mb-2"> <div class="flex justify-between text-sm mb-2">
<span class="text-gray-600 dark:text-gray-300 font-medium">Fortschritt</span> <span class="text-gray-600 dark:text-gray-300 font-medium">{{ $t('hero.cards.progress') }}</span>
<span class="text-primary-600 dark:text-primary-400 font-semibold">67%</span> <span class="text-primary-600 dark:text-primary-400 font-semibold">67%</span>
</div> </div>
<div class="h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden"> <div class="h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden">
@@ -165,8 +167,10 @@
> >
<UIcon name="i-lucide-check-circle" class="w-5 h-5 text-success-500" /> <UIcon name="i-lucide-check-circle" class="w-5 h-5 text-success-500" />
<div> <div>
<p class="text-xs font-medium text-success-700 dark:text-success-300">8 Abschnitte</p> <p class="text-xs font-medium text-success-700 dark:text-success-300">
<p class="text-xs text-success-600 dark:text-success-400">abgeschlossen</p> {{ $t('hero.cards.sectionsCompleted') }}
</p>
<p class="text-xs text-success-600 dark:text-success-400">{{ $t('hero.cards.completed') }}</p>
</div> </div>
</div> </div>
<div <div
@@ -174,8 +178,10 @@
> >
<UIcon name="i-lucide-message-square" class="w-5 h-5 text-primary-500" /> <UIcon name="i-lucide-message-square" class="w-5 h-5 text-primary-500" />
<div> <div>
<p class="text-xs font-medium text-primary-700 dark:text-primary-300">4 Kommentare</p> <p class="text-xs font-medium text-primary-700 dark:text-primary-300">
<p class="text-xs text-primary-600 dark:text-primary-400">neu</p> {{ $t('hero.cards.commentsNew') }}
</p>
<p class="text-xs text-primary-600 dark:text-primary-400">{{ $t('hero.cards.new') }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -184,7 +190,7 @@
<button <button
class="w-full py-3 px-4 rounded-xl bg-gradient-to-r from-primary-500 to-cyan-500 text-white font-semibold text-sm hover:from-primary-600 hover:to-cyan-600 transition-all shadow-lg shadow-primary-500/25" class="w-full py-3 px-4 rounded-xl bg-gradient-to-r from-primary-500 to-cyan-500 text-white font-semibold text-sm hover:from-primary-600 hover:to-cyan-600 transition-all shadow-lg shadow-primary-500/25"
> >
Weiter bearbeiten {{ $t('hero.cards.continueEditing') }}
</button> </button>
</div> </div>
</div> </div>
@@ -202,8 +208,10 @@
<UIcon name="i-lucide-check-circle" class="w-5 h-5 text-white" /> <UIcon name="i-lucide-check-circle" class="w-5 h-5 text-white" />
</div> </div>
<div> <div>
<p class="font-semibold text-gray-900 dark:text-white text-sm">Abgeschlossen</p> <p class="font-semibold text-gray-900 dark:text-white text-sm">
<p class="text-xs text-gray-500 dark:text-gray-400">Letzte Woche</p> {{ $t('hero.cards.completedTitle') }}
</p>
<p class="text-xs text-gray-500 dark:text-gray-400">{{ $t('hero.cards.lastWeek') }}</p>
</div> </div>
</div> </div>
<div class="space-y-2"> <div class="space-y-2">
@@ -236,8 +244,8 @@
<UIcon name="i-lucide-sparkles" class="w-4 h-4 text-white" /> <UIcon name="i-lucide-sparkles" class="w-4 h-4 text-white" />
</div> </div>
<div> <div>
<p class="text-sm font-semibold text-gray-900 dark:text-white">BV erstellt!</p> <p class="text-sm font-semibold text-gray-900 dark:text-white">{{ $t('hero.cards.bvCreated') }}</p>
<p class="text-xs text-gray-500 dark:text-gray-400">Bereit zur Unterschrift</p> <p class="text-xs text-gray-500 dark:text-gray-400">{{ $t('hero.cards.readyForSignature') }}</p>
</div> </div>
</div> </div>
</div> </div>
@@ -249,7 +257,7 @@
<a <a
href="#betriebsraete" href="#betriebsraete"
class="flex items-center justify-center w-12 h-12 rounded-full glass text-gray-600 dark:text-gray-300 hover:bg-white/80 dark:hover:bg-gray-800/80 transition-colors" class="flex items-center justify-center w-12 h-12 rounded-full glass text-gray-600 dark:text-gray-300 hover:bg-white/80 dark:hover:bg-gray-800/80 transition-colors"
aria-label="Nach unten scrollen" :aria-label="$t('hero.scrollDown')"
> >
<UIcon name="i-lucide-chevron-down" class="w-6 h-6" /> <UIcon name="i-lucide-chevron-down" class="w-6 h-6" />
</a> </a>
@@ -258,6 +266,5 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const description = // No additional script needed - using $t() from i18n
'Struktur statt Hauruck: Alle relevanten Informationen an einem Ort, klare Prozessschritte und nachvollziehbare Dokumentation damit Mitbestimmung schneller, belastbarer und dauerhaft updatefähig wird.'
</script> </script>

View File

@@ -41,7 +41,8 @@
<h2 <h2
class="font-heading text-3xl sm:text-4xl font-bold text-center text-gray-900 dark:text-white mb-4 animate-fade-in-up" class="font-heading text-3xl sm:text-4xl font-bold text-center text-gray-900 dark:text-white mb-4 animate-fade-in-up"
> >
Bleiben Sie <span class="gradient-text">informiert</span> {{ $t('newsletter.title', { highlight: '' })
}}<span class="gradient-text">{{ $t('newsletter.titleHighlight') }}</span>
</h2> </h2>
<!-- Description --> <!-- Description -->
@@ -49,8 +50,7 @@
class="text-center text-lg text-gray-600 dark:text-gray-300 mb-8 animate-fade-in-up" class="text-center text-lg text-gray-600 dark:text-gray-300 mb-8 animate-fade-in-up"
style="animation-delay: 100ms" style="animation-delay: 100ms"
> >
Erhalten Sie Updates zur Entwicklung von LegalConsentHub und seien Sie unter den Ersten, die von neuen {{ $t('newsletter.description') }}
Funktionen erfahren.
</p> </p>
<!-- Form --> <!-- Form -->
@@ -66,7 +66,7 @@
<UInput <UInput
v-model="formState.email" v-model="formState.email"
type="email" type="email"
placeholder="Ihre E-Mail-Adresse" :placeholder="$t('newsletter.placeholder')"
size="xl" size="xl"
:disabled="isLoading || isSuccess" :disabled="isLoading || isSuccess"
:ui="{ :ui="{
@@ -89,10 +89,10 @@
> >
<template v-if="isSuccess"> <template v-if="isSuccess">
<UIcon name="i-lucide-check" class="w-5 h-5 mr-2" /> <UIcon name="i-lucide-check" class="w-5 h-5 mr-2" />
<span>Angemeldet!</span> <span>{{ $t('newsletter.submitted') }}</span>
</template> </template>
<template v-else> <template v-else>
<span>Anmelden</span> <span>{{ $t('newsletter.submit') }}</span>
</template> </template>
</UButton> </UButton>
</div> </div>
@@ -115,7 +115,7 @@
<div class="w-8 h-8 rounded-full bg-success-500 flex items-center justify-center"> <div class="w-8 h-8 rounded-full bg-success-500 flex items-center justify-center">
<UIcon name="i-lucide-check" class="w-5 h-5 text-white" /> <UIcon name="i-lucide-check" class="w-5 h-5 text-white" />
</div> </div>
<span class="font-medium">Vielen Dank! Wir halten Sie auf dem Laufenden.</span> <span class="font-medium">{{ $t('newsletter.success') }}</span>
</div> </div>
</div> </div>
</Transition> </Transition>
@@ -125,11 +125,13 @@
class="mt-6 text-sm text-center text-gray-500 dark:text-gray-400 animate-fade-in-up" class="mt-6 text-sm text-center text-gray-500 dark:text-gray-400 animate-fade-in-up"
style="animation-delay: 300ms" style="animation-delay: 300ms"
> >
Mit der Anmeldung stimmen Sie unserer <i18n-t keypath="newsletter.privacyNote" tag="span">
<NuxtLink to="/datenschutz" class="text-primary-600 dark:text-primary-400 hover:underline font-medium"> <template #link>
Datenschutzerklärung <NuxtLink to="/datenschutz" class="text-primary-600 dark:text-primary-400 hover:underline font-medium">
</NuxtLink> {{ $t('newsletter.privacyLink') }}
zu. Wir versenden keinen Spam. </NuxtLink>
</template>
</i18n-t>
</p> </p>
<!-- Trust indicators --> <!-- Trust indicators -->
@@ -141,19 +143,19 @@
<div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center"> <div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center">
<UIcon name="i-lucide-shield-check" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" /> <UIcon name="i-lucide-shield-check" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" />
</div> </div>
<span>DSGVO-konform</span> <span>{{ $t('newsletter.trust.gdpr') }}</span>
</div> </div>
<div class="flex items-center gap-2 text-gray-600 dark:text-gray-300"> <div class="flex items-center gap-2 text-gray-600 dark:text-gray-300">
<div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center"> <div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center">
<UIcon name="i-lucide-lock" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" /> <UIcon name="i-lucide-lock" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" />
</div> </div>
<span>Verschlüsselt</span> <span>{{ $t('newsletter.trust.encrypted') }}</span>
</div> </div>
<div class="flex items-center gap-2 text-gray-600 dark:text-gray-300"> <div class="flex items-center gap-2 text-gray-600 dark:text-gray-300">
<div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center"> <div class="w-6 h-6 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center">
<UIcon name="i-lucide-x-circle" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" /> <UIcon name="i-lucide-x-circle" class="w-3.5 h-3.5 text-success-600 dark:text-success-400" />
</div> </div>
<span>Kein Spam</span> <span>{{ $t('newsletter.trust.noSpam') }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -166,22 +168,20 @@
import { z } from 'zod' import { z } from 'zod'
import type { FormSubmitEvent } from '@nuxt/ui' import type { FormSubmitEvent } from '@nuxt/ui'
const { t } = useI18n()
const { isLoading, isSuccess, submitEmail } = useNewsletterSignup() const { isLoading, isSuccess, submitEmail } = useNewsletterSignup()
const schema = z.object({ const schema = computed(() =>
email: z z.object({
.string() email: z.string().min(1, t('newsletter.validation.required')).email(t('newsletter.validation.invalid'))
.min(1, 'Bitte geben Sie eine E-Mail-Adresse ein') })
.email('Bitte geben Sie eine gültige E-Mail-Adresse ein') )
})
type Schema = z.output<typeof schema> const formState = reactive<{ email: string }>({
const formState = reactive<Partial<Schema>>({
email: '' email: ''
}) })
async function onSubmit(event: FormSubmitEvent<Schema>) { async function onSubmit(event: FormSubmitEvent<{ email: string }>) {
await submitEmail(event.data.email) await submitEmail(event.data.email)
} }
</script> </script>

View File

@@ -29,7 +29,7 @@
<!-- Trust badges --> <!-- Trust badges -->
<div class="mt-10 pt-8 border-t border-gray-200 dark:border-gray-800"> <div class="mt-10 pt-8 border-t border-gray-200 dark:border-gray-800">
<p class="text-center text-sm text-gray-500 dark:text-gray-400 mb-8">Vertrauen & Sicherheit</p> <p class="text-center text-sm text-gray-500 dark:text-gray-400 mb-8">{{ $t('stats.trustAndSecurity') }}</p>
<div class="flex flex-wrap justify-center items-center gap-8 lg:gap-12"> <div class="flex flex-wrap justify-center items-center gap-8 lg:gap-12">
<div <div
@@ -52,22 +52,24 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const stats = [ const { t } = useI18n()
{ value: 70, suffix: '%', label: 'Zeitersparnis im Verfahren' },
{ value: 100, suffix: '%', label: 'Revisionssicher dokumentiert' },
{ value: 24, suffix: '/7', label: 'Verfügbarkeit' },
{ value: 0, suffix: '', label: 'Medienbrüche' }
]
const trustBadges = [ const stats = computed(() => [
{ icon: 'i-lucide-shield-check', label: 'DSGVO-konform' }, { value: 70, suffix: '%', label: t('stats.timeSaved') },
{ icon: 'i-lucide-server', label: 'Hosting in Deutschland' }, { value: 100, suffix: '%', label: t('stats.auditProof') },
{ icon: 'i-lucide-lock', label: 'Ende-zu-Ende verschlüsselt' }, { value: 24, suffix: '/7', label: t('stats.availability') },
{ icon: 'i-lucide-key', label: 'SSO-fähig' } { value: 0, suffix: '', label: t('stats.mediaBreaks') }
] ])
const trustBadges = computed(() => [
{ icon: 'i-lucide-shield-check', label: t('stats.badges.gdpr') },
{ icon: 'i-lucide-server', label: t('stats.badges.hosting') },
{ icon: 'i-lucide-lock', label: t('stats.badges.encrypted') },
{ icon: 'i-lucide-key', label: t('stats.badges.sso') }
])
// Animated counter values // Animated counter values
const animatedValues = ref(stats.map(() => 0)) const animatedValues = ref(stats.value.map(() => 0))
const hasAnimated = ref(false) const hasAnimated = ref(false)
// Counter animation function // Counter animation function
@@ -99,7 +101,7 @@ onMounted(() => {
entries.forEach((entry) => { entries.forEach((entry) => {
if (entry.isIntersecting && !hasAnimated.value) { if (entry.isIntersecting && !hasAnimated.value) {
hasAnimated.value = true hasAnimated.value = true
stats.forEach((stat, index) => { stats.value.forEach((stat, index) => {
setTimeout(() => { setTimeout(() => {
animateCounter(index, stat.value) animateCounter(index, stat.value)
}, index * 200) }, index * 200)

View File

@@ -1,4 +1,5 @@
export function useNewsletterSignup() { export function useNewsletterSignup() {
const { t } = useI18n()
const isLoading = ref(false) const isLoading = ref(false)
const isSuccess = ref(false) const isSuccess = ref(false)
const error = ref<string | null>(null) const error = ref<string | null>(null)
@@ -20,7 +21,7 @@ export function useNewsletterSignup() {
isSuccess.value = true isSuccess.value = true
} catch (e: unknown) { } catch (e: unknown) {
error.value = e instanceof Error ? e.message : 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.' error.value = e instanceof Error ? e.message : t('errors.generic')
throw e throw e
} finally { } finally {
isLoading.value = false isLoading.value = false

View File

@@ -30,13 +30,14 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const { t, locale } = useI18n()
// SEO Meta // SEO Meta
useSeoMeta({ useSeoMeta({
title: 'LegalConsentHub - Digitale Mitbestimmung für IT- und KI-Systeme', title: () => t('meta.title'),
description: description: () => t('meta.description'),
'Struktur statt Hauruck: Alle relevanten Informationen an einem Ort, klare Prozessschritte und nachvollziehbare Dokumentation damit Mitbestimmung schneller, belastbarer und dauerhaft updatefähig wird.', ogTitle: () => t('meta.title'),
ogTitle: 'LegalConsentHub - Digitale Mitbestimmung für IT- und KI-Systeme', ogDescription: () => t('meta.ogDescription'),
ogDescription: 'Strukturierte IT-Mitbestimmung mit klaren Prozessen und revisionssicherer Dokumentation.',
ogImage: '/og-image.png', ogImage: '/og-image.png',
ogType: 'website', ogType: 'website',
twitterCard: 'summary_large_image' twitterCard: 'summary_large_image'
@@ -44,6 +45,9 @@ useSeoMeta({
// Structured data for SEO // Structured data for SEO
useHead({ useHead({
htmlAttrs: {
lang: () => locale.value
},
script: [ script: [
{ {
type: 'application/ld+json', type: 'application/ld+json',
@@ -53,20 +57,19 @@ useHead({
name: 'LegalConsentHub', name: 'LegalConsentHub',
applicationCategory: 'BusinessApplication', applicationCategory: 'BusinessApplication',
operatingSystem: 'Web', operatingSystem: 'Web',
description: description: t('meta.description'),
'Digitale Mitbestimmung für IT- und KI-Systeme. Strukturierte Eingabelogik, klare Prozesse und revisionssichere Dokumentation.',
offers: { offers: {
'@type': 'Offer', '@type': 'Offer',
price: '0', price: '0',
priceCurrency: 'EUR', priceCurrency: 'EUR',
description: 'Kontaktieren Sie uns für Preisdetails' description: t('common.onRequest')
}, },
featureList: [ featureList: [
'Geführter Mitbestimmungsprozess', t('features.items[0].title'),
'Risikobasierter Assistent', t('features.items[1].title'),
'Versionierung & Audit-Trail', t('features.items[3].title'),
'Automatische BV-/DV-Generierung', t('features.items[5].title'),
'SSO & Governance' t('features.items[8].title')
] ]
}) })
} }

View File

@@ -0,0 +1,328 @@
{
"meta": {
"title": "LegalConsentHub - Digitale Mitbestimmung für IT- und KI-Systeme",
"description": "Struktur statt Hauruck: Alle relevanten Informationen an einem Ort, klare Prozessschritte und nachvollziehbare Dokumentation für IT-Mitbestimmung.",
"ogDescription": "Strukturierte IT-Mitbestimmung mit klaren Prozessen und revisionssicherer Dokumentation."
},
"common": {
"skipToContent": "Zum Hauptinhalt springen",
"stayInformed": "Informiert bleiben",
"learnMore": "Mehr erfahren",
"contact": "Kontakt aufnehmen",
"features": "Features",
"navigation": "Navigation",
"legal": "Rechtliches",
"allRightsReserved": "Alle Rechte vorbehalten",
"hostedInGermany": "Hosted in Germany",
"gdprCompliant": "DSGVO-konform",
"price": "Preis",
"onRequest": "Auf Anfrage"
},
"nav": {
"forWorksCouncils": "Für Betriebsräte",
"forCompanies": "Für Unternehmen",
"features": "Features",
"contact": "Kontakt"
},
"footer": {
"brandDescription": "Digitale Mitbestimmung für IT- und KI-Systeme. Strukturierte Prozesse, revisionssichere Dokumentation.",
"imprint": "Impressum",
"privacy": "Datenschutz",
"terms": "AGB"
},
"hero": {
"badge": "Jetzt verfügbar",
"title1": "Digitale Mitbestimmung",
"title2": "für IT- und KI-Systeme",
"description": "Struktur statt Hauruck: Alle relevanten Informationen an einem Ort, klare Prozessschritte und nachvollziehbare Dokumentation damit Mitbestimmung schneller, belastbarer und dauerhaft updatefähig wird.",
"cta": {
"requestDemo": "Demo anfragen",
"discoverFeatures": "Features entdecken"
},
"cards": {
"riskAssessment": "Risikoprüfung",
"pointsOpen": "3 Punkte offen",
"privacyImpact": "Datenschutz-Folgenabschätzung",
"performanceCheck": "Leistungskontrolle prüfen",
"accessDefined": "Zugriffsrechte definiert",
"operatingAgreement": "Betriebsvereinbarung",
"inProgress": "In Bearbeitung",
"progress": "Fortschritt",
"sectionsCompleted": "8 Abschnitte",
"completed": "abgeschlossen",
"commentsNew": "4 Kommentare",
"new": "neu",
"continueEditing": "Weiter bearbeiten",
"completedTitle": "Abgeschlossen",
"lastWeek": "Letzte Woche",
"bvCreated": "BV erstellt!",
"readyForSignature": "Bereit zur Unterschrift"
},
"scrollDown": "Nach unten scrollen"
},
"stats": {
"timeSaved": "Zeitersparnis im Verfahren",
"auditProof": "Revisionssicher dokumentiert",
"availability": "Verfügbarkeit",
"mediaBreaks": "Medienbrüche",
"trustAndSecurity": "Vertrauen & Sicherheit",
"badges": {
"gdpr": "DSGVO-konform",
"hosting": "Hosting in Deutschland",
"encrypted": "Ende-zu-Ende verschlüsselt",
"sso": "SSO-fähig"
}
},
"worksCouncil": {
"badge": "Für Betriebsräte",
"title": "Vorteile für {highlight}",
"titleHighlight": "Betriebsräte",
"description": "Weg von Informationsjagd und Blackbox-Systemen hin zu Transparenz und belastbaren Vereinbarungen.",
"tabs": {
"awayFrom": "Weg von",
"towards": "Hin zu"
},
"painPoints": [
"Informationen zu IT-/KI-Systemen mühsam zusammensuchen (E-Mails, PDFs, PowerPoint, Excel-Chaos)",
"Medienbrüche, Versionschaos und wiederkehrende Rückfragen",
"Ad-hoc-Systemeinführungen unter Zeitdruck (\"Hauruck\" statt Prozess)",
"Überforderung durch Menge und Komplexität der Systeme",
"Blackbox bei Funktionen, Auswertungen, Schnittstellen und Änderungen",
"Verhandlungen ohne belastbare Datenbasis",
"Heute geregelt, morgen veraltet"
],
"benefits": [
"Strukturierte, vollständige Informationsgrundlage (einheitlich je System/Verarbeitung)",
"Klarer Mitbestimmungsprozess mit bewährten Schritten und Zuständigkeiten",
"Betriebs-/Dienstvereinbarungen auf belastbarer Grundlage schneller, konsistenter, leicht aktualisierbar",
"Transparenz über Systemfähigkeiten inkl. möglicher Leistungs-/Verhaltenskontrolle",
"Vergleichbarkeit über viele Systeme hinweg durch Standardisierung und einheitliche Templates",
"Große Zeitersparnis gegenüber konventionellem Verfahren",
"Schutzmaßnahmen konsequent dokumentiert und pro Auswertung/Verarbeitung nachvollziehbar",
"Spürbare Entlastung: mehr Zeit für andere Mitbestimmungsthemen und kontinuierlichen Arbeitnehmerschutz"
],
"highlightsTitle": "So hilft es im {highlight}",
"highlightsTitleHighlight": "Alltag",
"highlights": [
{
"title": "Schneller prüfen",
"description": "Relevante Funktionen und Risiken sind auf einen Blick sichtbar."
},
{
"title": "Besser verhandeln",
"description": "Klare, konsistente Unterlagen statt Interpretationsspielräumen."
},
{
"title": "Nachhaltig absichern",
"description": "Änderungen und neue Auswertungen lassen sich strukturiert nachziehen."
}
]
},
"company": {
"badge": "Für Unternehmen",
"title": "Vorteile für {highlight}",
"titleHighlight": "Unternehmen",
"description": "Schneller zur abgestimmten Einführung von IT- und KI-Systemen mit planbaren Timelines.",
"awayFrom": {
"title": "Weg von",
"subtitle": "Typische Herausforderungen"
},
"towards": {
"title": "Hin zu",
"subtitle": "Mit LegalConsentHub"
},
"painPoints": [
"Unkalkulierbare Schleifen im Mitbestimmungsverfahren (fehlende Infos, Nachforderungen)",
"Verzögerungen, Projektstopps und Last-Minute-Änderungen kurz vor Go-live",
"Hoher Koordinationsaufwand (E-Mail/Excel/Word) und Versionschaos",
"Komplexität und Reibung durch uneinheitliche Prozesse und unterschiedliche Erwartungshaltungen",
"Unklarer Änderungsumfang bei Updates/Modulerweiterungen",
"Verlust wertvoller Zeit und begrenzter Ressourcen",
"Vermeidbare Kosten (Einigungsstelle, externe Beratung, Eskalationen)"
],
"benefits": [
"Planbare, schnellere Verfahren durch Standardisierung & klare Prozessschritte",
"Bessere Zusammenarbeit mit BR/PR durch Transparenz und nachvollziehbare Dokumentation",
"Risikobasierter Ansatz: Schnellverfahren für Standard-/Low-Risk-Systeme, Fokus auf High-Risk",
"Höhere Einigungswahrscheinlichkeit, weil die Verhandlungsgrundlage strukturiert ist",
"Qualitativ konsistente, robuste Betriebs-/Dienstvereinbarungen (auch bei Änderungen updatefähig)",
"Entlastung von Fachbereichen/IT/HR mehr Zeit für Wertschöpfung"
],
"highlightsTitle": "So wirkt es in der {highlight}",
"highlightsTitleHighlight": "Praxis",
"highlights": [
{
"title": "Weniger Iterationen",
"description": "Unterlagen sind vollständig und vergleichbar Nachforderungen sinken."
},
{
"title": "Schneller zur Freigabe",
"description": "Klare Schritte statt \"Hauruck\" und kurzfristiger Umplanungen."
},
{
"title": "Change-ready",
"description": "Updates, neue Module oder neue Auswertungen werden strukturiert nachgezogen, ohne jedes Mal neu zu starten."
}
]
},
"features": {
"badge": "Features",
"title": "Features, die Mitbestimmung {highlight} machen",
"titleHighlight": "effizient",
"description": "Eine strukturierte Eingabelogik, klare Prozesse und revisionssichere Dokumentation damit IT-/KI-Systeme schneller bewertet, abgestimmt und sauber vereinbart werden können.",
"items": [
{
"title": "Geführter Mitbestimmungsprozess",
"description": "Vorgegebene, erweiterbare Eingabeparameter strukturieren den gesamten Ablauf von der Systembeschreibung bis zur Vereinbarung."
},
{
"title": "Risikobasierter Assistent",
"description": "Ein regelbasierter, risikoorientierter Assistent passt die Eingabemaske an Komplexität, Umfang und Potenziale zur Leistungs-/Verhaltensauswertung an."
},
{
"title": "Ampelsystem & Direktfeedback",
"description": "Kritikalität wird transparent bewertet und direkt beim Ausfüllen zurückgespielt für schnelle Orientierung und weniger Schleifen."
},
{
"title": "Versionierung & Audit-Trail",
"description": "Änderungen werden versioniert und lückenlos nachvollziehbar dokumentiert inklusive Historie und Vergleich."
},
{
"title": "Zusammenarbeit per Kommentaren",
"description": "Inline-Kommentare ermöglichen Abstimmung direkt an einzelnen Inhalten ohne Medienbrüche."
},
{
"title": "Automatische BV-/DV-Generierung",
"description": "Nach Abschluss der Eingaben erzeugt das System strukturierte, übersichtliche und signaturbereite Betriebs-/Dienstvereinbarungen."
},
{
"title": "Signaturfähig mit QES (eIDAS)",
"description": "Optional rechtsverbindliche Unterzeichnung per qualifizierter elektronischer Signatur nach eIDAS."
},
{
"title": "Benachrichtigungen & News-Center",
"description": "Aktuell bleiben über Status-Updates, Änderungen und Aufgaben per Nachrichten-Center und E-Mail."
},
{
"title": "SSO & Governance",
"description": "SSO-Integration via SAML oder OIDC sowie ein umfangreich konfigurierbares Rollen- und Berechtigungskonzept."
}
]
},
"additionalFeatures": {
"badge": "Vertrauen & Sicherheit",
"title": "Weitere {highlight}",
"titleHighlight": "Vorteile",
"description": "Alles aus einer Hand ohne Drittanbieter, mit Serverstandort in Deutschland.",
"items": [
{
"title": "Keine Zusatztools erforderlich",
"description": "Keine externen Zusatzlösungen für Prozess, Abstimmung und Dokumentenerstellung alles läuft in einem System."
},
{
"title": "Hosting & Backups in Deutschland",
"description": "Betrieb und Datensicherung erfolgen in Deutschland transparente Datenflüsse ohne unerwartete Auslandsverarbeitung."
},
{
"title": "Verschlüsselte Übertragung",
"description": "Alle Verbindungen sind per TLS/HTTPS verschlüsselt, damit Inhalte und Zugangsdaten beim Transport geschützt sind."
},
{
"title": "Einfach zu bedienen",
"description": "Nutzerfreundliche, selbsterklärende Oberfläche mit geführten Eingaben reduziert Schulungsaufwand."
},
{
"title": "Hohe Anpassbarkeit",
"description": "Templates, Felder und Prozessschritte lassen sich auf Organisation und Abläufe konkret anpassen (auf Anfrage)."
},
{
"title": "Persönlicher Support",
"description": "Bei Fragen steht Ihnen unser Support-Team zur Verfügung schnell, kompetent und auf Deutsch."
}
],
"ctaQuestion": "Haben Sie Fragen zu unseren Sicherheitsstandards?",
"ctaButton": "Kontakt aufnehmen"
},
"frameworkAgreement": {
"badge": "Optional verfügbar",
"title": "Rahmenbetriebsvereinbarung {highlight}",
"titleHighlight": "IT/KI",
"description": "Für den Einstieg stellen wir auf Nachfrage eine optionale Rahmenbetriebs-/Rahmendienstvereinbarung für IT- und KI-Systeme bereit. Sie ist auf die Struktur des Tools zugeschnitten und enthält praxiserprobte Regelungsbausteine.",
"bulletPoints": [
"Vorlage für eine Rahmen-BV/DV zu IT- und KI-Systemen",
"Auf die Tool-Logik und Dokumentationsstruktur zugeschnitten",
"Enthält praxiserprobte Regelungsbausteine als Startpunkt für systembezogene Vereinbarungen"
],
"document": {
"title": "Rahmen-BV IT/KI",
"subtitle": "Betriebsvereinbarung Vorlage",
"tableOfContents": "Inhaltsverzeichnis",
"sections": [
{
"title": "Geltungsbereich",
"description": "Definition der betroffenen Systeme"
},
{
"title": "Mitbestimmungsverfahren",
"description": "Prozessschritte und Zuständigkeiten"
},
{
"title": "Datenschutz & Kontrolle",
"description": "Schutzmaßnahmen und Auswertungen"
},
{
"title": "Änderungsmanagement",
"description": "Updates und Erweiterungen"
}
],
"regulationBlocks": "12 Regelungsbausteine",
"fieldTested": "Praxiserprobt"
}
},
"newsletter": {
"title": "Bleiben Sie {highlight}",
"titleHighlight": "informiert",
"description": "Erhalten Sie Updates zur Entwicklung von LegalConsentHub und seien Sie unter den Ersten, die von neuen Funktionen erfahren.",
"placeholder": "Ihre E-Mail-Adresse",
"submit": "Anmelden",
"submitted": "Angemeldet!",
"success": "Vielen Dank! Wir halten Sie auf dem Laufenden.",
"privacyNote": "Mit der Anmeldung stimmen Sie unserer {link} zu. Wir versenden keinen Spam.",
"privacyLink": "Datenschutzerklärung",
"validation": {
"required": "Bitte geben Sie eine E-Mail-Adresse ein",
"invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein"
},
"trust": {
"gdpr": "DSGVO-konform",
"encrypted": "Verschlüsselt",
"noSpam": "Kein Spam"
}
},
"expertAccess": {
"badge": "Expertennetzwerk",
"title": "Externer Sachverstand direkt aus dem Verfahren",
"description": "Wenn Betriebsparteien bei einzelnen Fragen nicht weiterkommen, kann optional externer Sachverstand direkt im System angefragt werden. Anfragen, Rückfragen und Ergebnisse bleiben nachvollziehbar dokumentiert.",
"cta": {
"contact": "Kontakt aufnehmen",
"learnMore": "Mehr erfahren"
},
"experts": {
"labor": {
"title": "Arbeitsrecht",
"description": "Fachanwälte für Arbeitsrecht"
},
"technical": {
"title": "Technik",
"description": "IT-Sachverständige"
},
"process": {
"title": "Direkt im Verfahren",
"description": "Dokumentiert & nachvollziehbar"
}
}
},
"errors": {
"generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut."
}
}

View File

@@ -0,0 +1,328 @@
{
"meta": {
"title": "LegalConsentHub - Digital Co-determination for IT and AI Systems",
"description": "Structure instead of chaos: All relevant information in one place, clear process steps and traceable documentation for IT co-determination.",
"ogDescription": "Structured IT co-determination with clear processes and audit-proof documentation."
},
"common": {
"skipToContent": "Skip to main content",
"stayInformed": "Stay informed",
"learnMore": "Learn more",
"contact": "Contact us",
"features": "Features",
"navigation": "Navigation",
"legal": "Legal",
"allRightsReserved": "All rights reserved",
"hostedInGermany": "Hosted in Germany",
"gdprCompliant": "GDPR compliant",
"price": "Price",
"onRequest": "On request"
},
"nav": {
"forWorksCouncils": "For Works Councils",
"forCompanies": "For Companies",
"features": "Features",
"contact": "Contact"
},
"footer": {
"brandDescription": "Digital co-determination for IT and AI systems. Structured processes, audit-proof documentation.",
"imprint": "Imprint",
"privacy": "Privacy Policy",
"terms": "Terms & Conditions"
},
"hero": {
"badge": "Available now",
"title1": "Digital Co-determination",
"title2": "for IT and AI Systems",
"description": "Structure instead of chaos: All relevant information in one place, clear process steps and traceable documentation making co-determination faster, more robust and continuously updatable.",
"cta": {
"requestDemo": "Request demo",
"discoverFeatures": "Discover features"
},
"cards": {
"riskAssessment": "Risk Assessment",
"pointsOpen": "3 points open",
"privacyImpact": "Privacy impact assessment",
"performanceCheck": "Check performance monitoring",
"accessDefined": "Access rights defined",
"operatingAgreement": "Operating Agreement",
"inProgress": "In Progress",
"progress": "Progress",
"sectionsCompleted": "8 sections",
"completed": "completed",
"commentsNew": "4 comments",
"new": "new",
"continueEditing": "Continue editing",
"completedTitle": "Completed",
"lastWeek": "Last week",
"bvCreated": "Agreement created!",
"readyForSignature": "Ready for signature"
},
"scrollDown": "Scroll down"
},
"stats": {
"timeSaved": "Time saved in process",
"auditProof": "Audit-proof documented",
"availability": "Availability",
"mediaBreaks": "Media breaks",
"trustAndSecurity": "Trust & Security",
"badges": {
"gdpr": "GDPR compliant",
"hosting": "Hosting in Germany",
"encrypted": "End-to-end encrypted",
"sso": "SSO capable"
}
},
"worksCouncil": {
"badge": "For Works Councils",
"title": "Benefits for {highlight}",
"titleHighlight": "Works Councils",
"description": "Away from information hunting and black-box systems towards transparency and robust agreements.",
"tabs": {
"awayFrom": "Away from",
"towards": "Towards"
},
"painPoints": [
"Laboriously gathering information on IT/AI systems (emails, PDFs, PowerPoint, Excel chaos)",
"Media breaks, version chaos and recurring inquiries",
"Ad-hoc system introductions under time pressure (chaos instead of process)",
"Overwhelm due to the volume and complexity of systems",
"Black box for functions, evaluations, interfaces and changes",
"Negotiations without reliable data basis",
"Regulated today, outdated tomorrow"
],
"benefits": [
"Structured, complete information basis (uniform per system/processing)",
"Clear co-determination process with proven steps and responsibilities",
"Operating/service agreements on a solid basis faster, more consistent, easily updatable",
"Transparency about system capabilities including potential performance/behavior monitoring",
"Comparability across many systems through standardization and uniform templates",
"Significant time savings compared to conventional procedures",
"Protective measures consistently documented and traceable per evaluation/processing",
"Noticeable relief: more time for other co-determination topics and continuous employee protection"
],
"highlightsTitle": "How it helps in {highlight}",
"highlightsTitleHighlight": "daily work",
"highlights": [
{
"title": "Review faster",
"description": "Relevant functions and risks are visible at a glance."
},
{
"title": "Negotiate better",
"description": "Clear, consistent documentation instead of room for interpretation."
},
{
"title": "Secure sustainably",
"description": "Changes and new evaluations can be tracked in a structured way."
}
]
},
"company": {
"badge": "For Companies",
"title": "Benefits for {highlight}",
"titleHighlight": "Companies",
"description": "Faster to agreed IT and AI system implementation with predictable timelines.",
"awayFrom": {
"title": "Away from",
"subtitle": "Typical challenges"
},
"towards": {
"title": "Towards",
"subtitle": "With LegalConsentHub"
},
"painPoints": [
"Unpredictable loops in the co-determination process (missing info, follow-up requests)",
"Delays, project stops and last-minute changes shortly before go-live",
"High coordination effort (email/Excel/Word) and version chaos",
"Complexity and friction due to inconsistent processes and different expectations",
"Unclear scope of changes for updates/module extensions",
"Loss of valuable time and limited resources",
"Avoidable costs (arbitration, external consulting, escalations)"
],
"benefits": [
"Plannable, faster procedures through standardization & clear process steps",
"Better collaboration with works councils through transparency and traceable documentation",
"Risk-based approach: fast-track for standard/low-risk systems, focus on high-risk",
"Higher probability of agreement because the negotiation basis is structured",
"Qualitatively consistent, robust operating agreements (also updatable when changes occur)",
"Relief for departments/IT/HR more time for value creation"
],
"highlightsTitle": "How it works in {highlight}",
"highlightsTitleHighlight": "practice",
"highlights": [
{
"title": "Fewer iterations",
"description": "Documents are complete and comparable follow-up requests decrease."
},
{
"title": "Faster to approval",
"description": "Clear steps instead of chaos and short-term rescheduling."
},
{
"title": "Change-ready",
"description": "Updates, new modules or new evaluations are structurally tracked without starting from scratch each time."
}
]
},
"features": {
"badge": "Features",
"title": "Features that make co-determination {highlight}",
"titleHighlight": "efficient",
"description": "A structured input logic, clear processes and audit-proof documentation so IT/AI systems can be evaluated, coordinated and properly agreed upon faster.",
"items": [
{
"title": "Guided Co-determination Process",
"description": "Predefined, extensible input parameters structure the entire workflow from system description to agreement."
},
{
"title": "Risk-based Assistant",
"description": "A rule-based, risk-oriented assistant adapts the input form to complexity, scope and potential for performance/behavior evaluation."
},
{
"title": "Traffic Light System & Direct Feedback",
"description": "Criticality is transparently assessed and fed back directly during completion for quick orientation and fewer loops."
},
{
"title": "Versioning & Audit Trail",
"description": "Changes are versioned and documented traceably without gaps including history and comparison."
},
{
"title": "Collaboration via Comments",
"description": "Inline comments enable coordination directly on individual content without media breaks."
},
{
"title": "Automatic Agreement Generation",
"description": "After completing the inputs, the system generates structured, clear and signature-ready operating agreements."
},
{
"title": "Signature-ready with QES (eIDAS)",
"description": "Optionally legally binding signing via qualified electronic signature according to eIDAS."
},
{
"title": "Notifications & News Center",
"description": "Stay current on status updates, changes and tasks via news center and email."
},
{
"title": "SSO & Governance",
"description": "SSO integration via SAML or OIDC as well as an extensively configurable role and permission concept."
}
]
},
"additionalFeatures": {
"badge": "Trust & Security",
"title": "Additional {highlight}",
"titleHighlight": "Benefits",
"description": "Everything from one source without third-party providers, with server location in Germany.",
"items": [
{
"title": "No Additional Tools Required",
"description": "No external additional solutions for process, coordination and document creation everything runs in one system."
},
{
"title": "Hosting & Backups in Germany",
"description": "Operations and data backup take place in Germany transparent data flows without unexpected foreign processing."
},
{
"title": "Encrypted Transmission",
"description": "All connections are encrypted via TLS/HTTPS, so content and credentials are protected during transport."
},
{
"title": "Easy to Use",
"description": "User-friendly, self-explanatory interface with guided inputs reduces training effort."
},
{
"title": "Highly Customizable",
"description": "Templates, fields and process steps can be specifically adapted to organization and workflows (on request)."
},
{
"title": "Personal Support",
"description": "Our support team is available for questions fast, competent and in German."
}
],
"ctaQuestion": "Do you have questions about our security standards?",
"ctaButton": "Contact us"
},
"frameworkAgreement": {
"badge": "Optionally available",
"title": "Framework Operating Agreement {highlight}",
"titleHighlight": "IT/AI",
"description": "For getting started, we provide on request an optional framework operating/service agreement for IT and AI systems. It is tailored to the structure of the tool and contains field-tested regulation building blocks.",
"bulletPoints": [
"Template for a framework operating agreement for IT and AI systems",
"Tailored to the tool logic and documentation structure",
"Contains field-tested regulation building blocks as a starting point for system-specific agreements"
],
"document": {
"title": "Framework Agreement IT/AI",
"subtitle": "Operating Agreement Template",
"tableOfContents": "Table of Contents",
"sections": [
{
"title": "Scope",
"description": "Definition of affected systems"
},
{
"title": "Co-determination Process",
"description": "Process steps and responsibilities"
},
{
"title": "Data Protection & Control",
"description": "Protective measures and evaluations"
},
{
"title": "Change Management",
"description": "Updates and extensions"
}
],
"regulationBlocks": "12 regulation blocks",
"fieldTested": "Field-tested"
}
},
"newsletter": {
"title": "Stay {highlight}",
"titleHighlight": "informed",
"description": "Receive updates on the development of LegalConsentHub and be among the first to learn about new features.",
"placeholder": "Your email address",
"submit": "Subscribe",
"submitted": "Subscribed!",
"success": "Thank you! We'll keep you updated.",
"privacyNote": "By subscribing, you agree to our {link}. We don't send spam.",
"privacyLink": "Privacy Policy",
"validation": {
"required": "Please enter an email address",
"invalid": "Please enter a valid email address"
},
"trust": {
"gdpr": "GDPR compliant",
"encrypted": "Encrypted",
"noSpam": "No spam"
}
},
"expertAccess": {
"badge": "Expert Network",
"title": "External Expertise Directly from the Process",
"description": "When parties cannot resolve certain questions, external expertise can optionally be requested directly in the system. Requests, follow-ups and results remain traceably documented.",
"cta": {
"contact": "Contact us",
"learnMore": "Learn more"
},
"experts": {
"labor": {
"title": "Labor Law",
"description": "Specialized labor lawyers"
},
"technical": {
"title": "Technology",
"description": "IT experts"
},
"process": {
"title": "Directly in Process",
"description": "Documented & traceable"
}
}
},
"errors": {
"generic": "An error occurred. Please try again later."
}
}

View File

@@ -1,6 +1,6 @@
export default defineNuxtConfig({ export default defineNuxtConfig({
compatibilityDate: '2025-07-15', compatibilityDate: '2025-07-15',
modules: ['@nuxt/ui', '@nuxt/eslint', '@nuxt/fonts'], modules: ['@nuxt/ui', '@nuxt/eslint', '@nuxt/fonts', '@nuxtjs/i18n'],
css: ['~/assets/css/main.css'], css: ['~/assets/css/main.css'],
devtools: { enabled: true }, devtools: { enabled: true },
@@ -23,12 +23,19 @@ export default defineNuxtConfig({
] ]
}, },
// i18n configuration
i18n: {
defaultLocale: 'de',
strategy: 'no_prefix',
locales: [
{ code: 'en', name: 'English', file: 'en.json' },
{ code: 'de', name: 'Deutsch', file: 'de.json' }
]
},
// App configuration // App configuration
app: { app: {
head: { head: {
htmlAttrs: {
lang: 'de'
},
title: 'LegalConsentHub - Digitale Mitbestimmung für IT- und KI-Systeme', title: 'LegalConsentHub - Digitale Mitbestimmung für IT- und KI-Systeme',
meta: [ meta: [
{ {

View File

@@ -16,13 +16,14 @@
}, },
"dependencies": { "dependencies": {
"@nuxt/eslint": "1.12.1", "@nuxt/eslint": "1.12.1",
"@nuxt/fonts": "^0.12.1", "@nuxt/fonts": "0.12.1",
"@nuxt/ui": "4.3.0", "@nuxt/ui": "4.3.0",
"@nuxtjs/i18n": "10.2.1",
"eslint": "9.39.2", "eslint": "9.39.2",
"nuxt": "4.2.2", "nuxt": "4.2.2",
"vue": "3.5.26", "vue": "3.5.26",
"vue-router": "4.6.4", "vue-router": "4.6.4",
"zod": "^4.3.4" "zod": "4.3.4"
}, },
"devDependencies": { "devDependencies": {
"prettier": "^3.7.4", "prettier": "^3.7.4",

3071
landing/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff