Your Order

Your cart is empty

Subtotal: 0 BDT
Delivery: 50 BDT
Total: 50 BDT
Dark Spices

Authentic Bangladeshi Flavors

Experience the rich heritage of spices and culinary tradition delivered to your doorstep.

Corporate Lunch Plans

Nutritious, delicious meals for your team, delivered daily.

Interested in Corporate Plans?

Fill out this form and we'll contact you with custom plans and payment options (Pay every 7 days).

What Our Customers Say

Get In Touch

Ready to cater your next event or set up a corporate lunch plan? Send us a message.

+880 1712 345678
Gulshan 1, Dhaka, Bangladesh
orders@shaheenskitchen.com

My Dashboard

Welcome back, Guest

Total Orders

0

Pending Orders

0

Total Spent

0 BDT

Active Orders

No active orders

Order History

No order history

Admin Access

Enter your password to manage the kitchen.

`; } }, handleStep1: (e) => { e.preventDefault(); const formData = new FormData(e.target); checkout.customerInfo = { name: formData.get('name'), phone: formData.get('phone'), address: formData.get('address'), instructions: formData.get('instructions') }; checkout.currentStep = 2; checkout.renderStep(); }, handleStep2: (e) => { e.preventDefault(); const formData = new FormData(e.target); const paymentMethod = formData.get('paymentMethod'); // Calculate estimated delivery time based on food prep time let maxPrepTime = 0; cart.items.forEach(item => { if (item.prepTime && item.prepTime > maxPrepTime) { maxPrepTime = item.prepTime; } }); const estimatedDelivery = new Date(Date.now() + (maxPrepTime + 30) * 60 * 1000); const order = { id: Date.now(), customer: checkout.customerInfo.name, customerPhone: checkout.customerInfo.phone, address: checkout.customerInfo.address, instructions: checkout.customerInfo.instructions, items: cart.items.map(item => ({ name: item.name, quantity: item.quantity, price: item.price, type: item.type })), subtotal: cart.items.reduce((sum, item) => sum + (item.price * item.quantity), 0), delivery: 50, total: cart.items.reduce((sum, item) => sum + (item.price * item.quantity), 0) + 50, paymentMethod: paymentMethod, paymentStatus: paymentMethod === 'cod' ? 'pending' : 'paid', transactionId: formData.get('transactionId') || null, senderPhone: formData.get('senderPhone') || null, status: 'confirmed', statusHistory: [ { status: 'confirmed', timestamp: new Date().toISOString() } ], estimatedDelivery: estimatedDelivery.toISOString(), date: new Date().toISOString().split('T')[0], userId: state.currentUser ? state.currentUser.id : null }; // Add order to state state.orders = [order, ...state.orders]; // Save user info if logged in if (state.currentUser) { state.currentUser.orders = [...(state.currentUser.orders || []), order.id]; const userIndex = state.users.findIndex(u => u.id === state.currentUser.id); if (userIndex !== -1) { state.users[userIndex] = { ...state.currentUser }; } } // Clear cart cart.items = []; cart.saveCart(); cart.renderCart(); // Close modals checkout.closeCheckout(); // Show success message alert(`Order placed successfully! Your order ID is #${order.id}. Estimated delivery: ${estimatedDelivery.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}`); // Update user dashboard if logged in if (state.currentUser) { user.renderDashboard(); } } }; // ============================================ // 4. USER MANAGEMENT & DASHBOARD // ============================================ const user = { toggleUserPanel: () => { if (state.currentUser) { // If logged in, show dashboard document.body.classList.toggle('show-user'); if (document.body.classList.contains('show-user')) { user.renderDashboard(); } } else { // Show login modal const modal = document.getElementById('user-modal'); modal.classList.toggle('active'); user.showLogin(); } }, showLogin: () => { document.getElementById('user-modal-title').textContent = 'Login to Your Account'; document.getElementById('user-modal-content').innerHTML = `

Don't have an account?

`; }, showRegister: () => { document.getElementById('user-modal-title').textContent = 'Create Account'; document.getElementById('user-modal-content').innerHTML = `

Already have an account?

