Files
moneyfy/frontend/src/store/ui.ts
T
Jonas MenzelandClaude Opus 5 d63cc0af65
Images bauen / build (backend) (push) Failing after 58s
Images bauen / build (frontend) (push) Failing after 57s
CI / backend (push) Successful in 2m21s
CI / frontend (push) Canceled after 4m40s
feat: Politur – Demodaten, Kürzel, Fehlerseiten, Kontraste
- Demo-Seed mit realistischem deutschem Haushalt (make seed-demo): drei Konten,
  zehn Firmen samt Logos, zwölf Posten, bestätigte Historie, Buchungen, Budgets
  und Sparziele; alle Termine relativ zum heutigen Monat
- Tastaturkürzel n / r / / / ? samt Übersicht; greifen nur außerhalb von
  Eingabefeldern
- Fehlergrenze für Renderfehler und eigene 404-Seite
- Farbtoken beider Modi gegen WCAG geprüft und nachgezogen: Hilfstext lag hell
  bei 2,56:1, Weiß auf dem Primärknopf bei 3,30:1 – jetzt überall >= 4,5:1
- Abo-Übersicht heißt „Laufende Kosten“, weil sie auch Miete und Sparplan enthält
- build.yml fällt auf GITEA_TOKEN zurück, wenn REGISTRY_TOKEN fehlt, und erklärt
  im Fehlerfall, wie das Secret anzulegen ist
- README mit Screenshot-Abschnitt, Kürzeln und Barrierefreiheit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
2026-09-09 21:55:01 +02:00

39 lines
1.2 KiB
TypeScript

/**
* Kleiner Zustand für seitenübergreifende Absichten.
*
* Ein Tastaturkürzel wird im Layout ausgelöst, wirkt aber auf einer anderen
* Seite. Statt Rückrufe durch den Baum zu reichen, hinterlegt das Layout hier
* eine Absicht, die die Zielseite nach dem Wechsel abholt.
*/
import { create } from "zustand";
export type PendingAction = "new-transaction" | "new-recurrence";
interface UiStore {
pendingAction: PendingAction | null;
/** Zähler; jede Erhöhung fordert die aktive Seite auf, ihr Suchfeld zu fokussieren. */
searchFocusRequest: number;
requestAction: (action: PendingAction) => void;
/** Holt die Absicht ab und löscht sie. True, wenn sie zur Seite passte. */
consumeAction: (action: PendingAction) => boolean;
requestSearchFocus: () => void;
}
export const useUiStore = create<UiStore>((set, get) => ({
pendingAction: null,
searchFocusRequest: 0,
requestAction: (action) => set({ pendingAction: action }),
consumeAction: (action) => {
if (get().pendingAction !== action) return false;
set({ pendingAction: null });
return true;
},
requestSearchFocus: () =>
set((zustand) => ({ searchFocusRequest: zustand.searchFocusRequest + 1 })),
}));