Files
planer/src/app/layout.tsx
T
Florian WildeandClaude Opus 5 9565b9a920 feat: Schnellerfassung vom Handy, auch ohne Netz
Ein Feld, ein Knopf, grosse Flaeche. Was ohne Netz erfasst wird, liegt in
IndexedDB, bis es hinausgeht — nicht in localStorage: Ein Eintrag, der
beim Aufraeumen des Speichers verschwindet, ist eine verlorene Aufgabe.

Erst anstellen, dann senden. Andersherum ginge der Eintrag verloren, wenn
der Browser mitten im Senden geschlossen wird. Jede Erfassung traegt eine
vom Geraet vergebene Kennung, damit eine doppelt zugestellte Nachricht
keine zweite Aufgabe ergibt.

Der Dienstarbeiter haelt genau diese eine Seite offline bereit und sonst
nichts. Ein halb veralteter Planer waere schlimmer als gar keiner — ein
Eingabefeld dagegen veraltet nicht, und ohne die Seite naehme die
Warteschlange im Geraet niemandem etwas ab.

Dazu das Manifest, damit sich der Planer als Anwendung ablegen laesst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 11:09:39 +02:00

44 lines
1.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { Metadata, Viewport } from 'next'
import { Toaster } from 'sonner'
import { FarbschemaAnbieter } from '@/components/farbschema-anbieter'
import './globals.css'
export const metadata: Metadata = {
title: {
default: 'Planer',
template: '%s – Planer',
},
description: 'Aufgaben, Ideen, Projekte und Zeitblöcke an einem Ort.',
applicationName: 'Planer',
robots: { index: false, follow: false },
manifest: '/manifest.webmanifest',
icons: {
icon: '/symbol.svg',
apple: '/symbol.svg',
},
// Auf dem iPhone laeuft eine hinzugefuegte Seite sonst mit Browserleiste.
appleWebApp: { capable: true, title: 'Planer', statusBarStyle: 'default' },
}
export const viewport: Viewport = {
width: 'device-width',
initialScale: 1,
themeColor: [
{ media: '(prefers-color-scheme: light)', color: '#fbfbfd' },
{ media: '(prefers-color-scheme: dark)', color: '#1a1c22' },
],
}
export default function WurzelLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="de" suppressHydrationWarning>
<body className="min-h-dvh antialiased">
<FarbschemaAnbieter>
{children}
<Toaster position="bottom-right" richColors closeButton />
</FarbschemaAnbieter>
</body>
</html>
)
}