feat(frontend): Oberfläche mit RRULE-Editor und Logo-Auswahl

- 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
This commit is contained in:
moneyfy
2026-09-09 16:23:04 +02:00
co-authored by Claude Opus 5
parent 8edb69fe6a
commit 8d6fcfeb58
57 changed files with 13064 additions and 2 deletions
+73
View File
@@ -0,0 +1,73 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
/* Heller Modus */
:root {
--color-ground: 248 250 252;
--color-surface: 255 255 255;
--color-raised: 241 245 249;
--color-line: 226 232 240;
--color-ink: 15 23 42;
--color-muted: 71 85 105;
--color-faint: 148 163 184;
--color-accent: 22 163 74;
--color-accent-ink: 255 255 255;
--color-positive: 21 128 61;
--color-negative: 190 18 60;
--color-warning: 180 83 9;
}
/* Dunkler Modus die Vorgabe der Anwendung */
.dark {
--color-ground: 15 17 21;
--color-surface: 24 27 33;
--color-raised: 33 37 45;
--color-line: 51 57 68;
--color-ink: 226 232 240;
--color-muted: 148 163 184;
--color-faint: 100 116 139;
--color-accent: 34 197 94;
--color-accent-ink: 4 20 11;
--color-positive: 74 222 128;
--color-negative: 248 113 113;
--color-warning: 251 191 36;
}
html {
@apply h-full;
}
body {
@apply h-full bg-ground font-sans text-ink antialiased;
}
#root {
@apply h-full;
}
/* Sichtbarer Fokus überall die Anwendung ist vollständig per Tastatur bedienbar. */
:focus-visible {
@apply outline-none ring-2 ring-accent ring-offset-2 ring-offset-ground;
}
::-webkit-scrollbar {
@apply h-2 w-2;
}
::-webkit-scrollbar-thumb {
@apply rounded-full bg-line;
}
}
@layer components {
.card {
@apply rounded-card border border-line bg-surface;
}
/* Zahlen sollen untereinander bündig stehen. */
.tabular {
font-variant-numeric: tabular-nums;
}
}