feat(admin): eigener Arbeitsbereich mit Dashboard, Zaehlern und Schnellsuche

- Admin ohne Shop-Kopf-/Fusszeile (HideOnAdmin); kein doppeltes <main> mehr
- Seitenleiste gruppiert (Verkauf, Sortiment, Kundschaft, Seite), aktive
  Seite als wandernde Flaeche mit Wabe, Zaehler fuer Wartendes: bezahlte
  offene Bestellungen, neue Retouren, unfreigegebene Bewertungen, neue
  Firmenanfragen (COUNT-Abfragen erst nach Admin-/2FA-Pruefung)
- Schnellsuche (Strg/Cmd+K): Seiten und haeufige Aktionen per Tastatur,
  tolerante Wortsuche, Ziele nur aus fester Liste
- Dashboard: Begruessung nach Tageszeit (Berliner Zeit), eine Leitzahl
  "Umsatz heute" mit Vergleich zu gestern und Mini-Verlauf, "Zu erledigen"
  mit direkten Links bzw. "Alles erledigt"-Siegel, ruhigere Kennzahl-Kacheln
- Diagramme nach dataviz-Skill: per Validator gepruefter Diagrammton
  #a0722f (>=3:1; #b88a44 erreichte nur 2,93:1), gerundete Balkenkappen,
  2px Luecke, Tooltip je Balken (auch per Tastatur), Meter mit Spur im
  selben Ton, Rang der Top-Produkte als Wabe
- Einheitliche Admin-Details zentral: groessere Ueberschriften,
  Tabellenkopf als Etikett, feste Ziffernbreite, eigene Auswahlpfeile

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-09-25 13:45:24 +02:00
1 parent 15ddceaa39
commit c95c713717
11 files changed
+762 -133

No files matched your search

