smolSWE commited on
Commit
583e303
·
verified ·
1 Parent(s): ffcde35

Implement product page, cart, and checkout functionality with icons and animations

Browse files

Implemented the product page with dynamic product display, detailed product information, add to cart, remove from cart, and checkout functionalities. Added icons using Font Awesome and animations to enhance the user experience.

Files changed (7) hide show
  1. cart.html +55 -2
  2. checkout.html +99 -67
  3. data.js +1 -1
  4. index.html +29 -198
  5. product.html +43 -129
  6. script.js +33 -270
  7. style.css +17 -0
cart.html CHANGED
@@ -1,4 +1,3 @@
1
-
2
  <!DOCTYPE html>
3
  <html lang="en">
4
  <head>
@@ -43,5 +42,59 @@
43
  </footer>
44
 
45
  <script src="script.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  </body>
47
- </html>
 
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
  <head>
 
42
  </footer>
43
 
44
  <script src="script.js"></script>
45
+ <script>
46
+ function updateCartPage() {
47
+ const cartItems = getCartItems();
48
+ const cartItemsContainer = document.getElementById('cart-items');
49
+ const subtotalElement = document.getElementById('subtotal');
50
+ const totalElement = document.getElementById('total');
51
+
52
+ cartItemsContainer.innerHTML = ''; // Clear existing cart items
53
+
54
+ let subtotal = 0;
55
+
56
+ cartItems.forEach(item => {
57
+ const cartItemDiv = document.createElement('div');
58
+ cartItemDiv.classList.add('cart-item', 'flex', 'items-center', 'justify-between', 'border', 'p-4');
59
+
60
+ const imageElement = document.createElement('img');
61
+ imageElement.src = item.image;
62
+ imageElement.alt = item.name;
63
+ imageElement.classList.add('h-20', 'w-20', 'object-cover');
64
+ cartItemDiv.appendChild(imageElement);
65
+
66
+ const nameElement = document.createElement('p');
67
+ nameElement.textContent = item.name;
68
+ cartItemDiv.appendChild(nameElement);
69
+
70
+ const priceElement = document.createElement('p');
71
+ priceElement.textContent = `$${item.price}`;
72
+ cartItemDiv.appendChild(priceElement);
73
+
74
+ const quantityElement = document.createElement('p');
75
+ quantityElement.textContent = `Quantity: ${item.quantity}`;
76
+ cartItemDiv.appendChild(quantityElement);
77
+
78
+ const removeButton = document.createElement('button');
79
+ removeButton.textContent = 'Remove';
80
+ removeButton.classList.add('bg-red-500', 'text-white', 'px-2', 'py-1', 'rounded-md', 'hover:bg-red-400');
81
+ removeButton.addEventListener('click', () => {
82
+ removeFromCart(item.id);
83
+ });
84
+ cartItemDiv.appendChild(removeButton);
85
+
86
+ cartItemsContainer.appendChild(cartItemDiv);
87
+
88
+ subtotal += item.price * item.quantity;
89
+ });
90
+
91
+ subtotalElement.textContent = `$${subtotal.toFixed(2)}`;
92
+ const total = subtotal + 5; // Shipping is $5
93
+ totalElement.textContent = `$${total.toFixed(2)}`;
94
+ }
95
+
96
+ // Call updateCartPage on page load
97
+ updateCartPage();
98
+ </script>
99
  </body>
100
+ </html>
checkout.html CHANGED
@@ -3,79 +3,111 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Checkout - Amazon Clone</title>
7
- <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
8
  <link rel="stylesheet" href="style.css">
 
9
  </head>
10
- <body>
11
- <nav class="bg-gray-800 p-4 text-white">
12
- <div class="container mx-auto flex items-center justify-between">
13
- <a href="/" class="text-2xl font-bold">Amazon</a>
14
- <div class="flex items-center">
15
- <input type="text" placeholder="Search" class="bg-gray-700 text-white px-4 py-2 rounded-md mr-2">
16
- <button class="bg-yellow-500 text-gray-800 px-4 py-2 rounded-md hover:bg-yellow-400">Search</button>
17
- </div>
18
- <div>
19
- <a href="/cart.html" class="hover:text-yellow-500">Cart</a>
 
 
 
 
 
 
 
 
 
 
20
  </div>
21
  </div>
22
- </nav>
23
 
24
- <main class="container mx-auto mt-8">
25
- <h1 class="text-2xl font-bold mb-4">Checkout</h1>
26
- <div class="grid grid-cols-2 gap-8">
27
- <div>
28
- <h2 class="text-xl font-bold mb-2">Shipping Information</h2>
29
- <form id="checkout-form">
30
- <div class="mb-4">
31
- <label for="name" class="block text-gray-700 text-sm font-bold mb-2">Name:</label>
32
- <input type="text" id="name" name="name" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
33
- </div>
34
- <div class="mb-4">
35
- <label for="address" class="block text-gray-700 text-sm font-bold mb-2">Address:</label>
36
- <input type="text" id="address" name="address" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
37
- </div>
38
- <div class="mb-4">
39
- <label for="city" class="block text-gray-700 text-sm font-bold mb-2">City:</label>
40
- <input type="text" id="city" name="city" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
41
- </div>
42
- <div class="mb-4">
43
- <label for="state" class="block text-gray-700 text-sm font-bold mb-2">State:</label>
44
- <input type="text" id="state" name="state" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
45
- </div>
46
- <div class="mb-4">
47
- <label for="zip" class="block text-gray-700 text-sm font-bold mb-2">Zip Code:</label>
48
- <input type="text" id="zip" name="zip" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
49
- </div>
50
- <h2 class="text-xl font-bold mb-2">Payment Information</h2>
51
- <div class="mb-4">
52
- <label for="credit_card" class="block text-gray-700 text-sm font-bold mb-2">Credit Card Number:</label>
53
- <input type="text" id="credit_card" name="credit_card" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
54
- </div>
55
- <div class="mb-4">
56
- <label for="expiration_date" class="block text-gray-700 text-sm font-bold mb-2">Expiration Date:</label>
57
- <input type="text" id="expiration_date" name="expiration_date" placeholder="MM/YY" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
58
- </div>
59
- <div class="mb-4">
60
- <label for="cvv" class="block text-gray-700 text-sm font-bold mb-2">CVV:</label>
61
- <input type="text" id="cvv" name="cvv" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
62
- </div>
63
- <button type="submit" class="bg-yellow-500 text-gray-800 px-4 py-2 rounded-md hover:bg-yellow-400">Place Order</button>
64
- </form>
65
- </div>
66
- <div>
67
- <h2 class="text-xl font-bold mb-2">Order Summary</h2>
68
- <p>Subtotal: <span id="subtotal">$0.00</span></p>
69
- <p>Shipping: <span id="shipping">$5.00</span></p>
70
- <p class="font-bold">Total: <span id="total">$0.00</span></p>
71
- </div>
72
  </div>
