diff options
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/datenschutz/page.tsx | 387 | ||||
| -rw-r--r-- | src/app/globals.css | 168 | ||||
| -rw-r--r-- | src/app/impressum/page.tsx | 71 | ||||
| -rw-r--r-- | src/app/layout.tsx | 31 | ||||
| -rw-r--r-- | src/app/page.tsx | 155 |
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'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> + ); +} |
