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
This commit is contained in:
co-authored by
Claude Opus 5
parent
bdf4097bd7
commit
d63cc0af65
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* 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 })),
|
||||
}));
|
||||
Reference in New Issue
Block a user