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>
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
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>
|
||
)
|
||
}
|