`; }, handleLogin: (e) => { e.preventDefault(); const formData = new FormData(e.target); const phone = formData.get('phone'); const password = formData.get('password'); const foundUser = state.users.find(u => u.phone === phone && u.password === password); if (foundUser) { state.currentUser = foundUser; localStorage.setItem('sk_current_user', JSON.stringify(foundUser)); document.getElementById('user-modal').classList.remove('active'); document.getElementById('user-btn').innerHTML = ``; user.showNotification('Login successful!'); } else { alert('Invalid phone number or password'); } }, handleRegister: (e) => { e.preventDefault(); const formData = new FormData(e.target); const name = formData.get('name'); const phone = formData.get('phone'); const address = formData.get('address'); const password = formData.get('password'); const confirmPassword = formData.get('confirmPassword'); if (password !== confirmPassword) { alert('Passwords do not match'); return; } if (state.users.find(u => u.phone === phone)) { alert('Phone number already registered'); return; } const newUser = { id: Date.now(), name: name, phone: phone, address: address, password: password, orders: [] }; state.users = [...state.users, newUser]; state.currentUser = newUser; localStorage.setItem('sk_current_user', JSON.stringify(newUser)); document.getElementById('user-modal').classList.remove('active'); document.getElementById('user-btn').innerHTML = ``; user.showNotification('Account created successfully!'); }, logout: () => { state.currentUser = null; localStorage.removeItem('sk_current_user'); document.getElementById('user-btn').innerHTML = ``; document.body.classList.remove('show-user'); user.showNotification('Logged out successfully'); }, renderDashboard: () => { if (!state.currentUser) return; // Update user info document.getElementById('user-name').textContent = state.currentUser.name; // Get user orders const userOrders = state.orders.filter(order => order.userId === state.currentUser.id); const activeOrders = userOrders.filter(order => order.status !== 'delivered' && order.status !== 'cancelled' ); const totalSpent = userOrders.reduce((sum, order) => sum + order.total, 0); // Update stats document.getElementById('user-total-orders').textContent = userOrders.length; document.getElementById('user-pending-orders').textContent = activeOrders.length; document.getElementById('user-total-spent').textContent = `${totalSpent} BDT`; // Render active orders with countdown const activeContainer = document.getElementById('user-active-orders'); if (activeOrders.length === 0) { activeContainer.innerHTML = `

No active orders

`; } else { activeContainer.innerHTML = activeOrders.map(order => { const deliveryTime = new Date(order.estimatedDelivery); const now = new Date(); const timeRemaining = deliveryTime - now; const minutesRemaining = Math.max(0, Math.floor(timeRemaining / (1000 * 60))); let statusText = ''; let progress = 0; if (order.status === 'confirmed') { statusText = 'Order Confirmed'; progress = 25; } else if (order.status === 'preparing') { statusText = 'Preparing Food'; progress = 50; } else if (order.status === 'on_the_way') { statusText = 'On the Way'; progress = 75; } else if (order.status === 'delivered') { statusText = 'Delivered'; progress = 100; } return `

Order #${order.id}

${order.items.map(i => `${i.name} x${i.quantity}`).join(', ')}

${statusText}
Order Progress ${progress}%

Estimated Delivery

