feat(ui): Fundament und Einkaufserlebnis visuell aufgewertet

- Fundament: feine Papierkoernung, Scrollbar/Cursor/Fokusring/Markierung in
  Markenfarben, gleich breite Ziffern fuer Preise, einlaufende Unterstriche
- Knoepfe fuellen sich beim Hover von unten wie ein Glas (Honig/Waldgruen),
  geben beim Klick nach
- Wabenmotiv aus dem Logo als Komponente (Raster, Markierung, Haekchen)
- In den Warenkorb: ein Honigtropfen fliegt im Bogen zum Korb, der Korb
  wippt, der Zaehler springt, erst dann oeffnet die Schublade; Knopf zeigt
  gezeichnetes Haekchen. Reduzierte Bewegung: Schublade oeffnet sofort.
- Produktkarten: Honigschimmer, Anheben, Serifen-Preis, gestaffeltes
  Erscheinen, Pfeil-Links
- Produktseite: mitlaufendes Bild auf Wabenraster, groesserer Titel und
  Preis, sich fuellende Geschmacksskala, Waben-Haekchen statt "✓"
- Shop-Filter als einheitliche Werkzeugleiste mit Schalter
- Warenkorb-Schublade: Dialog-Semantik, animierte Positionen, tickende
  Summe, gestalteter leerer Zustand

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 04:56:03 +02:00
1 parent 839bbff595
commit 3cb639c154
11 files changed
+621 -123

No files matched your search

+10 -4
View File
@@ -25,7 +25,12 @@ interface CartState {
setHasHydrated: (hasHydrated: boolean) => void;
openCart: () => void;
closeCart: () => void;
addItem: (item: Omit<CartItem, "quantity">, quantity?: number) => void;
/**
* openDrawer: false laesst die Schublade zu — die Flug-Animation zum
* Warenkorb-Symbol (components/cart-flight.tsx) oeffnet sie erst, wenn
* der Tropfen gelandet ist.
*/
addItem: (item: Omit<CartItem, "quantity">, quantity?: number, options?: { openDrawer?: boolean }) => void;
removeItem: (productId: string) => void;
setQuantity: (productId: string, quantity: number) => void;
clear: () => void;
@@ -40,8 +45,9 @@ export const useCartStore = create<CartState>()(
setHasHydrated: (hasHydrated) => set({ hasHydrated }),
openCart: () => set({ isOpen: true }),
closeCart: () => set({ isOpen: false }),
addItem: (item, quantity = 1) =>
addItem: (item, quantity = 1, options) =>
set((state) => {
const isOpen = options?.openDrawer === false ? state.isOpen : true;
const existing = state.items.find((i) => i.productId === item.productId);
if (existing) {
return {
@@ -50,10 +56,10 @@ export const useCartStore = create<CartState>()(
? { ...i, quantity: i.quantity + quantity }
: i
),
isOpen: true,
isOpen,
};
}
return { items: [...state.items, { ...item, quantity }], isOpen: true };
return { items: [...state.items, { ...item, quantity }], isOpen };
}),
removeItem: (productId) =>
set((state) => ({