From a369c20f222536b03697796a3ef40d6098bf9e51 Mon Sep 17 00:00:00 2001 From: Rajpreet0 Date: Sun, 20 Sep 2026 19:02:31 +0200 Subject: [PATCH] fix website, basic seo, waitlist functionality --- app/agb/page.tsx | 37 +++++ app/apple-icon.png | Bin 0 -> 3709 bytes app/components/hero.tsx | 8 +- app/components/legal.tsx | 60 ++++++++ app/components/mockup.tsx | 12 +- app/components/motion.tsx | 34 +++-- app/components/sections.tsx | 117 ++++++++------- app/components/ui.tsx | 290 ++++++++++++++++++++++++++++++++---- app/datenschutz/page.tsx | 123 +++++++++++++++ app/globals.css | 10 ++ app/icon.svg | 16 ++ app/impressum/page.tsx | 92 ++++++++++++ app/layout.tsx | 65 +++++--- app/lib/faq.ts | 45 ++++++ app/lib/site.ts | 32 ++++ app/lib/structured-data.ts | 104 +++++++++++++ app/lib/waitlist-state.ts | 15 ++ app/lib/waitlist.ts | 181 ++++++++++++++++++++++ app/manifest.ts | 34 +++++ app/not-found.tsx | 78 ++++++++++ app/robots.ts | 19 +++ app/sitemap.ts | 21 +++ next.config.ts | 4 + package-lock.json | 21 +++ package.json | 2 + 25 files changed, 1305 insertions(+), 115 deletions(-) create mode 100644 app/agb/page.tsx create mode 100644 app/apple-icon.png create mode 100644 app/components/legal.tsx create mode 100644 app/datenschutz/page.tsx create mode 100644 app/icon.svg create mode 100644 app/impressum/page.tsx create mode 100644 app/lib/faq.ts create mode 100644 app/lib/site.ts create mode 100644 app/lib/structured-data.ts create mode 100644 app/lib/waitlist-state.ts create mode 100644 app/lib/waitlist.ts create mode 100644 app/manifest.ts create mode 100644 app/not-found.tsx create mode 100644 app/robots.ts create mode 100644 app/sitemap.ts diff --git a/app/agb/page.tsx b/app/agb/page.tsx new file mode 100644 index 0000000..33acfd9 --- /dev/null +++ b/app/agb/page.tsx @@ -0,0 +1,37 @@ +import type { Metadata } from "next"; +import { LegalPage, Todo } from "../components/legal"; + +export const metadata: Metadata = { + title: "Allgemeine Geschäftsbedingungen", + description: "Allgemeine Geschäftsbedingungen für die Nutzung von Kumasy.", + alternates: { canonical: "/agb" }, + robots: { index: false, follow: true }, +}; + +export default function AgbPage() { + return ( + +
+

+ + Die AGB sind noch nicht verfasst. Sie sollten von einer + Rechtsanwältin oder einem Rechtsanwalt erstellt werden — ein + Vorlagentext führt bei einem SaaS-Vertrag mit Zahlungsabwicklung + und Auftragsverarbeitung erfahrungsgemäß zu unwirksamen Klauseln. + +

+

+ Folgende Punkte sind typischerweise zu regeln: Vertragsgegenstand + und Leistungsumfang, Zustandekommen des Vertrags, Preise und + Zahlungsbedingungen, Laufzeit und Kündigung, Verfügbarkeit und + Wartungsfenster, Pflichten der Nutzerin, Haftung und + Haftungsbeschränkung, Datenschutz und Auftragsverarbeitung, + Änderungen der AGB sowie Schlussbestimmungen und Gerichtsstand. +

+
+
+ ); +} diff --git a/app/apple-icon.png b/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dbea3132724ab7c64e08ea319852648e64de38a8 GIT binary patch literal 3709 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 literal 0 HcmV?d00001 diff --git a/app/components/hero.tsx b/app/components/hero.tsx index e9bfce5..57b501b 100644 --- a/app/components/hero.tsx +++ b/app/components/hero.tsx @@ -137,7 +137,11 @@ export function Hero() { {/* Per-character entrance. The

carries the readable text for assistive tech; the animated spans are aria-hidden. */} -

+ {/* The floor is 2.1rem, not 2.75rem: the longest line ("und + bezahlen sich") has to fit 321px of usable width on a 353px + Samsung viewport. 10.2vw carries it from there up to the + 5.25rem ceiling. */} +

Deine Kurse füllen und bezahlen sich von selbst. @@ -171,7 +175,7 @@ export function Hero() {
- +
diff --git a/app/components/legal.tsx b/app/components/legal.tsx new file mode 100644 index 0000000..618f2de --- /dev/null +++ b/app/components/legal.tsx @@ -0,0 +1,60 @@ +import type { ReactNode } from "react"; +import { Footer } from "./sections"; +import { Nav } from "./ui"; + +/** + * Shared shell for the legal pages. The root layout renders only + * {children}, so each page has to bring its own chrome — same reasoning + * as not-found.tsx. + */ +export function LegalPage({ + title, + intro, + children, +}: { + title: string; + intro?: string; + children: ReactNode; +}) { + return ( + <> +