${deliveryTime.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'})}

Time Remaining

${minutesRemaining} minutes

`; }).join(''); } // Render order history const historyContainer = document.getElementById('user-order-history'); if (userOrders.length === 0) { historyContainer.innerHTML = `

No order history

`; } else { historyContainer.innerHTML = ` ${userOrders.map(order => ` `).join('')}
Order ID Date Items Total Status
#${order.id} ${order.date} ${order.items.slice(0, 2).map(i => `
${i.name} x${i.quantity}
`).join('')} ${order.items.length > 2 ? `
+${order.items.length - 2} more
` : ''}
${order.total} BDT ${order.status}
`; } lucide.createIcons(); }, showNotification: (message) => { const notification = document.createElement('div'); notification.className = 'fixed top-6 right-6 bg-green-600 text-white px-6 py-3 rounded-lg shadow-lg z-50 transform translate-x-full transition-transform'; notification.textContent = message; notification.id = 'user-notification'; document.body.appendChild(notification); setTimeout(() => { notification.classList.remove('translate-x-full'); notification.classList.add('translate-x-0'); }, 10); setTimeout(() => { notification.classList.remove('translate-x-0'); notification.classList.add('translate-x-full'); setTimeout(() => { document.body.removeChild(notification); }, 300); }, 3000); } }; // ============================================ // 5. FRONTEND APP // ============================================ const app = { init: () => { // Check for logged in user const savedUser = localStorage.getItem('sk_current_user'); if (savedUser) { state.currentUser = JSON.parse(savedUser); document.getElementById('user-btn').innerHTML = ``; } app.render(); app.animate(); lucide.createIcons(); cart.updateCartCount(); }, toggleAdmin: () => { const isAdmin = document.body.classList.toggle('show-admin'); if (isAdmin) { admin.init(); } else { app.render(); setTimeout(() => lucide.createIcons(), 100); } }, submitContact: (e) => { e.preventDefault(); const formData = new FormData(e.target); const lead = { id: Date.now(), name: formData.get('name'), phone: formData.get('phone'), subject: formData.get('subject'), message: formData.get('message'), date: new Date().toLocaleDateString(), status: "New" }; state.leads = [lead, ...state.leads]; alert('Thank you! Your message has been sent. We will contact you soon.'); e.target.reset(); const button = e.target.querySelector('button[type="submit"]'); const originalText = button.textContent; button.textContent = "✓ Message Sent!"; button.classList.remove('bg-white'); button.classList.add('bg-green-600', 'text-white'); setTimeout(() => { button.textContent = originalText; button.classList.remove('bg-green-600', 'text-white'); button.classList.add('bg-white'); }, 2000); }, submitCorporateContact: (e) => { e.preventDefault(); const formData = new FormData(e.target); const corporateLead = { id: Date.now(), company: formData.get('company'), contactPerson: formData.get('contact_person'), email: formData.get('email'), phone: formData.get('phone'), employeeCount: formData.get('employee_count'), requirements: formData.get('requirements'), date: new Date().toLocaleDateString(), status: "New", type: "corporate" }; state.corporateLeads = [corporateLead, ...state.corporateLeads]; alert('Thank you for your interest! We will contact you within 24 hours with custom corporate plans and payment options.'); e.target.reset(); }, render: () => { // 1. Settings document.title = state.settings.title; document.getElementById('nav-title').textContent = state.settings.title; document.getElementById('nav-logo').src = state.settings.logoUrl; // 2. Hero document.getElementById('hero-title').innerHTML = state.hero.title; document.getElementById('hero-subtitle').textContent = state.hero.subtitle; // 3. Food Menu with Add to Cart functionality const foodContainer = document.getElementById('food-carousel'); foodContainer.innerHTML = state.foodMenu.map(item => `
${item.isDiscount ? '-20% OFF' : ''} ${item.isPopular ? '🔥 POPULAR' : ''}
${item.name}

${item.name}

${item.rating}

${item.description}

${item.time} ${item.price} BDT
`).join(''); // 4. Corporate Menu const corpContainer = document.getElementById('corp-carousel'); corpContainer.innerHTML = state.corpMenu.map(item => `
${item.name}

${item.name}

${item.description}

${item.days.split(',').map(d => `${d.trim()}`).join('')}
${item.price} BDT
`).join(''); // 5. Reviews document.getElementById('reviews-grid').innerHTML = state.reviews.map(rev => `
${Array(5).fill(0).map((_, i) => ``).join('')}

"${rev.text}"

${rev.name}

${rev.name}

Verified Customer
`).join(''); // 6. Gallery document.getElementById('gallery-grid').innerHTML = state.gallery.map((img, i) => `
Gallery image ${i+1}
`).join(''); // 7. Footer & Support const s = state.settings; document.getElementById('footer').innerHTML = `
Logo ${s.title}

${s.footerAbout}

Quick Links

Business Hours

