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:
1 parent
839bbff595
commit
3cb639c154
11 files changed
+621
-123
No files matched your search
+10
-4
@@ -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) => ({
|
||||
|
||||
Reference in new issue
Block a user