Browse Source
- Replaced CartSheet and CartSidebar components with a new CartResponsive component that adapts to screen size, providing a unified cart experience. - Implemented responsive animations for the cart, allowing it to slide in from the right on desktop and from the bottom on mobile. - Updated styles and layout in tailwind.css to support new animation effects for the cart component.main
6 changed files with 184 additions and 86 deletions
@ -1,66 +0,0 @@ |
|||||
<script setup lang="ts"> |
|
||||
import { |
|
||||
Sheet, |
|
||||
SheetContent, |
|
||||
SheetHeader, |
|
||||
SheetTitle, |
|
||||
} from '@/components/ui/sheet' |
|
||||
import { ScrollArea } from '@/components/ui/scroll-area' |
|
||||
import CartEmpty from './CartEmpty.vue' |
|
||||
import CartItem from './CartItem.vue' |
|
||||
import CartSummary from './CartSummary.vue' |
|
||||
|
|
||||
// Get cart state and UI controls |
|
||||
const { items, itemCount, total, loading, updateItem, removeItem } = useCart() |
|
||||
const { isOpen, close } = useCartUI() |
|
||||
|
|
||||
// Handle quantity update |
|
||||
async function handleUpdateQuantity(itemId: string, quantity: number) { |
|
||||
await updateItem(itemId, quantity) |
|
||||
} |
|
||||
|
|
||||
// Handle item removal |
|
||||
async function handleRemoveItem(itemId: string) { |
|
||||
await removeItem(itemId) |
|
||||
} |
|
||||
|
|
||||
// Navigate to checkout |
|
||||
function handleCheckout() { |
|
||||
close() |
|
||||
navigateTo('/checkout') |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<template> |
|
||||
<Sheet :open="isOpen" @update:open="(open) => !open && close()"> |
|
||||
<SheetContent side="bottom" class="h-[90vh] p-0 flex flex-col"> |
|
||||
<!-- Header --> |
|
||||
<SheetHeader class="px-6 py-4 border-b"> |
|
||||
<SheetTitle class="text-xl font-bold"> |
|
||||
Warenkorb ({{ itemCount }}) |
|
||||
</SheetTitle> |
|
||||
</SheetHeader> |
|
||||
|
|
||||
<!-- Empty State --> |
|
||||
<div v-if="itemCount === 0" class="flex-1 flex items-center justify-center px-6"> |
|
||||
<CartEmpty /> |
|
||||
</div> |
|
||||
|
|
||||
<!-- Cart Items + Summary --> |
|
||||
<template v-else> |
|
||||
<!-- Scrollable Items List --> |
|
||||
<ScrollArea class="flex-1 px-6"> |
|
||||
<div class="space-y-4 py-4"> |
|
||||
<CartItem v-for="item in items" :key="item.id" :item="item" :loading="loading" |
|
||||
@update:quantity="(qty) => handleUpdateQuantity(item.id, qty)" @remove="handleRemoveItem(item.id)" /> |
|
||||
</div> |
|
||||
</ScrollArea> |
|
||||
|
|
||||
<!-- Sticky Footer with Summary --> |
|
||||
<div class="border-t px-6 py-4 bg-background"> |
|
||||
<CartSummary :items="items" :total="total" :loading="loading" @checkout="handleCheckout" /> |
|
||||
</div> |
|
||||
</template> |
|
||||
</SheetContent> |
|
||||
</Sheet> |
|
||||
</template> |
|
||||
Loading…
Reference in new issue