30 Commits

Author SHA1 Message Date
b1739ae5f7 Merge version_14_1780418362755 into main
Merge version_14_1780418362755 into main
2026-06-02 16:39:42 +00:00
kudinDmitriyUp
15c8e946ed Bob AI (stub): fix the layout in the rooms section because there is a lot o 2026-06-02 16:39:39 +00:00
a5596c3348 Merge version_13_1780417301194 into main
Merge version_13_1780417301194 into main
2026-06-02 16:24:38 +00:00
kudinDmitriyUp
29b956f2fd Bob AI: fix build errors (attempt 1) 2026-06-02 16:24:11 +00:00
kudinDmitriyUp
8e24e07fed Bob AI: Added more cards to the rooms section. 2026-06-02 16:22:14 +00:00
5044c1fd12 Merge version_12_1780417142958 into main
Merge version_12_1780417142958 into main
2026-06-02 16:19:45 +00:00
kudinDmitriyUp
84e4ab365f Bob AI: Refine the main headline in the hero section to clearly state the primary value 2026-06-02 16:19:39 +00:00
2afc73664f Merge version_11_1780416966007 into main
Merge version_11_1780416966007 into main
2026-06-02 16:17:59 +00:00
kudinDmitriyUp
3698c6d186 Bob AI: fix build errors (attempt 1) 2026-06-02 16:17:20 +00:00
kudinDmitriyUp
2c869b1fe7 Bob AI: Added a prominent booking CTA section after rates. 2026-06-02 16:16:38 +00:00
142e7f113c Merge version_10_1780416788314 into main
Merge version_10_1780416788314 into main
2026-06-02 16:15:14 +00:00
kudinDmitriyUp
ee580473d9 Bob AI: Updated global styles to a premium blue color theme. 2026-06-02 16:14:31 +00:00
18454c63be Merge version_9_1780416549900 into main
Merge version_9_1780416549900 into main
2026-06-02 16:12:14 +00:00
kudinDmitriyUp
f4760b4ad2 Bob AI (stub): I want a premium blue color theme 2026-06-02 16:12:08 +00:00
450ec1bc3c Merge version_8_1780416382501 into main
Merge version_8_1780416382501 into main
2026-06-02 16:07:59 +00:00
kudinDmitriyUp
f8c2cb6c42 Bob AI: Updated global style to a premium blue color theme. 2026-06-02 16:07:20 +00:00
efd91b19fe Merge version_7_1780416131141 into main
Merge version_7_1780416131141 into main
2026-06-02 16:04:23 +00:00
kudinDmitriyUp
ce1111b45e Bob AI: Added rotating image carousel with progress bar to about sec 2026-06-02 16:03:46 +00:00
d0cebafa09 Merge version_6_1780416011152 into main
Merge version_6_1780416011152 into main
2026-06-02 16:01:40 +00:00
kudinDmitriyUp
2f1bd4c7b0 Bob AI (stub): change the about section's image to rotate every 5 seconds a 2026-06-02 16:01:34 +00:00
9f978faae1 Merge version_5_1780415848006 into main
Merge version_5_1780415848006 into main
2026-06-02 15:58:53 +00:00
kudinDmitriyUp
2f0564e52f Bob AI (stub): change the about section's image to rotate every 5 seconds a 2026-06-02 15:58:49 +00:00
f3204164f5 Merge version_4_1780415625629 into main
Merge version_4_1780415625629 into main
2026-06-02 15:56:11 +00:00
kudinDmitriyUp
ebd1186e4d Bob AI: Replaced about section with bullet points and an image. 2026-06-02 15:55:24 +00:00
a89e02dc40 Merge version_3_1780415372754 into main
Merge version_3_1780415372754 into main
2026-06-02 15:52:36 +00:00
kudinDmitriyUp
a7c5de9f60 Bob AI: fix build errors (attempt 1) 2026-06-02 15:52:00 +00:00
kudinDmitriyUp
d8b08eeae5 Bob AI: Replaced billboard hero with a big image hero section 2026-06-02 15:51:19 +00:00
4b43e4ba11 Merge version_2_1780415167973 into main
Merge version_2_1780415167973 into main
2026-06-02 15:47:39 +00:00
kudinDmitriyUp
02a06d94c7 Bob AI (stub): make the hero section with a big image 2026-06-02 15:47:36 +00:00
kudinDmitriyUp
b337af83c9 Bob AI: Split src/pages/HomePage.tsx into per-section files (9 sections) 2026-06-02 15:46:19 +00:00
12 changed files with 649 additions and 332 deletions

