-
+
+
+
+
+
{{ user?.firstName }} {{ user?.lastName }}
-
+
{{ user?.email }}
@@ -72,18 +94,24 @@ async function handleLogout() {
+
+
+
+ Meine Bestellungen
+
+
-
-
- Profil
+
+
+ Profil bearbeiten
-
-
- Abmelden
+
+
+ Abmelden
diff --git a/app/components/navigation/AppHeader.vue b/app/components/navigation/AppHeader.vue
new file mode 100644
index 0000000..8d5d9c0
--- /dev/null
+++ b/app/components/navigation/AppHeader.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/navigation/AreaTabs.vue b/app/components/navigation/AreaTabs.vue
new file mode 100644
index 0000000..c20a1a1
--- /dev/null
+++ b/app/components/navigation/AreaTabs.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+ {{ area.label }}
+
+ {{ area.badge }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/navigation/BottomNav.vue b/app/components/navigation/BottomNav.vue
new file mode 100644
index 0000000..f2b08c0
--- /dev/null
+++ b/app/components/navigation/BottomNav.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.badge > 99 ? '99+' : item.badge }}
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/navigation/CartButton.vue b/app/components/navigation/CartButton.vue
new file mode 100644
index 0000000..2fdd178
--- /dev/null
+++ b/app/components/navigation/CartButton.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+ {{ cartItemCount > 99 ? '99+' : cartItemCount }}
+
+
+
+
+
+
+
diff --git a/app/components/navigation/RoleSwitcher.vue b/app/components/navigation/RoleSwitcher.vue
new file mode 100644
index 0000000..0674ffd
--- /dev/null
+++ b/app/components/navigation/RoleSwitcher.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+ Du kaufst als:
+
+ {{ currentRoleData.label }}
+
+
+
+
+
+
+
+ Für wen kaufst du?
+
+
+
+
+
+
+
+ {{ role.label }}
+ {{ role.description }}
+
+
+
+
+
+ {{ role.badge }}
+
+
+
+
+
+
+
+ 💡 Weitere Rollen werden in Kürze verfügbar sein.
+
+
+
+
+
diff --git a/app/components/ui/badge/Badge.vue b/app/components/ui/badge/Badge.vue
new file mode 100644
index 0000000..68288d6
--- /dev/null
+++ b/app/components/ui/badge/Badge.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/app/components/ui/badge/index.ts b/app/components/ui/badge/index.ts
new file mode 100644
index 0000000..536e84f
--- /dev/null
+++ b/app/components/ui/badge/index.ts
@@ -0,0 +1,24 @@
+import { type VariantProps, cva } from 'class-variance-authority'
+
+export { default as Badge } from './Badge.vue'
+
+export const badgeVariants = cva(
+ 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
+ {
+ variants: {
+ variant: {
+ default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',
+ secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ destructive: 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',
+ outline: 'text-foreground',
+ success: 'border-transparent bg-green-500 text-white shadow hover:bg-green-600',
+ warning: 'border-transparent bg-yellow-500 text-white shadow hover:bg-yellow-600',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+ }
+)
+
+export type BadgeVariants = VariantProps
diff --git a/app/components/ui/separator/Separator.vue b/app/components/ui/separator/Separator.vue
new file mode 100644
index 0000000..773edac
--- /dev/null
+++ b/app/components/ui/separator/Separator.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/app/components/ui/separator/index.ts b/app/components/ui/separator/index.ts
new file mode 100644
index 0000000..2287bcb
--- /dev/null
+++ b/app/components/ui/separator/index.ts
@@ -0,0 +1 @@
+export { default as Separator } from './Separator.vue'
diff --git a/app/layouts/default.vue b/app/layouts/default.vue
index 302ba80..275aadb 100644
--- a/app/layouts/default.vue
+++ b/app/layouts/default.vue
@@ -1,18 +1,31 @@
+
+
diff --git a/app/pages/internal/product-detail-demo.vue b/app/pages/internal/product-detail-demo.vue
new file mode 100644
index 0000000..1374c6d
--- /dev/null
+++ b/app/pages/internal/product-detail-demo.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+ Produktdetailseite Demo
+
+
+ Mobile-optimierte Produktdetailseite für Jahreskarten mit Glassmorphism-Design.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ product.name }}
+
+
+
+
+ {{ product.description }}
+
+
+
+
+
+
+ Preis
+
+ {{ formattedPrice }}
+
+
+
+
+
+
Verfügbarkeit
+
+
+ Sofort
+
+
+
+
+
+
+
+ Was du mit dieser Karte bekommst:
+
+
+
+ ✓
+ 365 Tage unbegrenzter Zugang
+
+
+ ✓
+ Keine versteckten Kosten
+
+
+ ✓
+ Sofort einsatzbereit nach Kauf
+
+
+ ✓
+ Flexible Nutzung – komme so oft du möchtest
+
+
+
+
+
+
+
+ In den Warenkorb
+
+
+ Weitere Produkte ansehen
+
+
+
+
+
+
+
+
+
+
+ Design Features
+
+
+
+ ✓
+ Hero Image: 16:9 Aspect Ratio, bündig mit oberer Kartenrundung
+
+
+ ✓
+ Glassmorphism Card: Backdrop blur mit experimenta Farbpalette
+
+
+ ✓
+ Info Cards: Preis und Verfügbarkeit in separaten Cards mit Icons
+
+
+ ✓
+ Feature List: Mit Häkchen-Icons in experimenta-accent Farbe
+
+
+ ✓
+ Button Combo: Primary (experimenta) + Secondary (transparent border)
+
+
+ ✓
+ Mobile-First: Responsive Grid (2 Spalten → 1 Spalte auf Mobile)
+
+
+ ✓
+ Status-Anzeige: "Verfügbarkeit: Sofort" mit CheckCircle Icon (statt "Auf Lager")
+
+
+
+
+
+
+
+
+
+ Implementation
+
+
+ Die Produktdetailseite ist unter /products/[id] verfügbar.
+ Produktdaten werden aus der PostgreSQL-Datenbank über die API geladen.
+
+
// API Endpoints
+GET /api/products - List all products
+GET /api/products/[id] - Get single product
+
+// Page Routes
+/products - Product listing (ProductGrid)
+/products/[id] - Product detail page
+
+
+
+
diff --git a/app/pages/internal/styleguide.vue b/app/pages/internal/styleguide.vue
index 77ca3b5..1cfd700 100644
--- a/app/pages/internal/styleguide.vue
+++ b/app/pages/internal/styleguide.vue
@@ -56,6 +56,7 @@ const copyCode = async (code: string) => {
Progress Bars
Components
→ Product Cards Demo
+ → Product Detail Demo
@@ -243,6 +244,46 @@ const copyCode = async (code: string) => {
+
+
+
Secondary Button (.btn-secondary)
+
+ Transparent button with white border. Perfect for secondary actions alongside primary buttons.
+ Features a smooth hover effect that fills with white background.
+
+
+
+
+
+
Usage Example: Product detail pages
+
+ Use alongside primary "In den Warenkorb" button for actions like "Weitere Produkte ansehen".
+ The transparent background integrates beautifully with glassmorphism design.
+
+
+
+
+ Show Code
+ <!-- As Link -->
+<a href="#" class="btn-secondary">
+ Secondary Action
+</a>
+
+<!-- As NuxtLink -->
+<NuxtLink to="/products" class="btn-secondary">
+ Weitere Produkte ansehen
+</NuxtLink>
+
+
+
+
Product Detail Page
+
+ Vollständige Produktdetailseite für Jahreskarten mit Hero-Image, Preis- und Verfügbarkeitsanzeige,
+ Feature-Liste und Call-to-Action Buttons. Zeigt alle Design-Patterns für Produktseiten.
+
+
+
+ Zur Product Detail Demo →
+
+
+
diff --git a/app/pages/products/[id].vue b/app/pages/products/[id].vue
index 7a69ac1..5a843cb 100644
--- a/app/pages/products/[id].vue
+++ b/app/pages/products/[id].vue
@@ -181,10 +181,8 @@ const handleAddToCart = () => {
>
{{ product.stockQuantity > 0 ? 'In den Warenkorb' : 'Nicht verfügbar' }}
-