© ${new Date().getFullYear()} ${s.title}. All rights reserved.
`; document.getElementById('support-float').innerHTML = ` `; lucide.createIcons(); }, animate: () => { gsap.registerPlugin(ScrollTrigger); gsap.to('.hero-text', { opacity: 1, y: 0, duration: 1, ease: 'power3.out', delay: 0.2 }); gsap.to('.hero-video', { opacity: 1, x: 0, duration: 1, ease: 'power3.out', delay: 0.4 }); gsap.utils.toArray('section h2').forEach(h2 => { gsap.from(h2, { scrollTrigger: { trigger: h2, start: 'top 80%' }, y: 30, opacity: 0, duration: 0.8 }); }); } }; // ============================================ // 6. FULLY FUNCTIONAL ADMIN PANEL // ============================================ const admin = { init: () => { const isLoggedIn = sessionStorage.getItem('sk_admin_auth') === 'true'; if (isLoggedIn) { document.getElementById('admin-login').classList.add('hidden'); document.getElementById('admin-dashboard').classList.remove('hidden'); admin.showTab('dashboard'); } else { document.getElementById('admin-login').classList.remove('hidden'); document.getElementById('admin-dashboard').classList.add('hidden'); } lucide.createIcons(); }, handleLogin: (e) => { e.preventDefault(); const input = document.getElementById('admin-pass-input'); const password = input.value; if (password === state.settings.password) { sessionStorage.setItem('sk_admin_auth', 'true'); input.value = ''; admin.init(); } else { alert('Invalid Password! Try: admin123'); input.classList.add('border-red-500'); setTimeout(() => input.classList.remove('border-red-500'), 2000); } }, logout: () => { sessionStorage.removeItem('sk_admin_auth'); app.toggleAdmin(); }, showTab: (tabId) => { const content = document.getElementById('admin-content'); let html = ''; if (tabId === 'dashboard') { const totalOrders = state.orders.length; const totalRevenue = state.orders.reduce((sum, order) => sum + order.total, 0); const pendingLeads = state.leads.length; const pendingCorporateLeads = state.corporateLeads.length; html = `

Dashboard Overview

Total Orders

${totalOrders}

Total Revenue

${totalRevenue} BDT

Pending Leads

${pendingLeads}

Corporate Leads

${pendingCorporateLeads}

Recent Orders

