summaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'src/app')
-rw-r--r--src/app/datenschutz/page.tsx387
-rw-r--r--src/app/globals.css168
-rw-r--r--src/app/impressum/page.tsx71
-rw-r--r--src/app/layout.tsx31
-rw-r--r--src/app/page.tsx155
5 files changed, 812 insertions, 0 deletions
diff --git a/src/app/datenschutz/page.tsx b/src/app/datenschutz/page.tsx
new file mode 100644
index 0000000..d412d6f
--- /dev/null
+++ b/src/app/datenschutz/page.tsx
@@ -0,0 +1,387 @@
+export default function Datenschutz() {
+ return (
+ <div className="container mx-auto px-4 py-10">
+ <div className="card shadow-lg bg-base-100 p-8">
+ <h1 className="text-4xl font-bold text-center mb-8">
+ Datenschutzerklärung
+ </h1>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 1. Verantwortlicher für die Datenverarbeitung
+ </h2>
+ <p>
+ <strong>Leo Götz</strong>
+ <p>c/o IP-Management #9337</p>
+ <p>Ludwig-Erhard-Str. 18</p>
+ <p>20459 Hamburg</p>
+ </p>
+ <p>E-Mail: info [at] leogtz.de</p>
+ <p>
+ Ein gesetzlicher Datenschutzbeauftragter ist nicht erforderlich, da
+ die gesetzlichen Voraussetzungen gemäß Art. 37 DSGVO nicht erfüllt
+ sind. Bei Fragen zum Datenschutz können Sie sich jedoch jederzeit an
+ den oben genannten Verantwortlichen wenden.
+ </p>
+ </section>
+
+ <section className="mb-8" id="section-2">
+ <h2 className="text-2xl font-semibold mb-4">
+ 2. Allgemeine Informationen zur Datenverarbeitung
+ </h2>
+ <h3 className="text-xl font-semibold mb-2">
+ Umfang der Verarbeitung personenbezogener Daten
+ </h3>
+ <p>
+ Ich verarbeite personenbezogene Daten der Nutzer grundsätzlich nur,
+ soweit dies zur Bereitstellung einer funktionsfähigen Website sowie
+ meiner Inhalte und Leistungen erforderlich ist. Die Verarbeitung
+ personenbezogener Daten erfolgt regelmäßig nur nach Einwilligung des
+ Nutzers oder wenn die Verarbeitung durch gesetzliche Vorschriften
+ gestattet ist.
+ </p>
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Rechtsgrundlagen der Datenverarbeitung
+ </h3>
+ <p>
+ Die Verarbeitung personenbezogener Daten erfolgt auf Basis der
+ folgenden Rechtsgrundlagen:
+ </p>
+ <ul className="list-disc ml-6">
+ <li>
+ <strong>Art. 6 Abs. 1 lit. f DSGVO</strong> – Verarbeitung erfolgt
+ aufgrund meines berechtigten Interesses an der Sicherheit und
+ Stabilität der Website sowie zur Fehleranalyse und Optimierung.
+ </li>
+ </ul>
+ <h2 className="font-semibold mt-6 mb-4">
+ Hosting und Server-Logfiles
+ </h2>
+ <p>Diese Website wird gehostet bei:</p>
+ <p>
+ <strong>IP-Projects GmbH & Co. KG</strong>
+ <br />
+ </p>
+ Am Vogelherd 14
+ <br />D - 97295 Waldbrunn
+ <p>
+ <a
+ href="https://www.ip-projects.de"
+ target="_blank"
+ rel="noopener noreferrer"
+ className="link"
+ >
+ ip-projects.de
+ </a>
+ </p>
+ <p>
+ Beim Aufruf meiner Website werden durch den Webserver automatisch
+ Informationen in sogenannten Server-Logfiles erfasst und
+ gespeichert. Diese Daten werden von Ihrem Browser automatisch
+ übermittelt und umfassen:
+ </p>
+ <ul className="list-disc ml-6">
+ <li>IP-Adresse des anfragenden Geräts</li>
+ <li>Datum und Uhrzeit des Zugriffs</li>
+ <li>Aufgerufene URL (Seite oder Datei)</li>
+ <li>HTTP-Methode (z. B. GET, POST)</li>
+ <li>HTTP-Statuscode der Antwort</li>
+ <li>Übertragene Datenmenge in Bytes</li>
+ <li>Referrer-URL (zuvor besuchte Seite, sofern übermittelt)</li>
+ <li>
+ Browser-Kennung (User-Agent), einschließlich verwendetem Browser,
+ Betriebssystem und Spracheinstellungen
+ </li>
+ </ul>
+ <p>
+ Die Verarbeitung dieser Daten ist technisch notwendig, um die
+ Website korrekt ausliefern zu können, die Systemsicherheit und
+ -stabilität zu gewährleisten sowie Fehler zu diagnostizieren. Eine
+ Zusammenführung dieser Daten mit anderen Datenquellen findet nicht
+ statt.
+ </p>
+ <p>
+ Speicherdauer: Die Logfiles werden nach spätestens 7 Tagen
+ automatisch gelöscht, sofern keine sicherheitsrelevanten Vorfälle
+ eine längere Aufbewahrung erfordern
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 3. Erhebung und Speicherung personenbezogener Daten sowie Art und
+ Zweck der Verwendung
+ </h2>
+ <p>
+ Beim Besuch dieser Website werden grundsätzlich keine
+ personenbezogenen Daten aktiv erhoben oder gespeichert. Die
+ Erstellung der vCard-Daten (Vorname, Nachname, Telefonnummer usw.)
+ sowie der zugehörige QR-Code erfolgt vollständig clientseitig im
+ Browser des Nutzers. Es findet keine Übermittlung, Speicherung oder
+ Verarbeitung dieser Daten auf meinem Server oder durch Dritte statt.
+ Eine darüber hinausgehende Verarbeitung personenbezogener Daten
+ findet nicht statt.
+ </p>
+ <p>
+ Die einzigen Daten, die im Rahmen der technischen Bereitstellung
+ meiner Website erfasst werden, sind in den Server-Logfiles
+ gespeichert (siehe Abschnitt 2:
+ <a href="#section-2" className="link">
+ Allgemeine Informationen zur Datenverarbeitung
+ </a>
+ ). Diese Daten dienen ausschließlich der Sicherstellung des
+ störungsfreien Betriebs der Website sowie zur Fehleranalyse und
+ werden nicht mit anderen Datenquellen zusammengeführt.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 4. Weitergabe von Daten an Dritte
+ </h2>
+ <p>Ich übermittle keine personenbezogenen Daten an Dritte.</p>
+ <p>
+ Es erfolgt weder eine Verarbeitung durch externe Dienstleister noch
+ eine Weitergabe der Daten an Drittländer. Mein Server befindet sich
+ in Deutschland, und es werden keine externen Tracking- oder
+ Analyse-Dienste wie Google Analytics verwendet.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 5. Rechte der betroffenen Personen
+ </h2>
+ <p>
+ Als betroffene Person haben Sie nach der Datenschutz-Grundverordnung
+ (DSGVO) folgende Rechte in Bezug auf die Verarbeitung Ihrer
+ personenbezogenen Daten:
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Auskunft (Art. 15 DSGVO)
+ </h3>
+ <p>
+ Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob
+ personenbezogene Daten über Sie verarbeitet werden. Ist dies der
+ Fall, können Sie Auskunft über diese Daten sowie weitere
+ Informationen zur Verarbeitung erhalten.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Berichtigung (Art. 16 DSGVO)
+ </h3>
+ <p>
+ Falls Ihre personenbezogenen Daten unrichtig oder unvollständig
+ sind, haben Sie das Recht, die unverzügliche Berichtigung oder
+ Vervollständigung dieser Daten zu verlangen.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Löschung („Recht auf Vergessenwerden“) (Art. 17 DSGVO)
+ </h3>
+ <p>
+ Sie können verlangen, dass Ihre personenbezogenen Daten gelöscht
+ werden, sofern einer der folgenden Gründe zutrifft:
+ </p>
+ <ul className="list-disc ml-6">
+ <li>
+ Die Daten sind für die Zwecke, für die sie erhoben wurden, nicht
+ mehr erforderlich.
+ </li>
+ <li>
+ Sie widerrufen Ihre Einwilligung und es gibt keine andere
+ Rechtsgrundlage für die Verarbeitung.
+ </li>
+ <li>
+ Sie legen Widerspruch gegen die Verarbeitung ein (siehe Art. 21
+ DSGVO).
+ </li>
+ <li>Die Daten wurden unrechtmäßig verarbeitet.</li>
+ <li>
+ Die Löschung ist zur Erfüllung einer rechtlichen Verpflichtung
+ erforderlich.
+ </li>
+ </ul>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Einschränkung der Verarbeitung (Art. 18 DSGVO)
+ </h3>
+ <p>
+ Unter bestimmten Voraussetzungen können Sie die Einschränkung der
+ Verarbeitung Ihrer personenbezogenen Daten verlangen, z. B. wenn die
+ Richtigkeit der Daten bestritten wird oder die Verarbeitung
+ unrechtmäßig ist, Sie aber keine Löschung wünschen.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Datenübertragbarkeit (Art. 20 DSGVO)
+ </h3>
+ <p>
+ Falls die Verarbeitung auf Ihrer Einwilligung oder einem Vertrag
+ beruht und automatisiert erfolgt, haben Sie das Recht, Ihre
+ personenbezogenen Daten in einem strukturierten, gängigen und
+ maschinenlesbaren Format zu erhalten oder diese an einen anderen
+ Verantwortlichen übertragen zu lassen.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Widerspruchsrecht gegen die Verarbeitung (Art. 21 DSGVO)
+ </h3>
+ <p>
+ Sie haben das Recht, aus Gründen, die sich aus Ihrer besonderen
+ Situation ergeben, jederzeit Widerspruch gegen die Verarbeitung
+ Ihrer personenbezogenen Daten einzulegen, sofern die Verarbeitung
+ auf einem berechtigten Interesse (Art. 6 Abs. 1 lit. f DSGVO)
+ beruht. Ich werde Ihre Daten dann nicht mehr verarbeiten, es sei
+ denn, es liegen zwingende schutzwürdige Gründe für die Verarbeitung
+ vor.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Recht auf Beschwerde bei einer Aufsichtsbehörde (Art. 77 DSGVO)
+ </h3>
+ <p>
+ Falls Sie der Ansicht sind, dass die Verarbeitung Ihrer
+ personenbezogenen Daten gegen die DSGVO verstößt, haben Sie das
+ Recht, sich bei einer Datenschutzaufsichtsbehörde zu beschweren.
+ </p>
+
+ <h3 className="text-xl font-semibold mt-4 mb-2">
+ Zuständige Aufsichtsbehörde für Datenschutz in Deutschland:
+ </h3>
+ <p>
+ <strong>
+ Bayerisches Landesamt für Datenschutzaufsicht (BayLDA)
+ </strong>
+ <br />
+ Promenade 18<br></br>
+ 91522 Ansbach<br></br>
+ Deutschland
+ </p>
+ <p>
+ Telefon: +49 (0) 981 180093-0<br></br>
+ E-Mail:
+ <a href="mailto:poststelle@lda.bayern.de" className="link">
+ poststelle@lda.bayern.de
+ </a>
+ <br></br>
+ Website:
+ <a
+ href="https://www.lda.bayern.de"
+ target="_blank"
+ rel="noopener noreferrer"
+ className="link"
+ >
+ https://www.lda.bayern.de
+ </a>
+ </p>
+ <p>
+ Eine Liste aller Datenschutzaufsichtsbehörden in Deutschland finden
+ Sie hier:<br></br>
+ <a
+ href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html"
+ target="_blank"
+ rel="noopener noreferrer"
+ className="link"
+ >
+ https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html
+ </a>
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 6. Verwendung von Cookies und Tracking-Technologien
+ </h2>
+ <p>
+ Meine Website verwendet keine Cookies und setzt keine
+ Tracking-Technologien ein, die personenbezogene Daten speichern oder
+ an Dritte weitergeben.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 7. Einsatz von Drittanbietern und Tools
+ </h2>
+ <p>
+ Ich verwende keine externen Drittanbieter oder Cloud-Dienste zur
+ Verarbeitung personenbezogener Daten.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">8. Datensicherheit</h2>
+ <p>
+ Ich treffe geeignete technische und organisatorische Maßnahmen, um
+ die Sicherheit Ihrer personenbezogenen Daten zu gewährleisten und
+ sie vor unbefugtem Zugriff, Verlust oder Manipulation zu schützen.
+ </p>
+ <p>
+ Zu den von mir eingesetzten Sicherheitsmaßnahmen gehören unter
+ anderem:
+ </p>
+ <ul className="list-disc ml-6">
+ <li>
+ <strong>Regelmäßige Aktualisierung des Servers:</strong> Mein VPS
+ wird kontinuierlich mit Sicherheitsupdates versorgt, um bekannte
+ Sicherheitslücken zu schließen.
+ </li>
+ <li>
+ <strong>SSL/TLS-Verschlüsselung:</strong> Die Übertragung von
+ Daten zwischen Ihrem Browser und meiner Website erfolgt
+ verschlüsselt über das SSL/TLS-Protokoll. Dadurch werden Ihre
+ Daten während der Übertragung vor unbefugtem Zugriff geschützt.
+ </li>
+ <li>
+ <strong>Firewall-Schutz:</strong> Zum Schutz gegen unbefugte
+ Zugriffe und Angriffe setze ich Firewalls ein, die den
+ Datenverkehr überwachen und verdächtige Aktivitäten blockieren.
+ </li>
+ <li>
+ <strong>DDoS-Schutz:</strong> Maßnahmen zum Schutz gegen
+ Distributed-Denial-of-Service (DDoS)-Angriffe sorgen dafür, dass
+ meine Website auch bei unerwartet hohem Datenverkehr erreichbar
+ bleibt.
+ </li>
+ </ul>
+ <p>
+ Trotz aller Sicherheitsmaßnahmen weise ich darauf hin, dass die
+ Übertragung von Daten im Internet (z. B. bei der Kommunikation per
+ E-Mail) Sicherheitslücken aufweisen kann. Ein vollständiger Schutz
+ der Daten vor dem Zugriff durch Dritte ist nicht möglich.
+ </p>
+ <p>
+ Falls Sie Fragen zur Sicherheit meiner Website haben, können Sie
+ mich jederzeit unter
+ <a href="mailto:info@leogtz.de" className="link">
+ info@leogtz.de
+ </a>{" "}
+ kontaktieren.
+ </p>
+ </section>
+
+ <section className="mb-8">
+ <h2 className="text-2xl font-semibold mb-4">
+ 9. Änderungen der Datenschutzerklärung
+ </h2>
+ <p>
+ Ich behalte mir vor, diese Datenschutzerklärung jederzeit zu ändern,
+ um sie an rechtliche Anforderungen oder Änderungen meines Angebots
+ anzupassen. Die jeweils aktuelle Version der Datenschutzerklärung
+ ist jederzeit auf dieser Website abrufbar.
+ </p>
+ <p>
+ Falls durch eine Änderung der Datenschutzerklärung eine Mitwirkung
+ Ihrerseits erforderlich wird (z. B. eine erneute Einwilligung),
+ werde ich Sie rechtzeitig darüber informieren.
+ </p>
+ <p>
+ <strong>Letzte Aktualisierung:</strong> 21. März 2026
+ </p>
+ </section>
+ </div>
+ </div>
+ );
+}
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..d81e27c
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,168 @@
+@import "tailwindcss";
+@import "tw-animate-css";
+
+@custom-variant dark (&:is(.dark *));
+
+:root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.3211 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.3211 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.3211 0 0);
+ --primary: oklch(0.6231 0.188 259.8145);
+ --primary-foreground: oklch(1 0 0);
+ --secondary: oklch(0.967 0.0029 264.5419);
+ --secondary-foreground: oklch(0.4461 0.0263 256.8018);
+ --muted: oklch(0.9846 0.0017 247.8389);
+ --muted-foreground: oklch(0.551 0.0234 264.3637);
+ --accent: oklch(0.9514 0.025 236.8242);
+ --accent-foreground: oklch(0.3791 0.1378 265.5222);
+ --destructive: oklch(0.6368 0.2078 25.3313);
+ --destructive-foreground: oklch(1 0 0);
+ --border: oklch(0.9276 0.0058 264.5313);
+ --input: oklch(0.9276 0.0058 264.5313);
+ --ring: oklch(0.6231 0.188 259.8145);
+ --chart-1: oklch(0.6231 0.188 259.8145);
+ --chart-2: oklch(0.5461 0.2152 262.8809);
+ --chart-3: oklch(0.4882 0.2172 264.3763);
+ --chart-4: oklch(0.4244 0.1809 265.6377);
+ --chart-5: oklch(0.3791 0.1378 265.5222);
+ --sidebar: oklch(0.9846 0.0017 247.8389);
+ --sidebar-foreground: oklch(0.3211 0 0);
+ --sidebar-primary: oklch(0.6231 0.188 259.8145);
+ --sidebar-primary-foreground: oklch(1 0 0);
+ --sidebar-accent: oklch(0.9514 0.025 236.8242);
+ --sidebar-accent-foreground: oklch(0.3791 0.1378 265.5222);
+ --sidebar-border: oklch(0.9276 0.0058 264.5313);
+ --sidebar-ring: oklch(0.6231 0.188 259.8145);
+ --font-sans: Inter, sans-serif;
+ --font-serif: Source Serif 4, serif;
+ --font-mono: JetBrains Mono, monospace;
+ --radius: 0.375rem;
+ --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
+ --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
+ --shadow-sm:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
+ --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
+ --shadow-md:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
+ --shadow-lg:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
+ --shadow-xl:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
+ --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
+}
+
+.dark {
+ --background: oklch(0.2046 0 0);
+ --foreground: oklch(0.9219 0 0);
+ --card: oklch(0.2686 0 0);
+ --card-foreground: oklch(0.9219 0 0);
+ --popover: oklch(0.2686 0 0);
+ --popover-foreground: oklch(0.9219 0 0);
+ --primary: oklch(0.6231 0.188 259.8145);
+ --primary-foreground: oklch(1 0 0);
+ --secondary: oklch(0.2686 0 0);
+ --secondary-foreground: oklch(0.9219 0 0);
+ --muted: oklch(0.2686 0 0);
+ --muted-foreground: oklch(0.7155 0 0);
+ --accent: oklch(0.3791 0.1378 265.5222);
+ --accent-foreground: oklch(0.8823 0.0571 254.1284);
+ --destructive: oklch(0.6368 0.2078 25.3313);
+ --destructive-foreground: oklch(1 0 0);
+ --border: oklch(0.3715 0 0);
+ --input: oklch(0.3715 0 0);
+ --ring: oklch(0.6231 0.188 259.8145);
+ --chart-1: oklch(0.7137 0.1434 254.624);
+ --chart-2: oklch(0.6231 0.188 259.8145);
+ --chart-3: oklch(0.5461 0.2152 262.8809);
+ --chart-4: oklch(0.4882 0.2172 264.3763);
+ --chart-5: oklch(0.4244 0.1809 265.6377);
+ --sidebar: oklch(0.2046 0 0);
+ --sidebar-foreground: oklch(0.9219 0 0);
+ --sidebar-primary: oklch(0.6231 0.188 259.8145);
+ --sidebar-primary-foreground: oklch(1 0 0);
+ --sidebar-accent: oklch(0.3791 0.1378 265.5222);
+ --sidebar-accent-foreground: oklch(0.8823 0.0571 254.1284);
+ --sidebar-border: oklch(0.3715 0 0);
+ --sidebar-ring: oklch(0.6231 0.188 259.8145);
+ --font-sans: Inter, sans-serif;
+ --font-serif: Source Serif 4, serif;
+ --font-mono: JetBrains Mono, monospace;
+ --radius: 0.375rem;
+ --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
+ --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);
+ --shadow-sm:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
+ --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);
+ --shadow-md:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);
+ --shadow-lg:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);
+ --shadow-xl:
+ 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);
+ --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-destructive-foreground: var(--destructive-foreground);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-chart-1: var(--chart-1);
+ --color-chart-2: var(--chart-2);
+ --color-chart-3: var(--chart-3);
+ --color-chart-4: var(--chart-4);
+ --color-chart-5: var(--chart-5);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+
+ --font-sans: var(--font-sans);
+ --font-mono: var(--font-mono);
+ --font-serif: var(--font-serif);
+
+ --radius-sm: calc(var(--radius) - 4px);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) + 4px);
+
+ --shadow-2xs: var(--shadow-2xs);
+ --shadow-xs: var(--shadow-xs);
+ --shadow-sm: var(--shadow-sm);
+ --shadow: var(--shadow);
+ --shadow-md: var(--shadow-md);
+ --shadow-lg: var(--shadow-lg);
+ --shadow-xl: var(--shadow-xl);
+ --shadow-2xl: var(--shadow-2xl);
+}
+@layer base {
+ * {
+ @apply border-border outline-ring/50;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/src/app/impressum/page.tsx b/src/app/impressum/page.tsx
new file mode 100644
index 0000000..57268a1
--- /dev/null
+++ b/src/app/impressum/page.tsx
@@ -0,0 +1,71 @@
+export default function Impressum() {
+ return (
+ <div className="container mx-auto px-4 py-10">
+ <div className="card shadow-lg bg-base-100 p-8">
+ <h1 className="text-4xl font-bold text-center mb-8">Impressum</h1>
+ {/* Angaben gemäß § 5 TMG */}
+ <h2 className="text-2xl font-semibold mt-4">Angaben gemäß § 5 TMG</h2>
+ <p>
+ <strong>Leo Götz</strong>
+ </p>
+ <p>c/o IP-Management #9337</p>
+ <p>Ludwig-Erhard-Str. 18</p>
+ <p>20459 Hamburg</p>
+ {/* Kontakt */}
+ <h2 className="text-2xl font-semibold mt-6">Kontakt</h2>
+ <p>E-Mail: info [at] leogtz.de</p>
+ {/* Haftung für Inhalte */}
+ <h2 className="text-2xl font-semibold mt-6">Haftung für Inhalte</h2>
+ <p>
+ Als Diensteanbieter bin ich gemäß <strong>§ 7 Abs. 1 TMG</strong> für
+ eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen
+ verantwortlich. Nach <strong>§§ 8 bis 10 TMG</strong> bin ich jedoch
+ nicht verpflichtet, übermittelte oder gespeicherte fremde
+ Informationen zu überwachen oder nach Umständen zu forschen, die auf
+ eine rechtswidrige Tätigkeit hinweisen.
+ </p>
+ <p>
+ Verpflichtungen zur Entfernung oder Sperrung der Nutzung von
+ Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt.
+ Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der
+ Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden
+ entsprechender Rechtsverletzungen werde ich diese Inhalte umgehend
+ entfernen.
+ </p>
+ {/* Haftung für Links */}
+ <h2 className="text-2xl font-semibold mt-6">Haftung für Links</h2>
+ <p>
+ Meine Webseite kann Links zu externen Webseiten Dritter enthalten, auf
+ deren Inhalte ich keinen Einfluss habe. Deshalb kann ich für diese
+ fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der
+ verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der
+ Seiten verantwortlich.
+ </p>
+ {/* EU-Streitschlichtung */}
+ <h2 className="text-2xl font-semibold mt-6">EU-Streitschlichtung</h2>
+ <p>
+ Die Europäische Kommission stellt eine Plattform zur
+ Online-Streitbeilegung (OS) bereit:{" "}
+ <a
+ href="https://ec.europa.eu/consumers/odr/"
+ target="_blank"
+ rel="noopener noreferrer"
+ className="link"
+ >
+ https://ec.europa.eu/consumers/odr/
+ </a>
+ .<br />
+ Unsere E-Mail-Adresse finden Sie oben im Impressum.
+ </p>
+ <p>
+ Ich bin weder verpflichtet noch bereit, an einem
+ Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle
+ teilzunehmen.
+ </p>
+ {/* Letzte Aktualisierung */}
+ <h2 className="text-2xl font-semibold mt-6">Letzte Aktualisierung</h2>
+ <p>21. März 2026</p>
+ </div>
+ </div>
+ );
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..7c74651
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,31 @@
+import type { Metadata } from "next";
+import "./globals.css";
+import FooterSection from "@/components/FooterSection";
+
+export const metadata: Metadata = {
+ title: "Leo's VCard Generator",
+ description: "Generiere kostenlos und clientseitig deine VCard als QRCode.",
+ openGraph: {
+ type: "website",
+ url: "https://vcard.leogtz.de",
+ title: "Leo's VCard Generator",
+ description: "Generiere kostenlos und clientseitig deine VCard als QRCode.",
+ siteName: "Leo's VCard Generator",
+ images: [{ url: "https://leogtz.de/logo.png" }],
+ },
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+ <html lang="de">
+ <body className={`antialiased dark flex flex-col min-h-screen`}>
+ <main className="grow">{children}</main>
+ <FooterSection />
+ </body>
+ </html>
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..aed6b8d
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,155 @@
+"use client";
+import VCardExport from "@/components/VCardExport";
+import VCardForm from "@/components/VCardForm";
+import { useState } from "react";
+import { SelectionItem } from "@/lib/definitions";
+
+export default function Home() {
+ // Declare and initialize selection array
+ const [section, setSection] = useState("form");
+ const [selection, setSelection] = useState<SelectionItem[]>([
+ {
+ field: "Vorname",
+ value: "",
+ placeholder: "Max",
+ required: true,
+ },
+ {
+ field: "Nachname",
+ value: "",
+ placeholder: "Mustermann",
+ required: true,
+ },
+ {
+ field: "Spitzname",
+ value: "",
+ placeholder: "Maxi",
+ required: false,
+ },
+ {
+ field: "Email",
+ value: "",
+ placeholder: "max@example.com",
+ required: false,
+ },
+ {
+ field: "Telefonnummer (Zuhause)",
+ value: "",
+ placeholder: "+49 123 456789",
+ required: false,
+ },
+ {
+ field: "Telefonnummer (Mobile)",
+ value: "",
+ placeholder: "+49 123 456789",
+ required: false,
+ },
+ {
+ field: "Telefonnummer (Arbeit)",
+ value: "",
+ placeholder: "+49 123 456789",
+ required: false,
+ },
+ {
+ field: "Land",
+ value: "",
+ placeholder: "Deutschland",
+ required: false,
+ },
+ {
+ field: "Ort",
+ value: "",
+ placeholder: "Musterstadt",
+ required: false,
+ },
+ {
+ field: "Straße",
+ value: "",
+ placeholder: "Musterstraße 1",
+ required: false,
+ },
+ {
+ field: "Postleitzahl",
+ value: "",
+ placeholder: "12345",
+ required: false,
+ },
+ {
+ field: "Geburtstag",
+ value: "",
+ placeholder: "1990-01-01 (jahr-monat-tag)",
+ required: false,
+ },
+ {
+ field: "Firma",
+ value: "",
+ placeholder: "Beispiel GmbH",
+ required: false,
+ },
+ {
+ field: "Abteilung",
+ value: "",
+ placeholder: "Entwicklung",
+ required: false,
+ },
+ {
+ field: "Berufsbezeichnung",
+ value: "",
+ placeholder: "Softwareentwickler",
+ required: false,
+ },
+ {
+ field: "Rolle im Unternehmen",
+ value: "",
+ placeholder: "Projektleiter",
+ required: false,
+ },
+ {
+ field: "Homepage/Persönliche Webseite",
+ value: "",
+ placeholder: "https://example.com",
+ required: false,
+ },
+ {
+ field: "Notizen",
+ value: "",
+ placeholder: "Zusätzliche Informationen...",
+ required: false,
+ },
+ ]);
+ const [vcardData, setVcardData] = useState<string>("");
+
+ // Setting value for field when value changes
+ const handleValueChange = (field: string, value: string) => {
+ setSelection((prev) =>
+ prev.map((item) => (item.field === field ? { ...item, value } : item)),
+ );
+ };
+
+ const handleSectionChange = (section: string) => {
+ setSection(section);
+ };
+
+ return (
+ <div className="flex flex-col items-center mt-5 min-h-screen">
+ <h1 className="text-2xl font-bold mb-8">Leo&apos;s VCard Generator</h1>
+ {/* Show Component based on section */}
+ <div className="flex justify-center gap-8 w-full">
+ {section == "form" && (
+ <VCardForm
+ selection={selection}
+ onValueChange={handleValueChange}
+ sectionChange={handleSectionChange}
+ onGenerate={(data: any) => setVcardData(data)}
+ />
+ )}
+ {section == "export" && (
+ <VCardExport
+ sectionChange={handleSectionChange}
+ vcardText={vcardData}
+ />
+ )}
+ </div>
+ </div>
+ );
+}