Little Lemon β Mediterranean Restaurant Reservation System
Little Lemon is a modern, fully responsive restaurant website for a fictional Mediterranean restaurant in Chicago. Built with React, this project features a beautiful multi-page layout with a hero section, weekly specials cards, full menu catalog with category filtering, about section, guest testimonials, and a fully functional table reservation system with dynamic timeslot generation. The design is warm, earthy, and inviting β reflecting the Mediterranean culinary experience. Perfect for restaurateurs, hospitality businesses, and developers looking for a polished front-end showcase. π½οΈ
Page
Purpose
Key Features
Home
Restaurant landing
Hero, specials cards, about section, testimonials, CTA banner
Menu
Food catalog
Filterable grid (7 categories), 14+ dishes, add-to-cart simulation
About
Restaurant story
Full history, chef background, guest testimonials
Booking
Table reservation
Dynamic form with date picker, timeslot selector, guest count
Confirmation
Booking success
Confirmation details with customer info, animated checkmark
Element
Color
Hex
Usage
Olive
π« Green
#495E57
Primary brand color, navigation, buttons
Lemon
π Yellow
#F4CE14
Accent, highlights, call-to-action
Salmon
π Peach
#EE9972
Secondary accent, prices, badges
Peach
π Light
#FBDABB
Subtle backgrounds, hover states
Cream
π₯ Off-white
#FEFAE0
Page background, cards
Charcoal
β« Dark
#2C2C2C
Text, footer
Split layout : Text content on left, image on right
Animated rotating badge with restaurant establishment year
Call-to-action buttons : "Reserve a Table" and "Explore Menu"
Key statistics : 12+ years, 4.9β
rating, 40k guests
3 featured recipes with images, badges, prices
Hover effects : Card lifts, image scales, CTA arrow animates
Recipe details :
Greek Salad β Vegetarian, $12.99
Bruschetta β Chef's Pick, $7.99
Grilled Fish β Signature, $20.99
"View Full Menu" button navigates to Menu page
Split layout : Two overlapping images on left, story text on right
Restaurant origin story β family-owned since 2012
Local sourcing commitment to Chicago farmers
3 guest reviews with star ratings
Quotes from satisfied customers
Author attribution with names
Call to action : "Ready for an unforgettable dining experience?"
Dark button with hover effect
Footer π
4-column layout : Brand, navigation, contact, hours
Address : 12 S Michigan Ave, Chicago, IL 60603
Phone : +1 312-456-7891
Email : hello@littlelemon.com
π Menu Page
Category
Items
All
14 dishes
Appetizers
Bruschetta, Mozzarella Sticks, Chicken Wings
Salads
Greek Salad, Caesar Salad
Pasta
Fettuccine Alfredo, Marinara Pasta
Pizza
Cheese Pizza, Pepperoni Pizza
Burgers
Mushroom Swiss Burger, Veggie Burger
Seafood
Grilled Fish, Fish Tacos
Desserts
Lemon Dessert
Menu Features π½οΈ
Filterable grid layout with category chips
14 menu items with images, descriptions, prices
"Add" button with toast notification simulation
Responsive grid adapts to screen size
Field
Type
Validation
Purpose
Full Name
Text
Required
Customer identification
Email
Email
Required
Confirmation delivery
Date
Date picker
Required, min=today
Select reservation date
Time
Dropdown
Required, dynamic
Available timeslots
Guests
Number
1-20, required
Party size
Occasion
Select
Optional
None, Birthday, Anniversary, etc.
Special Requests
Text
Optional
Allergies, seating preferences
Dynamic generation based on selected date
Seed random algorithm for consistent but varied slots
Hours : 5:00 PM β 11:30 PM
Slots : On the hour and half-hour, filtered by availability
Caching : Times for same date remain consistent
const fetchTimes = ( date ) => {
const r = seedRandom ( new Date ( date ) . getDate ( ) || new Date ( ) . getDate ( ) ) ;
const slots = [ ] ;
for ( let h = 17 ; h <= 23 ; h ++ ) {
if ( r ( ) < 0.5 ) slots . push ( `${ h } :00` ) ;
if ( r ( ) > 0.5 ) slots . push ( `${ h } :30` ) ;
}
return slots . length ? slots : [ "18:00" , "19:00" , "20:00" ] ;
} ;
All required fields must be filled
Date must be today or future
Guests between 1-20
Email format validation via HTML5
useReducer for Timeslots π
const [ times , dispatch ] = useReducer ( reducer , fetchTimes ( today ) ) ;
const reducer = ( _ , date ) => fetchTimes ( date ) ;
Pulsing checkmark icon with scale animation
Pop animation on page load
4-column grid showing:
Date
Time
Guests
Occasion
Personalized greeting with customer name
"Back to Home" button with smooth transition
Breakpoint
Layout Changes
< 768px
Hero becomes single column, right image hidden
< 900px
Cards grid becomes 1 column
< 768px
About section becomes single column
< 500px
Footer becomes single column, form grid becomes single
Cormorant Garamond β Serif for headings, numbers, elegant touches
DM Sans β Sans-serif for body text, navigation, buttons
Sticky navbar that changes background on scroll
Logo with lemon-colored "Lemon" text
Desktop links with animated underline hover
Reserve button with olive background
Type
Background
Hover Effect
Primary
Lemon (#F4CE14)
Darker yellow, lift, shadow
Ghost
Transparent
Border lightens, background tint
Outline
Transparent
Olive fill on hover
Dark
Charcoal
Olive fill on hover
White background with slight shadow
Hover lift of -6px translateY
Image zoom on hover (scale 1.06)
Price in salmon color
Element
Animation
Duration
Hero badge
Slow spin
20s linear
Cards
Hover lift
0.3s
Page transitions
Fade up
0.5s ease
Confirmation icon
Pop
0.6s cubic-bezier
π οΈ Technical Implementation
React 18 β Functional components with hooks
Pure CSS β No frameworks, custom design system
Responsive design β Media queries for all breakpoints
Hook
Purpose
useState
Page state, form fields, scrolled state, toast
useEffect
Scroll listener for navbar
useReducer
Timeslot generation based on date
Component Structure ποΈ
App
βββ Navbar
βββ HomePage
β βββ Hero
β βββ Specials
β βββ About
β βββ Testimonials
β βββ CTABanner
β βββ Footer
βββ MenuPage
βββ AboutPage
βββ BookingPage
βββ ConfirmPage
Page state lifted to App (useState)
Booking data passed to ConfirmPage via navigation
Timeslots generated via useReducer with seed random
π₯ Video Demo Script (45-60 seconds)
Time
Scene
Action
0:00
Hero
Show Little Lemon logo, rotating badge, call-to-action buttons
0:05
Specials
Scroll through 3 cards: Greek Salad, Bruschetta, Grilled Fish
0:10
Card Hover
Hover over Bruschetta β card lifts, image scales
0:15
Menu Page
Click "Explore Menu" β navigate to Menu page
0:20
Menu Filters
Click "Pizza" filter β shows only pizza items
0:25
Add Item
Click "Add" on Pepperoni Pizza β toast appears
0:30
About Page
Navigate to About page β show restaurant story
0:35
Booking
Click "Reserve a Table" β navigate to booking page
0:40
Booking Form
Fill out name, email, select date β timeslots update
0:45
Submit
Click "Confirm Reservation" β validation, then navigate
0:50
Confirmation
Animated checkmark appears, booking details shown
0:55
Back Home
Click "Back to Home" β return to hero
Load Time : < 1.5 seconds
Memory Usage : < 20 MB
Network : Images from ImgBB and Unsplash CDNs
Lazy loading images with browser native
Efficient re-renders via React hooks
CSS animations instead of JavaScript for performance
Little Lemon is a safe front-end demo application:
β
No backend server
β
No data storage (form submission simulated)
β
No tracking or analytics
β
No external dependencies beyond React
MIT License β see LICENSE file for details.
Little Lemon β Fictional restaurant from Meta Front-End Developer Certificate
Unsplash β Restaurant interior and food photography
ImgBB β Image hosting for specials and hero
π Little Lemon β Mediterranean Restaurant Website π
Last updated: April 2026