Compare commits

...

54 Commits

Author SHA1 Message Date
kudinDmitriyUp
b8a934daef Bob AI: fix build errors (attempt 1) 2026-06-03 14:47:23 +00:00
kudinDmitriyUp
07e87980df Bob AI: add an about section as the second section 2026-06-03 14:46:45 +00:00
5c0ca1bc47 Merge version_26_1780497803548 into main
Merge version_26_1780497803548 into main
2026-06-03 14:44:24 +00:00
kudinDmitriyUp
691b7358f1 Bob AI (stub): in the hero section on top of the big image let's add floati 2026-06-03 14:44:18 +00:00
86d97a6b0d Merge version_25_1780497680352 into main
Merge version_25_1780497680352 into main
2026-06-03 14:42:48 +00:00
kudinDmitriyUp
9ca64f07fd Bob AI (stub): in the hero section on top of the big image let's add floati 2026-06-03 14:42:45 +00:00
ca02ca44f0 Merge version_24_1780497537571 into main
Merge version_24_1780497537571 into main
2026-06-03 14:40:32 +00:00
kudinDmitriyUp
ed73a46116 Bob AI (stub): add floating KPI cards in the hero section, they should move 2026-06-03 14:40:25 +00:00
ed3f23f639 Merge version_23_1780497315842 into main
Merge version_23_1780497315842 into main
2026-06-03 14:36:59 +00:00
kudinDmitriyUp
1eaceaf054 Bob AI: reduce the space between the navbar and the hero section, an 2026-06-03 14:36:26 +00:00
ca209f8fc4 Merge version_22_1780497042169 into main
Merge version_22_1780497042169 into main
2026-06-03 14:33:53 +00:00
kudinDmitriyUp
38b4a3e01d Bob AI: fix build errors (attempt 1) 2026-06-03 14:33:20 +00:00
kudinDmitriyUp
39d9941b58 Bob AI: i want a simpler navbar 2026-06-03 14:32:26 +00:00
38c9a521d3 Merge version_21_1780497029869 into main
Merge version_21_1780497029869 into main
2026-06-03 14:30:33 +00:00
51f6fc5115 Update theme colors 2026-06-03 14:30:30 +00:00
de70dd02a2 Merge version_20_1780496932547 into main
Merge version_20_1780496932547 into main
2026-06-03 14:30:19 +00:00
kudinDmitriyUp
e5b8f20a11 Bob AI: I want a light beige color theme 2026-06-03 14:29:43 +00:00
83ab24c38f Merge version_19_1780496743813 into main
Merge version_19_1780496743813 into main
2026-06-03 14:26:11 +00:00
kudinDmitriyUp
6f9df2475f Bob AI (stub): make the hero section use width content width, like w-conten 2026-06-03 14:26:07 +00:00
55090fbfbe Merge version_18_1780496227930 into main
Merge version_18_1780496227930 into main
2026-06-03 14:17:32 +00:00
kudinDmitriyUp
1c7704b1ba Bob AI (stub): make the hero section the same width as all the other sectio 2026-06-03 14:17:29 +00:00
212f55108a Merge version_17_1780496129831 into main
Merge version_17_1780496129831 into main
2026-06-03 14:16:46 +00:00
kudinDmitriyUp
25247ef9dd Bob AI: Make hero section progress bars full width 2026-06-03 14:16:07 +00:00
009b67ee3e Merge version_16_1780495977779 into main
Merge version_16_1780495977779 into main
2026-06-03 14:13:59 +00:00
kudinDmitriyUp
6a1e1b8121 Bob AI: remove white border from hero section image box 2026-06-03 14:13:22 +00:00
b744e497c0 Merge version_15_1780495898454 into main
Merge version_15_1780495898454 into main
2026-06-03 14:12:40 +00:00
kudinDmitriyUp
1e6aab2988 Bob AI: Removed the black background from the hero section 2026-06-03 14:12:03 +00:00
587cbacf95 Merge version_14_1780495786088 into main
Merge version_14_1780495786088 into main
2026-06-03 14:11:26 +00:00
kudinDmitriyUp
444cf85ddc Bob AI: Fix hero heading gradient and bottom clipping 2026-06-03 14:10:37 +00:00
56e04d4460 Merge version_13_1780495654401 into main
Merge version_13_1780495654401 into main
2026-06-03 14:08:48 +00:00
kudinDmitriyUp
280e8dda68 Bob AI: Added text-balance to hero heading 2026-06-03 14:08:11 +00:00
d9f48bc7b4 Merge version_12_1780495544927 into main
Merge version_12_1780495544927 into main
2026-06-03 14:06:57 +00:00
kudinDmitriyUp
dcc140c72d Bob AI: Match hero heading size and gradient to accommodation sectio 2026-06-03 14:06:20 +00:00
b237841c42 Merge version_11_1780495392414 into main
Merge version_11_1780495392414 into main
2026-06-03 14:04:34 +00:00
kudinDmitriyUp
ce48920897 Bob AI: Match hero title size with accommodation title 2026-06-03 14:03:55 +00:00
101c7f6641 Merge version_10_1780495208394 into main
Merge version_10_1780495208394 into main
2026-06-03 14:02:00 +00:00
kudinDmitriyUp
7c37b18ffd Bob AI: Adjust hero section text box to match accommodation section 2026-06-03 14:01:22 +00:00
da7de495ba Merge version_9_1780495095951 into main
Merge version_9_1780495095951 into main
2026-06-03 13:59:34 +00:00
kudinDmitriyUp
ada39e3fe6 Bob AI: Adjust hero section textbox sizing to match accommodation se 2026-06-03 13:58:53 +00:00
7f0cc4b273 Merge version_8_1780494974164 into main
Merge version_8_1780494974164 into main
2026-06-03 13:57:49 +00:00
kudinDmitriyUp
20ff83b8d9 Bob AI: Remove the text 'Our Legacy of Hospitality' from the about s 2026-06-03 13:57:16 +00:00
026cd0a078 Merge version_7_1780494791132 into main
Merge version_7_1780494791132 into main
2026-06-03 13:55:26 +00:00
kudinDmitriyUp
61d5307458 Bob AI: Fix carousel skipping images by removing state setter from u 2026-06-03 13:54:36 +00:00
fede3905da Merge version_6_1780494606830 into main
Merge version_6_1780494606830 into main
2026-06-03 13:52:04 +00:00
kudinDmitriyUp
64c7aa89fb Bob AI: i want each images to have their own progress bar and they a 2026-06-03 13:51:28 +00:00
bc52183401 Merge version_5_1780494437120 into main
Merge version_5_1780494437120 into main
2026-06-03 13:49:07 +00:00
kudinDmitriyUp
1f33c04279 Bob AI (stub): change the hero section so each image in the carousel has it 2026-06-03 13:49:01 +00:00
5cb557e570 Merge version_4_1780494288262 into main
Merge version_4_1780494288262 into main
2026-06-03 13:46:48 +00:00
kudinDmitriyUp
588c8cddf7 Bob AI: Add image carousel with progress bar to hero section 2026-06-03 13:46:07 +00:00
311974c386 Merge version_3_1780494163704 into main
Merge version_3_1780494163704 into main
2026-06-03 13:44:05 +00:00
kudinDmitriyUp
e60814f2c1 Bob AI: Updated hero section layout with text above and image below 2026-06-03 13:43:24 +00:00
2ec5bb4c45 Merge version_2_1780494013667 into main
Merge version_2_1780494013667 into main
2026-06-03 13:42:25 +00:00
kudinDmitriyUp
af7e351e7d Bob AI: make the hero section have one big image 2026-06-03 13:41:48 +00:00
be5edb77e7 Merge version_1_1780493796410 into main
Merge version_1_1780493796410 into main
2026-06-03 13:38:13 +00:00
12 changed files with 539 additions and 319 deletions

