Hnxrec commited on
Commit
fa71ee6
·
verified ·
1 Parent(s): cfad371

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +1187 -19
  3. prompts.txt +0 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Resturant Space
3
- emoji: 📉
4
- colorFrom: indigo
5
- colorTo: green
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: resturant-space
3
+ emoji: 🐳
4
+ colorFrom: red
5
+ colorTo: yellow
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1187 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </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>Restro-fi Premium | Restaurant Ordering System</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
10
+ <style>
11
+ body {
12
+ font-family: 'Poppins', sans-serif;
13
+ background-color: #f8fafc;
14
+ }
15
+
16
+ .menu-item-card {
17
+ transition: all 0.3s ease;
18
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
19
+ }
20
+
21
+ .menu-item-card:hover {
22
+ transform: translateY(-5px);
23
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
24
+ }
25
+
26
+ .category-btn.active {
27
+ background: linear-gradient(135deg, #f59e0b, #ef4444);
28
+ color: white;
29
+ }
30
+
31
+ .cart-item:hover .remove-btn {
32
+ opacity: 1;
33
+ }
34
+
35
+ .tab-content {
36
+ display: none;
37
+ animation: fadeIn 0.3s ease;
38
+ }
39
+
40
+ .tab-content.active {
41
+ display: block;
42
+ }
43
+
44
+ .order-status {
45
+ transition: all 0.3s ease;
46
+ }
47
+
48
+ .order-status.pending {
49
+ background-color: #fef3c7;
50
+ color: #92400e;
51
+ }
52
+
53
+ .order-status.preparing {
54
+ background-color: #bfdbfe;
55
+ color: #1e40af;
56
+ }
57
+
58
+ .order-status.served {
59
+ background-color: #d1fae5;
60
+ color: #065f46;
61
+ }
62
+
63
+ .order-status.cancelled {
64
+ background-color: #fee2e2;
65
+ color: #991b1b;
66
+ }
67
+
68
+ .table-card {
69
+ transition: all 0.3s ease;
70
+ }
71
+
72
+ .table-card:hover {
73
+ transform: scale(1.03);
74
+ }
75
+
76
+ .table-available {
77
+ background: linear-gradient(135deg, #10b981, #3b82f6);
78
+ }
79
+
80
+ .table-occupied {
81
+ background: linear-gradient(135deg, #ef4444, #f59e0b);
82
+ }
83
+
84
+ @keyframes fadeIn {
85
+ from { opacity: 0; }
86
+ to { opacity: 1; }
87
+ }
88
+
89
+ .sidebar-overlay {
90
+ backdrop-filter: blur(5px);
91
+ }
92
+
93
+ .floating-btn {
94
+ box-shadow: 0 4px 15px rgba(239, 68, 68, 0.3);
95
+ }
96
+
97
+ .notification {
98
+ animation: slideIn 0.5s ease, fadeOut 0.5s ease 2.5s forwards;
99
+ }
100
+
101
+ @keyframes slideIn {
102
+ from { transform: translateX(100%); }
103
+ to { transform: translateX(0); }
104
+ }
105
+
106
+ @keyframes fadeOut {
107
+ to { opacity: 0; }
108
+ }
109
+ </style>
110
+ </head>
111
+ <body class="bg-gray-50">
112
+ <!-- Notification -->
113
+ <div id="notification" class="notification fixed top-4 right-4 hidden z-50">
114
+ <div class="bg-white rounded-lg shadow-lg p-4 flex items-start border-l-4 border-orange-500 max-w-sm">
115
+ <div class="mr-3">
116
+ <div class="h-8 w-8 rounded-full bg-orange-100 flex items-center justify-center">
117
+ <i class="fas fa-check text-orange-500"></i>
118
+ </div>
119
+ </div>
120
+ <div class="flex-1">
121
+ <h4 class="font-medium text-gray-900" id="notification-title">Success</h4>
122
+ <p class="text-sm text-gray-600" id="notification-message">Your order has been placed successfully!</p>
123
+ </div>
124
+ <button class="ml-4 text-gray-400 hover:text-gray-500" id="close-notification">
125
+ <i class="fas fa-times"></i>
126
+ </button>
127
+ </div>
128
+ </div>
129
+
130
+ <!-- Header -->
131
+ <header class="bg-white shadow-sm sticky top-0 z-30">
132
+ <div class="container mx-auto px-6 py-3 flex justify-between items-center">
133
+ <div class="flex items-center">
134
+ <div class="h-10 w-10 rounded-full bg-gradient-to-r from-orange-500 to-red-500 flex items-center justify-center mr-3">
135
+ <i class="fas fa-utensils text-white"></i>
136
+ </div>
137
+ <h1 class="text-xl font-bold text-gray-800">Restro<span class="text-orange-500">-fi</span> <span class="text-xs bg-orange-500 text-white px-2 py-0.5 rounded-full ml-1">Premium</span></h1>
138
+ </div>
139
+ <div class="flex items-center space-x-4">
140
+ <div class="hidden md:flex space-x-2">
141
+ <button id="customerBtn" class="px-4 py-2 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition flex items-center">
142
+ <i class="fas fa-user mr-2"></i> Customer View
143
+ </button>
144
+ <button id="adminBtn" class="px-4 py-2 bg-gradient-to-r from-gray-800 to-gray-700 text-white rounded-lg hover:opacity-90 transition flex items-center">
145
+ <i class="fas fa-cog mr-2"></i> Admin View
146
+ </button>
147
+ </div>
148
+ <div class="relative">
149
+ <button id="cartIcon" class="relative p-2 rounded-full bg-gray-100 hover:bg-gray-200 transition">
150
+ <i class="fas fa-shopping-cart text-gray-700"></i>
151
+ <span id="cartCount" class="absolute -top-1 -right-1 bg-orange-500 text-white text-xs rounded-full h-5 w-5 flex items-center justify-center">0</span>
152
+ </button>
153
+ </div>
154
+ <div class="relative group">
155
+ <div class="flex items-center space-x-2 cursor-pointer">
156
+ <img src="https://randomuser.me/api/portraits/men/1.jpg" alt="User" class="w-8 h-8 rounded-full object-cover border-2 border-orange-500">
157
+ <span class="hidden md:inline text-sm font-medium">Admin</span>
158
+ <i class="fas fa-chevron-down text-xs text-gray-500"></i>
159
+ </div>
160
+ <div class="absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-xl py-1 z-10 hidden group-hover:block origin-top-right transform transition duration-100 ease-out">
161
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center">
162
+ <i class="fas fa-user mr-2 text-gray-500"></i> Profile
163
+ </a>
164
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center">
165
+ <i class="fas fa-cog mr-2 text-gray-500"></i> Settings
166
+ </a>
167
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center">
168
+ <i class="fas fa-sign-out-alt mr-2 text-gray-500"></i> Logout
169
+ </a>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </header>
175
+
176
+ <!-- Mobile View Toggle -->
177
+ <div class="md:hidden fixed bottom-4 right-4 z-40">
178
+ <div class="flex space-x-2">
179
+ <button id="mobileCustomerBtn" class="floating-btn h-12 w-12 rounded-full bg-gradient-to-r from-orange-500 to-red-500 text-white flex items-center justify-center shadow-lg">
180
+ <i class="fas fa-user"></i>
181
+ </button>
182
+ <button id="mobileAdminBtn" class="floating-btn h-12 w-12 rounded-full bg-gradient-to-r from-gray-800 to-gray-700 text-white flex items-center justify-center shadow-lg">
183
+ <i class="fas fa-cog"></i>
184
+ </button>
185
+ </div>
186
+ </div>
187
+
188
+ <!-- Main Content - Customer View -->
189
+ <main id="customerView" class="container mx-auto px-4 py-6">
190
+ <!-- Table Selection -->
191
+ <div class="bg-white rounded-xl shadow-sm p-6 mb-6 border border-gray-100">
192
+ <h2 class="text-xl font-semibold mb-4 flex items-center">
193
+ <i class="fas fa-chair mr-2 text-orange-500"></i> Select Your Table
194
+ </h2>
195
+ <div class="flex flex-wrap gap-3">
196
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="1">
197
+ <span class="h-2 w-2 rounded-full bg-green-500 mr-2"></span> Table 1
198
+ </button>
199
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="2">
200
+ <span class="h-2 w-2 rounded-full bg-red-500 mr-2"></span> Table 2
201
+ </button>
202
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="3">
203
+ <span class="h-2 w-2 rounded-full bg-green-500 mr-2"></span> Table 3
204
+ </button>
205
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="4">
206
+ <span class="h-2 w-2 rounded-full bg-green-500 mr-2"></span> Table 4
207
+ </button>
208
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="5">
209
+ <span class="h-2 w-2 rounded-full bg-green-500 mr-2"></span> Table 5
210
+ </button>
211
+ <button class="table-btn px-4 py-2 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-100 transition flex items-center" data-table="6">
212
+ <span class="h-2 w-2 rounded-full bg-green-500 mr-2"></span> Table 6
213
+ </button>
214
+ </div>
215
+ <div class="mt-4 pt-4 border-t border-gray-100">
216
+ <p class="text-sm text-gray-600 mb-2">Or scan the QR code at your table</p>
217
+ <button class="px-4 py-2 bg-gradient-to-r from-blue-500 to-blue-600 text-white rounded-lg hover:opacity-90 transition flex items-center">
218
+ <i class="fas fa-qrcode mr-2"></i> Scan QR Code
219
+ </button>
220
+ </div>
221
+ </div>
222
+
223
+ <!-- Menu Categories -->
224
+ <div class="mb-6">
225
+ <div class="flex overflow-x-auto pb-2 space-x-2 scrollbar-hide">
226
+ <button class="category-btn px-4 py-2 rounded-lg whitespace-nowrap transition flex items-center active" data-category="all">
227
+ <i class="fas fa-utensils mr-2"></i> All Items
228
+ </button>
229
+ <button class="category-btn px-4 py-2 bg-gray-100 text-gray-800 rounded-lg whitespace-nowrap hover:bg-gray-200 transition flex items-center" data-category="starters">
230
+ <i class="fas fa-bread-slice mr-2"></i> Starters
231
+ </button>
232
+ <button class="category-btn px-4 py-2 bg-gray-100 text-gray-800 rounded-lg whitespace-nowrap hover:bg-gray-200 transition flex items-center" data-category="mains">
233
+ <i class="fas fa-drumstick-bite mr-2"></i> Main Courses
234
+ </button>
235
+ <button class="category-btn px-4 py-2 bg-gray-100 text-gray-800 rounded-lg whitespace-nowrap hover:bg-gray-200 transition flex items-center" data-category="desserts">
236
+ <i class="fas fa-ice-cream mr-2"></i> Desserts
237
+ </button>
238
+ <button class="category-btn px-4 py-2 bg-gray-100 text-gray-800 rounded-lg whitespace-nowrap hover:bg-gray-200 transition flex items-center" data-category="drinks">
239
+ <i class="fas fa-glass-martini-alt mr-2"></i> Drinks
240
+ </button>
241
+ </div>
242
+ </div>
243
+
244
+ <!-- Search -->
245
+ <div class="mb-6 relative">
246
+ <div class="relative">
247
+ <input type="text" id="menuSearch" placeholder="Search menu items..." class="w-full pl-10 pr-4 py-3 border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent">
248
+ <i class="fas fa-search absolute left-3 top-3.5 text-gray-400"></i>
249
+ </div>
250
+ </div>
251
+
252
+ <!-- Menu Items -->
253
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6" id="menuItems">
254
+ <!-- Menu items will be dynamically added here -->
255
+ </div>
256
+ </main>
257
+
258
+ <!-- Main Content - Admin View (Hidden by default) -->
259
+ <main id="adminView" class="container mx-auto px-4 py-6 hidden">
260
+ <!-- Admin Dashboard -->
261
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6">
262
+ <div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100">
263
+ <div class="flex justify-between items-start">
264
+ <div>
265
+ <p class="text-gray-500">Total Orders</p>
266
+ <h3 class="text-2xl font-bold">124</h3>
267
+ <p class="text-sm text-green-500 flex items-center mt-1">
268
+ <i class="fas fa-arrow-up mr-1"></i> 12% from yesterday
269
+ </p>
270
+ </div>
271
+ <div class="bg-blue-100 p-3 rounded-full">
272
+ <i class="fas fa-shopping-bag text-blue-500 text-xl"></i>
273
+ </div>
274
+ </div>
275
+ </div>
276
+ <div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100">
277
+ <div class="flex justify-between items-start">
278
+ <div>
279
+ <p class="text-gray-500">Pending Orders</p>
280
+ <h3 class="text-2xl font-bold">8</h3>
281
+ <p class="text-sm text-red-500 flex items-center mt-1">
282
+ <i class="fas fa-arrow-down mr-1"></i> 2 from yesterday
283
+ </p>
284
+ </div>
285
+ <div class="bg-orange-100 p-3 rounded-full">
286
+ <i class="fas fa-clock text-orange-500 text-xl"></i>
287
+ </div>
288
+ </div>
289
+ </div>
290
+ <div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100">
291
+ <div class="flex justify-between items-start">
292
+ <div>
293
+ <p class="text-gray-500">Today's Revenue</p>
294
+ <h3 class="text-2xl font-bold">$1,245</h3>
295
+ <p class="text-sm text-green-500 flex items-center mt-1">
296
+ <i class="fas fa-arrow-up mr-1"></i> $320 from yesterday
297
+ </p>
298
+ </div>
299
+ <div class="bg-green-100 p-3 rounded-full">
300
+ <i class="fas fa-dollar-sign text-green-500 text-xl"></i>
301
+ </div>
302
+ </div>
303
+ </div>
304
+ <div class="bg-white rounded-xl shadow-sm p-6 border border-gray-100">
305
+ <div class="flex justify-between items-start">
306
+ <div>
307
+ <p class="text-gray-500">Active Tables</p>
308
+ <h3 class="text-2xl font-bold">12/20</h3>
309
+ <p class="text-sm text-gray-500 flex items-center mt-1">
310
+ <i class="fas fa-info-circle mr-1"></i> 60% occupancy
311
+ </p>
312
+ </div>
313
+ <div class="bg-purple-100 p-3 rounded-full">
314
+ <i class="fas fa-chair text-purple-500 text-xl"></i>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ </div>
319
+
320
+ <!-- Admin Tabs -->
321
+ <div class="bg-white rounded-xl shadow-sm mb-6 border border-gray-100">
322
+ <div class="flex overflow-x-auto scrollbar-hide">
323
+ <button class="admin-tab px-6 py-4 font-medium text-gray-600 hover:text-gray-800 border-b-2 border-transparent hover:border-orange-500 whitespace-nowrap flex items-center active" data-tab="orders">
324
+ <i class="fas fa-clipboard-list mr-2"></i> Orders
325
+ </button>
326
+ <button class="admin-tab px-6 py-4 font-medium text-gray-600 hover:text-gray-800 border-b-2 border-transparent hover:border-orange-500 whitespace-nowrap flex items-center" data-tab="menu">
327
+ <i class="fas fa-utensils mr-2"></i> Menu
328
+ </button>
329
+ <button class="admin-tab px-6 py-4 font-medium text-gray-600 hover:text-gray-800 border-b-2 border-transparent hover:border-orange-500 whitespace-nowrap flex items-center" data-tab="categories">
330
+ <i class="fas fa-tags mr-2"></i> Categories
331
+ </button>
332
+ <button class="admin-tab px-6 py-4 font-medium text-gray-600 hover:text-gray-800 border-b-2 border-transparent hover:border-orange-500 whitespace-nowrap flex items-center" data-tab="tables">
333
+ <i class="fas fa-chair mr-2"></i> Tables
334
+ </button>
335
+ </div>
336
+ </div>
337
+
338
+ <!-- Orders Tab Content -->
339
+ <div id="ordersTab" class="tab-content active">
340
+ <div class="bg-white rounded-xl shadow-sm overflow-hidden border border-gray-100">
341
+ <div class="overflow-x-auto">
342
+ <table class="min-w-full divide-y divide-gray-200">
343
+ <thead class="bg-gray-50">
344
+ <tr>
345
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Order ID</th>
346
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Table</th>
347
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Items</th>
348
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Total</th>
349
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
350
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
351
+ </tr>
352
+ </thead>
353
+ <tbody class="bg-white divide-y divide-gray-200">
354
+ <!-- Orders will be dynamically added here -->
355
+ </tbody>
356
+ </table>
357
+ </div>
358
+ </div>
359
+ </div>
360
+
361
+ <!-- Menu Tab Content -->
362
+ <div id="menuTab" class="tab-content">
363
+ <div class="bg-white rounded-xl shadow-sm p-6 mb-6 border border-gray-100">
364
+ <div class="flex justify-between items-center mb-4">
365
+ <h2 class="text-xl font-semibold flex items-center">
366
+ <i class="fas fa-utensils mr-2 text-orange-500"></i> Menu Items
367
+ </h2>
368
+ <button class="px-4 py-2 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition flex items-center" id="addMenuItemBtn">
369
+ <i class="fas fa-plus mr-2"></i> Add Item
370
+ </button>
371
+ </div>
372
+ <div class="overflow-x-auto">
373
+ <table class="min-w-full divide-y divide-gray-200">
374
+ <thead class="bg-gray-50">
375
+ <tr>
376
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Name</th>
377
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Category</th>
378
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Price</th>
379
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
380
+ </tr>
381
+ </thead>
382
+ <tbody class="bg-white divide-y divide-gray-200" id="adminMenuItems">
383
+ <!-- Admin menu items will be dynamically added here -->
384
+ </tbody>
385
+ </table>
386
+ </div>
387
+ </div>
388
+ </div>
389
+
390
+ <!-- Categories Tab Content -->
391
+ <div id="categoriesTab" class="tab-content">
392
+ <div class="bg-white rounded-xl shadow-sm p-6 mb-6 border border-gray-100">
393
+ <div class="flex justify-between items-center mb-4">
394
+ <h2 class="text-xl font-semibold flex items-center">
395
+ <i class="fas fa-tags mr-2 text-orange-500"></i> Menu Categories
396
+ </h2>
397
+ <button class="px-4 py-2 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition flex items-center" id="addCategoryBtn">
398
+ <i class="fas fa-plus mr-2"></i> Add Category
399
+ </button>
400
+ </div>
401
+ <div class="overflow-x-auto">
402
+ <table class="min-w-full divide-y divide-gray-200">
403
+ <thead class="bg-gray-50">
404
+ <tr>
405
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Name</th>
406
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Items</th>
407
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
408
+ </tr>
409
+ </thead>
410
+ <tbody class="bg-white divide-y divide-gray-200" id="adminCategories">
411
+ <!-- Categories will be dynamically added here -->
412
+ </tbody>
413
+ </table>
414
+ </div>
415
+ </div>
416
+ </div>
417
+
418
+ <!-- Tables Tab Content -->
419
+ <div id="tablesTab" class="tab-content">
420
+ <div class="bg-white rounded-xl shadow-sm p-6 mb-6 border border-gray-100">
421
+ <div class="flex justify-between items-center mb-4">
422
+ <h2 class="text-xl font-semibold flex items-center">
423
+ <i class="fas fa-chair mr-2 text-orange-500"></i> Restaurant Tables
424
+ </h2>
425
+ <button class="px-4 py-2 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition flex items-center" id="addTableBtn">
426
+ <i class="fas fa-plus mr-2"></i> Add Table
427
+ </button>
428
+ </div>
429
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4" id="tablesList">
430
+ <!-- Tables will be dynamically added here -->
431
+ </div>
432
+ </div>
433
+ </div>
434
+ </main>
435
+
436
+ <!-- Shopping Cart Sidebar -->
437
+ <div id="cartSidebar" class="fixed inset-y-0 right-0 w-full md:w-96 bg-white shadow-xl transform translate-x-full transition-transform duration-300 ease-in-out z-50">
438
+ <div class="flex flex-col h-full">
439
+ <div class="flex justify-between items-center p-4 border-b border-gray-100">
440
+ <h2 class="text-xl font-semibold flex items-center">
441
+ <i class="fas fa-shopping-cart mr-2 text-orange-500"></i> Your Order
442
+ </h2>
443
+ <button id="closeCartBtn" class="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100">
444
+ <i class="fas fa-times"></i>
445
+ </button>
446
+ </div>
447
+ <div class="p-4 border-b border-gray-100">
448
+ <div class="flex justify-between items-center">
449
+ <span class="font-medium flex items-center">
450
+ <i class="fas fa-chair mr-2 text-gray-500"></i> Table:
451
+ </span>
452
+ <span id="selectedTableDisplay" class="font-semibold text-orange-500">Not selected</span>
453
+ </div>
454
+ </div>
455
+ <div class="flex-1 overflow-y-auto p-4" id="cartItems">
456
+ <!-- Cart items will be dynamically added here -->
457
+ <div class="text-center text-gray-500 py-10" id="emptyCartMessage">
458
+ <i class="fas fa-shopping-cart text-4xl mb-2 text-gray-300"></i>
459
+ <p class="font-medium">Your cart is empty</p>
460
+ <p class="text-sm mt-1">Add items from the menu to get started</p>
461
+ </div>
462
+ </div>
463
+ <div class="p-4 border-t border-gray-100">
464
+ <div class="flex justify-between mb-2">
465
+ <span class="text-gray-600">Subtotal:</span>
466
+ <span id="cartSubtotal" class="font-medium">$0.00</span>
467
+ </div>
468
+ <div class="flex justify-between mb-4">
469
+ <span class="text-gray-600">Tax (10%):</span>
470
+ <span id="cartTax" class="font-medium">$0.00</span>
471
+ </div>
472
+ <div class="flex justify-between font-bold text-lg border-t border-gray-100 pt-3">
473
+ <span>Total:</span>
474
+ <span id="cartTotal" class="text-orange-500">$0.00</span>
475
+ </div>
476
+ <button id="placeOrderBtn" class="w-full mt-4 px-4 py-3 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center" disabled>
477
+ <i class="fas fa-paper-plane mr-2"></i> Place Order
478
+ </button>
479
+ </div>
480
+ </div>
481
+ </div>
482
+ <div id="cartOverlay" class="fixed inset-0 bg-black bg-opacity-50 z-40 hidden sidebar-overlay"></div>
483
+
484
+ <!-- Add Menu Item Modal -->
485
+ <div id="addMenuItemModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
486
+ <div class="bg-white rounded-xl shadow-xl w-full max-w-md mx-4">
487
+ <div class="flex justify-between items-center p-4 border-b border-gray-100">
488
+ <h3 class="text-lg font-semibold flex items-center">
489
+ <i class="fas fa-plus-circle mr-2 text-orange-500"></i> Add Menu Item
490
+ </h3>
491
+ <button id="closeMenuItemModal" class="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100">
492
+ <i class="fas fa-times"></i>
493
+ </button>
494
+ </div>
495
+ <div class="p-4">
496
+ <form id="menuItemForm">
497
+ <div class="mb-4">
498
+ <label class="block text-gray-700 mb-2 font-medium" for="itemName">Name</label>
499
+ <input type="text" id="itemName" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" required>
500
+ </div>
501
+ <div class="mb-4">
502
+ <label class="block text-gray-700 mb-2 font-medium" for="itemDescription">Description</label>
503
+ <textarea id="itemDescription" rows="3" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent"></textarea>
504
+ </div>
505
+ <div class="mb-4">
506
+ <label class="block text-gray-700 mb-2 font-medium" for="itemPrice">Price</label>
507
+ <div class="relative">
508
+ <span class="absolute left-3 top-2.5 text-gray-500">$</span>
509
+ <input type="number" id="itemPrice" min="0" step="0.01" class="w-full pl-8 pr-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" required>
510
+ </div>
511
+ </div>
512
+ <div class="mb-4">
513
+ <label class="block text-gray-700 mb-2 font-medium" for="itemCategory">Category</label>
514
+ <select id="itemCategory" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-orange-500 focus:border-transparent" required>
515
+ <option value="">Select a category</option>
516
+ <option value="starters">Starters</option>
517
+ <option value="mains">Main Courses</option>
518
+ <option value="desserts">Desserts</option>
519
+ <option value="drinks">Drinks</option>
520
+ </select>
521
+ </div>
522
+ <div class="mb-4">
523
+ <label class="block text-gray-700 mb-2 font-medium" for="itemImage">Image</label>
524
+ <div class="flex items-center justify-center w-full">
525
+ <label for="itemImage" class="flex flex-col items-center justify-center w-full h-32 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 hover:bg-gray-100">
526
+ <div class="flex flex-col items-center justify-center pt-5 pb-6">
527
+ <i class="fas fa-cloud-upload-alt text-3xl text-gray-400 mb-2"></i>
528
+ <p class="mb-2 text-sm text-gray-500">Click to upload</p>
529
+ <p class="text-xs text-gray-500">PNG, JPG (MAX. 2MB)</p>
530
+ </div>
531
+ <input id="itemImage" type="file" class="hidden" />
532
+ </label>
533
+ </div>
534
+ </div>
535
+ <div class="flex justify-end space-x-3">
536
+ <button type="button" id="cancelMenuItem" class="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-100 transition">Cancel</button>
537
+ <button type="submit" class="px-4 py-2 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition">Save Item</button>
538
+ </div>
539
+ </form>
540
+ </div>
541
+ </div>
542
+ </div>
543
+
544
+ <script>
545
+ // Sample data
546
+ const menuItems = [
547
+ { id: 1, name: "Garlic Bread", description: "Toasted bread with garlic butter and herbs", price: 4.99, category: "starters", image: "https://images.unsplash.com/photo-1518604666860-9ed391f76460?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
548
+ { id: 2, name: "Bruschetta", description: "Toasted bread topped with tomatoes, garlic and fresh basil", price: 5.99, category: "starters", image: "https://images.unsplash.com/photo-1490645935967-10de6ba17061?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
549
+ { id: 3, name: "Margherita Pizza", description: "Classic pizza with tomato sauce, mozzarella and basil", price: 12.99, category: "mains", image: "https://images.unsplash.com/photo-1565299624946-b28f40a0ae38?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
550
+ { id: 4, name: "Spaghetti Carbonara", description: "Pasta with creamy egg sauce, pancetta and parmesan", price: 14.99, category: "mains", image: "https://images.unsplash.com/photo-1589227365533-cee630bd59bd?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
551
+ { id: 5, name: "Tiramisu", description: "Classic Italian dessert with coffee-soaked ladyfingers", price: 6.99, category: "desserts", image: "https://images.unsplash.com/photo-1563805042-7684c019e1cb?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
552
+ { id: 6, name: "Chocolate Lava Cake", description: "Warm chocolate cake with a molten center, served with vanilla ice cream", price: 7.99, category: "desserts", image: "https://images.unsplash.com/photo-1564355808539-22fda35bed7e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
553
+ { id: 7, name: "Red Wine", description: "Glass of premium house red wine", price: 8.99, category: "drinks", image: "https://images.unsplash.com/photo-1551024506-0ecc539b5e0e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" },
554
+ { id: 8, name: "Sparkling Water", description: "Bottle of sparkling mineral water", price: 3.99, category: "drinks", image: "https://images.unsplash.com/photo-1567337710282-00832a8167a9?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=400&q=80" }
555
+ ];
556
+
557
+ const categories = [
558
+ { id: 1, name: "Starters", slug: "starters", itemCount: 2 },
559
+ { id: 2, name: "Main Courses", slug: "mains", itemCount: 2 },
560
+ { id: 3, name: "Desserts", slug: "desserts", itemCount: 2 },
561
+ { id: 4, name: "Drinks", slug: "drinks", itemCount: 2 }
562
+ ];
563
+
564
+ const tables = [
565
+ { id: 1, number: "1", qrCode: "qr1", status: "available" },
566
+ { id: 2, number: "2", qrCode: "qr2", status: "occupied" },
567
+ { id: 3, number: "3", qrCode: "qr3", status: "available" },
568
+ { id: 4, number: "4", qrCode: "qr4", status: "available" },
569
+ { id: 5, number: "5", qrCode: "qr5", status: "available" },
570
+ { id: 6, number: "6", qrCode: "qr6", status: "available" }
571
+ ];
572
+
573
+ const orders = [
574
+ { id: 1, table: "2", items: [{id: 3, name: "Margherita Pizza", quantity: 1, price: 12.99}, {id: 7, name: "Red Wine", quantity: 2, price: 8.99}], total: 30.97, status: "pending", timestamp: "2023-06-15T14:30:00" },
575
+ { id: 2, table: "5", items: [{id: 4, name: "Spaghetti Carbonara", quantity: 1, price: 14.99}, {id: 5, name: "Tiramisu", quantity: 1, price: 6.99}], total: 21.98, status: "preparing", timestamp: "2023-06-15T14:15:00" },
576
+ { id: 3, table: "3", items: [{id: 1, name: "Garlic Bread", quantity: 2, price: 4.99}, {id: 2, name: "Bruschetta", quantity: 1, price: 5.99}, {id: 8, name: "Sparkling Water", quantity: 1, price: 3.99}], total: 19.96, status: "served", timestamp: "2023-06-15T13:45:00" },
577
+ { id: 4, table: "1", items: [{id: 6, name: "Chocolate Lava Cake", quantity: 1, price: 7.99}], total: 7.99, status: "cancelled", timestamp: "2023-06-15T13:30:00" }
578
+ ];
579
+
580
+ // State
581
+ let cart = [];
582
+ let selectedTable = null;
583
+ let selectedCategory = "all";
584
+ let searchQuery = "";
585
+
586
+ // DOM Elements
587
+ const customerView = document.getElementById('customerView');
588
+ const adminView = document.getElementById('adminView');
589
+ const customerBtn = document.getElementById('customerBtn');
590
+ const adminBtn = document.getElementById('adminBtn');
591
+ const mobileCustomerBtn = document.getElementById('mobileCustomerBtn');
592
+ const mobileAdminBtn = document.getElementById('mobileAdminBtn');
593
+ const cartIcon = document.getElementById('cartIcon');
594
+ const cartCount = document.getElementById('cartCount');
595
+ const cartSidebar = document.getElementById('cartSidebar');
596
+ const cartOverlay = document.getElementById('cartOverlay');
597
+ const closeCartBtn = document.getElementById('closeCartBtn');
598
+ const cartItems = document.getElementById('cartItems');
599
+ const emptyCartMessage = document.getElementById('emptyCartMessage');
600
+ const selectedTableDisplay = document.getElementById('selectedTableDisplay');
601
+ const cartSubtotal = document.getElementById('cartSubtotal');
602
+ const cartTax = document.getElementById('cartTax');
603
+ const cartTotal = document.getElementById('cartTotal');
604
+ const placeOrderBtn = document.getElementById('placeOrderBtn');
605
+ const tableBtns = document.querySelectorAll('.table-btn');
606
+ const categoryBtns = document.querySelectorAll('.category-btn');
607
+ const menuSearch = document.getElementById('menuSearch');
608
+ const menuItemsContainer = document.getElementById('menuItems');
609
+ const adminTabs = document.querySelectorAll('.admin-tab');
610
+ const tabContents = document.querySelectorAll('.tab-content');
611
+ const ordersTab = document.getElementById('ordersTab');
612
+ const menuTab = document.getElementById('menuTab');
613
+ const categoriesTab = document.getElementById('categoriesTab');
614
+ const tablesTab = document.getElementById('tablesTab');
615
+ const addMenuItemBtn = document.getElementById('addMenuItemBtn');
616
+ const addMenuItemModal = document.getElementById('addMenuItemModal');
617
+ const closeMenuItemModal = document.getElementById('closeMenuItemModal');
618
+ const cancelMenuItem = document.getElementById('cancelMenuItem');
619
+ const menuItemForm = document.getElementById('menuItemForm');
620
+ const adminMenuItems = document.getElementById('adminMenuItems');
621
+ const adminCategories = document.getElementById('adminCategories');
622
+ const addCategoryBtn = document.getElementById('addCategoryBtn');
623
+ const tablesList = document.getElementById('tablesList');
624
+ const addTableBtn = document.getElementById('addTableBtn');
625
+ const notification = document.getElementById('notification');
626
+ const notificationTitle = document.getElementById('notification-title');
627
+ const notificationMessage = document.getElementById('notification-message');
628
+ const closeNotification = document.getElementById('close-notification');
629
+
630
+ // Initialize the app
631
+ function init() {
632
+ renderMenuItems();
633
+ renderAdminMenuItems();
634
+ renderAdminCategories();
635
+ renderOrders();
636
+ renderTables();
637
+ setupEventListeners();
638
+ }
639
+
640
+ // Set up event listeners
641
+ function setupEventListeners() {
642
+ // View toggle
643
+ customerBtn.addEventListener('click', () => {
644
+ customerView.classList.remove('hidden');
645
+ adminView.classList.add('hidden');
646
+ customerBtn.classList.add('from-orange-500', 'to-red-500');
647
+ customerBtn.classList.remove('bg-gray-200', 'text-gray-800');
648
+ adminBtn.classList.add('from-gray-800', 'to-gray-700');
649
+ adminBtn.classList.remove('bg-gray-200', 'text-gray-800');
650
+ });
651
+
652
+ adminBtn.addEventListener('click', () => {
653
+ customerView.classList.add('hidden');
654
+ adminView.classList.remove('hidden');
655
+ adminBtn.classList.add('from-gray-800', 'to-gray-700');
656
+ adminBtn.classList.remove('bg-gray-200', 'text-gray-800');
657
+ customerBtn.classList.add('bg-gray-200', 'text-gray-800');
658
+ customerBtn.classList.remove('from-orange-500', 'to-red-500');
659
+ });
660
+
661
+ // Mobile view toggle
662
+ mobileCustomerBtn.addEventListener('click', () => {
663
+ customerView.classList.remove('hidden');
664
+ adminView.classList.add('hidden');
665
+ });
666
+
667
+ mobileAdminBtn.addEventListener('click', () => {
668
+ customerView.classList.add('hidden');
669
+ adminView.classList.remove('hidden');
670
+ });
671
+
672
+ // Cart toggle
673
+ cartIcon.addEventListener('click', toggleCart);
674
+ closeCartBtn.addEventListener('click', toggleCart);
675
+ cartOverlay.addEventListener('click', toggleCart);
676
+
677
+ // Table selection
678
+ tableBtns.forEach(btn => {
679
+ btn.addEventListener('click', () => {
680
+ selectedTable = btn.dataset.table;
681
+ selectedTableDisplay.textContent = `Table ${selectedTable}`;
682
+ updatePlaceOrderButton();
683
+
684
+ // Update active table button
685
+ tableBtns.forEach(b => {
686
+ b.classList.remove('bg-orange-500', 'text-white');
687
+ b.classList.add('bg-gray-50', 'border', 'border-gray-200');
688
+ });
689
+ btn.classList.add('bg-orange-500', 'text-white');
690
+ btn.classList.remove('bg-gray-50', 'border', 'border-gray-200');
691
+ });
692
+ });
693
+
694
+ // Category filter
695
+ categoryBtns.forEach(btn => {
696
+ btn.addEventListener('click', () => {
697
+ selectedCategory = btn.dataset.category;
698
+
699
+ // Update active category button
700
+ categoryBtns.forEach(b => {
701
+ if (b.dataset.category === selectedCategory) {
702
+ b.classList.add('active');
703
+ } else {
704
+ b.classList.remove('active');
705
+ }
706
+ });
707
+
708
+ renderMenuItems();
709
+ });
710
+ });
711
+
712
+ // Search
713
+ menuSearch.addEventListener('input', (e) => {
714
+ searchQuery = e.target.value.toLowerCase();
715
+ renderMenuItems();
716
+ });
717
+
718
+ // Admin tabs
719
+ adminTabs.forEach(tab => {
720
+ tab.addEventListener('click', () => {
721
+ const tabId = tab.dataset.tab + 'Tab';
722
+
723
+ // Update active tab
724
+ adminTabs.forEach(t => {
725
+ t.classList.remove('border-orange-500', 'text-orange-600');
726
+ });
727
+ tab.classList.add('border-orange-500', 'text-orange-600');
728
+
729
+ // Show corresponding content
730
+ tabContents.forEach(content => {
731
+ content.classList.remove('active');
732
+ });
733
+ document.getElementById(tabId).classList.add('active');
734
+ });
735
+ });
736
+
737
+ // Add menu item modal
738
+ addMenuItemBtn.addEventListener('click', () => {
739
+ addMenuItemModal.classList.remove('hidden');
740
+ });
741
+
742
+ closeMenuItemModal.addEventListener('click', () => {
743
+ addMenuItemModal.classList.add('hidden');
744
+ });
745
+
746
+ cancelMenuItem.addEventListener('click', () => {
747
+ addMenuItemModal.classList.add('hidden');
748
+ });
749
+
750
+ // Notification
751
+ closeNotification.addEventListener('click', () => {
752
+ notification.classList.add('hidden');
753
+ });
754
+
755
+ // Place order
756
+ placeOrderBtn.addEventListener('click', placeOrder);
757
+ }
758
+
759
+ // Show notification
760
+ function showNotification(title, message) {
761
+ notificationTitle.textContent = title;
762
+ notificationMessage.textContent = message;
763
+ notification.classList.remove('hidden');
764
+
765
+ setTimeout(() => {
766
+ notification.classList.add('hidden');
767
+ }, 3000);
768
+ }
769
+
770
+ // Toggle cart sidebar
771
+ function toggleCart() {
772
+ cartSidebar.classList.toggle('translate-x-full');
773
+ cartOverlay.classList.toggle('hidden');
774
+ }
775
+
776
+ // Render menu items based on filters
777
+ function renderMenuItems() {
778
+ menuItemsContainer.innerHTML = '';
779
+
780
+ const filteredItems = menuItems.filter(item => {
781
+ const matchesCategory = selectedCategory === 'all' || item.category === selectedCategory;
782
+ const matchesSearch = item.name.toLowerCase().includes(searchQuery) ||
783
+ item.description.toLowerCase().includes(searchQuery);
784
+ return matchesCategory && matchesSearch;
785
+ });
786
+
787
+ if (filteredItems.length === 0) {
788
+ menuItemsContainer.innerHTML = `
789
+ <div class="col-span-full text-center py-10">
790
+ <i class="fas fa-utensils text-4xl text-gray-300 mb-2"></i>
791
+ <p class="text-gray-500 font-medium">No menu items found</p>
792
+ <p class="text-sm text-gray-400">Try adjusting your search or filter</p>
793
+ </div>
794
+ `;
795
+ return;
796
+ }
797
+
798
+ filteredItems.forEach(item => {
799
+ const cartItem = cart.find(ci => ci.id === item.id);
800
+ const quantity = cartItem ? cartItem.quantity : 0;
801
+
802
+ const itemElement = document.createElement('div');
803
+ itemElement.className = 'menu-item-card bg-white rounded-xl shadow-sm overflow-hidden border border-gray-100';
804
+ itemElement.innerHTML = `
805
+ <div class="h-48 overflow-hidden relative">
806
+ <img src="${item.image}" alt="${item.name}" class="w-full h-full object-cover">
807
+ <div class="absolute inset-0 bg-gradient-to-t from-black/30 to-transparent"></div>
808
+ <div class="absolute bottom-0 left-0 p-4">
809
+ <h3 class="font-semibold text-white text-lg">${item.name}</h3>
810
+ <span class="font-bold text-orange-300">$${item.price.toFixed(2)}</span>
811
+ </div>
812
+ </div>
813
+ <div class="p-4">
814
+ <p class="text-gray-600 text-sm mb-4">${item.description}</p>
815
+ <div class="flex items-center justify-between">
816
+ <div class="flex items-center border border-gray-200 rounded-lg overflow-hidden">
817
+ <button class="quantity-btn px-3 py-1 bg-gray-50 hover:bg-gray-100 transition" data-id="${item.id}" data-action="decrease">
818
+ <i class="fas fa-minus text-xs"></i>
819
+ </button>
820
+ <span class="px-3 quantity-display text-sm font-medium">${quantity}</span>
821
+ <button class="quantity-btn px-3 py-1 bg-gray-50 hover:bg-gray-100 transition" data-id="${item.id}" data-action="increase">
822
+ <i class="fas fa-plus text-xs"></i>
823
+ </button>
824
+ </div>
825
+ <button class="add-to-cart-btn px-3 py-1 bg-gradient-to-r from-orange-500 to-red-500 text-white rounded-lg hover:opacity-90 transition flex items-center" data-id="${item.id}">
826
+ <i class="fas fa-cart-plus mr-1 text-xs"></i> Add
827
+ </button>
828
+ </div>
829
+ </div>
830
+ `;
831
+
832
+ menuItemsContainer.appendChild(itemElement);
833
+ });
834
+
835
+ // Add event listeners to quantity buttons
836
+ document.querySelectorAll('.quantity-btn').forEach(btn => {
837
+ btn.addEventListener('click', (e) => {
838
+ const itemId = parseInt(btn.dataset.id);
839
+ const action = btn.dataset.action;
840
+ updateCartItem(itemId, action);
841
+ });
842
+ });
843
+
844
+ // Add event listeners to add to cart buttons
845
+ document.querySelectorAll('.add-to-cart-btn').forEach(btn => {
846
+ btn.addEventListener('click', (e) => {
847
+ const itemId = parseInt(btn.dataset.id);
848
+ addToCart(itemId);
849
+ });
850
+ });
851
+ }
852
+
853
+ // Render admin menu items
854
+ function renderAdminMenuItems() {
855
+ adminMenuItems.innerHTML = '';
856
+
857
+ menuItems.forEach(item => {
858
+ const itemElement = document.createElement('tr');
859
+ itemElement.className = 'hover:bg-gray-50';
860
+ itemElement.innerHTML = `
861
+ <td class="px-6 py-4 whitespace-nowrap">
862
+ <div class="flex items-center">
863
+ <div class="flex-shrink-0 h-10 w-10">
864
+ <img src="${item.image}" alt="${item.name}" class="h-10 w-10 rounded-full object-cover">
865
+ </div>
866
+ <div class="ml-4">
867
+ <div class="text-sm font-medium text-gray-900">${item.name}</div>
868
+ <div class="text-xs text-gray-500 line-clamp-1">${item.description}</div>
869
+ </div>
870
+ </div>
871
+ </td>
872
+ <td class="px-6 py-4 whitespace-nowrap">
873
+ <span class="px-2 py-1 text-xs font-medium rounded-full bg-gray-100 text-gray-800 capitalize">${item.category}</span>
874
+ </td>
875
+ <td class="px-6 py-4 whitespace-nowrap">
876
+ <div class="text-sm font-medium text-gray-900">$${item.price.toFixed(2)}</div>
877
+ </td>
878
+ <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
879
+ <button class="text-orange-600 hover:text-orange-900 mr-3 edit-item-btn" data-id="${item.id}">
880
+ <i class="fas fa-edit"></i>
881
+ </button>
882
+ <button class="text-red-600 hover:text-red-900 delete-item-btn" data-id="${item.id}">
883
+ <i class="fas fa-trash"></i>
884
+ </button>
885
+ </td>
886
+ `;
887
+
888
+ adminMenuItems.appendChild(itemElement);
889
+ });
890
+ }
891
+
892
+ // Render admin categories
893
+ function renderAdminCategories() {
894
+ adminCategories.innerHTML = '';
895
+
896
+ categories.forEach(category => {
897
+ const categoryElement = document.createElement('tr');
898
+ categoryElement.className = 'hover:bg-gray-50';
899
+ categoryElement.innerHTML = `
900
+ <td class="px-6 py-4 whitespace-nowrap">
901
+ <div class="text-sm font-medium text-gray-900 capitalize">${category.slug}</div>
902
+ </td>
903
+ <td class="px-6 py-4 whitespace-nowrap">
904
+ <div class="text-sm text-gray-900">${category.itemCount} items</div>
905
+ </td>
906
+ <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
907
+ <button class="text-orange-600 hover:text-orange-900 mr-3 edit-category-btn" data-id="${category.id}">
908
+ <i class="fas fa-edit"></i>
909
+ </button>
910
+ <button class="text-red-600 hover:text-red-900 delete-category-btn" data-id="${category.id}">
911
+ <i class="fas fa-trash"></i>
912
+ </button>
913
+ </td>
914
+ `;
915
+
916
+ adminCategories.appendChild(categoryElement);
917
+ });
918
+ }
919
+
920
+ // Render orders
921
+ function renderOrders() {
922
+ const ordersTableBody = document.querySelector('#ordersTab tbody');
923
+ ordersTableBody.innerHTML = '';
924
+
925
+ orders.forEach(order => {
926
+ const orderElement = document.createElement('tr');
927
+ orderElement.className = 'hover:bg-gray-50';
928
+ orderElement.innerHTML = `
929
+ <td class="px-6 py-4 whitespace-nowrap">
930
+ <div class="text-sm font-medium text-gray-900">#${order.id}</div>
931
+ <div class="text-xs text-gray-500">${new Date(order.timestamp).toLocaleTimeString()}</div>
932
+ </td>
933
+ <td class="px-6 py-4 whitespace-nowrap">
934
+ <div class="text-sm text-gray-900">Table ${order.table}</div>
935
+ </td>
936
+ <td class="px-6 py-4">
937
+ <div class="text-sm text-gray-900 line-clamp-1">
938
+ ${order.items.map(item => `${item.quantity}x ${item.name}`).join(', ')}
939
+ </div>
940
+ </td>
941
+ <td class="px-6 py-4 whitespace-nowrap">
942
+ <div class="text-sm font-medium text-gray-900">$${order.total.toFixed(2)}</div>
943
+ </td>
944
+ <td class="px-6 py-4 whitespace-nowrap">
945
+ <span class="px-2 py-1 text-xs font-semibold rounded-full order-status ${order.status} capitalize">
946
+ ${order.status}
947
+ </span>
948
+ </td>
949
+ <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
950
+ <select class="status-select border border-gray-300 rounded-lg px-3 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-orange-500" data-order-id="${order.id}">
951
+ <option value="pending" ${order.status === 'pending' ? 'selected' : ''}>Pending</option>
952
+ <option value="preparing" ${order.status === 'preparing' ? 'selected' : ''}>Preparing</option>
953
+ <option value="served" ${order.status === 'served' ? 'selected' : ''}>Served</option>
954
+ <option value="cancelled" ${order.status === 'cancelled' ? 'selected' : ''}>Cancelled</option>
955
+ </select>
956
+ </td>
957
+ `;
958
+
959
+ ordersTableBody.appendChild(orderElement);
960
+ });
961
+
962
+ // Add event listeners to status selects
963
+ document.querySelectorAll('.status-select').forEach(select => {
964
+ select.addEventListener('change', (e) => {
965
+ const orderId = parseInt(select.dataset.orderId);
966
+ const newStatus = select.value;
967
+ updateOrderStatus(orderId, newStatus);
968
+ });
969
+ });
970
+ }
971
+
972
+ // Render tables
973
+ function renderTables() {
974
+ tablesList.innerHTML = '';
975
+
976
+ tables.forEach(table => {
977
+ const tableElement = document.createElement('div');
978
+ tableElement.className = 'table-card bg-white rounded-xl shadow-sm overflow-hidden border border-gray-100';
979
+ tableElement.innerHTML = `
980
+ <div class="p-4">
981
+ <div class="flex justify-between items-start mb-2">
982
+ <h3 class="font-semibold text-lg">Table ${table.number}</h3>
983
+ <span class="text-xs font-medium px-2 py-1 rounded-full ${table.status === 'available' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'}">
984
+ ${table.status === 'available' ? 'Available' : 'Occupied'}
985
+ </span>
986
+ </div>
987
+ <div class="mb-4">
988
+ <div class="w-full h-32 bg-gray-100 rounded-lg flex items-center justify-center">
989
+ <i class="fas fa-qrcode text-4xl text-gray-400"></i>
990
+ </div>
991
+ </div>
992
+ <div class="flex justify-between items-center">
993
+ <button class="text-xs text-blue-500 hover:text-blue-700 flex items-center">
994
+ <i class="fas fa-download mr-1"></i> QR Code
995
+ </button>
996
+ <div class="flex space-x-2">
997
+ <button class="edit-table-btn text-xs text-orange-500 hover:text-orange-700 flex items-center" data-id="${table.id}">
998
+ <i class="fas fa-edit mr-1"></i> Edit
999
+ </button>
1000
+ <button class="delete-table-btn text-xs text-red-500 hover:text-red-700 flex items-center" data-id="${table.id}">
1001
+ <i class="fas fa-trash mr-1"></i> Delete
1002
+ </button>
1003
+ </div>
1004
+ </div>
1005
+ </div>
1006
+ `;
1007
+
1008
+ tablesList.appendChild(tableElement);
1009
+ });
1010
+ }
1011
+
1012
+ // Add item to cart
1013
+ function addToCart(itemId) {
1014
+ const item = menuItems.find(i => i.id === itemId);
1015
+ if (!item) return;
1016
+
1017
+ const existingItem = cart.find(i => i.id === itemId);
1018
+
1019
+ if (existingItem) {
1020
+ existingItem.quantity += 1;
1021
+ } else {
1022
+ cart.push({
1023
+ id: item.id,
1024
+ name: item.name,
1025
+ price: item.price,
1026
+ quantity: 1
1027
+ });
1028
+ }
1029
+
1030
+ updateCart();
1031
+ renderMenuItems();
1032
+ showNotification('Item Added', `${item.name} has been added to your cart`);
1033
+ }
1034
+
1035
+ // Update cart item quantity
1036
+ function updateCartItem(itemId, action) {
1037
+ const itemIndex = cart.findIndex(i => i.id === itemId);
1038
+
1039
+ if (itemIndex === -1) return;
1040
+
1041
+ if (action === 'increase') {
1042
+ cart[itemIndex].quantity += 1;
1043
+ } else if (action === 'decrease') {
1044
+ cart[itemIndex].quantity -= 1;
1045
+
1046
+ if (cart[itemIndex].quantity <= 0) {
1047
+ cart.splice(itemIndex, 1);
1048
+ }
1049
+ }
1050
+
1051
+ updateCart();
1052
+ renderMenuItems();
1053
+ }
1054
+
1055
+ // Update cart display
1056
+ function updateCart() {
1057
+ // Update cart count
1058
+ const totalItems = cart.reduce((total, item) => total + item.quantity, 0);
1059
+ cartCount.textContent = totalItems;
1060
+
1061
+ // Update cart items
1062
+ cartItems.innerHTML = '';
1063
+
1064
+ if (cart.length === 0) {
1065
+ emptyCartMessage.classList.remove('hidden');
1066
+ } else {
1067
+ emptyCartMessage.classList.add('hidden');
1068
+
1069
+ cart.forEach(item => {
1070
+ const itemElement = document.createElement('div');
1071
+ itemElement.className = 'cart-item flex justify-between items-center mb-4 pb-4 border-b border-gray-100';
1072
+ itemElement.innerHTML = `
1073
+ <div>
1074
+ <h4 class="font-medium">${item.name}</h4>
1075
+ <p class="text-sm text-gray-600">$${item.price.toFixed(2)} x ${item.quantity}</p>
1076
+ </div>
1077
+ <div class="flex items-center">
1078
+ <span class="font-medium mr-4">$${(item.price * item.quantity).toFixed(2)}</span>
1079
+ <button class="remove-btn px-2 py-1 bg-gray-100 text-gray-500 rounded-lg hover:bg-gray-200 transition opacity-0" data-id="${item.id}">
1080
+ <i class="fas fa-trash text-sm"></i>
1081
+ </button>
1082
+ </div>
1083
+ `;
1084
+
1085
+ cartItems.appendChild(itemElement);
1086
+ });
1087
+
1088
+ // Add event listeners to remove buttons
1089
+ document.querySelectorAll('.remove-btn').forEach(btn => {
1090
+ btn.addEventListener('click', (e) => {
1091
+ const itemId = parseInt(btn.dataset.id);
1092
+ removeFromCart(itemId);
1093
+ });
1094
+ });
1095
+ }
1096
+
1097
+ // Update totals
1098
+ const subtotal = cart.reduce((total, item) => total + (item.price * item.quantity), 0);
1099
+ const tax = subtotal * 0.1;
1100
+ const total = subtotal + tax;
1101
+
1102
+ cartSubtotal.textContent = `$${subtotal.toFixed(2)}`;
1103
+ cartTax.textContent = `$${tax.toFixed(2)}`;
1104
+ cartTotal.textContent = `$${total.toFixed(2)}`;
1105
+
1106
+ updatePlaceOrderButton();
1107
+ }
1108
+
1109
+ // Remove item from cart
1110
+ function removeFromCart(itemId) {
1111
+ const item = menuItems.find(i => i.id === itemId);
1112
+ cart = cart.filter(item => item.id !== itemId);
1113
+ updateCart();
1114
+ renderMenuItems();
1115
+
1116
+ if (item) {
1117
+ showNotification('Item Removed', `${item.name} has been removed from your cart`);
1118
+ }
1119
+ }
1120
+
1121
+ // Update place order button state
1122
+ function updatePlaceOrderButton() {
1123
+ if (cart.length > 0 && selectedTable) {
1124
+ placeOrderBtn.disabled = false;
1125
+ } else {
1126
+ placeOrderBtn.disabled = true;
1127
+ }
1128
+ }
1129
+
1130
+ // Place order
1131
+ function placeOrder() {
1132
+ if (cart.length === 0 || !selectedTable) return;
1133
+
1134
+ // Create order object
1135
+ const newOrder = {
1136
+ id: orders.length + 1,
1137
+ table: selectedTable,
1138
+ items: cart.map(item => ({
1139
+ id: item.id,
1140
+ name: item.name,
1141
+ quantity: item.quantity,
1142
+ price: item.price
1143
+ })),
1144
+ total: cart.reduce((total, item) => total + (item.price * item.quantity), 0),
1145
+ status: "pending",
1146
+ timestamp: new Date().toISOString()
1147
+ };
1148
+
1149
+ // Add to orders
1150
+ orders.unshift(newOrder);
1151
+
1152
+ // Reset cart and table selection
1153
+ cart = [];
1154
+ selectedTable = null;
1155
+ selectedTableDisplay.textContent = "Not selected";
1156
+
1157
+ // Update UI
1158
+ updateCart();
1159
+ renderMenuItems();
1160
+ renderOrders();
1161
+ toggleCart();
1162
+
1163
+ // Reset table buttons
1164
+ tableBtns.forEach(btn => {
1165
+ btn.classList.remove('bg-orange-500', 'text-white');
1166
+ btn.classList.add('bg-gray-50', 'border', 'border-gray-200');
1167
+ });
1168
+
1169
+ // Show success message
1170
+ showNotification('Order Placed', `Order #${newOrder.id} placed successfully for Table ${newOrder.table}!`);
1171
+ }
1172
+
1173
+ // Update order status
1174
+ function updateOrderStatus(orderId, newStatus) {
1175
+ const order = orders.find(o => o.id === orderId);
1176
+ if (order) {
1177
+ order.status = newStatus;
1178
+ renderOrders();
1179
+ showNotification('Order Updated', `Order #${orderId} status changed to ${newStatus}`);
1180
+ }
1181
+ }
1182
+
1183
+ // Initialize the app
1184
+ init();
1185
+ </script>
1186
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Hnxrec/resturant-space" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1187
+ </html>
prompts.txt ADDED
File without changes