73
- </main>
74
 
75
- <footer class="bg-gray-800 p-4 text-white text-center mt-8">
76
- <p>&copy; 2024 Amazon Clone</p>
77
- </footer>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
- <script src="script.js"></script>
 
 
 
 
 
 
 
80
  </body>
81
- </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Checkout</title>
 
7
  <link rel="stylesheet" href="style.css">
8
+ <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
9
  </head>
10
+ <body class="bg-gray-100">
11
+ <div class="container mx-auto p-8">
12
+ <h1 class="text-2xl font-bold mb-4">Checkout</h1>
13
+
14
+ <div id="cart-summary" class="mb-8">
15
+ <h2 class="text-xl font-semibold mb-2">Cart Summary</h2>
16
+ <table class="table-auto w-full">
17
+ <thead>
18
+ <tr>
19
+ <th class="px-4 py-2">Product</th>
20
+ <th class="px-4 py-2">Name</th>
21
+ <th class="px-4 py-2">Quantity</th>
22
+ <th class="px-4 py-2">Price</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody id="cart-items">
26
+ </tbody>
27
+ </table>
28
+ <div class="mt-4 font-bold">
29
+ Total: <span id="cart-total"></span>
30
  </div>
31
  </div>
 
32
 
33
+ <div id="shipping-info" class="mb-8">
34
+ <h2 class="text-xl font-semibold mb-2">Shipping Information</h2>
35
+ <form id="shipping-form" class="max-w-lg">
36
+ <div class="mb-4">
37
+ <label for="name" class="block text-gray-700 text-sm font-bold mb-2">Name:</label>
38
+ <input type="text" id="name" name="name" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
39
+ </div>
40
+ <div class="mb-4">
41
+ <label for="address" class="block text-gray-700 text-sm font-bold mb-2">Address:</label>
42
+ <input type="text" id="address" name="address" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
43
+ </div>
44
+ <div class="mb-4">
45
+ <label for="city" class="block text-gray-700 text-sm font-bold mb-2">City:</label>
46
+ <input type="text" id="city" name="city" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
47
+ </div>
48
+ <div class="mb-4">
49
+ <label for="zip" class="block text-gray-700 text-sm font-bold mb-2">Zip Code:</label>
50
+ <input type="text" id="zip" name="zip" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
51
+ </div>
52
+ </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  </div>
 
54
 
55
+ <div id="payment-info" class="mb-8">
56
+ <h2 class="text-xl font-semibold mb-2">Payment Information</h2>
57
+ <form id="payment-form" class="max-w-lg">
58
+ <div class="mb-4">
59
+ <label for="card-number" class="block text-gray-700 text-sm font-bold mb-2">Card Number:</label>
60
+ <input type="text" id="card-number" name="card-number" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
61
+ </div>
62
+ <div class="mb-4">
63
+ <label for="expiry" class="block text-gray-700 text-sm font-bold mb-2">Expiry Date:</label>
64
+ <input type="text" id="expiry" name="expiry" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
65
+ </div>
66
+ <div class="mb-4">
67
+ <label for="cvv" class="block text-gray-700 text-sm font-bold mb-2">CVV:</label>
68
+ <input type="text" id="cvv" name="cvv" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
69
+ </div>
70
+ </form>
71
+ </div>
72
+
73
+ <button id="place-order" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">Place Order</button>
74
+
75
+ <div id="confirmation-message" class="mt-8 text-green-500 font-bold hidden">
76
+ Your order has been placed!
77
+ </div>
78
+ </div>
79
+
80
+ <script>
81
+ document.addEventListener('DOMContentLoaded', function () {
82
+ const cartItems = JSON.parse(localStorage.getItem('cart')) || [];
83
+ const cartItemsContainer = document.getElementById('cart-items');
84
+ const cartTotalElement = document.getElementById('cart-total');
85
+ const placeOrderButton = document.getElementById('place-order');
86
+ const confirmationMessage = document.getElementById('confirmation-message');
87
+
88
+ let cartTotal = 0;
89
+
90
+ cartItems.forEach(item => {
91
+ const row = document.createElement('tr');
92
+ row.innerHTML = `
93
+ <td class="px-4 py-2"><img src="${item.image}" alt="${item.name}" class="w-16 h-16"></td>
94
+ <td class="px-4 py-2">${item.name}</td>
95
+ <td class="px-4 py-2">${item.quantity}</td>
96
+ <td class="px-4 py-2">$${item.price * item.quantity}</td>
97
+ `;
98
+ cartItemsContainer.appendChild(row);
99
+ cartTotal += item.price * item.quantity;
100
+ });
101
+
102
+ cartTotalElement.textContent = '$' + cartTotal;
103
 
104
+ placeOrderButton.addEventListener('click', function () {
105
+ confirmationMessage.classList.remove('hidden');
106
+ localStorage.removeItem('cart');
107
+ cartItemsContainer.innerHTML = '';
108
+ cartTotalElement.textContent = '$0';
109
+ });
110
+ });
111
+ </script>
112
  </body>
