Restaurants Hotel Template
Preview
Edit
Download
Run
Download Options
HTML File
Download as .html file
CSS File
Download as .css file
JavaScript File
Download as .js file
Combined HTML
All code in one HTML file
Project ZIP
All files in a ZIP archive
Cancel
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Bella Vista | Gourmet Dining Experience</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700;800&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> </head> <body> <!-- Header & Navigation --> <header id="header"> <div class="container"> <div class="header-content"> <div class="logo"> <i class="fas fa-utensils"></i> <span>BellaVista</span> </div> <nav id="nav"> <ul> <li><a href="#home" class="active">Home</a></li> <li><a href="#menu">Menu</a></li> <li><a href="#chef-special">Chef's Special</a></li> <li><a href="#booking">Reservations</a></li> <li><a href="#contact">Contact</a></li> </ul> </nav> <div class="header-actions"> <button class="reservation-btn" onclick="scrollToBooking()"> <i class="fas fa-calendar-check"></i> Book Table </button> <button class="mobile-menu-btn" id="mobileMenuBtn"> <i class="fas fa-bars"></i> </button> </div> </div> </div> </header> <!-- Hero Section --> <section class="hero" id="home"> <div class="container"> <div class="hero-content"> <h1>Exquisite Dining Experience</h1> <p>At Bella Vista, we blend culinary artistry with exceptional service to create unforgettable moments. Our award-winning chefs craft dishes using the finest seasonal ingredients.</p> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <a href="#menu" class="btn"> <i class="fas fa-book-open"></i> View Menu </a> <a href="#booking" class="btn btn-outline"> <i class="fas fa-table"></i> Reserve Now </a> </div> </div> </div> </section> <!-- Menu Section --> <section id="menu"> <div class="container"> <div class="section-title"> <h2>Our Culinary Selection</h2> <p>Discover our carefully crafted menu featuring seasonal ingredients and innovative techniques</p> </div> <!-- Category Filter --> <div class="filter-container"> <button class="filter-btn active" data-filter="all"> <i class="fas fa-utensils"></i> All Items </button> <button class="filter-btn" data-filter="appetizers"> <i class="fas fa-leaf"></i> Appetizers </button> <button class="filter-btn" data-filter="mains"> <i class="fas fa-drumstick-bite"></i> Main Courses </button> <button class="filter-btn" data-filter="desserts"> <i class="fas fa-ice-cream"></i> Desserts </button> <button class="filter-btn" data-filter="drinks"> <i class="fas fa-glass-whiskey"></i> Drinks </button> </div> <!-- Menu Cards --> <div class="menu-container" id="menuContainer"> <!-- Menu items will be generated by JavaScript --> </div> </div> </section> <!-- Chef Special Section --> <section class="chef-special" id="chef-special"> <div class="container"> <div class="section-title"> <h2>Chef's Special Creations</h2> <p>Signature dishes crafted by our award-winning chef, available for a limited time</p> </div> <div class="special-container" id="specialContainer"> <!-- Special items will be generated by JavaScript --> </div> </div> </section> <!-- Booking Form --> <section class="booking" id="booking"> <div class="container"> <div class="section-title"> <h2>Make a Reservation</h2> <p>Secure your table for an unforgettable dining experience</p> </div> <div class="booking-form-container"> <form id="bookingForm"> <div class="form-row"> <div class="form-group"> <label for="name">Full Name *</label> <input type="text" id="name" name="name" class="form-control" required placeholder="John Smith"> </div> <div class="form-group"> <label for="email">Email Address *</label> <input type="email" id="email" name="email" class="form-control" required placeholder="john@example.com"> </div> </div> <div class="form-row"> <div class="form-group"> <label for="phone">Phone Number *</label> <input type="tel" id="phone" name="phone" class="form-control" required placeholder="(123) 456-7890"> </div> <div class="form-group"> <label for="date">Reservation Date *</label> <input type="date" id="date" name="date" class="form-control" required> </div> </div> <div class="form-row"> <div class="form-group"> <label for="time">Reservation Time *</label> <select id="time" name="time" class="form-control" required> <option value="">Select Time</option> <option value="17:00">5:00 PM</option> <option value="17:30">5:30 PM</option> <option value="18:00">6:00 PM</option> <option value="18:30">6:30 PM</option> <option value="19:00">7:00 PM</option> <option value="19:30">7:30 PM</option> <option value="20:00">8:00 PM</option> <option value="20:30">8:30 PM</option> <option value="21:00">9:00 PM</option> </select> </div> <div class="form-group"> <label for="guests">Number of Guests *</label> <select id="guests" name="guests" class="form-control" required> <option value="">Select Guests</option> <option value="1">1 Person</option> <option value="2">2 People</option> <option value="3">3 People</option> <option value="4">4 People</option> <option value="5">5 People</option> <option value="6">6 People</option> <option value="7">7 People</option> <option value="8">8 People</option> <option value="9">9+ People</option> </select> </div> </div> <div class="form-group"> <label for="special-requests">Special Requests</label> <textarea id="special-requests" name="special-requests" class="form-control" placeholder="Any dietary requirements, allergies, or special occasions..."></textarea> </div> <button type="submit" class="btn btn-submit"> <i class="fas fa-check-circle"></i> Confirm Reservation </button> </form> </div> </div> </section> <!-- Map Section --> <section class="map-container" id="contact"> <div class="container"> <div class="section-title"> <h2>Visit Our Restaurant</h2> <p>Located in the heart of the city with convenient access and parking</p> </div> <div class="contact-overlay"> <h3>Contact Information</h3> <div class="contact-info"> <p><i class="fas fa-map-marker-alt"></i> 123 Gourmet Avenue, New York, NY 10001</p> <p><i class="fas fa-phone"></i> (212) 555-1234</p> <p><i class="fas fa-envelope"></i> reservations@bellavista.com</p> <p><i class="fas fa-clock"></i> Mon-Thu: 5PM-10PM | Fri-Sun: 4PM-11PM</p> </div> </div> <div class="map-wrapper"> <!-- Google Map Embed --> <iframe id="map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3024.177858804427!2d-73.98784468459418!3d40.70555197933206!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c25a3166d86293%3A0x8c0b1c7f0f4b5f2d!2sWall%20St%2C%20New%20York%2C%20NY%2C%20USA!5e0!3m2!1sen!2s!4v1629999400000!5m2!1sen!2s" style="border:0;" allowfullscreen="" loading="lazy"></iframe> </div> </div> </section> <!-- Footer --> <footer> <div class="container"> <div class="footer-content"> <div class="footer-column"> <h3>Bella Vista</h3> <p>An award-winning fine dining restaurant offering exceptional cuisine, curated wine selections, and impeccable service in an elegant atmosphere.</p> <div class="social-links"> <a href="#"><i class="fab fa-facebook-f"></i></a> <a href="#"><i class="fab fa-instagram"></i></a> <a href="#"><i class="fab fa-twitter"></i></a> </div> </div> <div class="footer-column"> <h3>Opening Hours</h3> <ul class="footer-links"> <li><a href="#"><i class="far fa-clock"></i> Monday - Thursday: 5:00 PM - 10:00 PM</a></li> <li><a href="#"><i class="far fa-clock"></i> Friday - Saturday: 4:00 PM - 11:00 PM</a></li> <li><a href="#"><i class="far fa-clock"></i> Sunday: 4:00 PM - 9:00 PM</a></li> <li><a href="#"><i class="fas fa-glass-cheers"></i> Bar: Open until 1:00 AM on weekends</a></li> </ul> </div> <div class="footer-column"> <h3>Quick Links</h3> <ul class="footer-links"> <li><a href="#menu"><i class="fas fa-chevron-right"></i> Our Menu</a></li> <li><a href="#chef-special"><i class="fas fa-chevron-right"></i> Chef's Specials</a></li> <li><a href="#booking"><i class="fas fa-chevron-right"></i> Book a Table</a></li> <li><a href="#contact"><i class="fas fa-chevron-right"></i> Contact Us</a></li> <li><a href="#"><i class="fas fa-chevron-right"></i> Gift Cards</a></li> </ul> </div> </div> <div class="copyright"> <p>© 2023 Bella Vista Restaurant. All rights reserved. | Designed with <i class="fas fa-heart" style="color: var(--accent);"></i> for food lovers</p> </div> </div> </footer> <!-- Scroll to Top --> <a href="#" class="scroll-top" id="scrollTop"> <i class="fas fa-arrow-up"></i> </a> </body> </html>
CSS
:root { --primary: #D4AF37; --primary-dark: #B8941F; --secondary: #0C1A1A; --light: #F8F7F4; --dark: #1E1E1E; --accent: #C41E3A; --gray: #8A8A8A; --transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.1); --shadow: 0 10px 30px rgba(0, 0, 0, 0.08); --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.12); --radius: 12px; } * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; } body { font-family: 'Inter', sans-serif; line-height: 1.6; color: var(--dark); background-color: var(--light); overflow-x: hidden; } h1, h2, h3, h4, h5 { font-family: 'Playfair Display', serif; font-weight: 700; line-height: 1.2; } .container { width: 100%; max-width: 1280px; margin: 0 auto; padding: 0 24px; } /* Header & Navigation */ header { background-color: rgba(12, 26, 26, 0.95); backdrop-filter: blur(10px); color: white; padding: 18px 0; position: fixed; top: 0; width: 100%; z-index: 1000; transition: var(--transition); border-bottom: 1px solid rgba(212, 175, 55, 0.1); } header.scrolled { padding: 12px 0; box-shadow: var(--shadow); } .header-content { display: flex; justify-content: space-between; align-items: center; } .logo { font-family: 'Playfair Display', serif; font-size: 32px; font-weight: 800; color: var(--primary); display: flex; align-items: center; gap: 8px; } .logo span { color: white; } .logo i { font-size: 28px; } nav ul { display: flex; list-style: none; gap: 36px; } nav ul li a { color: white; text-decoration: none; font-weight: 500; font-size: 16px; position: relative; padding: 8px 0; transition: var(--transition); } nav ul li a:after { content: ''; position: absolute; bottom: 0; left: 0; width: 0; height: 2px; background-color: var(--primary); transition: var(--transition); } nav ul li a:hover, nav ul li a.active { color: var(--primary); } nav ul li a:hover:after, nav ul li a.active:after { width: 100%; } .header-actions { display: flex; align-items: center; gap: 20px; } .reservation-btn { background-color: var(--primary); color: var(--secondary); border: none; padding: 12px 26px; border-radius: 30px; font-weight: 600; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 8px; } .reservation-btn:hover { background-color: var(--primary-dark); transform: translateY(-2px); box-shadow: 0 8px 20px rgba(212, 175, 55, 0.3); } .mobile-menu-btn { display: none; background: none; border: none; color: white; font-size: 24px; cursor: pointer; } /* Hero Section */ .hero { background: linear-gradient(rgba(12, 26, 26, 0.85), rgba(12, 26, 26, 0.9)), url('https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80'); background-size: cover; background-position: center; background-attachment: fixed; color: white; padding: 180px 0 120px; text-align: center; position: relative; overflow: hidden; } .hero-content { max-width: 800px; margin: 0 auto; position: relative; z-index: 2; } .hero h1 { font-size: 64px; margin-bottom: 24px; opacity: 0; transform: translateY(30px); animation: fadeUp 1s forwards 0.3s; } .hero p { font-size: 20px; margin-bottom: 40px; opacity: 0.9; opacity: 0; transform: translateY(30px); animation: fadeUp 1s forwards 0.5s; } .btn { display: inline-flex; align-items: center; justify-content: center; background-color: var(--primary); color: var(--secondary); padding: 16px 36px; border-radius: 30px; text-decoration: none; font-weight: 600; border: none; cursor: pointer; transition: var(--transition); gap: 10px; opacity: 0; transform: translateY(30px); animation: fadeUp 1s forwards 0.7s; } .btn:hover { background-color: var(--primary-dark); transform: translateY(-5px); box-shadow: 0 12px 25px rgba(212, 175, 55, 0.4); } .btn-outline { background-color: transparent; color: white; border: 2px solid rgba(255, 255, 255, 0.3); } .btn-outline:hover { background-color: rgba(255, 255, 255, 0.1); border-color: var(--primary); color: var(--primary); } /* Section Styling */ section { padding: 100px 0; } .section-title { text-align: center; margin-bottom: 60px; } .section-title h2 { font-size: 48px; color: var(--secondary); position: relative; display: inline-block; margin-bottom: 16px; } .section-title h2:after { content: ''; position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 80px; height: 3px; background-color: var(--primary); } .section-title p { color: var(--gray); font-size: 18px; max-width: 600px; margin: 0 auto; } /* Menu Filter */ .filter-container { display: flex; justify-content: center; flex-wrap: wrap; margin-bottom: 50px; gap: 12px; } .filter-btn { background: transparent; border: 2px solid rgba(212, 175, 55, 0.2); color: var(--secondary); padding: 12px 28px; border-radius: 30px; font-weight: 600; cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 8px; } .filter-btn.active, .filter-btn:hover { background-color: var(--primary); border-color: var(--primary); color: white; transform: translateY(-3px); box-shadow: var(--shadow); } /* Menu Cards */ .menu-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 30px; } .menu-card { background-color: white; border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); transition: var(--transition); position: relative; opacity: 0; transform: translateY(30px); } .menu-card.visible { opacity: 1; transform: translateY(0); } .menu-card:hover { transform: translateY(-15px); box-shadow: var(--shadow-lg); } .menu-card-image { width: 100%; height: 220px; object-fit: cover; transition: transform 0.8s; } .menu-card:hover .menu-card-image { transform: scale(1.05); } .menu-card-content { padding: 24px; } .menu-card-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 12px; } .menu-card-title h3 { font-size: 22px; color: var(--secondary); margin-bottom: 4px; } .price { color: var(--primary); font-weight: 700; font-size: 22px; white-space: nowrap; margin-left: 15px; } .menu-card-content p { color: var(--gray); font-size: 15px; margin-bottom: 20px; } .category { display: inline-block; background-color: rgba(212, 175, 55, 0.1); color: var(--primary); padding: 6px 16px; border-radius: 30px; font-size: 13px; font-weight: 600; margin-right: 8px; margin-bottom: 8px; } /* Chef Specials */ .chef-special { background-color: var(--secondary); color: white; position: relative; overflow: hidden; } .chef-special:before { content: ''; position: absolute; top: 0; right: 0; width: 300px; height: 300px; background: radial-gradient(circle, rgba(212, 175, 55, 0.15) 0%, transparent 70%); } .chef-special .section-title h2 { color: white; } .chef-special .section-title p { color: rgba(255, 255, 255, 0.7); } .special-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 40px; } .special-card { background-color: rgba(255, 255, 255, 0.05); border-radius: var(--radius); padding: 40px 30px; text-align: center; transition: var(--transition); border: 1px solid rgba(212, 175, 55, 0.1); opacity: 0; transform: translateY(30px); } .special-card.visible { opacity: 1; transform: translateY(0); } .special-card:hover { transform: translateY(-15px); border-color: rgba(212, 175, 55, 0.3); background-color: rgba(255, 255, 255, 0.08); } .special-icon { font-size: 48px; color: var(--primary); margin-bottom: 24px; display: inline-flex; align-items: center; justify-content: center; width: 80px; height: 80px; background-color: rgba(212, 175, 55, 0.1); border-radius: 50%; } .special-card h3 { font-size: 26px; margin-bottom: 15px; } .special-card p { color: rgba(255, 255, 255, 0.7); margin-bottom: 20px; } .special-price { color: var(--primary); font-weight: 700; font-size: 22px; } /* Booking Form */ .booking { background-color: #f9f9f7; } .booking-form-container { background-color: white; border-radius: var(--radius); padding: 50px; box-shadow: var(--shadow); max-width: 900px; margin: 0 auto; position: relative; overflow: hidden; } .booking-form-container:before { content: ''; position: absolute; top: 0; left: 0; width: 8px; height: 100%; background-color: var(--primary); } .form-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 24px; margin-bottom: 24px; } .form-group { margin-bottom: 24px; } .form-group label { display: block; margin-bottom: 10px; font-weight: 600; color: var(--secondary); font-size: 15px; } .form-control { width: 100%; padding: 16px 20px; border: 1px solid #e0e0e0; border-radius: 8px; font-family: 'Inter', sans-serif; font-size: 16px; transition: var(--transition); background-color: #fcfcfc; } .form-control:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(212, 175, 55, 0.2); } .form-group textarea { resize: vertical; min-height: 140px; } .btn-submit { width: 100%; padding: 18px; font-size: 17px; margin-top: 10px; } /* Map Section */ .map-container { position: relative; } .map-wrapper { border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow-lg); height: 500px; position: relative; } #map { height: 100%; width: 100%; } .contact-overlay { position: absolute; top: 50px; left: 50px; background-color: rgba(12, 26, 26, 0.9); color: white; padding: 30px; border-radius: var(--radius); max-width: 350px; z-index: 10; backdrop-filter: blur(5px); } .contact-overlay h3 { color: var(--primary); margin-bottom: 20px; font-size: 24px; } .contact-info p { display: flex; align-items: center; gap: 12px; margin-bottom: 15px; color: rgba(255, 255, 255, 0.8); } .contact-info i { color: var(--primary); width: 20px; } /* Footer */ footer { background-color: var(--secondary); color: white; padding: 80px 0 30px; position: relative; } footer:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px; background: linear-gradient(to right, var(--primary), var(--accent)); } .footer-content { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 50px; margin-bottom: 60px; } .footer-column h3 { font-size: 22px; margin-bottom: 25px; color: var(--primary); } .footer-column p { opacity: 0.7; margin-bottom: 15px; line-height: 1.8; } .social-links { display: flex; gap: 15px; margin-top: 25px; } .social-links a { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; background-color: rgba(255, 255, 255, 0.08); border-radius: 50%; color: white; text-decoration: none; transition: var(--transition); } .social-links a:hover { background-color: var(--primary); transform: translateY(-5px); } .footer-links { list-style: none; } .footer-links li { margin-bottom: 12px; } .footer-links a { color: rgba(255, 255, 255, 0.7); text-decoration: none; transition: var(--transition); display: flex; align-items: center; gap: 10px; } .footer-links a:hover { color: var(--primary); padding-left: 5px; } .copyright { text-align: center; padding-top: 30px; border-top: 1px solid rgba(255, 255, 255, 0.1); opacity: 0.6; font-size: 14px; } /* Animations */ @keyframes fadeUp { to { opacity: 1; transform: translateY(0); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Scroll to top */ .scroll-top { position: fixed; bottom: 30px; right: 30px; width: 50px; height: 50px; background-color: var(--primary); color: var(--secondary); border-radius: 50%; display: flex; align-items: center; justify-content: center; text-decoration: none; font-size: 20px; box-shadow: var(--shadow); z-index: 99; transition: var(--transition); opacity: 0; visibility: hidden; } .scroll-top.active { opacity: 1; visibility: visible; } .scroll-top:hover { background-color: var(--primary-dark); transform: translateY(-5px); } /* Notification */ .notification { position: fixed; top: 100px; right: 30px; background-color: white; color: var(--secondary); padding: 20px 30px; border-radius: var(--radius); box-shadow: var(--shadow-lg); z-index: 1000; display: flex; align-items: center; gap: 15px; transform: translateX(400px); transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); border-left: 5px solid var(--primary); } .notification.show { transform: translateX(0); } .notification i { color: var(--primary); font-size: 24px; } /* Responsive Design */ @media (max-width: 1100px) { .hero h1 { font-size: 54px; } .section-title h2 { font-size: 42px; } } @media (max-width: 992px) { nav { position: fixed; top: 80px; left: 0; width: 100%; background-color: var(--secondary); padding: 30px; transform: translateY(-100%); opacity: 0; visibility: hidden; transition: var(--transition); box-shadow: var(--shadow); } nav.active { transform: translateY(0); opacity: 1; visibility: visible; } nav ul { flex-direction: column; gap: 20px; } .mobile-menu-btn { display: block; } .header-actions { gap: 15px; } .contact-overlay { position: relative; top: 0; left: 0; max-width: 100%; margin-bottom: 30px; } } @media (max-width: 768px) { .hero { padding: 150px 0 80px; } .hero h1 { font-size: 42px; } .hero p { font-size: 18px; } .section-title h2 { font-size: 36px; } .booking-form-container { padding: 30px 25px; } .menu-container { grid-template-columns: 1fr; } .special-container { grid-template-columns: 1fr; } } @media (max-width: 576px) { .hero h1 { font-size: 36px; } .btn { padding: 14px 28px; } .section-title h2 { font-size: 32px; } .form-row { grid-template-columns: 1fr; } .header-content { flex-wrap: wrap; } .logo { font-size: 28px; } }
JavaScript
// Menu Data const menuItems = [ { id: 1, name: "Truffle Arancini", description: "Crispy risotto balls filled with black truffle and mozzarella, served with truffle aioli.", price: "$16", category: "appetizers", image: "https://images.unsplash.com/photo-1563379926898-05f4575a45d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" }, { id: 2, name: "Burrata & Heirloom Tomatoes", description: "Creamy burrata with heirloom tomatoes, basil pesto, aged balsamic, and sourdough crostini.", price: "$18", category: "appetizers", image: "https://images.unsplash.com/photo-1723744910344-370bc4305972?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8N3x8cmVzdHVyYW50fGVufDB8fDB8fHww" }, { id: 3, name: "Wagyu Beef Tenderloin", description: "8oz A5 Wagyu beef with truffle mashed potatoes, asparagus, and red wine reduction.", price: "$68", category: "mains", image: "https://images.unsplash.com/photo-1600891964092-4316c288032e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" }, { id: 4, name: "Atlantic Lobster Linguine", description: "Fresh lobster with handmade linguine in a sherry cream sauce with chives and lemon zest.", price: "$42", category: "mains", image: "https://images.unsplash.com/photo-1563379926898-05f4575a45d8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" }, { id: 5, name: "Wild Mushroom Risotto", description: "Arborio rice with wild mushrooms, parmesan, white wine, and truffle oil.", price: "$32", category: "mains", image: "https://images.unsplash.com/photo-1476124369491-e7addf5db371?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" }, { id: 6, name: "Chocolate Soufflé", description: "Warm chocolate soufflé with a molten dark chocolate center, served with vanilla bean ice cream.", price: "$14", category: "desserts", image: "https://plus.unsplash.com/premium_photo-1673830185931-40661a11948f?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8MTd8fHJlc3R1cmFudHxlbnwwfHwwfHx8MA%3D%3D" }, { id: 7, name: "Artisan Cheese Board", description: "Selection of local and imported cheeses with honey, nuts, and house-made crackers.", price: "$22", category: "desserts", image: "https://images.unsplash.com/photo-1488477181946-6428a0291777?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1374&q=80" }, { id: 8, name: "Signature Cocktails", description: "Our mixologist's creations using premium spirits, fresh juices, and house-made syrups.", price: "$16", category: "drinks", image: "https://images.unsplash.com/photo-1514362545857-3bc16c4c7d1b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" }, { id: 9, name: "Wine Pairing Selection", description: "Curated wine flights featuring both old-world and new-world vineyards.", price: "$28", category: "drinks", image: "https://images.unsplash.com/photo-1510812431401-41d2bd2722f3?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxzZWFyY2h8M3x8d2luZXxlbnwwfHwwfHx8MA%3D%3D" } ]; // Chef Special Data const specialItems = [ { id: 1, name: "Chef's Tasting Menu", description: "A 7-course journey featuring the chef's latest creations and seasonal highlights.", price: "$125", icon: "fas fa-utensil-spoon" }, { id: 2, name: "Truffle Experience", description: "Exclusive black truffle menu with freshly shaved truffles from Alba, Italy.", price: "$95", icon: "fas fa-gem" }, { id: 3, name: "Wine Cellar Dinner", description: "Private dining in our wine cellar with sommelier-selected pairings.", price: "$150", icon: "fas fa-wine-bottle" } ]; // DOM Elements const menuContainer = document.getElementById('menuContainer'); const specialContainer = document.getElementById('specialContainer'); const filterButtons = document.querySelectorAll('.filter-btn'); const bookingForm = document.getElementById('bookingForm'); const notification = document.getElementById('notification'); const mobileMenuBtn = document.getElementById('mobileMenuBtn'); const nav = document.getElementById('nav'); const header = document.getElementById('header'); const scrollTop = document.getElementById('scrollTop'); const navLinks = document.querySelectorAll('nav a'); // Initialize document.addEventListener('DOMContentLoaded', function() { renderMenuItems(menuItems); renderSpecialItems(specialItems); setupEventListeners(); setupIntersectionObserver(); setMinDate(); // Animate menu cards on load setTimeout(() => { const menuCards = document.querySelectorAll('.menu-card'); menuCards.forEach((card, index) => { setTimeout(() => { card.classList.add('visible'); }, index * 100); }); const specialCards = document.querySelectorAll('.special-card'); specialCards.forEach((card, index) => { setTimeout(() => { card.classList.add('visible'); }, index * 150); }); }, 300); }); // Render Menu Items function renderMenuItems(items) { menuContainer.innerHTML = ''; items.forEach(item => { const menuCard = document.createElement('div'); menuCard.className = 'menu-card'; menuCard.setAttribute('data-category', item.category); menuCard.innerHTML = ` <img src="${item.image}" alt="${item.name}" class="menu-card-image"> <div class="menu-card-content"> <div class="menu-card-header"> <div class="menu-card-title"> <h3>${item.name}</h3> </div> <span class="price">${item.price}</span> </div> <p>${item.description}</p> <div> <span class="category">${item.category.charAt(0).toUpperCase() + item.category.slice(1)}</span> </div> </div> `; menuContainer.appendChild(menuCard); }); } // Render Special Items function renderSpecialItems(items) { specialContainer.innerHTML = ''; items.forEach(item => { const specialCard = document.createElement('div'); specialCard.className = 'special-card'; specialCard.innerHTML = ` <div class="special-icon"> <i class="${item.icon}"></i> </div> <h3>${item.name}</h3> <p>${item.description}</p> <div class="special-price">${item.price}</div> `; specialContainer.appendChild(specialCard); }); } // Filter functionality function setupFilterButtons() { filterButtons.forEach(button => { button.addEventListener('click', function() { // Remove active class from all buttons filterButtons.forEach(btn => btn.classList.remove('active')); // Add active class to clicked button this.classList.add('active'); const filterValue = this.getAttribute('data-filter'); if (filterValue === 'all') { renderMenuItems(menuItems); } else { const filteredItems = menuItems.filter(item => item.category === filterValue); renderMenuItems(filteredItems); } // Animate new cards setTimeout(() => { const menuCards = document.querySelectorAll('.menu-card'); menuCards.forEach((card, index) => { setTimeout(() => { card.classList.add('visible'); }, index * 80); }); }, 10); }); }); } // Booking Form Submission function setupBookingForm() { bookingForm.addEventListener('submit', function(e) { e.preventDefault(); // Get form values const name = document.getElementById('name').value; const date = document.getElementById('date').value; const time = document.getElementById('time').value; const guests = document.getElementById('guests').value; // Format date for display const dateObj = new Date(date); const formattedDate = dateObj.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }); // Show notification showNotification(`Thank you, ${name}! Your table for ${guests} guests has been reserved for ${formattedDate} at ${time}. A confirmation email has been sent.`); // Reset form bookingForm.reset(); setMinDate(); }); } // Show Notification function showNotification(message) { const notificationText = notification.querySelector('p'); notificationText.textContent = message; notification.classList.add('show'); setTimeout(() => { notification.classList.remove('show'); }, 5000); } // Mobile Menu Toggle function setupMobileMenu() { mobileMenuBtn.addEventListener('click', function() { nav.classList.toggle('active'); this.innerHTML = nav.classList.contains('active') ? '<i class="fas fa-times"></i>' : '<i class="fas fa-bars"></i>'; }); // Close mobile menu when clicking on a link navLinks.forEach(link => { link.addEventListener('click', () => { nav.classList.remove('active'); mobileMenuBtn.innerHTML = '<i class="fas fa-bars"></i>'; }); }); } // Set minimum date for booking to today function setMinDate() { const today = new Date().toISOString().split('T')[0]; document.getElementById('date').setAttribute('min', today); // Set default to tomorrow const tomorrow = new Date(); tomorrow.setDate(tomorrow.getDate() + 1); const tomorrowFormatted = tomorrow.toISOString().split('T')[0]; document.getElementById('date').value = tomorrowFormatted; } // Header scroll effect function setupHeaderScroll() { window.addEventListener('scroll', function() { if (window.scrollY > 100) { header.classList.add('scrolled'); } else { header.classList.remove('scrolled'); } // Show/hide scroll to top button if (window.scrollY > 500) { scrollTop.classList.add('active'); } else { scrollTop.classList.remove('active'); } // Update active nav link based on scroll position updateActiveNavLink(); }); } // Scroll to top functionality function setupScrollTop() { scrollTop.addEventListener('click', function(e) { e.preventDefault(); window.scrollTo({ top: 0, behavior: 'smooth' }); }); } // Update active nav link based on scroll position function updateActiveNavLink() { const sections = document.querySelectorAll('section'); const scrollPos = window.scrollY + 150; sections.forEach(section => { const sectionTop = section.offsetTop; const sectionHeight = section.clientHeight; const sectionId = section.getAttribute('id'); if (scrollPos >= sectionTop && scrollPos < sectionTop + sectionHeight) { navLinks.forEach(link => { link.classList.remove('active'); if (link.getAttribute('href') === `#${sectionId}`) { link.classList.add('active'); } }); } }); } // Intersection Observer for animations function setupIntersectionObserver() { const observerOptions = { root: null, rootMargin: '0px', threshold: 0.1 }; const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('visible'); } }); }, observerOptions); // Observe menu cards and special cards document.querySelectorAll('.menu-card, .special-card').forEach(card => { observer.observe(card); }); } // Scroll to booking function function scrollToBooking() { document.getElementById('booking').scrollIntoView({ behavior: 'smooth' }); } // Setup all event listeners function setupEventListeners() { setupFilterButtons(); setupBookingForm(); setupMobileMenu(); setupHeaderScroll(); setupScrollTop(); // Smooth scrolling for navigation links navLinks.forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#home') { window.scrollTo({ top: 0, behavior: 'smooth' }); } else { const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 100, behavior: 'smooth' }); } } }); }); }
Output Preview
Desktop
Mobile
Fullscreen