${state.orders.slice(0, 5).map(order => `

#${order.id} - ${order.customer}

${order.items.slice(0, 2).map(i => `${i.name} x${i.quantity}`).join(', ')}

${order.total} BDT
${order.status}
`).join('')} ${state.orders.length === 0 ? '
No orders yet.
' : ''}

Recent Messages

${state.leads.slice(0, 5).map(lead => `

${lead.name}

${lead.date}

${lead.subject}

${lead.message}

`).join('')} ${state.leads.length === 0 ? '
No messages yet.
' : ''}
`; } else if (tabId === 'settings') { html = `

General Settings

Change this immediately for security.

Format: +880XXXXXXXXXX

`; } else if (tabId === 'food') { html = `

Food Menu Management

${state.foodMenu.map((item, idx) => `
`).join('')}
`; } else if (tabId === 'orders') { html = `

Order Management

Total Orders: ${state.orders.length}
${state.orders.map((order, idx) => ` `).join('')} ${state.orders.length === 0 ? `` : ''}
Order ID Customer Items Total Payment Status Date Actions
#${order.id}
${order.customer}
${order.customerPhone}
${order.items.slice(0, 2).map(item => `
${item.name} x${item.quantity}
`).join('')} ${order.items.length > 2 ? `
+${order.items.length - 2} more
` : ''}
${order.total} BDT
${order.paymentMethod}
${order.transactionId ? `
ID: ${order.transactionId}
` : ''}
${order.date}
No orders yet.
`; } else if (tabId === 'leads') { html = `

Contact Form Submissions

${state.leads.length ? state.leads.map((lead, idx) => ` `).join('') : ``}
Date Name Phone Subject Message Status Action
${lead.date} ${lead.name} ${lead.phone} ${lead.subject} ${lead.message} ${lead.status}
No messages yet.
`; } else if (tabId === 'corp-leads') { html = `

Corporate Lead Submissions

${state.corporateLeads.length ? state.corporateLeads.map((lead, idx) => ` `).join('') : ``}
Date Company Contact Person Phone/Email Employees Requirements Status Action
${lead.date} ${lead.company} ${lead.contactPerson}
${lead.phone}
${lead.email}
${lead.employeeCount} ${lead.requirements || 'None'} ${lead.status}
No corporate leads yet.
`; } else if (tabId === 'gallery') { html = `

Gallery Images

${state.gallery.map((img, idx) => `
`).join('')}
Add Image
`; } else if (tabId === 'reviews') { html = `

Customer Reviews

${state.reviews.map((review, idx) => `
${[1,2,3,4,5].map(star => ` `).join('')}
`).join('')}
`; } content.innerHTML = html; lucide.createIcons(); }, addItem: (type) => { if(type === 'food') { const newId = Math.max(...state.foodMenu.map(item => item.id), 0) + 1; state.foodMenu = [...state.foodMenu, { id: newId, name: "New Dish", price: 200, time: "30m", rating: 4.5, img: "https://images.unsplash.com/photo-1541518763669-27fef04b14ea?q=80&w=800", isPopular: false, isDiscount: false, prepTime: 30, description: "Delicious new dish description" }]; admin.showTab('food'); } }, addImage: () => { const url = prompt("Enter Image URL:"); if(url && url.trim()) { state.gallery = [...state.gallery, url.trim()]; admin.showTab('gallery'); } }, addReview: () => { const newReview = { id: Date.now(), name: "New Customer", text: "Great food and service!", rating: 5, img: "https://randomuser.me/api/portraits/lego/1.jpg" }; state.reviews = [...state.reviews, newReview]; admin.showTab('reviews'); }, deleteItem: (type, index) => { if(!confirm("Are you sure you want to delete this item?")) return; if(type === 'food') { const newMenu = [...state.foodMenu]; newMenu.splice(index, 1); state.foodMenu = newMenu; admin.showTab('food'); } else if (type === 'gallery') { const newGal = [...state.gallery]; newGal.splice(index, 1); state.gallery = newGal; admin.showTab('gallery'); } else if (type === 'reviews') { const newReviews = [...state.reviews]; newReviews.splice(index, 1); state.reviews = newReviews; admin.showTab('reviews'); } }, deleteOrder: (index) => { if(!confirm("Are you sure you want to delete this order?")) return; const newOrders = [...state.orders]; newOrders.splice(index, 1); state.orders = newOrders; admin.showTab('orders'); }, deleteLead: (index) => { if(!confirm("Are you sure you want to delete this lead?")) return; const newLeads = [...state.leads]; newLeads.splice(index, 1); state.leads = newLeads; admin.showTab('leads'); }, deleteCorporateLead: (index) => { if(!confirm("Are you sure you want to delete this corporate lead?")) return; const newLeads = [...state.corporateLeads]; newLeads.splice(index, 1); state.corporateLeads = newLeads; admin.showTab('corp-leads'); }, markLeadRead: (index) => { state.leads[index].status = "Read"; admin.showTab('leads'); }, markCorporateLeadContacted: (index) => { state.corporateLeads[index].status = "Contacted"; admin.showTab('corp-leads'); }, markAllLeadsRead: () => { state.leads.forEach(lead => lead.status = "Read"); admin.showTab('leads'); }, clearAllLeads: () => { if(confirm("Are you sure you want to delete all leads?")) { state.leads = []; admin.showTab('leads'); } }, updateOrderStatus: (index, status) => { state.orders[index].status = status; state.orders[index].statusHistory = [ ...(state.orders[index].statusHistory || []), { status: status, timestamp: new Date().toISOString() } ]; admin.showTab('orders'); }, viewOrder: (index) => { const order = state.orders[index]; alert(`Order Details:\n\nOrder ID: #${order.id}\nCustomer: ${order.customer}\nPhone: ${order.customerPhone}\nAddress: ${order.address}\nItems: ${order.items.map(i => `${i.name} x${i.quantity}`).join(', ')}\nTotal: ${order.total} BDT\nPayment: ${order.paymentMethod}\nStatus: ${order.status}`); } }; // Utility functions function scrollContainer(id, dir) { const container = document.getElementById(id); if (container) { container.scrollBy({ left: dir * 300, behavior: 'smooth' }); } } // Initialize everything when page loads window.onload = () => { app.init(); // Close cart when clicking outside document.addEventListener('click', (e) => { const cartModal = document.getElementById('cart-modal'); const cartButton = document.querySelector('button[onclick="cart.toggleCart()"]'); if (cartModal.classList.contains('active') && !cartModal.contains(e.target) && !cartButton.contains(e.target)) { cart.toggleCart(); } }); // Close cart with Escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { const cartModal = document.getElementById('cart-modal'); if (cartModal.classList.contains('active')) { cart.toggleCart(); } } }); };