View File

@@ -4,6 +4,46 @@
@import "./styles/animations.css";
:root {
--background: 222 47% 11%;
--foreground: 210 40% 98%;
--card: 222 47% 11%;
--card-foreground: 210 40% 98%;
--popover: 222 47% 11%;
--popover-foreground: 210 40% 98%;
--primary: 221 83% 53%;
--primary-foreground: 210 40% 98%;
--secondary: 217 33% 17%;
--secondary-foreground: 210 40% 98%;
--muted: 217 33% 17%;
--muted-foreground: 215 20% 65%;
--accent: 217 33% 17%;
--accent-foreground: 210 40% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
--border: 217 33% 17%;
--input: 217 33% 17%;
--ring: 221 83% 53%;
--radius: 0.5rem;
}
--background: 222 47% 11%;
--foreground: 210 40% 98%;
--card: 223 47% 14%;
--card-foreground: 210 40% 98%;
--popover: 223 47% 14%;
--popover-foreground: 210 40% 98%;
--primary: 217 91% 60%;
--primary-foreground: 222 47% 11%;
--secondary: 217 33% 17%;
--secondary-foreground: 210 40% 98%;
--muted: 217 33% 17%;
--muted-foreground: 215 20% 65%;
--accent: 217 33% 17%;
--accent-foreground: 210 40% 98%;
--destructive: 0 63% 31%;
--destructive-foreground: 210 40% 98%;
--border: 217 33% 17%;
--input: 217 33% 17%;
--ring: 224 76% 48%;
/* @colorThemes/lightTheme/grayNavyBlue */
--background: #0a0a0a;
--card: #1a1a1a;

View File