+29
View File
@@ -1234,6 +1234,19 @@ export const de: Dictionary = {
noVouchersYet: "Noch keine Gutscheine eingelöst.",
usedCountLabel: (count, maxUses) => `${count}× genutzt${maxUses ? ` / ${maxUses}` : ""}`,
viewAllOrders: "Alle Bestellungen ansehen →",
greeting: (part, name) =>
`${part === "morning" ? "Guten Morgen" : part === "day" ? "Hallo" : "Guten Abend"}, ${name}.`,
todayRevenueLabel: "Umsatz heute",
monthRevenueLabel: "Umsatz diesen Monat",
vsYesterday: (delta, up) => `${up ? "↑" : "↓"} ${delta} gegenüber gestern`,
toDoHeading: "Zu erledigen",
toDoOrders: (count) => (count === 1 ? "1 Bestellung wartet auf Versand" : `${count} Bestellungen warten auf Versand`),
toDoReturns: (count) => (count === 1 ? "1 neue Retoure" : `${count} neue Retouren`),
toDoReviews: (count) => (count === 1 ? "1 Bewertung wartet auf Freigabe" : `${count} Bewertungen warten auf Freigabe`),
toDoInquiries: (count) => (count === 1 ? "1 neue Firmenanfrage" : `${count} neue Firmenanfragen`),
allDoneTitle: "Alles erledigt.",
allDoneText: "Gerade wartet nichts auf dich. Zeit für die Bienen.",
chartTooltip: (day, value) => `${day}: ${value}`,
},
adminContentPage: {
backToDashboard: "Zurück zum Dashboard",
@@ -1308,6 +1321,22 @@ export const de: Dictionary = {
closeMenu: "Menü schließen",
loggedInAs: (name) => `Angemeldet als ${name}`,
logout: "Abmelden",
groupSales: "Verkauf",
groupRange: "Sortiment",
groupCustomers: "Kundschaft",
groupSite: "Seite",
paletteOpen: "Schnellsuche",
paletteShortcut: "Strg K",
palettePlaceholder: "Wohin? Seite oder Aktion suchen …",
paletteNoResults: "Nichts gefunden.",
paletteSectionPages: "Seiten",
paletteSectionActions: "Aktionen",
actionNewProduct: "Neues Produkt anlegen",
actionNewVoucher: "Neuen Gutschein anlegen",
actionNewUser: "Neues Konto anlegen",
actionNewShippingTier: "Neue Versandstufe anlegen",
actionViewShop: "Shop ansehen",
badgeWaiting: (count) => `${count} warten`,
twoFactorWarning:
"Dieses Admin-Konto hat noch keine Zwei-Faktor-Authentifizierung aktiviert, empfohlen für Konten mit Zugriff auf Bestellungen, Rückerstattungen und Kundendaten.",
twoFactorSetupLink: "Jetzt einrichten →",
+29
View File
@@ -1220,6 +1220,19 @@ export const en: Dictionary = {
noVouchersYet: "No vouchers redeemed yet.",
usedCountLabel: (count, maxUses) => `used ${count}×${maxUses ? ` / ${maxUses}` : ""}`,
viewAllOrders: "View all orders →",
greeting: (part, name) =>
`${part === "morning" ? "Good morning" : part === "day" ? "Hello" : "Good evening"}, ${name}.`,
todayRevenueLabel: "Revenue today",
monthRevenueLabel: "Revenue this month",
vsYesterday: (delta, up) => `${up ? "↑" : "↓"} ${delta} vs. yesterday`,
toDoHeading: "To do",
toDoOrders: (count) => (count === 1 ? "1 order waiting to ship" : `${count} orders waiting to ship`),
toDoReturns: (count) => (count === 1 ? "1 new return" : `${count} new returns`),
toDoReviews: (count) => (count === 1 ? "1 review awaiting approval" : `${count} reviews awaiting approval`),
toDoInquiries: (count) => (count === 1 ? "1 new business inquiry" : `${count} new business inquiries`),
allDoneTitle: "All done.",
allDoneText: "Nothing is waiting for you right now. Time for the bees.",
chartTooltip: (day, value) => `${day}: ${value}`,
},
adminContentPage: {
backToDashboard: "Back to dashboard",
@@ -1294,6 +1307,22 @@ export const en: Dictionary = {
closeMenu: "Close menu",
loggedInAs: (name) => `Signed in as ${name}`,
logout: "Sign out",
groupSales: "Sales",
groupRange: "Range",
groupCustomers: "Customers",
groupSite: "Site",
paletteOpen: "Quick search",
paletteShortcut: "Ctrl K",
palettePlaceholder: "Where to? Search a page or action …",
paletteNoResults: "Nothing found.",
paletteSectionPages: "Pages",
paletteSectionActions: "Actions",
actionNewProduct: "Create new product",
actionNewVoucher: "Create new voucher",
actionNewUser: "Create new account",
actionNewShippingTier: "Create new shipping tier",
actionViewShop: "View shop",
badgeWaiting: (count) => `${count} waiting`,
twoFactorWarning:
"This admin account doesn't have two-factor authentication enabled yet, recommended for accounts with access to orders, refunds, and customer data.",
twoFactorSetupLink: "Set up now →",
+28
View File
@@ -895,6 +895,18 @@ export interface Dictionary {
noVouchersYet: string;
usedCountLabel: (count: number, maxUses: number | null) => string;
viewAllOrders: string;
greeting: (part: "morning" | "day" | "evening", name: string) => string;
todayRevenueLabel: string;
monthRevenueLabel: string;
vsYesterday: (delta: string, up: boolean) => string;
toDoHeading: string;
toDoOrders: (count: number) => string;
toDoReturns: (count: number) => string;
toDoReviews: (count: number) => string;
toDoInquiries: (count: number) => string;
allDoneTitle: string;
allDoneText: string;
chartTooltip: (day: string, value: string) => string;
};
adminContentPage: {
backToDashboard: string;
@@ -964,6 +976,22 @@ export interface Dictionary {
closeMenu: string;
loggedInAs: (name: string) => string;
logout: string;
groupSales: string;
groupRange: string;
groupCustomers: string;
groupSite: string;
paletteOpen: string;
paletteShortcut: string;
palettePlaceholder: string;
paletteNoResults: string;
paletteSectionPages: string;
paletteSectionActions: string;
actionNewProduct: string;
actionNewVoucher: string;
actionNewUser: string;
actionNewShippingTier: string;
actionViewShop: string;
badgeWaiting: (count: number) => string;
twoFactorWarning: string;
twoFactorSetupLink: string;
};