View File

@@ -1,11 +1,22 @@
import React, { useState, useEffect } from 'react';
import FooterBrand from '@/components/sections/footer/FooterBrand';
import NavbarFloatingLogo from '@/components/ui/NavbarFloatingLogo';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import SiteBackgroundSlot from "@/components/ui/SiteBackgroundSlot";
import { Outlet } from 'react-router-dom';
import { StyleProvider } from "@/components/ui/StyleProvider";
import Button from "@/components/ui/Button";
export default function Layout() {
const [isScrolled, setIsScrolled] = useState(false);
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 10);
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
const navItems = [
{
"name": "Home", "href": "#hero"
@@ -37,12 +48,21 @@ export default function Layout() {
<StyleProvider buttonVariant="stagger" siteBackground="noise" heroBackground="gradientBars">
<SiteBackgroundSlot />
<SectionErrorBoundary name="navbar">
<NavbarFloatingLogo
ctaButton={{
text: "Book Now", href: "#contact"}}
logo="The Grand Hotel"
logoImageSrc="https://storage.googleapis.com/webild/default/no-image.jpg?id=6xbdeo"
navItems={navItems} />
<nav className={`fixed top-0 z-50 w-full transition-colors duration-300 ${isScrolled ? 'bg-background/95 backdrop-blur-sm border-b border-foreground/10' : 'bg-transparent'} py-4`}>
<div className="mx-auto flex w-content-width items-center justify-between">
<a href="#" className="text-xl md:text-2xl font-bold text-foreground tracking-tight">
The Grand Hotel
</a>
<div className="hidden lg:flex items-center gap-6">
{navItems.map((item) => (
<a key={item.name} href={item.href} className="text-sm font-medium text-foreground/80 hover:text-foreground transition-colors">
{item.name}
</a>
))}
</div>
<Button text="Book Now" href="#contact" variant="primary" />
</div>
</nav>
</SectionErrorBoundary>
<main className="flex-grow">
<Outlet />
@@ -90,4 +110,4 @@ export default function Layout() {
</SectionErrorBoundary>
</StyleProvider>
);
}
}

View File

@@ -5,15 +5,15 @@
:root {
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #0a0a0a;
--card: #1a1a1a;
--foreground: #f5f5f5;
--primary-cta: #ffdf7d;
--primary-cta-text: #0a0a0a;
--secondary-cta: #1a1a1a;
--secondary-cta-text: #ffffff;
--accent: #b8860b;
--background-accent: #8b6914;
--background: #f6f0e9;
--card: #efe7dd;
--foreground: #2b180a;
--primary-cta: #2b180a;
--primary-cta-text: #f6f0e9;
--secondary-cta: #efe7dd;
--secondary-cta-text: #2b180a;
--accent: #94877c;
--background-accent: #afa094;
/* @layout/border-radius/rounded */
--radius: 1.5rem;

View File

@@ -1,308 +1,48 @@
import AboutText from '@/components/sections/about/AboutText';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
import FeaturesRevealCardsBentoSharp from '@/components/sections/features/FeaturesRevealCardsBentoSharp';
import HeroSplitMediaGrid from '@/components/sections/hero/HeroSplitMediaGrid';
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
// AUTO-GENERATED shell by per-section-migrate.
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
// files directly; this shell only fixes render order.
export default function HomePage() {
import React from 'react';
import HeroSection from './HomePage/sections/Hero';
import AboutSection from './HomePage/sections/About';
import AccommodationSection from './HomePage/sections/Accommodation';
import ExperiencesSection from './HomePage/sections/Experiences';
import OffersSection from './HomePage/sections/Offers';
import TestimonialsSection from './HomePage/sections/Testimonials';
import SocialProofSection from './HomePage/sections/SocialProof';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
{/* webild-stub @2026-06-03T14:44:17.404Z: in the hero section on top of the big image let's add floating cards with kpi number and description. */}
{/* webild-stub @2026-06-03T14:42:44.419Z: in the hero section on top of the big image let's add floating cards with kpi number and description. on mouse move they should have a nice moving animation */}
{/* webild-stub @2026-06-03T14:40:24.768Z: add floating KPI cards in the hero section, they should move with a parallax effect as I move my mouse around in the hero section */}
{/* webild-stub @2026-06-03T14:26:06.808Z: make the hero section use width content width, like w-content-width */}
{/* webild-stub @2026-06-03T14:17:28.384Z: make the hero section the same width as all the other sections */}
{/* webild-stub @2026-06-03T13:49:00.110Z: change the hero section so each image in the carousel has its own progress bar, and all progress bars are visible at the same time */}
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroSplitMediaGrid
tag="Welcome to Luxury"
title="Experience Unparalleled Comfort & Elegance"
description="Discover a world where impeccable service meets sophisticated design. Your unforgettable journey begins here."
primaryButton={{
text: "Book Your Stay",
href: "#contact",
}}
secondaryButton={{
text: "Explore Rooms",
href: "#accommodation",
}}
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/modern-interior-design-interior_23-2151929575.jpg",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/hotel-receptionist-work_23-2149661548.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="Our Legacy of Hospitality"
/>
</SectionErrorBoundary>
</div>
<div id="accommodation" data-section="accommodation">
<SectionErrorBoundary name="accommodation">
<FeaturesDetailedSteps
tag="Accommodation"
title="Indulge in Our Luxurious Rooms & Suites"
description="Each space at The Grand Hotel is meticulously designed for ultimate comfort and sophistication, offering elegant decor, modern amenities, and breathtaking views to ensure a serene retreat."
steps={[
{
tag: "Cozy Comfort",
title: "Standard Room",
subtitle: "Your Elegant Retreat",
description: "Perfect for a relaxing stay, our Standard Rooms offer essential amenities and a comfortable ambiance.",
imageSrc: "http://img.b2bpic.net/free-photo/white-bed-lamp-hotel-business_1203-4933.jpg",
},
{
tag: "Spacious Luxury",
title: "Deluxe Suite",
subtitle: "The Premium Experience",
description: "Enjoy expansive living areas, enhanced amenities, and picturesque city views from our Deluxe Suites.",
imageSrc: "http://img.b2bpic.net/free-photo/empty-atelier-with-sketches-tools_482257-85311.jpg",
},
{
tag: "Unmatched Grandeur",
title: "Presidential Suite",
subtitle: "An Opulent Haven",
description: "The pinnacle of luxury, our Presidential Suite offers personalized service, private dining, and panoramic vistas.",
imageSrc: "http://img.b2bpic.net/free-photo/middle-eastern-worker-business-trip_482257-80852.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="experiences" data-section="experiences">
<SectionErrorBoundary name="experiences">
<FeaturesRevealCardsBentoSharp
tag="Experiences"
title="Beyond Your Stay: Our Signature Services"
description="From gourmet dining to rejuvenating spa treatments, The Grand Hotel offers an array of services designed to enrich every moment of your visit."
items={[
{
title: "Fine Dining",
description: "Savor exquisite dishes prepared by award-winning chefs in an elegant atmosphere.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/fried-chicken-with-mushrooms-tomato_140725-3752.jpg",
},
{
title: "Spa & Wellness",
description: "Indulge in a range of treatments designed for ultimate relaxation and rejuvenation.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-fair-skinned-women-use-moisturizing-day-cream-sensitive-skin-light-room-self-care-health-day-concept_197531-31471.jpg",
},
{
title: "Fitness Center",
description: "Maintain your routine with our state-of-the-art facilities and professional trainers.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-looking-mirror_23-2149832697.jpg",
},
{
title: "Event Spaces",
description: "Host your perfect occasion in our versatile venues, ideal for weddings and conferences.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/beautifully-decorated-venue-interior-wedding_181624-58530.jpg",
},
{
title: "Concierge Service",
description: "Our dedicated team provides personalized assistance to cater to your every need.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/guests-with-suitcases-hotel-reception_482257-80053.jpg",
},
{
title: "Rooftop Bar",
description: "Enjoy crafted beverages and stunning panoramic cityscapes from our exclusive bar.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/handsome-african-american-man-posing-inside-night-club-black-hat_627829-5507.jpg",
},
{
title: "Business Center",
description: "Fully equipped facilities for your professional needs, ensuring productivity on the go.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/view-empty-waiting-room_1170-1960.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="offers" data-section="offers">
<SectionErrorBoundary name="offers">
<PricingMediaCards
tag="Offers"
title="Exclusive Packages & Seasonal Deals"
description="Discover special rates and bundled experiences tailored to enhance your stay at The Grand Hotel."
plans={[
{
tag: "Weekend Escape",
price: "$450",
period: "/night",
features: [
"Complimentary breakfast for two",
"Late checkout (subject to availability)",
"Access to all hotel amenities",
"Welcome drink upon arrival",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/gentle-couple-celebrating-anniversary-shoreline_23-2147738211.jpg",
},
{
tag: "Couple's Delight",
price: "$600",
period: "/night",
features: [
"Romantic dinner for two at our fine dining restaurant",
"Champagne and chocolates upon arrival",
"Spa credit for two",
"Exclusive turndown service",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/man-woman-hug-smile-sitting-old-bus_1304-5367.jpg",
},
{
tag: "Family Fun",
price: "$750",
period: "/night",
features: [
"Interconnecting rooms available",
"Kids' activity pack and welcome treats",
"Complimentary tickets to local attractions",
"Special children's menu options",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/young-adults-with-social-media-addiction_23-2149324694.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Guest Reviews"
title="Hear From Our Valued Guests"
description="Read what discerning travelers have to say about their unforgettable experiences and exceptional service at The Grand Hotel."
testimonials={[
{
name: "Sarah J.",
role: "Business Executive",
quote: "The Grand Hotel exceeded all my expectations. The rooms are luxurious, the service is impeccable, and the dining experience was truly world-class. A perfect blend of comfort and sophistication.",
imageSrc: "http://img.b2bpic.net/free-photo/young-pregnant-woman-work_23-2149292809.jpg",
},
{
name: "Michael C.",
role: "Travel Blogger",
quote: "An absolute gem in the city! Every detail is thoughtfully curated, making for a truly memorable stay. The staff anticipate your every need. Highly recommended for luxury travelers.",
imageSrc: "http://img.b2bpic.net/free-photo/young-smiling-happy-man-woman-sunglasses-sitting-sand-beach-taking-selfie-photo-phone-camera_285396-737.jpg",
},
{
name: "Emily R.",
role: "Retired Educator",
quote: "My husband and I celebrated our anniversary here, and it was magical. The ambiance, the views, and the warm hospitality made it an experience we'll cherish forever.",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-old-man-date-outdoors_23-2148214567.jpg",
},
{
name: "David K.",
role: "Architect",
quote: "The architecture and interior design are stunning. The Grand Hotel manages to be both grand and incredibly comfortable. A truly inspiring place to stay and unwind.",
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-taking-selfie-home_23-2148925874.jpg",
},
{
name: "Jessica L.",
role: "Artist",
quote: "From the moment I arrived, I felt completely at home. The serene atmosphere of the spa and the exquisite culinary delights were highlights of my perfect getaway.",
imageSrc: "http://img.b2bpic.net/free-photo/relaxed-man-white-bathrobe-slippers-sitting-chair-balcony_259150-59747.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="social-proof" data-section="social-proof">
<SectionErrorBoundary name="social-proof">
<SocialProofMarquee
tag="Recognition"
title="Trusted by Industry Leaders & Partners"
description="Our unwavering commitment to excellence has earned us prestigious accolades and collaborations with esteemed organizations worldwide."
names={[
"Luxury Travel Magazine",
"Michelin Guide",
"Forbes Travel Guide",
"AAA Diamond Rated",
"Conde Nast Traveler",
"World Hotel Awards",
"Travel + Leisure",
"Relais & Châteaux",
]}
/>
</SectionErrorBoundary>
</div>
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="Help Center"
title="Frequently Asked Questions"
description="Find quick answers to common inquiries about your stay, booking process, and the services offered at The Grand Hotel."
items={[
{
question: "What are the check-in and check-out times?",
answer: "Check-in is at 3:00 PM, and check-out is at 12:00 PM. Early check-in or late check-out may be available upon request and subject to availability, additional charges may apply.",
},
{
question: "Does the hotel offer pet-friendly accommodations?",
answer: "Yes, The Grand Hotel offers a limited number of pet-friendly rooms. Please notify us in advance if you plan to bring a pet, as certain restrictions and fees apply.",
},
{
question: "What is your cancellation policy?",
answer: "Our standard cancellation policy requires notification 48 hours prior to arrival to avoid a charge. Specific rates and packages may have different cancellation terms, so please refer to your booking confirmation.",
},
{
question: "Are there dining options available within the hotel?",
answer: "Absolutely! The Grand Hotel boasts several dining options, including a gourmet restaurant, a casual bistro, and a sophisticated rooftop bar, catering to all tastes and preferences.",
},
{
question: "Is parking available at the hotel?",
answer: "Valet parking is available for guests at a daily rate. Self-parking options may also be available nearby. Please inquire with our concierge for details and directions.",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Connect With Us"
text="Ready to plan your perfect getaway? Contact us today for reservations or inquiries about your luxurious stay."
primaryButton={{
text: "Book Now",
href: "tel:+1234567890",
}}
secondaryButton={{
text: "Email Us",
href: "mailto:reservations@grandhotel.com",
}}
/>
</SectionErrorBoundary>
</div>
<HeroSection />
<AboutSection />
<AccommodationSection />
<ExperiencesSection />
<OffersSection />
<TestimonialsSection />
<SocialProofSection />
<FaqSection />
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,41 @@
import React from 'react';
import Tag from "@/components/ui/Tag";
import ScrollReveal from "@/components/ui/ScrollReveal";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import Button from "@/components/ui/Button";
export default function AboutSection() {
return (
<section data-webild-section="about" id="about" className="bg-background">
<div className="max-w-content-width mx-auto px-6">
<div className="grid grid-cols-1 lg:grid-cols-2 items-center">
<ScrollReveal variant="slide-up">
<div className="space-y-8">
<Tag text="About Us" />
<h2 className="text-4xl md:text-5xl font-bold text-foreground tracking-tight">
A Legacy of Unparalleled Hospitality
</h2>
<p className="text-lg text-muted-foreground leading-relaxed">
Nestled in the heart of the city, The Grand Hotel has been a beacon of luxury and comfort for over a century. Our commitment to excellence is reflected in every detail, from our meticulously designed rooms to our world-class dining experiences.
</p>
<p className="text-lg text-muted-foreground leading-relaxed">
We believe that true luxury lies in the experience. Our dedicated staff is here to ensure that your stay is nothing short of extraordinary, anticipating your every need and exceeding your expectations.
</p>
<Button text="Discover Our Story" variant="primary" />
</div>
</ScrollReveal>
<ScrollReveal variant="fade">
<div className="relative h-[600px] rounded-theme overflow-hidden">
<ImageOrVideo
imageSrc="https://images.unsplash.com/photo-1542314831-c6a4d14d837e?q=80&w=2000&auto=format&fit=crop"
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-black/10"></div>
</div>
</ScrollReveal>
</div>
</div>
</section>
);
}

View File

@@ -0,0 +1,43 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "accommodation" section.
import React from 'react';
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AccommodationSection(): React.JSX.Element {
return (
<div id="accommodation" data-section="accommodation">
<SectionErrorBoundary name="accommodation">
<FeaturesDetailedSteps
tag="Accommodation"
title="Indulge in Our Luxurious Rooms & Suites"
description="Each space at The Grand Hotel is meticulously designed for ultimate comfort and sophistication, offering elegant decor, modern amenities, and breathtaking views to ensure a serene retreat."
steps={[
{
tag: "Cozy Comfort",
title: "Standard Room",
subtitle: "Your Elegant Retreat",
description: "Perfect for a relaxing stay, our Standard Rooms offer essential amenities and a comfortable ambiance.",
imageSrc: "http://img.b2bpic.net/free-photo/white-bed-lamp-hotel-business_1203-4933.jpg",
},
{
tag: "Spacious Luxury",
title: "Deluxe Suite",
subtitle: "The Premium Experience",
description: "Enjoy expansive living areas, enhanced amenities, and picturesque city views from our Deluxe Suites.",
imageSrc: "http://img.b2bpic.net/free-photo/empty-atelier-with-sketches-tools_482257-85311.jpg",
},
{
tag: "Unmatched Grandeur",
title: "Presidential Suite",
subtitle: "An Opulent Haven",
description: "The pinnacle of luxury, our Presidential Suite offers personalized service, private dining, and panoramic vistas.",
imageSrc: "http://img.b2bpic.net/free-photo/middle-eastern-worker-business-trip_482257-80852.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,27 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "contact" section.
import React from 'react';
import ContactCta from '@/components/sections/contact/ContactCta';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ContactSection(): React.JSX.Element {
return (
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Connect With Us"
text="Ready to plan your perfect getaway? Contact us today for reservations or inquiries about your luxurious stay."
primaryButton={{
text: "Book Now",
href: "tel:+1234567890",
}}
secondaryButton={{
text: "Email Us",
href: "mailto:reservations@grandhotel.com",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,64 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "experiences" section.
import React from 'react';
import FeaturesRevealCardsBentoSharp from '@/components/sections/features/FeaturesRevealCardsBentoSharp';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ExperiencesSection(): React.JSX.Element {
return (
<div id="experiences" data-section="experiences">
<SectionErrorBoundary name="experiences">
<FeaturesRevealCardsBentoSharp
tag="Experiences"
title="Beyond Your Stay: Our Signature Services"
description="From gourmet dining to rejuvenating spa treatments, The Grand Hotel offers an array of services designed to enrich every moment of your visit."
items={[
{
title: "Fine Dining",
description: "Savor exquisite dishes prepared by award-winning chefs in an elegant atmosphere.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/fried-chicken-with-mushrooms-tomato_140725-3752.jpg",
},
{
title: "Spa & Wellness",
description: "Indulge in a range of treatments designed for ultimate relaxation and rejuvenation.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-fair-skinned-women-use-moisturizing-day-cream-sensitive-skin-light-room-self-care-health-day-concept_197531-31471.jpg",
},
{
title: "Fitness Center",
description: "Maintain your routine with our state-of-the-art facilities and professional trainers.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-looking-mirror_23-2149832697.jpg",
},
{
title: "Event Spaces",
description: "Host your perfect occasion in our versatile venues, ideal for weddings and conferences.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/beautifully-decorated-venue-interior-wedding_181624-58530.jpg",
},
{
title: "Concierge Service",
description: "Our dedicated team provides personalized assistance to cater to your every need.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/guests-with-suitcases-hotel-reception_482257-80053.jpg",
},
{
title: "Rooftop Bar",
description: "Enjoy crafted beverages and stunning panoramic cityscapes from our exclusive bar.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/handsome-african-american-man-posing-inside-night-club-black-hat_627829-5507.jpg",
},
{
title: "Business Center",
description: "Fully equipped facilities for your professional needs, ensuring productivity on the go.",
href: "#",
imageSrc: "http://img.b2bpic.net/free-photo/view-empty-waiting-room_1170-1960.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,42 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "faq" section.
import React from 'react';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="Help Center"
title="Frequently Asked Questions"
description="Find quick answers to common inquiries about your stay, booking process, and the services offered at The Grand Hotel."
items={[
{
question: "What are the check-in and check-out times?",
answer: "Check-in is at 3:00 PM, and check-out is at 12:00 PM. Early check-in or late check-out may be available upon request and subject to availability, additional charges may apply.",
},
{
question: "Does the hotel offer pet-friendly accommodations?",
answer: "Yes, The Grand Hotel offers a limited number of pet-friendly rooms. Please notify us in advance if you plan to bring a pet, as certain restrictions and fees apply.",
},
{
question: "What is your cancellation policy?",
answer: "Our standard cancellation policy requires notification 48 hours prior to arrival to avoid a charge. Specific rates and packages may have different cancellation terms, so please refer to your booking confirmation.",
},
{
question: "Are there dining options available within the hotel?",
answer: "Absolutely! The Grand Hotel boasts several dining options, including a gourmet restaurant, a casual bistro, and a sophisticated rooftop bar, catering to all tastes and preferences.",
},
{
question: "Is parking available at the hotel?",
answer: "Valet parking is available for guests at a daily rate. Self-parking options may also be available nearby. Please inquire with our concierge for details and directions.",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,91 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "hero" section.
import React, { useState, useEffect } from 'react';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import Button from '@/components/ui/Button';
import Tag from '@/components/ui/Tag';
import ImageOrVideo from '@/components/ui/ImageOrVideo';
export default function HeroSection(): React.JSX.Element {
const images = [
"http://img.b2bpic.net/free-photo/modern-interior-design-interior_23-2151929575.jpg",
"http://img.b2bpic.net/free-photo/luxury-pool-villa-spectacular-contemporary-design-digital-art-real-estate-home-house-property-ge_1258-150749.jpg",
"http://img.b2bpic.net/free-photo/3d-rendering-beautiful-luxury-bedroom-suite-hotel-with-tv_105762-2301.jpg"
];
const [currentIndex, setCurrentIndex] = useState(0);
const [progress, setProgress] = useState(0);
useEffect(() => {
const intervalTime = 5000; // 5 seconds
const updateInterval = 50; // Update progress every 50ms
const step = (updateInterval / intervalTime) * 100;
const timer = setInterval(() => {
setProgress((prev) => {
if (prev >= 100) return 100;
return prev + step;
});
}, updateInterval);
return () => clearInterval(timer);
}, []);
useEffect(() => {
if (progress >= 100) {
setCurrentIndex((prevIndex) => (prevIndex + 1) % images.length);
setProgress(0);
}
}, [progress, images.length]);
return (
<div id="hero" data-webild-section="hero" className="w-full pt-32 pb-16 px-4 md:px-8">
<SectionErrorBoundary name="hero">
<div className="container mx-auto max-w-6xl flex flex-col items-center text-center">
<div className="flex flex-col items-center text-center gap-4 mb-16 max-w-3xl mx-auto">
<Tag text="Welcome to Luxury" />
<h1 className="text-5xl md:text-6xl lg:text-7xl font-bold tracking-tight text-balance bg-clip-text text-transparent bg-gradient-to-b from-foreground to-muted-foreground pb-2">
Experience Unparalleled Comfort & Elegance
</h1>
<p className="text-lg text-muted-foreground">
Discover a world where impeccable service meets sophisticated design. Your unforgettable journey begins here.
</p>
<div className="flex flex-wrap items-center justify-center gap-4">
<Button text="Book Your Stay" variant="primary" href="#contact" />
<Button text="Explore Rooms" variant="secondary" href="#accommodation" />
</div>
</div>
<div className="w-full rounded-3xl overflow-hidden shadow-2xl relative">
<div className="relative w-full h-[60vh]">
{images.map((src, index) => (
<div
key={src}
className={`absolute inset-0 transition-opacity duration-1000 ${index === currentIndex ? 'opacity-100 z-10' : 'opacity-0 z-0'}`}
>
<ImageOrVideo
imageSrc={src}
className="w-full h-full object-cover"
/>
</div>
))}
</div>
<div className="absolute bottom-6 left-1/2 -translate-x-1/2 flex gap-3 w-full px-4 z-20">
{images.map((_, index) => (
<div key={index} className="h-1.5 flex-1 bg-white/30 rounded-full overflow-hidden cursor-pointer" onClick={() => { setCurrentIndex(index); setProgress(0); }}>
<div
className="h-full bg-white transition-all duration-75 ease-linear"
style={{
width: index === currentIndex ? `${progress}%` : (index < currentIndex ? '100%' : '0%')
}}
/>
</div>
))}
</div>
</div>
</div>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,70 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "offers" section.
import React from 'react';
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function OffersSection(): React.JSX.Element {
return (
<div id="offers" data-section="offers">
<SectionErrorBoundary name="offers">
<PricingMediaCards
tag="Offers"
title="Exclusive Packages & Seasonal Deals"
description="Discover special rates and bundled experiences tailored to enhance your stay at The Grand Hotel."
plans={[
{
tag: "Weekend Escape",
price: "$450",
period: "/night",
features: [
"Complimentary breakfast for two",
"Late checkout (subject to availability)",
"Access to all hotel amenities",
"Welcome drink upon arrival",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/gentle-couple-celebrating-anniversary-shoreline_23-2147738211.jpg",
},
{
tag: "Couple's Delight",
price: "$600",
period: "/night",
features: [
"Romantic dinner for two at our fine dining restaurant",
"Champagne and chocolates upon arrival",
"Spa credit for two",
"Exclusive turndown service",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/man-woman-hug-smile-sitting-old-bus_1304-5367.jpg",
},
{
tag: "Family Fun",
price: "$750",
period: "/night",
features: [
"Interconnecting rooms available",
"Kids' activity pack and welcome treats",
"Complimentary tickets to local attractions",
"Special children's menu options",
],
primaryButton: {
text: "Book Now",
href: "#contact",
},
imageSrc: "http://img.b2bpic.net/free-photo/young-adults-with-social-media-addiction_23-2149324694.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,30 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "social-proof" section.
import React from 'react';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SocialProofSection(): React.JSX.Element {
return (
<div id="social-proof" data-section="social-proof">
<SectionErrorBoundary name="social-proof">
<SocialProofMarquee
tag="Recognition"
title="Trusted by Industry Leaders & Partners"
description="Our unwavering commitment to excellence has earned us prestigious accolades and collaborations with esteemed organizations worldwide."
names={[
"Luxury Travel Magazine",
"Michelin Guide",
"Forbes Travel Guide",
"AAA Diamond Rated",
"Conde Nast Traveler",
"World Hotel Awards",
"Travel + Leisure",
"Relais & Châteaux",
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,52 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "testimonials" section.
import React from 'react';
import TestimonialQuoteCards from '@/components/sections/testimonial/TestimonialQuoteCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TestimonialsSection(): React.JSX.Element {
return (
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialQuoteCards
tag="Guest Reviews"
title="Hear From Our Valued Guests"
description="Read what discerning travelers have to say about their unforgettable experiences and exceptional service at The Grand Hotel."
testimonials={[
{
name: "Sarah J.",
role: "Business Executive",
quote: "The Grand Hotel exceeded all my expectations. The rooms are luxurious, the service is impeccable, and the dining experience was truly world-class. A perfect blend of comfort and sophistication.",
imageSrc: "http://img.b2bpic.net/free-photo/young-pregnant-woman-work_23-2149292809.jpg",
},
{
name: "Michael C.",
role: "Travel Blogger",
quote: "An absolute gem in the city! Every detail is thoughtfully curated, making for a truly memorable stay. The staff anticipate your every need. Highly recommended for luxury travelers.",
imageSrc: "http://img.b2bpic.net/free-photo/young-smiling-happy-man-woman-sunglasses-sitting-sand-beach-taking-selfie-photo-phone-camera_285396-737.jpg",
},
{
name: "Emily R.",
role: "Retired Educator",
quote: "My husband and I celebrated our anniversary here, and it was magical. The ambiance, the views, and the warm hospitality made it an experience we'll cherish forever.",
imageSrc: "http://img.b2bpic.net/free-photo/close-up-old-man-date-outdoors_23-2148214567.jpg",
},
{
name: "David K.",
role: "Architect",
quote: "The architecture and interior design are stunning. The Grand Hotel manages to be both grand and incredibly comfortable. A truly inspiring place to stay and unwind.",
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-taking-selfie-home_23-2148925874.jpg",
},
{
name: "Jessica L.",
role: "Artist",
quote: "From the moment I arrived, I felt completely at home. The serene atmosphere of the spa and the exquisite culinary delights were highlights of my perfect getaway.",
imageSrc: "http://img.b2bpic.net/free-photo/relaxed-man-white-bathrobe-slippers-sitting-chair-balcony_259150-59747.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}