113
+ </html>
data.js CHANGED
@@ -1,5 +1,5 @@
1
 
2
- const products = [
3
  {
4
  id: "1",
5
  name: "Product 1",
 
1
 
2
+ export const products = [
3
  {
4
  id: "1",
5
  name: "Product 1",
index.html CHANGED
@@ -39,187 +39,31 @@
39
  <section class="product-listing">
40
  <h2 class="text-2xl font-bold mb-4">Products</h2>
41
  <div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4">
42
- <!-- Product 1 -->
43
-
44
- <a href="product.html?id=product-1" class="product-card">
45
- <img src="https://placehold.co/200x300" alt="Product 1" class="w-full rounded-md">
46
- <h3 class="text-lg font-semibold">Product 1</h3>
47
- <p class="text-gray-600">$19.99</p>
48
- <div class="flex items-center">
49
- <i class="fas fa-star text-yellow-500"></i>
50
- <i class="fas fa-star text-yellow-500"></i>
51
- <i class="fas fa-star text-yellow-500"></i>
52
- <i class="fas fa-star text-yellow-500"></i>
53
- <i class="fas fa-star-half-alt text-yellow-500"></i>
54
- <span class="text-gray-600 ml-2">4.5</span>
55
- </div>
56
- </a>
57
-
58
- <div class="flex items-center">
59
- <i class="fas fa-star text-yellow-500"></i>
60
- <i class="fas fa-star text-yellow-500"></i>
61
- <i class="fas fa-star text-yellow-500"></i>
62
- <i class="fas fa-star text-yellow-500"></i>
63
- <i class="fas fa-star-half-alt text-yellow-500"></i>
64
- <span class="text-gray-600 ml-2">4.5</span>
65
- </div>
66
- </div>
67
- <!-- Product 2 -->
68
-
69
- <a href="product.html?id=product-2" class="product-card">
70
- <img src="https://placehold.co/200x300" alt="Product 2" class="w-full rounded-md">
71
- <h3 class="text-lg font-semibold">Product 2</h3>
72
- <p class="text-gray-600">$19.99</p>
73
- <div class="flex items-center">
74
- <i class="fas fa-star text-yellow-500"></i>
75
- <i class="fas fa-star text-yellow-500"></i>
76
- <i class="fas fa-star text-yellow-500"></i>
77
- <i class="fas fa-star text-yellow-500"></i>
78
- <i class="fas fa-star-half-alt text-yellow-500"></i>
79
- <span class="text-gray-600 ml-2">4.5</span>
80
- </div>
81
- </a>
82
-
83
- <div class="flex items-center">
84
- <i class="fas fa-star text-yellow-500"></i>
85
- <i class="fas fa-star text-yellow-500"></i>
86
- <i class="fas fa-star text-yellow-500"></i>
87
- <i class="fas fa-star text-yellow-500"></i>
88
- <i class="fas fa-star text-yellow-500"></i>
89
- <span class="text-gray-600 ml-2">5.0</span>
90
- </div>
91
- </div>
92
- <!-- Product 3 -->
93
-
94
- <a href="product.html?id=product-3" class="product-card">
95
- <img src="https://placehold.co/200x300" alt="Product 3" class="w-full rounded-md">
96
- <h3 class="text-lg font-semibold">Product 3</h3>
97
- <p class="text-gray-600">$19.99</p>
98
- <div class="flex items-center">
99
- <i class="fas fa-star text-yellow-500"></i>
100
- <i class="fas fa-star text-yellow-500"></i>
101
- <i class="fas fa-star text-yellow-500"></i>
102
- <i class="fas fa-star text-yellow-500"></i>
103
- <i class="fas fa-star-half-alt text-yellow-500"></i>
104
- <span class="text-gray-600 ml-2">4.5</span>
105
- </div>
106
- </a>
107
-
108
- <div class="flex items-center">
109
- <i class="fas fa-star text-yellow-500"></i>
110
- <i class="fas fa-star text-yellow-500"></i>
111
- <i class="fas fa-star text-yellow-500"></i>
112
- <i class="fas fa-star-half-alt text-yellow-500"></i>
113
- <i class="far fa-star text-yellow-500"></i>
114
- <span class="text-gray-600 ml-2">3.5</span>
115
- </div>
116
- </div>
117
- <!-- Product 4 -->
118
-
119
- <a href="product.html?id=product-4" class="product-card">
120
- <img src="https://placehold.co/200x300" alt="Product 4" class="w-full rounded-md">
121
- <h3 class="text-lg font-semibold">Product 4</h3>
122
- <p class="text-gray-600">$19.99</p>
123
- <div class="flex items-center">
124
- <i class="fas fa-star text-yellow-500"></i>
125
- <i class="fas fa-star text-yellow-500"></i>
126
- <i class="fas fa-star text-yellow-500"></i>
127
- <i class="fas fa-star text-yellow-500"></i>
128
- <i class="fas fa-star-half-alt text-yellow-500"></i>
129
- <span class="text-gray-600 ml-2">4.5</span>
130
- </div>
131
- </a>
132
-
133
- <div class="flex items-center">
134
- <i class="fas fa-star text-yellow-500"></i>
135
- <i class="fas fa-star text-yellow-500"></i>
136
- <i class="fas fa-star text-yellow-500"></i>
137
- <i class="fas fa-star text-yellow-500"></i>
138
- <i class="far fa-star text-yellow-500"></i>
139
- <span class="text-gray-600 ml-2">4.0</span>
140
- </div>
141
- </div>
142
- <!-- Product 5 -->
143
-
144
- <a href="product.html?id=product-5" class="product-card">
145
- <img src="https://placehold.co/200x300" alt="Product 5" class="w-full rounded-md">
146
- <h3 class="text-lg font-semibold">Product 5</h3>
147
- <p class="text-gray-600">$19.99</p>
148
- <div class="flex items-center">
149
- <i class="fas fa-star text-yellow-500"></i>
150
- <i class="fas fa-star text-yellow-500"></i>
151
- <i class="fas fa-star text-yellow-500"></i>
152
- <i class="fas fa-star text-yellow-500"></i>
153
- <i class="fas fa-star-half-alt text-yellow-500"></i>
154
- <span class="text-gray-600 ml-2">4.5</span>
155
- </div>
156
- </a>
157
-
158
- <div class="flex items-center">
159
- <i class="fas fa-star text-yellow-500"></i>
160
- <i class="fas fa-star text-yellow-500"></i>
161
- <i class="fas fa-star text-yellow-500"></i>
162
- <i class="fas fa-star text-yellow-500"></i>
163
- <i class="fas fa-star-half-alt text-yellow-500"></i>
164
- <span class="text-gray-600 ml-2">4.5</span>
165
- </div>
166
- </div>
167
- <!-- Product 6 -->
168
-
169
- <a href="product.html?id=product-6" class="product-card">
170
- <img src="https://placehold.co/200x300" alt="Product 6" class="w-full rounded-md">
171
- <h3 class="text-lg font-semibold">Product 6</h3>
172
- <p class="text-gray-600">$19.99</p>
173
- <div class="flex items-center">
174
- <i class="fas fa-star text-yellow-500"></i>
175
- <i class="fas fa-star text-yellow-500"></i>
176
- <i class="fas fa-star text-yellow-500"></i>
177
- <i class="fas fa-star text-yellow-500"></i>
178
- <i class="fas fa-star-half-alt text-yellow-500"></i>
179
- <span class="text-gray-600 ml-2">4.5</span>
180
  </div>
181
- </a>
182
-
183
- <div class="flex items-center">
184
- <i class="fas fa-star text-yellow-500"></i>
185
- <i class="fas fa-star text-yellow-500"></i>
186
- <i class="fas fa-star text-yellow-500"></i>
187
- <i class="fas fa-star text-yellow-500"></i>
188
- <i class="fas fa-star text-yellow-500"></i>
189
- <span class="text-gray-600 ml-2">5.0</span>
190
- </div>
191
- </div>
192
- <!-- Product 7 -->
193
-
194
- <a href="product.html?id=product-7" class="product-card">
195
- <img src="https://placehold.co/200x300" alt="Product 7" class="w-full rounded-md">
196
- <h3 class="text-lg font-semibold">Product 7</h3>
197
- <p class="text-gray-600">$19.99</p>
198
- <div class="flex items-center">
199
- <i class="fas fa-star text-yellow-500"></i>
200
- <i class="fas fa-star text-yellow-500"></i>
201
- <i class="fas fa-star text-yellow-500"></i>
202
- <i class="fas fa-star text-yellow-500"></i>
203
- <i class="fas fa-star-half-alt text-yellow-500"></i>
204
- <span class="text-gray-600 ml-2">4.5</span>
205
- </div>
206
- </a>
207
-
208
- <div class="flex items-center">
209
- <i class="fas fa-star text-yellow-500"></i>
210
- <i class="fas fa-star text-yellow-500"></i>
211
- <i class="fas fa-star text-yellow-500"></i>
212
- <i class="fas fa-star-half-alt text-yellow-500"></i>
213
- <i class="far fa-star text-yellow-500"></i>
214
- <span class="text-gray-600 ml-2">3.5</span>
215
- </div>
216
- </div>
217
- <!-- Product 8 -->
218
-
219
- <a href="product.html?id=product-8" class="product-card">
220
- <img src="https://placehold.co/200x300" alt="Product 8" class="w-full rounded-md">
221
- <h3 class="text-lg font-semibold">Product 8</h3>
222
- <p class="text-gray-600">$19.99</p>
223
  <div class="flex items-center">
224
  <i class="fas fa-star text-yellow-500"></i>
225
  <i class="fas fa-star text-yellow-500"></i>
@@ -228,25 +72,12 @@
228
  <i class="fas fa-star-half-alt text-yellow-500"></i>
229
  <span class="text-gray-600 ml-2">4.5</span>
230
  </div>
231
- </a>
232
-
233
- <div class="flex items-center">
234
- <i class="fas fa-star text-yellow-500"></i>
235
- <i class="fas fa-star text-yellow-500"></i>
236
- <i class="fas fa-star text-yellow-500"></i>
237
- <i class="fas fa-star text-yellow-500"></i>
238
- <i class="far fa-star text-yellow-500"></i>
239
- <span class="text-gray-600 ml-2">4.0</span>
240
- </div>
241
- </div>
242
- </div>
243
- </section>
244
- </main>
245
 
246
- <footer class="bg-gray-800 p-4 text-white text-center mt-8">
247
- <p>&copy; 2024 Amazon Clone</p>
248
- </footer>
249
 
250
- <script src="script.js"></script>
 
251
  </body>
252
  </html>
 
39
  <section class="product-listing">
40
  <h2 class="text-2xl font-bold mb-4">Products</h2>
41
  <div class="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  </div>
43
+ </section>
44
+ </main>
45
+
46
+ <footer class="bg-gray-800 p-4 text-white text-center mt-8">
47
+ <p>&copy; 2024 Amazon Clone</p>
48
+ </footer>
49
+
50
+ <script src="script.js"></script>
51
+
52
+ <script type="module">
53
+ import { products } from './data.js';
54
+
55
+ const productListing = document.querySelector('.product-listing .grid');
56
+ productListing.innerHTML = ''; // Clear existing products
57
+
58
+ products.forEach(product => {
59
+ const productCard = document.createElement('a');
60
+ productCard.href = `product.html?id=${product.id}`;
61
+ productCard.className = 'product-card';
62
+
63
+ productCard.innerHTML = `
64
+ <img src="${product.image}" alt="${product.name}" class="w-full rounded-md">
65
+ <h3 class="text-lg font-semibold">${product.name}</h3>
66
+ <p class="text-gray-600">$${product.price.toFixed(2)}</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  <div class="flex items-center">
68
  <i class="fas fa-star text-yellow-500"></i>
69
  <i class="fas fa-star text-yellow-500"></i>
 
72
  <i class="fas fa-star-half-alt text-yellow-500"></i>
73
  <span class="text-gray-600 ml-2">4.5</span>
74
  </div>
75
+ `;
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
+ productListing.appendChild(productCard);
78
+ });
 
79
 
80
+ updateCartIcon();
81
+ </script>
82
  </body>
83
  </html>
product.html CHANGED
@@ -1,150 +1,64 @@
1
-
2
  <!DOCTYPE html>
3
  <html lang="en">
4
  <head>
5
  <meta charset="UTF-8">
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Product Details - Amazon Clone</title>
8
  <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
9
  <link rel="stylesheet" href="style.css">
10
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" integrity="sha512-9usAa10IRO0HhonpyAIVpjrylPvoDwiPUiKdWk5t3PyolY1cOd4DSE0Ga+ri4AuTroPR5aQvXU9xC6qOPnzFeg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
11
  </head>
12
- <body>
13
- <nav class="bg-gray-800 p-4 text-white">
14
- <div class="container mx-auto flex items-center justify-between">
15
- <a href="/" class="text-2xl font-bold">Amazon</a>
16
- <div class="flex items-center">
17
- <input type="text" placeholder="Search" class="bg-gray-700 text-white px-4 py-2 rounded-md mr-2">
18
- <button class="bg-yellow-500 text-gray-800 px-4 py-2 rounded-md hover:bg-yellow-400">Search</button>
19
- </div>
20
- <div>
21
- <a href="/cart.html" class="hover:text-yellow-500">Cart</a>
 
 
 
22
  </div>
23
  </div>
24
- </nav>
25
-
26
- <main class="container mx-auto mt-8">
27
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
28
- <div>
29
- <div class="image-gallery">
30
- <img src="https://placehold.co/400x400" alt="Product Image 1" class="w-full rounded-md mb-2">
31
- <div class="grid grid-cols-4 gap-2">
32
- <img src="https://placehold.co/100x100" alt="Product Image 2" class="w-full rounded-md">
33
- <img src="https://placehold.co/100x100" alt="Product Image 3" class="w-full rounded-md">
34
- <img src="https://placehold.co/100x100" alt="Product Image 4" class="w-full rounded-md">
35
- <img src="https://placehold.co/100x100" alt="Product Image 5" class="w-full rounded-md">
36
- </div>
37
- </div>
38
- </div>
39
- <div>
40
- <h1 class="text-2xl font-bold" id="productName">Product Title</h1>
41
- <p class="text-gray-600" id="productDescription">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
42
- <p class="text-xl font-semibold" id="productPrice">$99.99</p>
43
- <div class="flex items-center mb-4">
44
- <i class="fas fa-star text-yellow-500"></i>
45
- <i class="fas fa-star text-yellow-500"></i>
46
- <i class="fas fa-star text-yellow-500"></i>
47
- <i class="fas fa-star text-yellow-500"></i>
48
- <i class="fas fa-star-half-alt text-yellow-500"></i>
49
- <span class="text-gray-600 ml-2">4.5</span>
50
- </div>
51
- <button class="bg-yellow-500 text-gray-800 px-4 py-2 rounded-md hover:bg-yellow-400 add-to-cart-button" id="addToCartButton"><i class="fas fa-cart-plus"></i>&nbsp;Add to Cart</button>
52
- </div>
53
- </div>
54
- </main>
55
-
56
- <footer class="bg-gray-800 p-4 text-white text-center mt-8">
57
- <p>&copy; 2024 Amazon Clone</p>
58
- </footer>
59
 
60
- <script src="script.js">
61
- const urlParams = new URLSearchParams(window.location.search);
62
- const productId = urlParams.get("id");
63
-
64
- document.addEventListener('DOMContentLoaded', function() {
65
- if (productId) {
66
- const product = products.find(p => p.id === productId);
67
 
68
- if (product) {
69
- document.getElementById('productName').textContent = product.name;
70
- document.getElementById('productDescription').textContent = product.description;
71
- document.getElementById('productPrice').textContent = '$' + product.price.toFixed(2);
72
- // Assuming you have an image element with id 'productImage'
73
- // document.getElementById('productImage').src = product.image;
74
- // document.getElementById('productImage').alt = product.name;
75
  } else {
76
- console.error('Product not found with ID:', productId);
77
- document.getElementById('productName').textContent = 'Product Not Found';
78
  }
79
- } else {
80
- console.error('Product ID not provided.');
81
- document.getElementById('productName').textContent = 'Product ID Not Provided';
82
- }
83
 
84
- const addToCartButton = document.getElementById('addToCartButton');
85
- if (addToCartButton) {
86
- addToCartButton.addEventListener('click', () => {
87
- if (productId) {
88
- const product = products.find(p => p.id === productId);
89
- if (product) {
90
- addToCart(product);
91
- } else {
92
- console.error('Product not found with ID:', productId);
93
- }
94
  } else {
95
- console.error('Product ID not provided.');
96
  }
97
- });
98
- }
99
- });
100
- </script>
101
- <script src="data.js"></script>
102
-
103
- <script>
104
- const urlParams = new URLSearchParams(window.location.search);
105
- const productId = urlParams.get("id");
106
-
107
- document.addEventListener('DOMContentLoaded', function() {
108
- const product = products[0];
109
- trackProductView(product.id);
110
- });
111
- </script>
112
-
113
 
114
- <script>
115
- const urlParams = new URLSearchParams(window.location.search);
116
- const productId = urlParams.get("id");
 
 
117
 
118
- document.addEventListener('DOMContentLoaded', function() {
119
- trackProductView('product123');
 
 
120
  });
121
  </script>
122
-
123
- <script>
124
- const urlParams = new URLSearchParams(window.location.search);
125
- const productId = urlParams.get("id");
126
-
127
- const productNameElement = document.getElementById('productName');
128
- const productDescriptionElement = document.getElementById('productDescription');
129
- const productPriceElement = document.getElementById('productPrice');
130
- const productImageElement = document.getElementById('productImage');
131
- const addToCartButton = document.getElementById('addToCartButton');
132
-
133
- if (products && products.length > 0) {
134
- const product = products[0];
135
-
136
- if (productNameElement) productNameElement.textContent = product.name;
137
- if (productDescriptionElement) productDescriptionElement.textContent = product.description;
138
- if (productPriceElement) productPriceElement.textContent = '$' + product.price.toFixed(2);
139
- if (productImageElement) productImageElement.src = product.image;
140
- if (productImageElement) productImageElement.alt = product.name;
141
- } else {
142
- console.error('No products found in data.js');
143
- }
144
-
145
- addToCartButton.addEventListener('click', () => {
146
- addToCart(products[0]);
147
- });
148
- </script>
149
- </body>
150
- </html>
 
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Product Details</title>
7
  <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
8
  <link rel="stylesheet" href="style.css">
9
+ <script src="script.js"></script>
10
  </head>
11
+ <body class="bg-gray-100">
12
+ <div class="container mx-auto p-4">
13
+ <a href="index.html" class="block text-blue-500 hover:underline mb-4">Back to Home</a>
14
+
15
+ <div id="product-details" class="bg-white shadow-md rounded-lg overflow-hidden">
16
+ <img id="product-image" src="" alt="Product Image" class="w-full h-64 object-cover">
17
+ <div class="p-4">
18
+ <h2 id="product-name" class="text-2xl font-semibold mb-2"></h2>
19
+ <p id="product-description" class="text-gray-700 mb-2"></p>
20
+ <p id="product-price" class="text-lg font-bold mb-2"></p>
21
+ <button id="add-to-cart-button" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
22
+ Add to Cart
23
+ </button>
24
  </div>
25
  </div>
26
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ <script type="module">
29
+ import { products } from './data.js';
30
+ document.addEventListener('DOMContentLoaded', function() {
31
+ const urlParams = new URLSearchParams(window.location.search);
32
+ const productId = urlParams.get('id');
 
 
33
 
34
+ if (productId) {
35
+ fetchProductDetails(productId);
 
 
 
 
 
36
  } else {
37
+ document.getElementById('product-details').innerHTML = '<p>Product not found.</p>';
 
38
  }
 
 
 
 
39
 
40
+ function fetchProductDetails(productId) {
41
+ // Fetch product data from data.js
42
+ const product = products.find(p => p.id === productId);
43
+
44
+ if (product) {
45
+ displayProduct(product);
 
 
 
 
46
  } else {
47
+ document.getElementById('product-details').innerHTML = '<p>Product not found.</p>';
48
  }
49
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
+ function displayProduct(product) {
52
+ document.getElementById('product-image').src = product.image;
53
+ document.getElementById('product-name').textContent = product.name;
54
+ document.getElementById('product-description').textContent = product.description;
55
+ document.getElementById('product-price').textContent = '$' + product.price.toFixed(2);
56
 
57
+ document.getElementById('add-to-cart-button').addEventListener('click', function() {
58
+ addToCart(product);
59
+ });
60
+ }
61
  });
62
  </script>
63
+ </body>
64
+ </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
script.js CHANGED
@@ -1,279 +1,42 @@
1
 
2
- // Track product views
3
- function trackProductView(productId) {
4
- let viewCounts = JSON.parse(localStorage.getItem('viewCounts') || '{}');
5
- viewCounts[productId] = (viewCounts[productId] || 0) + 1;
6
- localStorage.setItem('viewCounts', JSON.stringify(viewCounts));
7
- }
8
-
9
- // Track add to cart events
10
- function trackAddToCart(productId) {
11
- let addToCartCounts = JSON.parse(localStorage.getItem('addToCartCounts') || '{}');
12
- addToCartCounts[productId] = (addToCartCounts[productId] || 0) + 1;
13
- localStorage.setItem('addToCartCounts', JSON.stringify(addToCartCounts));
14
- }
15
-
16
- document.addEventListener('DOMContentLoaded', function() {
17
- // Function to get cart items from local storage
18
- function getCartItems() {
19
- const cartItems = localStorage.getItem('cart');
20
- return cartItems ? JSON.parse(cartItems) : [];
21
- }
22
-
23
- // Function to set cart items in local storage
24
- function setCartItems(cartItems) {
25
- localStorage.setItem('cart', JSON.stringify(cartItems));
26
- }
27
-
28
-
29
-
30
- // Function to add an item to the cart
31
- function addToCart(product) {
32
- trackAddToCart(product.id); // Track add to cart event
33
- let cartItems = getCartItems();
34
- const existingItem = cartItems.find(item => item.id === product.id);
35
-
36
- if (existingItem) {
37
- existingItem.quantity += 1;
38
- } else {
39
- product.quantity = 1;
40
- cartItems.push(product);
41
- }
42
-
43
- setCartItems(cartItems);
44
- console.log("Cart updated:", cartItems);
45
- updateCartUI();
46
- }
47
-
48
- function addToCart(product) {
49
- trackAddToCart('product123'); // Track add to cart event
50
- let cartItems = getCartItems();
51
- const existingItem = cartItems.find(item => item.id === product.id);
52
-
53
- if (existingItem) {
54
- existingItem.quantity += 1;
55
- } else {
56
- product.quantity = 1;
57
- cartItems.push(product);
58
- }
59
-
60
- setCartItems(cartItems);
61
- console.log("Cart updated:", cartItems);
62
- updateCartUI();
63
- }
64
-
65
- // Function to update item quantity in the cart
66
- function updateQuantity(productId, quantity) {
67
- let cartItems = getCartItems();
68
- const itemIndex = cartItems.findIndex(item => item.id === productId);
69
-
70
- if (itemIndex !== -1) {
71
- cartItems[itemIndex].quantity = quantity;
72
- if (cartItems[itemIndex].quantity <= 0) {
73
- cartItems.splice(itemIndex, 1); // Remove item if quantity is 0 or less
74
- }
75
- setCartItems(cartItems);
76
- console.log("Cart updated:", cartItems);
77
- updateCartUI();
78
- }
79
- updateCartUI(); // Call updateCartUI to update the order summary
80
- }
81
-
82
- // Function to remove an item from the cart
83
- function removeItem(productId) {
84
- let cartItems = getCartItems();
85
- const itemIndex = cartItems.findIndex(item => item.id === productId);
86
-
87
- if (itemIndex !== -1) {
88
- cartItems.splice(itemIndex, 1);
89
- setCartItems(cartItems);
90
- console.log("Cart updated:", cartItems);
91
- updateCartUI();
92
- }
93
- }
94
-
95
- // Function to calculate cart totals
96
- function calculateTotals() {
97
- let cartItems = getCartItems();
98
- let subtotal = 0;
99
-
100
- cartItems.forEach(item => {
101
- subtotal += item.price * item.quantity;
102
- });
103
-
104
- const shipping = 5.00;
105
- const total = subtotal + shipping;
106
-
107
- return { subtotal, shipping, total };
108
- }
109
-
110
- // Function to display cart items in cart.html
111
- function displayCartItems() {
112
- let cartItems = getCartItems();
113
- const cartItemsContainer = document.getElementById('cart-items');
114
-
115
- if (cartItemsContainer) {
116
- cartItemsContainer.innerHTML = ''; // Clear existing items
117
-
118
- cartItems.forEach(item => {
119
- const cartItemDiv = document.createElement('div');
120
- cartItemDiv.classList.add('flex', 'items-center', 'border', 'border-gray-300', 'rounded-md', 'p-4');
121
-
122
- cartItemDiv.innerHTML = `
123
- <img src="${item.image}" alt="Product Image" class="w-24 h-24 mr-4">
124
- <div>
125
- <h2 class="text-lg font-bold">${item.name}</h2>
126
- <p class="text-gray-600">$${item.price.toFixed(2)}</p>
127
- <div class="flex items-center mt-2">
128
- <button class="bg-gray-200 px-2 py-1 rounded-md decrease-quantity" data-product-id="${item.id}">-</button>
129
- <input type="number" value="${item.quantity}" class="w-16 text-center border border-gray-300 rounded-md mx-2 quantity-input" data-product-id="${item.id}">
130
- <button class="bg-gray-200 px-2 py-1 rounded-md increase-quantity" data-product-id="${item.id}">+</button>
131
- <button class="text-red-500 hover:text-red-700 ml-4 remove-item" data-product-id="${item.id}">Remove</button>
132
- </div>
133
- </div>
134
- `;
135
-
136
- cartItemsContainer.appendChild(cartItemDiv);
137
-
138
- // Add event listener to remove button
139
- const removeButton = cartItemDiv.querySelector('.remove-item');
140
- removeButton.addEventListener('click', function() {
141
- const productId = this.dataset.productId;
142
- removeItem(productId);
143
- console.log("Item removed:", productId);
144
- });
145
- });
146
-
147
- // Add event listeners to quantity buttons and remove buttons
148
- const decreaseButtons = document.querySelectorAll('.decrease-quantity');
149
- decreaseButtons.forEach(button => {
150
- button.addEventListener('click', function() {
151
- const productId = this.dataset.productId;
152
- const quantityInput = this.parentNode.querySelector('.quantity-input');
153
- let quantity = parseInt(quantityInput.value);
154
- quantity = Math.max(1, quantity - 1); // Ensure quantity is not less than 1
155
- quantityInput.value = quantity;
156
- updateQuantity(productId, quantity);
157
- console.log("Quantity updated:", productId, quantity);
158
- });
159
- });
160
-
161
- const increaseButtons = document.querySelectorAll('.increase-quantity');
162
- increaseButtons.forEach(button => {
163
- button.addEventListener('click', function() {
164
- const productId = this.dataset.productId;
165
- const quantityInput = this.parentNode.querySelector('.quantity-input');
166
- let quantity = parseInt(quantityInput.value);
167
- quantity++;
168
- quantityInput.value = quantity;
169
- updateQuantity(productId, quantity);
170
- console.log("Quantity updated:", productId, quantity);
171
- });
172
- });
173
- }
174
- }
175
-
176
- // Function to update the order summary in cart.html and checkout.html
177
- function updateOrderSummary() {
178
- const { subtotal, shipping, total } = calculateTotals();
179
-
180
- const subtotalElements = document.querySelectorAll('#subtotal');
181
- subtotalElements.forEach(element => element.textContent = `$${subtotal.toFixed(2)}`);
182
-
183
- const shippingElements = document.querySelectorAll('#shipping');
184
- shippingElements.forEach(element => element.textContent = `$${shipping.toFixed(2)}`);
185
-
186
- const totalElements = document.querySelectorAll('#total');
187
- totalElements.forEach(element => element.textContent = `$${total.toFixed(2)}`);
188
- }
189
-
190
- // Function to handle checkout
191
- function handleCheckout() {
192
- const checkoutForm = document.getElementById('checkout-form');
193
- if (checkoutForm) {
194
- checkoutForm.addEventListener('submit', function(event) {
195
- event.preventDefault(); // Prevent form submission
196
-
197
- // Get form data
198
- const name = document.getElementById('name').value;
199
- const address = document.getElementById('address').value;
200
- const city = document.getElementById('city').value;
201
- const state = document.getElementById('state').value;
202
- const zip = document.getElementById('zip').value;
203
- const credit_card = document.getElementById('credit_card').value;
204
- const expiration_date = document.getElementById('expiration_date').value;
205
- const cvv = document.getElementById('cvv').value;
206
-
207
- // Store form data in local storage
208
- const shippingInfo = { name, address, city, state, zip };
209
- const paymentInfo = { credit_card, expiration_date, cvv };
210
- localStorage.setItem('shippingInfo', JSON.stringify(shippingInfo));
211
- localStorage.setItem('paymentInfo', JSON.stringify(paymentInfo));
212
-
213
- // Redirect to confirmation page
214
- window.location.href = '/confirmation.html';
215
- });
216
- }
217
- }
218
-
219
- // Function to display order confirmation details
220
- function displayConfirmationDetails() {
221
- const shippingInfo = localStorage.getItem('shippingInfo');
222
- const paymentInfo = localStorage.getItem('paymentInfo');
223
- const cartItems = getCartItems();
224
-
225
- if (shippingInfo && paymentInfo && cartItems) {
226
- const shipping = JSON.parse(shippingInfo);
227
- const payment = JSON.parse(paymentInfo);
228
-
229
- document.getElementById('shipping-name').textContent = shipping.name;
230
- document.getElementById('shipping-address').textContent = shipping.address;
231
- document.getElementById('shipping-city').textContent = shipping.city;
232
- document.getElementById('shipping-state').textContent = shipping.state;
233
- document.getElementById('shipping-zip').textContent = shipping.zip;
234
-
235
- // Payment information is dummy data in confirmation.html
236
-
237
- const orderItemsList = document.getElementById('order-items');
238
- let orderTotal = 0;
239
-
240
- cartItems.forEach(item => {
241
- const listItem = document.createElement('li');
242
- listItem.textContent = `${item.name} (${item.quantity}) - $${(item.price * item.quantity).toFixed(2)}`;
243
- orderItemsList.appendChild(listItem);
244
- orderTotal += item.price * item.quantity;
245
- });
246
-
247
- document.getElementById('order-total').textContent = `$${orderTotal.toFixed(2)}`;
248
 
249
- // Clear cart and shipping info from local storage
250
- localStorage.removeItem('cart');
251
- localStorage.removeItem('shippingInfo');
252
- localStorage.removeItem('paymentInfo');
253
- }
 
254
  }
 
255
 
256
- // Initialize the cart page
257
- if (window.location.pathname === '/cart.html') {
258
- displayCartItems();
259
- updateOrderSummary();
260
- }
261
 
262
- // Initialize the checkout page
263
- if (window.location.pathname === '/checkout.html') {
264
- updateOrderSummary();
265
- handleCheckout();
 
 
266
  }
267
 
268
- // Initialize the confirmation page
269
- if (window.location.pathname === '/confirmation.html') {
270
- displayConfirmationDetails();
271
- }
272
- });
273
 
274
- function updateCartUI() {
275
- if (window.location.pathname === '/cart.html') {
276
- displayCartItems();
277
- updateOrderSummary();
278
- }
 
279
  }
 
 
 
 
1
 
2
+ function getCartItems() {
3
+ const cartItems = localStorage.getItem('cart');
4
+ return cartItems ? JSON.parse(cartItems) : [];
5
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
+ function updateCartIcon() {
8
+ const cartItems = getCartItems();
9
+ const cartItemCount = cartItems.reduce((total, item) => total + item.quantity, 0);
10
+ const cartIcon = document.querySelector('a[href="/cart.html"]');
11
+ if (cartIcon) {
12
+ cartIcon.textContent = `Cart (${cartItemCount})`;
13
  }
14
+ }
15
 
16
+ function addToCart(product) {
17
+ const cartItems = getCartItems();
18
+ const existingProductIndex = cartItems.findIndex(item => item.id === product.id);
 
 
19
 
20
+ if (existingProductIndex > -1) {
21
+ // If the product already exists in the cart, increment the quantity
22
+ cartItems[existingProductIndex].quantity += 1;
23
+ } else {
24
+ // Otherwise, add the product to the cart with a quantity of 1
25
+ cartItems.push({ ...product, quantity: 1 });
26
  }
27
 
28
+ localStorage.setItem('cart', JSON.stringify(cartItems));
29
+ updateCartIcon();
30
+ alert('Product added to cart!');
31
+ }
 
32
 
33
+ function removeFromCart(productId) {
34
+ let cartItems = getCartItems();
35
+ cartItems = cartItems.filter(item => item.id !== productId);
36
+ localStorage.setItem('cart', JSON.stringify(cartItems));
37
+ updateCartIcon();
38
+ updateCartPage(); // Function to update cart page after removing item
39
  }
40
+
41
+ // Call updateCartIcon on page load
42
+ updateCartIcon();
style.css CHANGED
@@ -3,3 +3,20 @@
3
  transform: scale(1.05);
4
  transition: transform 0.2s ease-in-out;
5
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  transform: scale(1.05);
4
  transition: transform 0.2s ease-in-out;
5
  }
6
+
7
+ /* Add transition to the cart icon */
8
+ nav .container > div:nth-child(3) > a {
9
+ transition: color 0.3s ease;
10
+ }
11
+
12
+ nav .container > div:nth-child(3) > a:hover {
13
+ color: #FFFF00;
14
+ }
15
+
16
+ .product-card {
17
+ transition: transform 0.3s ease;
18
+ }
19
+
20
+ .product-card:hover {
21
+ transform: scale(1.03);
22
+ }