Neue Seite Verwaltung -> QR-Typen mit einem Schalter je Typ. Abgeschaltete Typen verschwinden vollstaendig von der Startseite und lassen sich nicht mehr neu anlegen. - Neue Tabelle QrTypeSetting; fehlender Eintrag heisst freigegeben, damit eine frische Installation ohne Vorbelegung laeuft und spaetere Typen automatisch erscheinen. - Registry-Feld 'active' heisst jetzt 'implemented' und beschreibt nur noch, ob der Typ ausprogrammiert ist. Ob er erscheint, entscheidet zusaetzlich die Freigabe aus der Datenbank (src/lib/qr/availability.ts). - Bestehende dynamische Codes bleiben von einer Abschaltung unberuehrt: die Weiterleitung funktioniert weiter und Bearbeiten bleibt moeglich. Ein gedruckter Code darf durch einen Schalter nicht ungueltig werden. - resolveQrRequest ist dadurch asynchron geworden; QrRequestError liegt jetzt in type-module.ts, sonst gaebe es einen Ringschluss mit availability.ts. - Startseite meldet jetzt auch den Fall, dass nur noch Platzhalter freigegeben sind - vorher standen dort 14 tote Kacheln ohne Erklaerung. - Kopfzeile: Schriftzug auf schmalen Geraeten ausgeblendet, sonst passte die dritte Navigationsschaltflaeche nicht mehr in die Zeile (7px Ueberlauf).
67 lines
2.5 KiB
TypeScript
67 lines
2.5 KiB
TypeScript
import type { Metadata } from "next";
|
|
import Link from "next/link";
|
|
|
|
import { Icon } from "@/components/icons";
|
|
import "./globals.css";
|
|
|
|
export const metadata: Metadata = {
|
|
title: {
|
|
default: "QR-Code-Generator",
|
|
template: "%s · QR-Code-Generator",
|
|
},
|
|
description:
|
|
"QR-Codes erstellen: statisch oder dynamisch, mit eigenen Farben, frei wählbarer Größe und Download als PNG oder SVG.",
|
|
};
|
|
|
|
export default function RootLayout({ children }: LayoutProps<"/">) {
|
|
return (
|
|
<html lang="de" className="h-full">
|
|
<body className="flex min-h-full flex-col">
|
|
<header className="border-b border-slate-200 bg-white">
|
|
<div className="mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-x-4 gap-y-2 px-4 py-3.5 sm:px-6">
|
|
<Link
|
|
href="/"
|
|
className="flex items-center gap-2.5 rounded-lg font-semibold text-slate-900"
|
|
>
|
|
<span className="flex size-9 items-center justify-center rounded-lg bg-indigo-600 text-white">
|
|
<Icon name="qr" className="size-5" />
|
|
</span>
|
|
{/* Auf schmalen Geräten reicht das Zeichen — sonst passt die
|
|
Navigation nicht mehr in eine Zeile. */}
|
|
<span className="hidden sm:inline">QR-Code-Generator</span>
|
|
</Link>
|
|
<nav className="flex items-center gap-0.5 text-sm font-medium sm:gap-1">
|
|
<Link
|
|
href="/"
|
|
className="rounded-lg px-3 py-2 text-slate-600 transition-colors hover:bg-slate-100 hover:text-slate-900"
|
|
>
|
|
Erstellen
|
|
</Link>
|
|
<Link
|
|
href="/meine-codes"
|
|
className="rounded-lg px-3 py-2 text-slate-600 transition-colors hover:bg-slate-100 hover:text-slate-900"
|
|
>
|
|
Meine Codes
|
|
</Link>
|
|
<Link
|
|
href="/verwaltung/typen"
|
|
className="rounded-lg px-3 py-2 text-slate-600 transition-colors hover:bg-slate-100 hover:text-slate-900"
|
|
>
|
|
Verwaltung
|
|
</Link>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main className="flex-1">{children}</main>
|
|
|
|
<footer className="border-t border-slate-200 bg-white">
|
|
<div className="mx-auto max-w-6xl px-4 py-6 text-sm text-slate-500 sm:px-6">
|
|
QR-Code-Generator · Version 1 — QR-Typ „Website/URL“
|
|
</div>
|
|
</footer>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|