Luxury dining, delivered.
Luxuro Dining is a responsive, elegantly crafted marketing and demo landing page for a premium fine-dining restaurant. Built with React 19, TypeScript, Vite, TailwindCSS, and motion/react, it showcases rich animated sections, including a parallax hero, curated menu cards, delivery highlights, chef's specials, guest testimonials, a full-bleed photo gallery, and an interactive reservation form all tied together with a polished, mobile-first responsive navbar. Designed to impress both guests and prospective employers, Luxuro Dining demonstrates production-quality front-end architecture in a real-world hospitality context.
- Features
- Tech Stack
- Getting Started
- Project Structure
- Deployment
- Customization
- Images & Credits
- Accessibility & Performance
- Environment Variables
- Contributing
- FAQ & Troubleshooting
- Changelog & Roadmap
- License
- Contact
- Parallax Hero β Full-viewport hero with layered depth scroll effect
- Animated Sections β Smooth entrance animations via
motion/reactthroughout every section - Menu Cards β Beautifully styled dish cards with hover effects
- Delivery Highlights β Service feature callouts with icon support (
lucide-react) - Chef's Specials β Spotlight section for featured or seasonal dishes
- Testimonials β Stylised guest review carousel/grid
- Photo Gallery β Responsive image grid using Unsplash photography
- Reservation Form β Interactive booking form with field validation
- Responsive Navbar β Mobile hamburger menu + smooth scroll links
- Fully Responsive β Mobile-first layout, tested across breakpoints
| Layer | Technology |
|---|---|
| Framework | React 19 + TypeScript |
| Build Tool | Vite |
| Styling | TailwindCSS |
| Animations | motion/react |
| Icons | lucide-react |
| Server (optional) | Express + dotenv |
| Deployment | Vercel (static) |
- Node.js
>=18.x(v20 LTS recommended) - npm
>=9.x
Check your versions:
node -v
npm -vgit clone https://github.com/pushparani7/Luxuro-Dining.git
cd Luxuro-Diningnpm installnpm run devThe app will be available at http://localhost:3000 (bound to 0.0.0.0 for network access).
npm run buildOutput is written to the dist/ directory.
npm run previewnpm run lintRuns tsc --noEmit β no JavaScript is emitted; only type errors are reported.
Luxuro-Dining/
βββ public/ # Static public assets
βββ src/
β βββ assets/ # Local SVG icons and decorative assets
β βββ App.tsx # Root component β all sections composed here
β βββ index.css # Global styles and Tailwind base imports
βββ index.html # HTML entry point β update <title> here
βββ vercel.json # Vercel deployment config
βββ vite.config.ts # Vite configuration
βββ tailwind.config.ts # TailwindCSS configuration
βββ tsconfig.json # TypeScript configuration
βββ package.json # Scripts and dependencies
The project ships with a vercel.json that configures Vercel to use dist/ as the output directory and vite build as the build command. No additional configuration is needed.
- Push your fork/clone to GitHub.
- Go to vercel.com/new and click Import Project.
- Select your
Luxuro-Diningrepository. - Vercel auto-detects Vite. Confirm these settings:
- Build Command:
npm run build - Output Directory:
dist - Install Command:
npm install
- Build Command:
- Click Deploy. Your site will be live at
luxuro-dining.vercel.app(or your preferred subdomain).
# Install Vercel CLI globally
npm i -g vercel
# Authenticate
vercel login
# Deploy to production
npx vercel --prod --name luxuro-diningThe included
vercel.jsonhandles routing and output directory configuration automatically.
{
"buildCommand": "npm run build",
"outputDirectory": "dist",
"framework": "vite"
}Edit index.html:
<title>Luxuro Dining β Your Custom Title</title>Gallery images are sourced from an array in src/App.tsx. Find the images array and replace the Unsplash URLs with your own:
const images = [
"https://images.unsplash.com/photo-your-id?auto=format&fit=crop&w=800",
// Add or replace URLs here
];Drop SVG files into src/assets/ and import them directly:
import MyIcon from "./assets/my-icon.svg?react";Edit tailwind.config.ts to adjust your primary palette:
theme: {
extend: {
colors: {
gold: "#C9A84C",
charcoal: "#1A1A1A",
},
},
},- Photography β All hero and gallery images are sourced from Unsplash and are free for personal and commercial use under the Unsplash License.
- Icons β UI icons provided by Lucide React.
- Decorative Assets β Local SVG files in
src/assets/are original project assets.
If you replace Unsplash images with licensed photography, ensure you hold appropriate rights before deploying publicly.
- All
<img>elements should include descriptivealtattributes. ReviewApp.tsxand add meaningful alt text for every image to comply with WCAG 2.1 AA. - The codebase uses
referrerPolicy="no-referrer"on external image elements to prevent referrer leakage. - Optimize Images: Before deploying with custom photography, compress images using Squoosh or TinyPNG. Target β€ 200 KB per image for above-the-fold content.
- Lazy Loading: Add
loading="lazy"to below-the-fold gallery images to improve Largest Contentful Paint (LCP). - Contrast: Ensure text on dark/image backgrounds meets a minimum 4.5:1 contrast ratio.
No environment variables are required to run the project in its default configuration.
If you add server-side functionality (e.g., via the optional Express setup or a contact form API), create a .env file in the project root:
# .env
VITE_API_URL=https://your-api.example.com
CONTACT_FORM_KEY=your_secret_keyNote: Variables prefixed with
VITE_are exposed to the client bundle. Never prefix sensitive secrets withVITE_. Use server-only variables (without the prefix) for anything that must stay private.
Vite loads .env automatically. Reference client-side variables in code as:
const apiUrl = import.meta.env.VITE_API_URL;Contributions, issues, and feature requests are welcome!
- Fork this repository.
- Create a branch for your feature or fix:
git checkout -b feature/your-feature-name
- Make your changes and commit with a clear message:
git commit -m "feat: add mobile swipe support to gallery" - Push your branch:
git push origin feature/your-feature-name
- Open a Pull Request against the
mainbranch and describe your changes.
When filing issues, please include:
- Bug reports: Steps to reproduce, expected vs. actual behaviour, browser/OS.
- Feature requests: Use case, proposed solution, any relevant mockups.
- Follow the existing TypeScript + TailwindCSS conventions.
- Run
npm run lintbefore submitting a PR. - Keep components focused β one responsibility per file where possible.
Q: Images are not loading after deployment.
Try a hard refresh (
Ctrl + Shift + R/Cmd + Shift + R). Open the browser Network tab and check for 404 or CORS errors on image URLs. If using Unsplash, ensure the URL is correct and the image is still publicly available. External images must be accessible from the user's network.
Q: The dev server won't start / port 3000 is in use.
Either terminate the process using port 3000 (
lsof -i :3000on macOS/Linux) or change the port inpackage.json:"dev": "vite --port=3001 --host=0.0.0.0"
Q: TailwindCSS classes are not applying.
Ensure
tailwind.config.tsincludes the correctcontentpaths:content: ["./index.html", "./src/**/*.{ts,tsx}"]
Q: motion/react animations are not playing.
Confirm
motion/reactis listed independencies(notdevDependencies) and that you are importing from"motion/react"β not the deprecated"framer-motion".
Q: TypeScript errors on npm run lint.
Run
npm installto ensure all type definitions are present, then re-runnpm run lint. Check thattsconfig.jsonincludes all source files.
- Initial release: Hero, Menu, Delivery, Specials, Testimonials, Gallery, Reservation, Navbar.
- Mobile micro-interactions β Swipe gestures for gallery and testimonials on touch devices
- Localization (i18n) β Multi-language support via
react-i18next - CMS Integration β Connect menu and gallery content to a headless CMS (e.g., Sanity, Contentful)
- SSR / SSG β Migrate to Next.js or Astro for improved SEO and performance
- Dark / Light Mode Toggle β System-preference-aware theme switching
- Reservation Backend β Wire up the form to an email API (Resend, SendGrid) or booking platform
- Performance Audit β Achieve Lighthouse score β₯ 95 across all categories
- Animation Accessibility β Honour
prefers-reduced-motionsystem setting throughout
MIT License
Copyright (c) 2024 pushparani7
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Author: @pushparani7 Repository: github.com/pushparani7/Luxuro-Dining Live Demo: luxuro-dining.vercel.app
β If you found this project useful or inspiring, consider giving it a star on GitHub β it helps others discover it!
Luxuro Dining is a responsive, animated fine-dining landing page built with React 19, TypeScript, Vite, TailwindCSS, and motion/react. It features a parallax hero, menu, gallery, testimonials, and reservation form β deployed live on Vercel. A production-quality front-end showcase for a premium restaurant brand.