- Vite, React 18, TypeScript und Tailwind mit dunklem Standard-Theme über CSS-Variablen, heller Modus umschaltbar und in localStorage gemerkt - Anmeldung, erzwungener Passwortwechsel, Layout mit Seitenleiste - API-Client mit stiller Token-Erneuerung, TanStack Query mit Fehler-Toasts - Seiten Recurrences (inkl. Detail-Drawer), Transactions, Merchants, Settings - Geführter RRULE-Editor mit Vorlagen, Expertenmodus, deutschem Klartext und Live-Vorschau der nächsten Termine vom preview-Endpunkt - Firmen-Kachelgrid mit Logo, Markenfarbe und Logo-Auswahldialog samt Upload - Beträge durchgängig in de-DE, Eingabe in beiden Schreibweisen - 49 Tests, tsc --noEmit und eslint sauber, Produktionsbundle baut Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
27 lines
939 B
HTML
27 lines
939 B
HTML
<!doctype html>
|
|
<html lang="de" class="dark">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta name="color-scheme" content="dark light" />
|
|
<meta name="description" content="Planung monatlicher Kosten und Einkünfte." />
|
|
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
<title>moneyfy</title>
|
|
<script>
|
|
// Vor dem ersten Rendern anwenden, damit die Seite nicht kurz aufblitzt.
|
|
(function () {
|
|
try {
|
|
var gespeichert = localStorage.getItem("moneyfy.theme");
|
|
if (gespeichert === "light") document.documentElement.classList.remove("dark");
|
|
} catch (fehler) {
|
|
/* Privatmodus ohne localStorage: es bleibt beim dunklen Standard. */
|
|
}
|
|
})();
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
</body>
|
|
</html>
|