@@ -1,338 +1,47 @@
import AboutText from '@/components/sections/about/AboutText';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
import FeaturesResultsComparison from '@/components/sections/features/FeaturesResultsComparison';
import HeroBillboardCreator from '@/components/sections/hero/HeroBillboardCreator';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import TestimonialOverlayCards from '@/components/sections/testimonial/TestimonialOverlayCards';
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 RoomsSection from './HomePage/sections/Rooms';
import AmenitiesSection from './HomePage/sections/Amenities';
import RatesSection from './HomePage/sections/Rates';
import ReviewsSection from './HomePage/sections/Reviews';
import PartnersSection from './HomePage/sections/Partners';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
{/* webild-stub @2026-06-02T16:39:38.244Z: fix the layout in the rooms section because there is a lot of empty space on the right, specifically from the fourth row, 1/3 from the right side */}
import BookingCtaSection from './HomePage/sections/BookingCta';{/* webild-stub @2026-06-02T16:12:07.363Z: I want a premium blue color theme */}
{/* webild-stub @2026-06-02T16:01:32.987Z: change the about section's image to rotate every 5 seconds and add a progress bar at the bottom of the image */}
{/* webild-stub @2026-06-02T15:58:48.008Z: change the about section's image to rotate every 5 seconds and add a progress bar at the bottom */}
{/* webild-stub @2026-06-02T15:47:34.838Z: make the hero section with a big image */}
export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBillboardCreator
tag="Your Ultimate Escape"
title="Experience Unrivaled Luxury at The Grand Hotel"
titleHighlight="Unrivaled Luxury"
description="Discover a world of refined elegance, impeccable service, and breathtaking amenities designed for an unforgettable stay. Your perfect getaway begins here."
primaryButton={{
text: "Book Your Stay",
href: "#contact",
}}
note="Voted #1 Luxury Hotel 5 Years in a Row by Global Travel Magazine"
videos={[
{
videoSrc: "asset://hero-video-1",
name: "Luxury Stays",
followers: "5000+ Guest Reviews",
imageSrc: "http://img.b2bpic.net/free-photo/closeup-photo-huge-bouquet-made-hydrangeas-standing-table-large-luxurious-room_627829-8201.jpg",
},
{
videoSrc: "asset://hero-video-2",
name: "Gourmet Dining",
followers: "Michelin Star Rated",
imageSrc: "http://img.b2bpic.net/free-photo/luxurious-modern-bedroom-with-comfortable-bedding-elegant-decor-generated-by-ai_188544-29870.jpg",
},
{
videoSrc: "asset://hero-video-3",
name: "Spa & Wellness",
followers: "Award-Winning Services",
imageSrc: "http://img.b2bpic.net/free-photo/towels-interior-spa-complex_169016-22506.jpg",
},
]}
badgeText="5-Star Excellence"
/>
</SectionErrorBoundary>
</div>
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="About The Grand Hotel"
/>
</SectionErrorBoundary>
</div>
<div id="rooms" data-section="rooms">
<SectionErrorBoundary name="rooms">
<FeaturesImageBento
tag="Our Accommodations"
title="Rooms & Suites Gallery"
description="Explore our lavish rooms and opulent suites, each meticulously designed for comfort and elegance. From breathtaking city views to serene garden vistas, find your perfect sanctuary."
items={[
{
imageSrc: "http://img.b2bpic.net/free-photo/pillow-bed_1203-9643.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-rendering-beautiful-luxury-dark-wood-european-classic-bedroom-suite-hotel_105762-2164.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/steel-faucet-bathtub-bathroom-interior-with-window_169016-26296.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/men-looking-out-window-cafe_23-2147775903.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/spa-complements_23-2147645728.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/side-view-women-gym_23-2148503087.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/wide-view-dining-hall-classic-design_114579-2224.jpg",
href: "#",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="amenities" data-section="amenities">
<SectionErrorBoundary name="amenities">
<FeaturesResultsComparison
tag="Transform Your Stay"
title="Experience Pure Rejuvenation"
description="From arrival to departure, our bespoke services are meticulously designed to elevate your well-being and leave you completely refreshed, creating lasting memories of tranquility."
items={[
{
treatment: "Stress-Free Spa",
detail: "Discover serenity with a personalized session at our world-class spa.",
beforeSrc: "",
afterSrc: "",
},
{
treatment: "Gourmet Dining",
detail: "Indulge your palate with an exquisite culinary journey at our acclaimed restaurants.",
beforeSrc: "",
afterSrc: "",
},
{
treatment: "Serene Sleep",
detail: "Experience ultimate comfort and deep relaxation in our plush, tranquil beds.",
beforeSrc: "",
afterSrc: "",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="rates" data-section="rates">
<SectionErrorBoundary name="rates">
<PricingHighlightedCards
tag="Our Exclusive Offers"
title="Find Your Perfect Stay"
description="Choose from our selection of meticulously crafted room and suite packages, each offering a unique blend of luxury and comfort tailored to your desires."
plans={[
{
tag: "Standard",
price: "$350/night",
description: "Comfort and elegance for a serene escape.",
features: [
"Luxury King Bed",
"City View",
"Complimentary Breakfast",
"Access to Fitness Center",
],
primaryButton: {
text: "Book Standard",
href: "#contact",
},
},
{
tag: "Deluxe",
price: "$550/night",
description: "Elevated comfort with premium amenities.",
features: [
"Spacious Room",
"Panoramic Views",
"Spa Credit Included",
"Late Check-out",
],
highlight: "Popular Choice",
primaryButton: {
text: "Book Deluxe",
href: "#contact",
},
},
{
tag: "Grand Suite",
price: "$900/night",
description: "Unparalleled luxury and personalized service.",
features: [
"Exclusive Lounge Access",
"Personal Concierge",
"Private Dining Experience",
"Airport Transfer",
],
primaryButton: {
text: "Book Grand Suite",
href: "#contact",
},
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="reviews" data-section="reviews">
<SectionErrorBoundary name="reviews">
<TestimonialOverlayCards
tag="What Our Guests Say"
title="Hear From Our Satisfied Visitors"
description="Read the glowing reviews and heartfelt experiences shared by those who have discovered the magic of The Grand Hotel. Your exceptional stay awaits."
testimonials={[
{
name: "Isabella Chen",
role: "Frequent Traveler",
company: "Luxury Lifestyle Magazine",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-night-dress-sitting-edge-pool-holding-champagne-house-daytime_176474-4936.jpg",
},
{
name: "Marcus Thorne",
role: "Business Executive",
company: "Global Innovations Inc.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/couple-sitting-by-tree-spring-forest_1157-32865.jpg",
},
{
name: "Sophia Rodriguez",
role: "Wedding Planner",
company: "Elite Events Co.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/people-having-dinner-luxurious-restaurants_23-2151081913.jpg",
},
{
name: "David Lee",
role: "Explorer",
company: "Solo Adventures Blog",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/sisters-fighting-with-pillows_1303-11231.jpg",
},
{
name: "Eleanor Vance",
role: "Travel Influencer",
company: "Wanderlust Diaries",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/smiling-woman-with-olives-beer_23-2147680964.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
<div id="partners" data-section="partners">
<SectionErrorBoundary name="partners">
<SocialProofMarquee
tag="Trusted By The Best"
title="Awards & Esteemed Partners"
description="Proudly recognized by leading travel organizations and trusted by prestigious partners worldwide, ensuring an unparalleled experience."
names={[
"Condé Nast Traveler",
"Forbes Travel Guide",
"Michelin Guide",
"Leading Hotels of the World",
"Virtuoso",
"American Express Fine Hotels + Resorts",
"Relais & Châteaux",
]}
/>
</SectionErrorBoundary>
</div>
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTabbedAccordion
tag="Need Assistance?"
title="Frequently Asked Questions"
description="Find quick answers to common queries about your stay, dining, and hotel services. Our comprehensive FAQ is designed to assist you effortlessly."
categories={[
{
name: "Booking & Reservations",
items: [
{
question: "How do I make a reservation?",
answer: "Reservations can be made directly on our website, via phone, or through our preferred travel partners. Visit our 'Book Now' section for more details.",
},
{
question: "What is your cancellation policy?",
answer: "Our standard cancellation policy allows free cancellation up to 48 hours prior to your arrival date. Specific packages may have different policies, so please check your booking details.",
},
{
question: "Do you offer group rates?",
answer: "Yes, we offer special rates for group bookings. Please contact our events team directly to discuss your requirements and receive a personalized quote.",
},
],
},
{
name: "Hotel Services",
items: [
{
question: "What amenities are included in my stay?",
answer: "All guests enjoy complimentary Wi-Fi, access to our fitness center, and a welcome drink upon arrival. Depending on your room type, additional amenities like spa credit or lounge access may be included.",
},
{
question: "Is parking available?",
answer: "Valet parking is available for all guests at a daily rate. Self-parking options are also available nearby. Please inquire with our concierge for details.",
},
{
question: "Do you have a concierge service?",
answer: "Our dedicated concierge team is available 24/7 to assist with dining reservations, tour bookings, transportation, and any other requests to enhance your stay.",
},
],
},
{
name: "Dining",
items: [
{
question: "What dining options are available?",
answer: "The Grand Hotel boasts several dining venues, including our Michelin-starred restaurant, an elegant cafe, and a sophisticated bar. Room service is also available 24 hours a day.",
},
{
question: "Do you cater to dietary restrictions?",
answer: "Our culinary team is happy to accommodate most dietary restrictions and allergies. Please inform us of your needs when making a reservation or upon arrival.",
},
],
},
]}
cta={{
name: "Our Concierge",
role: "Always Here to Help",
buttonText: "Contact Support",
buttonHref: "#contact",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-businessman-using-tablet_23-2148242702.jpg",
}}
/>
</SectionErrorBoundary>
</div>
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Ready to Experience Luxury?"
text="Book Your Unforgettable Stay at The Grand Hotel Today and Indulge in World-Class Hospitality."
primaryButton={{
text: "Book Now",
href: "#",
}}
secondaryButton={{
text: "Contact Us",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
<HeroSection headline="Discover Unrivaled Luxury: Your Perfect Getaway Awaits" />
<AboutSection />
<RoomsSection />
<AmenitiesSection />
<RatesSection />
<BookingCtaSection />
<ReviewsSection />
<PartnersSection />
<FaqSection />
<ContactSection />
</>
);
}

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 "about" section.
import React from 'react';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import Tag from "@/components/ui/Tag";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import ScrollReveal from "@/components/ui/ScrollReveal";
import { CheckCircle2 } from "lucide-react";
export default function AboutSection(): React.JSX.Element {
const [currentIndex, setCurrentIndex] = React.useState(0);
const IMAGES = [
"https://images.unsplash.com/photo-1566073771259-6a8506099945?auto=format&fit=crop&q=80",
"https://images.unsplash.com/photo-1582719478250-c894e4dc24a5?auto=format&fit=crop&q=80",
"https://images.unsplash.com/photo-1542314831-c6a4d14d8c85?auto=format&fit=crop&q=80"
];
React.useEffect(() => {
const timer = setInterval(() => {
setCurrentIndex((prev) => (prev + 1) % IMAGES.length);
}, 5000);
return () => clearInterval(timer);
}, []);
return (
<div id="about" data-section="about" className="py-24 bg-background">
<SectionErrorBoundary name="about">
<style>{`
@keyframes progress-bar {
0% { width: 0%; }
100% { width: 100%; }
}
`}</style>
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<ScrollReveal variant="slide-up">
<div className="space-y-6">
<Tag text="About Us" />
<h2 className="text-4xl md:text-5xl font-bold text-foreground">
A Legacy of Excellence
</h2>
<p className="text-lg text-muted-foreground">
Experience the perfect blend of classic elegance and modern luxury. Since our founding, we have been dedicated to providing unparalleled service and unforgettable experiences for our guests.
</p>
<ul className="space-y-4 mt-8">
{[
"Award-winning dining experiences",
"World-class spa and wellness center",
"Prime location in the heart of the city",
"Exceptional personalized concierge service"
].map((item, index) => (
<li key={index} className="flex items-center space-x-3 text-foreground">
<CheckCircle2 className="w-6 h-6 text-primary" />
<span>{item}</span>
</li>
))}
</ul>
</div>
</ScrollReveal>
<ScrollReveal variant="fade-blur">
<div className="relative h-[500px] rounded-2xl overflow-hidden">
{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 className="absolute bottom-0 left-0 right-0 h-1.5 bg-black/40 z-20">
<div
key={currentIndex}
className="h-full bg-primary"
style={{ animation: 'progress-bar 5s linear' }}
/>
</div>
</div>
</ScrollReveal>
</div>
</div>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,40 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "amenities" section.
import React from 'react';
import FeaturesResultsComparison from '@/components/sections/features/FeaturesResultsComparison';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AmenitiesSection(): React.JSX.Element {
return (
<div id="amenities" data-section="amenities">
<SectionErrorBoundary name="amenities">
<FeaturesResultsComparison
tag="Transform Your Stay"
title="Experience Pure Rejuvenation"
description="From arrival to departure, our bespoke services are meticulously designed to elevate your well-being and leave you completely refreshed, creating lasting memories of tranquility."
items={[
{
treatment: "Stress-Free Spa",
detail: "Discover serenity with a personalized session at our world-class spa.",
beforeSrc: "",
afterSrc: "",
},
{
treatment: "Gourmet Dining",
detail: "Indulge your palate with an exquisite culinary journey at our acclaimed restaurants.",
beforeSrc: "",
afterSrc: "",
},
{
treatment: "Serene Sleep",
detail: "Experience ultimate comfort and deep relaxation in our plush, tranquil beds.",
beforeSrc: "",
afterSrc: "",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,28 @@
// Created by create_section tool.
import React from 'react';
import ScrollReveal from '@/components/ui/ScrollReveal';
import Tag from '@/components/ui/Tag';
import Button from '@/components/ui/Button';
export default function BookingCtaSection(): React.JSX.Element {
return (
<div data-webild-section="booking-cta" className="bg-card">
<div className="container mx-auto px-4 text-center">
<ScrollReveal variant="slide-up">
<Tag text="Ready to Relax?"className="mb-6 mx-auto" />
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-6">
Book Your Stay Today
</h2>
<p className="text-lg text-muted-foreground max-w-content-width mx-auto">
Experience unrivaled luxury and impeccable service. Check our availability and secure your perfect getaway now.
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
<Button text="Check Availability" variant="primary" />
<Button text="View Special Offers" variant="secondary" />
</div>
</ScrollReveal>
</div>
</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="Ready to Experience Luxury?"
text="Book Your Unforgettable Stay at The Grand Hotel Today and Indulge in World-Class Hospitality."
primaryButton={{
text: "Book Now",
href: "#",
}}
secondaryButton={{
text: "Contact Us",
href: "#",
}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,76 @@
// 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 FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqTabbedAccordion
tag="Need Assistance?"
title="Frequently Asked Questions"
description="Find quick answers to common queries about your stay, dining, and hotel services. Our comprehensive FAQ is designed to assist you effortlessly."
categories={[
{
name: "Booking & Reservations",
items: [
{
question: "How do I make a reservation?",
answer: "Reservations can be made directly on our website, via phone, or through our preferred travel partners. Visit our 'Book Now' section for more details.",
},
{
question: "What is your cancellation policy?",
answer: "Our standard cancellation policy allows free cancellation up to 48 hours prior to your arrival date. Specific packages may have different policies, so please check your booking details.",
},
{
question: "Do you offer group rates?",
answer: "Yes, we offer special rates for group bookings. Please contact our events team directly to discuss your requirements and receive a personalized quote.",
},
],
},
{
name: "Hotel Services",
items: [
{
question: "What amenities are included in my stay?",
answer: "All guests enjoy complimentary Wi-Fi, access to our fitness center, and a welcome drink upon arrival. Depending on your room type, additional amenities like spa credit or lounge access may be included.",
},
{
question: "Is parking available?",
answer: "Valet parking is available for all guests at a daily rate. Self-parking options are also available nearby. Please inquire with our concierge for details.",
},
{
question: "Do you have a concierge service?",
answer: "Our dedicated concierge team is available 24/7 to assist with dining reservations, tour bookings, transportation, and any other requests to enhance your stay.",
},
],
},
{
name: "Dining",
items: [
{
question: "What dining options are available?",
answer: "The Grand Hotel boasts several dining venues, including our Michelin-starred restaurant, an elegant cafe, and a sophisticated bar. Room service is also available 24 hours a day.",
},
{
question: "Do you cater to dietary restrictions?",
answer: "Our culinary team is happy to accommodate most dietary restrictions and allergies. Please inform us of your needs when making a reservation or upon arrival.",
},
],
},
]}
cta={{
name: "Our Concierge",
role: "Always Here to Help",
buttonText: "Contact Support",
buttonHref: "#contact",
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-businessman-using-tablet_23-2148242702.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 "hero" section.
import React from 'react';
import Button from '@/components/ui/Button';
import Tag from '@/components/ui/Tag';
import ImageOrVideo from '@/components/ui/ImageOrVideo';
import ScrollReveal from '@/components/ui/ScrollReveal';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-webild-section="hero" className="relative min-h-[80vh] flex items-center justify-center overflow-hidden">
<SectionErrorBoundary name="hero">
<div className="absolute inset-0 z-0">
<ImageOrVideo
imageSrc="https://images.unsplash.com/photo-1542314831-c6a4d14d8c85?auto=format&fit=crop&q=80"
className="w-full h-full object-cover"
/>
<div className="absolute inset-0 bg-black/60" />
</div>
<div className="relative z-10 container mx-auto px-4 text-center">
<ScrollReveal variant="slide-up">
<Tag text="Your Ultimate Escape" className="mb-6 mx-auto bg-black/50 text-white border-white/20" />
<h1 className="text-5xl md:text-7xl font-bold text-white mb-6 tracking-tight">
Experience Unrivaled Luxury<br />
<span className="text-primary-cta">at The Grand Hotel</span>
</h1>
<p className="text-lg md:text-xl text-white/90 max-w-content-width mx-auto">
Discover a world of refined elegance, impeccable service, and breathtaking amenities designed for an unforgettable stay. Your perfect getaway begins here.
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
<Button text="Book Your Stay" variant="primary" href="#contact" className="px-8 py-4 text-lg" />
<Button text="Explore Rooms" variant="secondary" href="#rooms" className="px-8 py-4 text-lg text-white border-white/20" />
</div>
</ScrollReveal>
</div>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,29 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "partners" section.
import React from 'react';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function PartnersSection(): React.JSX.Element {
return (
<div id="partners" data-section="partners">
<SectionErrorBoundary name="partners">
<SocialProofMarquee
tag="Trusted By The Best"
title="Awards & Esteemed Partners"
description="Proudly recognized by leading travel organizations and trusted by prestigious partners worldwide, ensuring an unparalleled experience."
names={[
"Condé Nast Traveler",
"Forbes Travel Guide",
"Michelin Guide",
"Leading Hotels of the World",
"Virtuoso",
"American Express Fine Hotels + Resorts",
"Relais & Châteaux",
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,68 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "rates" section.
import React from 'react';
import PricingHighlightedCards from '@/components/sections/pricing/PricingHighlightedCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function RatesSection(): React.JSX.Element {
return (
<div id="rates" data-section="rates">
<SectionErrorBoundary name="rates">
<PricingHighlightedCards
tag="Our Exclusive Offers"
title="Find Your Perfect Stay"
description="Choose from our selection of meticulously crafted room and suite packages, each offering a unique blend of luxury and comfort tailored to your desires."
plans={[
{
tag: "Standard",
price: "$350/night",
description: "Comfort and elegance for a serene escape.",
features: [
"Luxury King Bed",
"City View",
"Complimentary Breakfast",
"Access to Fitness Center",
],
primaryButton: {
text: "Book Standard",
href: "#contact",
},
},
{
tag: "Deluxe",
price: "$550/night",
description: "Elevated comfort with premium amenities.",
features: [
"Spacious Room",
"Panoramic Views",
"Spa Credit Included",
"Late Check-out",
],
highlight: "Popular Choice",
primaryButton: {
text: "Book Deluxe",
href: "#contact",
},
},
{
tag: "Grand Suite",
price: "$900/night",
description: "Unparalleled luxury and personalized service.",
features: [
"Exclusive Lounge Access",
"Personal Concierge",
"Private Dining Experience",
"Airport Transfer",
],
primaryButton: {
text: "Book Grand Suite",
href: "#contact",
},
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,57 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "reviews" section.
import React from 'react';
import TestimonialOverlayCards from '@/components/sections/testimonial/TestimonialOverlayCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ReviewsSection(): React.JSX.Element {
return (
<div id="reviews" data-section="reviews">
<SectionErrorBoundary name="reviews">
<TestimonialOverlayCards
tag="What Our Guests Say"
title="Hear From Our Satisfied Visitors"
description="Read the glowing reviews and heartfelt experiences shared by those who have discovered the magic of The Grand Hotel. Your exceptional stay awaits."
testimonials={[
{
name: "Isabella Chen",
role: "Frequent Traveler",
company: "Luxury Lifestyle Magazine",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/woman-night-dress-sitting-edge-pool-holding-champagne-house-daytime_176474-4936.jpg",
},
{
name: "Marcus Thorne",
role: "Business Executive",
company: "Global Innovations Inc.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/couple-sitting-by-tree-spring-forest_1157-32865.jpg",
},
{
name: "Sophia Rodriguez",
role: "Wedding Planner",
company: "Elite Events Co.",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/people-having-dinner-luxurious-restaurants_23-2151081913.jpg",
},
{
name: "David Lee",
role: "Explorer",
company: "Solo Adventures Blog",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/sisters-fighting-with-pillows_1303-11231.jpg",
},
{
name: "Eleanor Vance",
role: "Travel Influencer",
company: "Wanderlust Diaries",
rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/smiling-woman-with-olives-beer_23-2147680964.jpg",
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,110 @@
import React from 'react';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import TextAnimation from "@/components/ui/TextAnimation";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import ScrollReveal from "@/components/ui/ScrollReveal";
export default function RoomsSection(): React.JSX.Element {
const items = [
{
imageSrc: "http://img.b2bpic.net/free-photo/pillow-bed_1203-9643.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/3d-rendering-beautiful-luxury-dark-wood-european-classic-bedroom-suite-hotel_105762-2164.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/steel-faucet-bathtub-bathroom-interior-with-window_169016-26296.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/men-looking-out-window-cafe_23-2147775903.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/spa-complements_23-2147645728.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/side-view-women-gym_23-2148503087.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/wide-view-dining-hall-classic-design_114579-2224.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/luxury-bedroom-suite-resort-high-rise-hotel-with-working-table_105762-1783.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/relaxing-area-with-two-chairs-small-table_1203-3222.jpg",
href: "#",
},
{
imageSrc: "http://img.b2bpic.net/free-photo/modern-studio-apartment-design-with-bedroom-living-space_1262-12375.jpg",
href: "#",
},
];
const spans = [
"md:col-span-2",
"md:col-span-1",
"md:col-span-1",
"md:col-span-1",
"md:col-span-2",
"md:col-span-1",
"md:col-span-1",
"md:col-span-1",
"md:col-span-2",
"md:col-span-2",
];
return (
<div id="rooms" data-section="rooms" className="">
<SectionErrorBoundary name="rooms">
<div className="flex flex-col gap-8 mx-auto w-content-width">
<div className="flex flex-col items-center gap-2">
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
<p>Our Accommodations</p>
</div>
<TextAnimation
text="Rooms & Suites Gallery"
variant="fade"
gradientText={true}
tag="h2"
className="md:max-w-8/10 text-6xl 2xl:text-7xl leading-[1.15] font-semibold text-center text-balance"
/>
<TextAnimation
text="Explore our lavish rooms and opulent suites, each meticulously designed for comfort and elegance. From breathtaking city views to serene garden vistas, find your perfect sanctuary."
variant="fade"
gradientText={false}
tag="p"
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-center text-balance"
/>
</div>
<ScrollReveal variant="fade-blur">
<div className="grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4 xl:gap-5 2xl:gap-6">
{items.map((item, index) => (
<a
key={index}
href={item.href}
className={`block relative h-64 md:h-80 card rounded overflow-hidden group ${spans[index] ||"md:col-span-1"}`}
>
<ImageOrVideo
imageSrc={item.imageSrc}
className="absolute inset-0 w-full h-full object-cover transition-transform duration-700 group-hover:scale-105"
/>
</a>
))}
</div>
</ScrollReveal>
</div>
</SectionErrorBoundary>
</div>
);
}