Fix auth form errors and redirects: Add React keys/useEffects for error rendering and scroll, Inertia::location in controllers for SPA navigation, extend RegistrationTest and add E2E. Update docs (changes/2025-10-02-registration-fixes.md, prp/13-backend-authentication.md). Add new UI components (accordion, carousel, progress, table, tabs), marketing/legal pages (Blog, Kontakt, Datenschutz, etc.), fonts, user migration (remove_name), views/css/package updates, seeders/factories.

This commit is contained in:
Codex Agent
2025-10-02 11:40:48 +02:00
parent 1945f664c6
commit 7475210893
101 changed files with 3406 additions and 376 deletions

View File

@@ -0,0 +1,79 @@
import React, { useState } from 'react';
import { Link } from '@inertiajs/react';
import { usePage } from '@inertiajs/react';
const MarketingHeader: React.FC = () => {
const [isOpen, setIsOpen] = useState(false);
const { url } = usePage();
const occasions = [
{ href: '/de/occasions/weddings', label: 'Hochzeiten' },
{ href: '/de/occasions/birthdays', label: 'Geburtstage' },
{ href: '/de/occasions/corporate-events', label: 'Firmenevents' },
{ href: '/de/occasions/family-celebrations', label: 'Familienfeiern' },
];
return (
<header className="bg-white shadow-md sticky top-0 z-50">
<div className="container mx-auto px-4 py-4 flex items-center justify-between">
<div className="flex items-center space-x-2">
<Link href="/" className="text-2xl font-bold text-gray-900">
Die Fotospiel.App
</Link>
<svg className="w-6 h-6 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 13a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</div>
<nav className="hidden md:flex space-x-6 items-center">
<Link href="/#how-it-works" className="text-gray-600 hover:text-gray-900">
So funktioniert es
</Link>
<Link href="/#features" className="text-gray-600 hover:text-gray-900">
Features
</Link>
<div className="relative">
<button
onClick={() => setIsOpen(!isOpen)}
className="text-gray-600 hover:text-gray-900"
>
Anlässe
</button>
{isOpen && (
<div className="absolute top-full left-0 mt-2 bg-white border rounded shadow-lg z-10">
{occasions.map((occasion) => (
<Link
key={occasion.href}
href={occasion.href}
className="block px-4 py-2 text-gray-600 hover:text-gray-900 hover:bg-gray-50 transition"
onClick={() => setIsOpen(false)}
>
{occasion.label}
</Link>
))}
</div>
)}
</div>
<Link href="/blog" className="text-gray-600 hover:text-gray-900">
Blog
</Link>
<Link href="/packages" className="text-gray-600 hover:text-gray-900">
Packages
</Link>
<Link href="/kontakt" className="text-gray-600 hover:text-gray-900">
Kontakt
</Link>
<Link
href="/packages"
className="bg-[#FFB6C1] text-white px-6 py-2 rounded-full font-semibold hover:bg-[#FF69B4] transition"
>
Packages entdecken
</Link>
</nav>
<button className="md:hidden text-gray-600"></button>
</div>
</header>
);
};
export default MarketingHeader;