From f729ccbd08c409a026fa5183aeb861b548676db6 Mon Sep 17 00:00:00 2001 From: "ALMAZROUEI Shamma (2021) WKIS203" <shamma.almazrouei.2021@live.rhul.ac.uk> Date: Tue, 11 Mar 2025 19:32:04 +0530 Subject: [PATCH] Build menu page --- golden-crust-bakery/index.html | 2 +- golden-crust-bakery/public/favicon.ico | Bin 0 -> 15406 bytes golden-crust-bakery/src/index.css | 7 +- golden-crust-bakery/src/lib/data.js | 48 ++++--- golden-crust-bakery/src/main.jsx | 5 + golden-crust-bakery/src/pages/About.jsx | 6 +- golden-crust-bakery/src/pages/Landing.jsx | 14 +- golden-crust-bakery/src/pages/Menu.jsx | 148 ++++++++++++++++++++++ 8 files changed, 201 insertions(+), 29 deletions(-) create mode 100644 golden-crust-bakery/public/favicon.ico create mode 100644 golden-crust-bakery/src/pages/Menu.jsx diff --git a/golden-crust-bakery/index.html b/golden-crust-bakery/index.html index c1e0ed6..1b1a6cc 100644 --- a/golden-crust-bakery/index.html +++ b/golden-crust-bakery/index.html @@ -2,7 +2,7 @@ <html lang="en"> <head> <meta charset="UTF-8" /> - <link rel="icon" type="image/svg+xml" href="/vite.svg" /> + <link rel="icon" type="image/svg+xml" href="/favicon.ico" /> <link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> diff --git a/golden-crust-bakery/public/favicon.ico b/golden-crust-bakery/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8aae0ed8413fb8d595c49f7d931694502f2b9f36 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/golden-crust-bakery/src/index.css b/golden-crust-bakery/src/index.css index 80ea3b7..901127c 100644 --- a/golden-crust-bakery/src/index.css +++ b/golden-crust-bakery/src/index.css @@ -1,6 +1,7 @@ @tailwind base; @tailwind components; @tailwind utilities; + @layer base { :root { --background: 0 0% 100%; @@ -27,8 +28,9 @@ --chart-3: 197 37% 24%; --chart-4: 43 74% 66%; --chart-5: 27 87% 67%; - --radius: 0.5rem + --radius: 0.5rem; } + .dark { --background: 224 71.4% 4.1%; --foreground: 210 20% 98%; @@ -53,9 +55,10 @@ --chart-2: 160 60% 45%; --chart-3: 30 80% 55%; --chart-4: 280 65% 60%; - --chart-5: 340 75% 55% + --chart-5: 340 75% 55%; } } + @layer base { * { @apply border-border; diff --git a/golden-crust-bakery/src/lib/data.js b/golden-crust-bakery/src/lib/data.js index 4929e52..0b91f88 100644 --- a/golden-crust-bakery/src/lib/data.js +++ b/golden-crust-bakery/src/lib/data.js @@ -6,7 +6,8 @@ export const cakeData = [ 'Fresh strawberries on a vanilla base with cream cheese frosting. Perfect for summer celebrations.', price: 32.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.flurys.com/cdn/shop/products/StrawberryCake_2.jpg?v=1676363157&width=1280', }, { id: 2, @@ -15,7 +16,8 @@ export const cakeData = [ "Rich chocolate cake with ganache and chocolate shavings. A chocolate lover's paradise.", price: 34.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.flurys.com/cdn/shop/products/ChocolateCake_1.jpg?v=1676363155&width=1280', }, { id: 3, @@ -24,7 +26,8 @@ export const cakeData = [ 'Zesty lemon cake with lemon curd and buttercream. Bright and refreshing for any occasion.', price: 29.99, category: 'Special Occasion', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://charlotteslivelykitchen.com/wp-content/uploads/2019/05/lemon-cake-2.jpg', }, { id: 4, @@ -33,7 +36,8 @@ export const cakeData = [ 'Classic red velvet cake with cream cheese frosting. Elegant and timeless.', price: 36.99, category: 'Wedding', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.flurys.com/cdn/shop/products/RedVelvetCake_1.jpg?v=1676363275&width=1280', }, { id: 5, @@ -42,7 +46,8 @@ export const cakeData = [ 'Premium vanilla bean cake with vanilla buttercream. Simple yet sophisticated.', price: 28.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.fnp.com/images/pr/l/v20221130174940/vanilla-buttercream-cake-half-kg_1.jpg', }, { id: 6, @@ -51,7 +56,8 @@ export const cakeData = [ 'Moist carrot cake with walnuts and cream cheese frosting. A beloved classic.', price: 31.99, category: 'Special Occasion', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://i0.wp.com/baketotheroots.de/wp-content/uploads/2024/03/SQ_240320_Baked-Carrot-Cake-Cheesecake.jpg?fit=1200%2C1200&ssl=1', }, { id: 7, @@ -60,7 +66,8 @@ export const cakeData = [ 'Coffee-soaked layers with mascarpone cream and cocoa. An Italian favorite.', price: 38.99, category: 'Special Occasion', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://simshomekitchen.com/wp-content/uploads/2023/08/Tiramisu-birthday-cake-recipe.jpg', }, { id: 8, @@ -69,7 +76,8 @@ export const cakeData = [ 'Three-tier white cake with delicate floral decorations. Perfect for your special day.', price: 149.99, category: 'Wedding', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.warmoven.in/blog/wp-content/uploads/2024/07/Buttercream-Beauty.png', }, { id: 9, @@ -78,7 +86,8 @@ export const cakeData = [ 'Warm pumpkin cake with cinnamon cream cheese frosting. Ideal for fall celebrations.', price: 33.99, category: 'Seasonal', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://chelsweets.com/wp-content/uploads/2018/10/cropped-pumpkin-cake-with-leaves.jpg', }, { id: 10, @@ -87,7 +96,8 @@ export const cakeData = [ 'Chocolate cake with mint buttercream and chocolate chips. Refreshingly delicious.', price: 35.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://livforcake.com/wp-content/uploads/2017/05/mint-chocolate-chip-cake-3.jpg', }, { id: 11, @@ -96,7 +106,8 @@ export const cakeData = [ 'Coconut cake with coconut cream and toasted coconut flakes. A tropical treat.', price: 32.99, category: 'Special Occasion', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.allrecipes.com/thmb/1LRCshuWcZJtOLg51z3r93RX4H8=/1500x0/filters:no_upscale():max_bytes(150000):strip_icc()/6698942-old-fashioned-coconut-cake-Kim-4x3-1-6b2b8ed757ac4b3884e773a1452e66b1.jpg', }, { id: 12, @@ -105,7 +116,8 @@ export const cakeData = [ 'Chocolate cake with cherries and whipped cream. A German classic.', price: 37.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://ichef.bbci.co.uk/food/ic/food_16x9_1600/recipes/black_forest_gateau_43895_16x9.jpg', }, { id: 13, @@ -114,7 +126,8 @@ export const cakeData = [ 'Spiced cake with cinnamon, nutmeg, and cloves. Perfect for winter holidays.', price: 34.99, category: 'Seasonal', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://zimmysnook.ca/wp-content/uploads/2024/01/IMG_8538_jpg-2-e1706408096718.jpg', }, { id: 14, @@ -123,7 +136,8 @@ export const cakeData = [ 'White cake with raspberry filling and white chocolate buttercream. Delicate and delicious.', price: 36.99, category: 'Wedding', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://assets-eu-01.kc-usercontent.com/559bb7d3-88a4-01c1-79a3-dd4d5b2d2bb0/8e846b3a-7973-4604-9913-f2edd322c701/Chocolate-Raspberry-Cake-SQUARE-2.jpg', }, { id: 15, @@ -132,7 +146,8 @@ export const cakeData = [ 'Vanilla cake with caramel filling and salted caramel drizzle. Sweet with a touch of salt.', price: 33.99, category: 'Birthday', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://www.supergoldenbakes.com/wordpress/wp-content/uploads/2023/05/Mary_Berry_Salted_Caramel_Cake-1.jpg', }, { id: 16, @@ -141,6 +156,7 @@ export const cakeData = [ 'Light lemon cake with floral decorations. A celebration of spring.', price: 35.99, category: 'Seasonal', - image: '/placeholder.svg?height=300&width=300', + image: + 'https://cdn11.bigcommerce.com/s-vm6doh2w4n/images/stencil/original/products/7183/18736/muf056gd8e3szbpyf098__55091.1728509796.jpg?c=1', }, ]; diff --git a/golden-crust-bakery/src/main.jsx b/golden-crust-bakery/src/main.jsx index 42b3ab9..d41fb02 100644 --- a/golden-crust-bakery/src/main.jsx +++ b/golden-crust-bakery/src/main.jsx @@ -13,6 +13,7 @@ import About from './pages/About'; import Contact from './pages/Contact'; import Login from './pages/Login'; import Register from './pages/Register'; +import Menu from './pages/Menu'; const router = createBrowserRouter([ { @@ -39,6 +40,10 @@ const router = createBrowserRouter([ path: '/register', element: <Register />, }, + { + path: '/menu', + element: <Menu />, + }, ], }, ]); diff --git a/golden-crust-bakery/src/pages/About.jsx b/golden-crust-bakery/src/pages/About.jsx index 4763221..033a62f 100644 --- a/golden-crust-bakery/src/pages/About.jsx +++ b/golden-crust-bakery/src/pages/About.jsx @@ -9,19 +9,19 @@ export default function About() { const reviews = [ { name: 'Sophia Patel', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-long-hair_23-2149436197.jpg?t=st=1741676033~exp=1741679633~hmac=d35bb3732ce662b10cc27aeeeb8f7055efc62b78e3642aa24f1beae0accddd45&w=1480', + img: 'https://avatar.iran.liara.run/public/94', comment: 'The cake was absolutely delicious and beautifully decorated. Everyone at the party loved it! Will definitely order again.', }, { name: 'Liam Johnson', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-sunglasses_23-2149436188.jpg?t=st=1741676063~exp=1741679663~hmac=2ea273721392950d9ee9cca8ae25fe80bd6d78d33c5ad6d6189cb20dd8f7f5be&w=1480', + img: 'https://avatar.iran.liara.run/public/25', comment: 'Amazing taste and perfect texture! The custom design was exactly as I imagined. Highly recommended!', }, { name: 'Emma Williams', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-rainbow-sunglasses_23-2149436181.jpg?t=st=1741676083~exp=1741679683~hmac=f3c74b0465c88d8090fc9fd8d54f8d0fbdf0c7ba00140199a6df67c79493ead0&w=1480', + img: 'https://avatar.iran.liara.run/public/91', comment: "Fresh, flavorful, and elegantly crafted. It was the highlight of our celebration. Can't wait to try another one!", }, diff --git a/golden-crust-bakery/src/pages/Landing.jsx b/golden-crust-bakery/src/pages/Landing.jsx index ed3ce8f..ccb5c86 100644 --- a/golden-crust-bakery/src/pages/Landing.jsx +++ b/golden-crust-bakery/src/pages/Landing.jsx @@ -24,7 +24,7 @@ export default function Landing() { 'Fresh strawberries on a vanilla base with cream cheese frosting', price: 32.99, image: - 'https://img.freepik.com/free-photo/layered-strawberry-vanilla-cake_1268-30137.jpg?t=st=1741675243~exp=1741678843~hmac=18ff6c24294bea6279aaa5b098c4a57da2db82fe33382670a5d1b416bcdf4542&w=1800', + 'https://www.flurys.com/cdn/shop/products/StrawberryCake_2.jpg?v=1676363157&width=1280', }, { id: 2, @@ -32,7 +32,7 @@ export default function Landing() { description: 'Rich chocolate cake with ganache and chocolate shavings', price: 34.99, image: - 'https://img.freepik.com/free-photo/front-view-sweet-chocolate-cake_23-2148834059.jpg?t=st=1741675403~exp=1741679003~hmac=2b7bf4f657915b4b0db2b724abf1b841c8144d28605691ec47b8113a76033fc2&w=1800', + 'https://www.flurys.com/cdn/shop/products/ChocolateCake_1.jpg?v=1676363155&width=840', }, { id: 3, @@ -40,26 +40,26 @@ export default function Landing() { description: 'Zesty lemon cake with lemon curd and buttercream', price: 29.99, image: - 'https://img.freepik.com/free-photo/ai-generated-cake-picture_23-2150649358.jpg?t=st=1741675442~exp=1741679042~hmac=8110dd439d3217343e7ed54e128ce94fb8db9a53297529616caa4d2119f88751&w=1800', + 'https://charlotteslivelykitchen.com/wp-content/uploads/2019/05/lemon-cake-2.jpg', }, ]; const reviews = [ { name: 'Sophia Patel', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-long-hair_23-2149436197.jpg?t=st=1741676033~exp=1741679633~hmac=d35bb3732ce662b10cc27aeeeb8f7055efc62b78e3642aa24f1beae0accddd45&w=1480', + img: 'https://avatar.iran.liara.run/public/94', comment: 'The cake was absolutely delicious and beautifully decorated. Everyone at the party loved it! Will definitely order again.', }, { name: 'Liam Johnson', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-sunglasses_23-2149436188.jpg?t=st=1741676063~exp=1741679663~hmac=2ea273721392950d9ee9cca8ae25fe80bd6d78d33c5ad6d6189cb20dd8f7f5be&w=1480', + img: 'https://avatar.iran.liara.run/public/25', comment: 'Amazing taste and perfect texture! The custom design was exactly as I imagined. Highly recommended!', }, { name: 'Emma Williams', - img: 'https://img.freepik.com/free-psd/3d-illustration-person-with-rainbow-sunglasses_23-2149436181.jpg?t=st=1741676083~exp=1741679683~hmac=f3c74b0465c88d8090fc9fd8d54f8d0fbdf0c7ba00140199a6df67c79493ead0&w=1480', + img: 'https://avatar.iran.liara.run/public/91', comment: "Fresh, flavorful, and elegantly crafted. It was the highlight of our celebration. Can't wait to try another one!", }, @@ -99,7 +99,7 @@ export default function Landing() { </div> <div className='relative h-[300px] md:h-[400px] rounded-2xl overflow-hidden shadow-xl'> <img - src='https://img.freepik.com/free-photo/various-cakes-supermarket-shelves-sale_627829-7332.jpg?t=st=1741673875~exp=1741677475~hmac=833e703e6c8857b6c3348a3ce0e9217f1d18e10b83f1066781dfe84bf46f863a&w=2000' + src='https://images.pexels.com/photos/2536967/pexels-photo-2536967.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2' alt='Delicious cake showcase' className='object-cover' /> diff --git a/golden-crust-bakery/src/pages/Menu.jsx b/golden-crust-bakery/src/pages/Menu.jsx new file mode 100644 index 0000000..3554c98 --- /dev/null +++ b/golden-crust-bakery/src/pages/Menu.jsx @@ -0,0 +1,148 @@ +import { useEffect, useState } from 'react'; +import { toast } from 'sonner'; +import { Search, ShoppingCart } from 'lucide-react'; + +import { useCartStore } from '@/lib/store'; +import { cakeData } from '@/lib/data'; + +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; + +export default function Menu() { + const { addToCart, initializeCart } = useCartStore(); + const [searchTerm, setSearchTerm] = useState(''); + const [categoryFilter, setCategoryFilter] = useState('All'); + + useEffect(() => { + initializeCart(); + }, [initializeCart]); + + const categories = [ + 'All', + 'Birthday', + 'Wedding', + 'Special Occasion', + 'Seasonal', + ]; + + const filteredCakes = cakeData.filter((cake) => { + const matchesSearch = + cake.name.toLowerCase().includes(searchTerm.toLowerCase()) || + cake.description.toLowerCase().includes(searchTerm.toLowerCase()); + const matchesCategory = + categoryFilter === 'All' || cake.category === categoryFilter; + return matchesSearch && matchesCategory; + }); + + const handleAddToCart = (cake) => { + addToCart({ + ...cake, + quantity: 1, + }); + + toast({ + title: 'Added to cart!', + description: `${cake.name} has been added to your cart.`, + }); + }; + + return ( + <div className='container mx-auto px-4 py-8 md:py-12'> + <div className='text-center mb-12'> + <h1 className='text-4xl font-bold text-gray-800 mb-4'>Our Cake Menu</h1> + <p className='text-gray-600 max-w-2xl mx-auto'> + Browse our selection of handcrafted cakes made with premium + ingredients and love + </p> + </div> + + {/* Search and Filter */} + <div className='mb-8 flex flex-col md:flex-row gap-4 justify-between'> + <div className='relative w-full md:w-1/3'> + <Search className='absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400' /> + <Input + type='text' + placeholder='Search cakes...' + value={searchTerm} + onChange={(e) => setSearchTerm(e.target.value)} + className='pl-10 rounded-full border-pink-200 focus:border-pink-400 focus:ring-pink-400' + /> + </div> + <div className='flex flex-wrap gap-2'> + {categories.map((category) => ( + <Button + key={category} + variant={categoryFilter === category ? 'default' : 'outline'} + onClick={() => setCategoryFilter(category)} + className={`rounded-full ${ + categoryFilter === category + ? 'bg-pink-500 hover:bg-pink-600 text-white' + : 'border-pink-200 text-pink-600 hover:bg-pink-50' + }`} + > + {category} + </Button> + ))} + </div> + </div> + + {/* Cake Grid */} + {filteredCakes.length > 0 ? ( + <div className='grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 md:gap-8 lg:gap-12'> + {filteredCakes.map((cake) => ( + <div + key={cake.id} + className='bg-white rounded-xl shadow-sm border overflow-hidden transition-transform hover:scale-105 hover:shadow-lg' + > + <div className='relative h-56'> + <img + src={cake.image} + alt={cake.name} + className='object-cover w-full h-full' + /> + <div className='absolute top-2 right-2 bg-pink-100 text-pink-600 px-2 py-1 rounded-full text-xs font-medium'> + {cake.category} + </div> + </div> + <div className='p-6'> + <div className='flex justify-between items-start mb-2'> + <h3 className='text-xl font-semibold text-gray-800'> + {cake.name} + </h3> + <p className='text-pink-600 font-bold'> + ${cake.price.toFixed(2)} + </p> + </div> + <p className='text-gray-600 mb-4 line-clamp-2'> + {cake.description} + </p> + <Button + onClick={() => handleAddToCart(cake)} + className='w-full bg-yellow-100 hover:bg-yellow-200 text-yellow-800 rounded-full' + > + <ShoppingCart className='mr-2 h-4 w-4' /> Add to Cart + </Button> + </div> + </div> + ))} + </div> + ) : ( + <div className='text-center py-12'> + <h3 className='text-xl text-gray-600'> + No cakes found matching your search. + </h3> + <Button + onClick={() => { + setSearchTerm(''); + setCategoryFilter('All'); + }} + variant='outline' + className='mt-4 border-pink-300 text-pink-600 hover:bg-pink-50 rounded-full' + > + Clear Filters + </Button> + </div> + )} + </div> + ); +} -- GitLab