Ads.txt
This commit is contained in:
@@ -91,14 +91,15 @@ export default function DatenschutzPage() {
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>5. Cookies und Werbung</h2>
|
||||
<h2>5. Werbung mit Google AdSense</h2>
|
||||
<p className="mt-3">
|
||||
Entscheidomat setzt aktuell keine Cookies und keine Werbedienste
|
||||
ein. Sollte künftig Werbung (z. B. Google AdSense)
|
||||
hinzukommen, wird diese Datenschutzerklärung vorher aktualisiert
|
||||
und eine Einwilligungslösung (Consent-Banner) für Nutzerinnen und
|
||||
Nutzer aus der EU, dem UK und der Schweiz eingebaut, bevor der
|
||||
Dienst aktiv geschaltet wird.
|
||||
Entscheidomat ist für die Nutzung von Google AdSense vorbereitet.
|
||||
Sobald personalisierte oder nicht-personalisierte Anzeigen an
|
||||
Besucherinnen und Besucher im Europäischen Wirtschaftsraum, im
|
||||
Vereinigten Königreich oder in der Schweiz ausgeliefert werden,
|
||||
setzen wir eine geeignete Einwilligungslösung ein und aktualisieren
|
||||
diese Datenschutzerklärung um die dann konkret verwendeten
|
||||
Einstellungen und Empfänger.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
|
||||
100
app/ratgeber/[slug]/page.tsx
Normal file
100
app/ratgeber/[slug]/page.tsx
Normal file
@@ -0,0 +1,100 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import { notFound } from "next/navigation";
|
||||
import Nav from "@/components/nav";
|
||||
import Footer from "@/components/footer";
|
||||
import { getGuide, GUIDES } from "@/lib/guides";
|
||||
|
||||
const SITE_URL = "https://entscheidomat.com";
|
||||
|
||||
export function generateStaticParams() {
|
||||
return GUIDES.map(({ slug }) => ({ slug }));
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: PageProps<"/ratgeber/[slug]">): Promise<Metadata> {
|
||||
const { slug } = await params;
|
||||
const guide = getGuide(slug);
|
||||
if (!guide) return {};
|
||||
|
||||
return {
|
||||
title: guide.title,
|
||||
description: guide.description,
|
||||
alternates: { canonical: `/ratgeber/${guide.slug}` },
|
||||
openGraph: {
|
||||
type: "article",
|
||||
locale: "de_DE",
|
||||
url: `${SITE_URL}/ratgeber/${guide.slug}`,
|
||||
title: guide.title,
|
||||
description: guide.description,
|
||||
publishedTime: "2026-08-03T08:00:00+02:00",
|
||||
modifiedTime: "2026-08-03T08:00:00+02:00",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default async function GuidePage({ params }: PageProps<"/ratgeber/[slug]">) {
|
||||
const { slug } = await params;
|
||||
const guide = getGuide(slug);
|
||||
if (!guide) notFound();
|
||||
|
||||
const url = `${SITE_URL}/ratgeber/${guide.slug}`;
|
||||
const jsonLd = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
headline: guide.title,
|
||||
description: guide.description,
|
||||
datePublished: "2026-08-03",
|
||||
dateModified: "2026-08-03",
|
||||
inLanguage: "de-DE",
|
||||
mainEntityOfPage: url,
|
||||
author: { "@type": "Person", name: "Timo Knuth" },
|
||||
publisher: { "@type": "Organization", name: "Entscheidomat", url: SITE_URL },
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd).replace(/</g, "\\u003c") }} />
|
||||
<Nav />
|
||||
<main className="flex-1 bg-paper pb-20 pt-28 sm:pt-32">
|
||||
<article className="mx-auto w-full max-w-3xl px-5 sm:px-8">
|
||||
<nav aria-label="Breadcrumb" className="text-sm text-ink-soft">
|
||||
<Link href="/" className="hover:text-[#0d7a57]">Entscheidomat</Link>
|
||||
<span aria-hidden className="px-2">/</span>
|
||||
<Link href="/ratgeber" className="hover:text-[#0d7a57]">Ratgeber</Link>
|
||||
</nav>
|
||||
<header className="mt-8 border-b border-line pb-10">
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-[#0d7a57]">{guide.readingTime}</p>
|
||||
<h1 className="mt-4 text-balance font-display text-5xl font-semibold leading-[0.95] tracking-[-0.045em] text-ink sm:text-6xl">{guide.title}</h1>
|
||||
<p className="mt-6 text-lg leading-relaxed text-ink-soft">{guide.description}</p>
|
||||
<p className="mt-6 text-sm text-ink-soft">Von Timo Knuth · Veröffentlicht und aktualisiert am {guide.updated}</p>
|
||||
</header>
|
||||
<div className="mt-10 space-y-10 text-[1.0625rem] leading-8 text-ink-soft">
|
||||
{guide.sections.map((section) => (
|
||||
<section key={section.heading}>
|
||||
<h2 className="font-display text-3xl font-semibold leading-tight text-ink">{section.heading}</h2>
|
||||
<div className="mt-4 space-y-4">
|
||||
{section.paragraphs.map((paragraph) => <p key={paragraph}>{paragraph}</p>)}
|
||||
</div>
|
||||
{section.bullets && (
|
||||
<ul className="mt-5 space-y-3 border-l-2 border-[#0d7a57]/30 pl-5">
|
||||
{section.bullets.map((bullet) => <li key={bullet}>{bullet}</li>)}
|
||||
</ul>
|
||||
)}
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
<aside className="mt-12 rounded-3xl border border-emerald-line bg-emerald-soft p-6 text-ink">
|
||||
<h2 className="font-display text-2xl font-semibold">Passendes Tool auswählen</h2>
|
||||
<p className="mt-2 leading-relaxed text-ink-soft">Für spielerische, folgenarme Entscheidungen kannst du die kostenlosen Tools direkt im Browser nutzen – ohne Anmeldung.</p>
|
||||
<div className="mt-4 flex flex-wrap gap-4 text-sm font-semibold text-[#0d7a57]">
|
||||
<Link href="/muenze-werfen" className="hover:underline">Münze werfen</Link>
|
||||
<Link href="/gluecksrad" className="hover:underline">Glücksrad</Link>
|
||||
<Link href="/namen-auslosen" className="hover:underline">Namen auslosen</Link>
|
||||
</div>
|
||||
</aside>
|
||||
</article>
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
47
app/ratgeber/page.tsx
Normal file
47
app/ratgeber/page.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import Nav from "@/components/nav";
|
||||
import Footer from "@/components/footer";
|
||||
import { GUIDES } from "@/lib/guides";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Ratgeber für kleine Entscheidungen",
|
||||
description:
|
||||
"Praktische, kostenlose Ratgeber zu Zufall, fairen Auslosungen und kleinen Alltagsentscheidungen.",
|
||||
alternates: { canonical: "/ratgeber" },
|
||||
};
|
||||
|
||||
export default function GuideIndexPage() {
|
||||
return (
|
||||
<>
|
||||
<Nav />
|
||||
<main className="flex-1 bg-paper pb-20 pt-28 sm:pt-32">
|
||||
<div className="mx-auto w-full max-w-6xl px-5 sm:px-8">
|
||||
<header className="max-w-3xl">
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-[#0d7a57]">Ratgeber</p>
|
||||
<h1 className="mt-4 text-balance font-display text-5xl font-semibold leading-[0.95] tracking-[-0.045em] text-ink sm:text-6xl">
|
||||
Kleine Entscheidungen, klarer gedacht.
|
||||
</h1>
|
||||
<p className="mt-6 max-w-2xl text-lg leading-relaxed text-ink-soft">
|
||||
Praktische Hinweise für spielerische Alltagsentscheidungen, faire Auslosungen und den bewussten Umgang mit Zufall.
|
||||
</p>
|
||||
</header>
|
||||
<section className="mt-14 grid gap-5 md:grid-cols-3" aria-label="Ratgeberartikel">
|
||||
{GUIDES.map((guide) => (
|
||||
<article key={guide.slug} className="flex flex-col rounded-3xl border border-line bg-surface p-6 shadow-soft transition-transform duration-200 hover:-translate-y-1">
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.14em] text-[#0d7a57]">{guide.readingTime}</p>
|
||||
<h2 className="mt-4 font-display text-3xl font-semibold leading-tight text-ink">{guide.title}</h2>
|
||||
<p className="mt-4 flex-1 leading-relaxed text-ink-soft">{guide.excerpt}</p>
|
||||
<p className="mt-6 text-sm text-ink-soft">Veröffentlicht am {guide.published}</p>
|
||||
<Link href={`/ratgeber/${guide.slug}`} className="mt-5 font-semibold text-[#0d7a57] underline decoration-[#0d7a57]/30 underline-offset-4 transition-colors hover:text-[#095c41]">
|
||||
Artikel lesen <span aria-hidden>→</span>
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { MetadataRoute } from "next";
|
||||
import { TOOL_PAGES } from "@/lib/tool-pages";
|
||||
import { GUIDES } from "@/lib/guides";
|
||||
|
||||
const SITE_URL = "https://entscheidomat.com";
|
||||
|
||||
@@ -17,6 +18,24 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
changeFrequency: "monthly" as const,
|
||||
priority: 0.8,
|
||||
})),
|
||||
{
|
||||
url: `${SITE_URL}/ratgeber`,
|
||||
lastModified: "2026-08-03",
|
||||
changeFrequency: "weekly" as const,
|
||||
priority: 0.8,
|
||||
},
|
||||
...GUIDES.map((guide) => ({
|
||||
url: `${SITE_URL}/ratgeber/${guide.slug}`,
|
||||
lastModified: "2026-08-03",
|
||||
changeFrequency: "monthly" as const,
|
||||
priority: 0.7,
|
||||
})),
|
||||
{
|
||||
url: `${SITE_URL}/ueber-uns`,
|
||||
lastModified: "2026-08-03",
|
||||
changeFrequency: "yearly" as const,
|
||||
priority: 0.4,
|
||||
},
|
||||
{
|
||||
url: `${SITE_URL}/developer`,
|
||||
lastModified: "2026-08-01",
|
||||
|
||||
43
app/ueber-uns/page.tsx
Normal file
43
app/ueber-uns/page.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
import type { Metadata } from "next";
|
||||
import Link from "next/link";
|
||||
import Nav from "@/components/nav";
|
||||
import Footer from "@/components/footer";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Über Entscheidomat",
|
||||
description: "Wer hinter Entscheidomat steht, wofür die kostenlosen Zufalls-Tools gedacht sind und wie du Kontakt aufnimmst.",
|
||||
alternates: { canonical: "/ueber-uns" },
|
||||
};
|
||||
|
||||
export default function AboutPage() {
|
||||
return (
|
||||
<>
|
||||
<Nav />
|
||||
<main className="flex-1 bg-paper pb-20 pt-28 sm:pt-32">
|
||||
<div className="mx-auto w-full max-w-3xl px-5 sm:px-8">
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.18em] text-[#0d7a57]">Über Entscheidomat</p>
|
||||
<h1 className="mt-4 text-balance font-display text-5xl font-semibold leading-[0.95] tracking-[-0.045em] text-ink sm:text-6xl">Ein kleiner Ort für klare Alltagsentscheidungen.</h1>
|
||||
<div className="mt-10 space-y-6 text-lg leading-relaxed text-ink-soft">
|
||||
<p>Entscheidomat ist ein unabhängiges, kostenloses Webprojekt von Timo Knuth. Es bündelt einfache Zufalls-Tools für spielerische und folgenarme Situationen: eine Münze werfen, Namen ziehen, würfeln oder aus mehreren Optionen auswählen.</p>
|
||||
<p>Die Idee ist bewusst schlicht: Wenn alle Optionen vertretbar sind, kann ein klarer, nachvollziehbarer Zufallsimpuls das Grübeln beenden oder einer Gruppe den Einstieg erleichtern. Die Tools laufen direkt im Browser. Eigene Listen und Einstellungen werden nicht an einen Server übermittelt.</p>
|
||||
<p>Entscheidomat ist keine Beratungsstelle und ersetzt keine persönliche, medizinische, rechtliche, finanzielle oder sonstige fachliche Entscheidung. Bei Entscheidungen mit größeren Folgen sollen Informationen, Gespräche und gegebenenfalls qualifizierter Rat im Mittelpunkt stehen.</p>
|
||||
</div>
|
||||
<section className="mt-12 rounded-3xl border border-line bg-surface p-7 shadow-soft">
|
||||
<h2 className="font-display text-3xl font-semibold text-ink">So bleibt das Projekt nützlich</h2>
|
||||
<ul className="mt-5 space-y-3 leading-relaxed text-ink-soft">
|
||||
<li>Die wichtigsten Funktionen sind ohne Konto und ohne Zahlung nutzbar.</li>
|
||||
<li>Jedes Tool erklärt seinen Zweck, seine Grenzen und die lokale Speicherung eigener Eingaben.</li>
|
||||
<li>Der <Link className="font-semibold text-[#0d7a57] underline underline-offset-4" href="/ratgeber">Ratgeber</Link> ergänzt die Tools mit konkreten Anleitungen für faire, spielerische Auslosungen.</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section className="mt-12 border-t border-line pt-8 text-ink-soft">
|
||||
<h2 className="font-display text-3xl font-semibold text-ink">Kontakt und rechtliche Angaben</h2>
|
||||
<p className="mt-4">Feedback, Hinweise und Fragen sind per E-Mail an <a className="font-semibold text-[#0d7a57] underline underline-offset-4" href="mailto:info@entscheidomat.com">info@entscheidomat.com</a> willkommen.</p>
|
||||
<p className="mt-4">Vollständige Angaben zum Anbieter stehen im <Link className="font-semibold text-[#0d7a57] underline underline-offset-4" href="/impressum">Impressum</Link>. Informationen zur Datenverarbeitung findest du in der <Link className="font-semibold text-[#0d7a57] underline underline-offset-4" href="/datenschutz">Datenschutzerklärung</Link>.</p>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user