Restaurant Menu Html: Css Codepen
/* custom scrollbar */ ::-webkit-scrollbar width: 6px; ::-webkit-scrollbar-track background: #e9e0d3; ::-webkit-scrollbar-thumb background: #b87c4f; border-radius: 8px;
/* footer / signature */ .footer-note text-align: center; margin-top: 3rem; padding-top: 2rem; border-top: 1px solid #ecdccb; font-size: 0.8rem; color: #a08162; display: flex; justify-content: center; gap: 2rem; flex-wrap: wrap; .footer-note span i margin-right: 6px; restaurant menu html css codepen
<!-- Dynamic category filters (JS powered) --> <div class="filter-tabs" id="filterTabs"> <!-- will be populated from js --> </div> const imgSrc = dish
let cardsHtml = ''; filteredItems.forEach(dish => // fallback image if unsplash not reachable? but unsplash works, reliable. provide a backup color style. const imgSrc = dish.img; // Dietary badge tiny let dietBadge = ''; if (dish.dietary === 'veg') dietBadge = '<span class="badge-cat"><i class="fas fa-seedling"></i> Vegetarian</span>'; else if (dish.dietary === 'seafood') dietBadge = '<span class="badge-cat"><i class="fas fa-fish"></i> Seafood</span>'; else if (dish.dietary === 'meat') dietBadge = '<span class="badge-cat"><i class="fas fa-drumstick-bite"></i> Meat</span>'; cardsHtml += ` <div class="menu-card"> <img class="card-img" src="$imgSrc" alt="$dish.name" loading="lazy" onerror="this.src='https://placehold.co/500x300/efe3d4/7a5a3e?text=Le+Bistro'"> <div class="card-content"> <div class="dish-header"> <h3 class="dish-name">$escapeHtml(dish.name)</h3> <span class="dish-price">$dish.price</span> </div> <div class="dish-desc">$escapeHtml(dish.desc)</div> <div class="dish-meta"> <span><i class="fas $dish.icon"></i> Signature</span> $dietBadge ? `<span>$dietBadge</span>` : '' </div> </div> </div> `; ); menuGrid.innerHTML = cardsHtml; 'active' : ''" data-filter="$cat">
/* header & hero section */ .hero text-align: center; margin-bottom: 3rem; border-bottom: 2px dashed #e6d5c0; padding-bottom: 2rem; .restaurant-name font-family: 'Playfair Display', serif; font-size: 3.2rem; font-weight: 600; letter-spacing: -0.5px; color: #3e2a1f; margin-bottom: 0.4rem; .restaurant-tagline font-size: 1rem; font-weight: 400; color: #8b6b4d; letter-spacing: 2px; text-transform: uppercase; background: #f3ede5; display: inline-block; padding: 0.3rem 1.2rem; border-radius: 40px; backdrop-filter: blur(2px); .menu-subhead margin-top: 1rem; font-size: 0.95rem; max-width: 580px; margin-left: auto; margin-right: auto; color: #5e4b34; font-weight: 400;
// Helper: render menu cards based on active category function renderMenuItems() let filteredItems = menuData; if (activeCategory !== null) filteredItems = menuData.filter(item => item.category === activeCategory);
// Helper: render filter buttons function renderFilters() let buttonsHtml = `<button class="filter-btn $activeCategory === null ? 'active' : ''" data-filter="all"><i class="fas fa-utensils"></i> All</button>`; uniqueCategories.forEach(cat => buttonsHtml += `<button class="filter-btn $activeCategory === cat ? 'active' : ''" data-filter="$cat"><i class="fas fa-tag"></i> $cat</button>`; ); filterContainer.innerHTML = buttonsHtml;