Merge version_2_1782165967701 into main #1
@@ -1,272 +1,36 @@
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroOverlay from '@/components/sections/hero/HeroOverlay';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import PricingSplitCards from '@/components/sections/pricing/PricingSplitCards';
|
||||
import TestimonialTrustCard from '@/components/sections/testimonial/TestimonialTrustCard';
|
||||
import { Coffee, Star, Users } from "lucide-react";
|
||||
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. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
export default function HomePage() {
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import AboutSection from './HomePage/sections/About';
|
||||
import ServicesSection from './HomePage/sections/Services';
|
||||
import PricingSection from './HomePage/sections/Pricing';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroOverlay
|
||||
tag="Experience True Luxury"
|
||||
title="Welcome to Mövenpick"
|
||||
description="Indulge in an exquisite blend of Swiss heritage, refined gastronomy, and modern comfort."
|
||||
primaryButton={{
|
||||
text: "Book Your Stay",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Explore Services",
|
||||
href: "#services",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/view-luxurious-hotel-interior-space_23-2150683453.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Heritage"
|
||||
title="A Legacy of Hospitality"
|
||||
description="Founded on Swiss roots, we provide exceptional service that turns every stay into a memory worth cherishing."
|
||||
items={[
|
||||
{
|
||||
icon: Star,
|
||||
title: "World-Class Comfort",
|
||||
description: "Premium rooms designed for ultimate rest.",
|
||||
},
|
||||
{
|
||||
icon: Coffee,
|
||||
title: "Culinary Excellence",
|
||||
description: "Gourmet dining experiences by master chefs.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Personalized Service",
|
||||
description: "Attentive staff catering to every need.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/handsome-businessman-with-women-standing-working-cafe_1157-28488.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<FeaturesImageBento
|
||||
tag="Our Offerings"
|
||||
title="Indulgent Services"
|
||||
description="Discover the range of amenities tailored for your relaxation and comfort."
|
||||
items={[
|
||||
{
|
||||
title: "Luxury Spa",
|
||||
description: "Relax in our world-class spa facilities.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/luxury-modern-apartment-with-elegant-wood-flooring-generated-by-ai_188544-36597.jpg",
|
||||
},
|
||||
{
|
||||
title: "Gourmet Dining",
|
||||
description: "Taste the finest international cuisine.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/flute-with-two-white-black-porcelain-plates-different-size-served-table-with-natural-fir-branch_132075-6157.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fitness Center",
|
||||
description: "State-of-the-art gym with latest gear.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-female-mat-exercising_23-2148284930.jpg",
|
||||
},
|
||||
{
|
||||
title: "Infinity Pool",
|
||||
description: "Enjoy a swim with breathtaking views.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hotel-pool-resort_74190-1651.jpg",
|
||||
},
|
||||
{
|
||||
title: "Valet Parking",
|
||||
description: "Seamless arrival experience provided daily.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-with-car_23-2150274556.jpg",
|
||||
},
|
||||
{
|
||||
title: "Concierge",
|
||||
description: "Expert travel assistance for your trip.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/couple-having-date-together-luxurious-restaurant_23-2150517398.jpg",
|
||||
},
|
||||
{
|
||||
title: "Meeting Rooms",
|
||||
description: "Professional spaces for all events.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/gorgeous-italian-hall-with-paintings-wall_8353-656.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ServicesSection />
|
||||
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingSplitCards
|
||||
tag="Stay With Us"
|
||||
title="Room Pricing"
|
||||
description="Find the perfect space for your travel needs."
|
||||
plans={[
|
||||
{
|
||||
tag: "Basic",
|
||||
price: "$299",
|
||||
period: "/night",
|
||||
description: "Perfect for solo travelers.",
|
||||
primaryButton: {
|
||||
text: "Select",
|
||||
href: "#contact",
|
||||
},
|
||||
featuresTitle: "Included Perks",
|
||||
features: [
|
||||
"Complimentary Wifi",
|
||||
"Daily Breakfast",
|
||||
"Room Service",
|
||||
],
|
||||
},
|
||||
{
|
||||
tag: "Suite",
|
||||
price: "$550",
|
||||
period: "/night",
|
||||
description: "Ideal for ultimate relaxation.",
|
||||
primaryButton: {
|
||||
text: "Select",
|
||||
href: "#contact",
|
||||
},
|
||||
featuresTitle: "Suite Benefits",
|
||||
features: [
|
||||
"Ocean View",
|
||||
"Private Lounge Access",
|
||||
"Spa Credits",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<PricingSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialTrustCard
|
||||
quote="A truly unforgettable experience. Mövenpick set the standard for luxury hospitality."
|
||||
rating={5}
|
||||
author="Jennifer L."
|
||||
avatars={[
|
||||
{
|
||||
name: "Guest 1",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-woman-home-doing-her-beauty-routine_23-2150420952.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 2",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-airline-check-attendant-counter_107420-95799.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 3",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/glamorous-young-woman-looking-shoulder-while-drinking-pineapple-cocktail-smiling-blonde-girl-hat-sitting-near-pool-with-fruits_197531-20938.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 4",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-holding-donut_23-2148773571.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 5",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-beautiful-smiling-female-white-lingerie-towel-head_158538-18051.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Impact"
|
||||
title="Hotel Metrics"
|
||||
description="Delivering excellence globally."
|
||||
metrics={[
|
||||
{
|
||||
value: "150+",
|
||||
title: "Rooms Available",
|
||||
features: [
|
||||
"Luxury suites",
|
||||
"Standard rooms",
|
||||
"Family units",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "20+",
|
||||
title: "Global Locations",
|
||||
features: [
|
||||
"Europe",
|
||||
"Middle East",
|
||||
"Asia",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "99%",
|
||||
title: "Guest Satisfaction",
|
||||
features: [
|
||||
"Cleanliness",
|
||||
"Comfort",
|
||||
"Friendly Service",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Help Center"
|
||||
title="Frequently Asked Questions"
|
||||
description="Find answers to common inquiries."
|
||||
categories={[
|
||||
{
|
||||
name: "Bookings",
|
||||
items: [
|
||||
{
|
||||
question: "Can I cancel?",
|
||||
answer: "Yes, flexible rates allow cancellation.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Stay",
|
||||
items: [
|
||||
{
|
||||
question: "Check-in time?",
|
||||
answer: "Check-in is from 3:00 PM.",
|
||||
},
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Connect"
|
||||
text="Book your dream stay with Mövenpick today."
|
||||
primaryButton={{
|
||||
text: "Contact Us",
|
||||
href: "#",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Map",
|
||||
href: "#",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
39
src/pages/HomePage/sections/About.tsx
Normal file
39
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,39 @@
|
||||
// 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 AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import { Coffee, Star, Users } from "lucide-react";
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Heritage"
|
||||
title="A Legacy of Hospitality"
|
||||
description="Founded on Swiss roots, we provide exceptional service that turns every stay into a memory worth cherishing."
|
||||
items={[
|
||||
{
|
||||
icon: Star,
|
||||
title: "World-Class Comfort",
|
||||
description: "Premium rooms designed for ultimate rest.",
|
||||
},
|
||||
{
|
||||
icon: Coffee,
|
||||
title: "Culinary Excellence",
|
||||
description: "Gourmet dining experiences by master chefs.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Personalized Service",
|
||||
description: "Attentive staff catering to every need.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/handsome-businessman-with-women-standing-working-cafe_1157-28488.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
102
src/pages/HomePage/sections/Contact.tsx
Normal file
102
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,102 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import Button from "@/components/ui/Button";
|
||||
import Input from "@/components/ui/Input";
|
||||
import Label from "@/components/ui/Label";
|
||||
|
||||
const primaryButton = {
|
||||
text: "Contact Us",
|
||||
href: "#"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "View Map",
|
||||
href: "#"
|
||||
};
|
||||
|
||||
const ContactInline = () => {
|
||||
return (
|
||||
<section aria-label="Contact section" className="py-20">
|
||||
<div className="w-content-width mx-auto grid grid-cols-1 lg:grid-cols-2 gap-12 items-start">
|
||||
<ScrollReveal variant="fade">
|
||||
<div className="flex flex-col gap-8 md:gap-10 py-10 px-8 rounded card h-full">
|
||||
<div className="flex flex-col gap-2">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Connect"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Book your dream stay with Mövenpick today."}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="text-4xl 2xl:text-5xl leading-[1.15] font-semibold text-balance"
|
||||
/>
|
||||
<p className="text-accent mt-4">
|
||||
Please provide your details below to request a booking or inquire about your stay.
|
||||
</p>
|
||||
</div>
|
||||
<form className="flex flex-col gap-4 mt-4" onSubmit={(e) => e.preventDefault()}>
|
||||
<div>
|
||||
<Label className="mb-1 block">Full Name</Label>
|
||||
<Input type="text" placeholder="John Doe" required className="w-full" />
|
||||
</div>
|
||||
<div>
|
||||
<Label className="mb-1 block">Passport Number</Label>
|
||||
<Input type="text" placeholder="A1234567" required className="w-full" />
|
||||
</div>
|
||||
<div>
|
||||
<Label className="mb-1 block">Telephone Number</Label>
|
||||
<Input type="tel" placeholder="+1 234 567 8900" required className="w-full" />
|
||||
</div>
|
||||
<div>
|
||||
<Label className="mb-1 block">Duration of Vacation</Label>
|
||||
<Input type="text" placeholder="e.g., 7 days" required className="w-full" />
|
||||
</div>
|
||||
<Button text="Submit Request" variant="primary" className="mt-4 w-full" />
|
||||
</form>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
|
||||
<ScrollReveal variant="fade" delay={0.2}>
|
||||
<div className="flex flex-col gap-8 md:gap-10 py-10 px-8 rounded card h-full">
|
||||
<div className="flex flex-col gap-2">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Location"}</p>
|
||||
</div>
|
||||
<TextAnimation
|
||||
text={"Find Us"}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="text-4xl 2xl:text-5xl leading-[1.15] font-semibold text-balance"
|
||||
/>
|
||||
<p className="text-accent mt-4">
|
||||
Visit our luxurious property located in the heart of the city.
|
||||
</p>
|
||||
<div className="mt-6 aspect-video w-full rounded overflow-hidden bg-card">
|
||||
<iframe
|
||||
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3151.835434509374!2d144.9537353153166!3d-37.816279742021665!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6ad65d4c2b349649%3A0xb6899234e561db11!2sEnvato!5e0!3m2!1sen!2sau!4v1622000000000!5m2!1sen!2sau"
|
||||
width="100%"
|
||||
height="100%"
|
||||
style={{ border: 0 }}
|
||||
allowFullScreen=""
|
||||
loading="lazy"
|
||||
></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function ContactSection() {
|
||||
return (
|
||||
<div data-webild-section="contact" id="contact">
|
||||
<ContactInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
40
src/pages/HomePage/sections/Faq.tsx
Normal file
40
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
// 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="Help Center"
|
||||
title="Frequently Asked Questions"
|
||||
description="Find answers to common inquiries."
|
||||
categories={[
|
||||
{
|
||||
name: "Bookings",
|
||||
items: [
|
||||
{
|
||||
question: "Can I cancel?",
|
||||
answer: "Yes, flexible rates allow cancellation.",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Stay",
|
||||
items: [
|
||||
{
|
||||
question: "Check-in time?",
|
||||
answer: "Check-in is from 3:00 PM.",
|
||||
},
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
29
src/pages/HomePage/sections/Hero.tsx
Normal file
29
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,29 @@
|
||||
// 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 HeroOverlay from '@/components/sections/hero/HeroOverlay';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroOverlay
|
||||
tag="Experience True Luxury"
|
||||
title="Welcome to Mövenpick"
|
||||
description="Indulge in an exquisite blend of Swiss heritage, refined gastronomy, and modern comfort."
|
||||
primaryButton={{
|
||||
text: "Book Your Stay",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Explore Services",
|
||||
href: "#services",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/view-luxurious-hotel-interior-space_23-2150683453.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
49
src/pages/HomePage/sections/Metrics.tsx
Normal file
49
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "metrics" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MetricsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Impact"
|
||||
title="Hotel Metrics"
|
||||
description="Delivering excellence globally."
|
||||
metrics={[
|
||||
{
|
||||
value: "150+",
|
||||
title: "Rooms Available",
|
||||
features: [
|
||||
"Luxury suites",
|
||||
"Standard rooms",
|
||||
"Family units",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "20+",
|
||||
title: "Global Locations",
|
||||
features: [
|
||||
"Europe",
|
||||
"Middle East",
|
||||
"Asia",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "99%",
|
||||
title: "Guest Satisfaction",
|
||||
features: [
|
||||
"Cleanliness",
|
||||
"Comfort",
|
||||
"Friendly Service",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
54
src/pages/HomePage/sections/Pricing.tsx
Normal file
54
src/pages/HomePage/sections/Pricing.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "pricing" section.
|
||||
|
||||
import React from 'react';
|
||||
import PricingSplitCards from '@/components/sections/pricing/PricingSplitCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function PricingSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingSplitCards
|
||||
tag="Stay With Us"
|
||||
title="Room Pricing"
|
||||
description="Find the perfect space for your travel needs."
|
||||
plans={[
|
||||
{
|
||||
tag: "Basic",
|
||||
price: "$299",
|
||||
period: "/night",
|
||||
description: "Perfect for solo travelers.",
|
||||
primaryButton: {
|
||||
text: "Select",
|
||||
href: "#contact",
|
||||
},
|
||||
featuresTitle: "Included Perks",
|
||||
features: [
|
||||
"Complimentary Wifi",
|
||||
"Daily Breakfast",
|
||||
"Room Service",
|
||||
],
|
||||
},
|
||||
{
|
||||
tag: "Suite",
|
||||
price: "$550",
|
||||
period: "/night",
|
||||
description: "Ideal for ultimate relaxation.",
|
||||
primaryButton: {
|
||||
text: "Select",
|
||||
href: "#contact",
|
||||
},
|
||||
featuresTitle: "Suite Benefits",
|
||||
features: [
|
||||
"Ocean View",
|
||||
"Private Lounge Access",
|
||||
"Spa Credits",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Services.tsx
Normal file
57
src/pages/HomePage/sections/Services.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "services" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ServicesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<FeaturesImageBento
|
||||
tag="Our Offerings"
|
||||
title="Indulgent Services"
|
||||
description="Discover the range of amenities tailored for your relaxation and comfort."
|
||||
items={[
|
||||
{
|
||||
title: "Luxury Spa",
|
||||
description: "Relax in our world-class spa facilities.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/luxury-modern-apartment-with-elegant-wood-flooring-generated-by-ai_188544-36597.jpg",
|
||||
},
|
||||
{
|
||||
title: "Gourmet Dining",
|
||||
description: "Taste the finest international cuisine.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/flute-with-two-white-black-porcelain-plates-different-size-served-table-with-natural-fir-branch_132075-6157.jpg",
|
||||
},
|
||||
{
|
||||
title: "Fitness Center",
|
||||
description: "State-of-the-art gym with latest gear.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-female-mat-exercising_23-2148284930.jpg",
|
||||
},
|
||||
{
|
||||
title: "Infinity Pool",
|
||||
description: "Enjoy a swim with breathtaking views.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/hotel-pool-resort_74190-1651.jpg",
|
||||
},
|
||||
{
|
||||
title: "Valet Parking",
|
||||
description: "Seamless arrival experience provided daily.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-with-car_23-2150274556.jpg",
|
||||
},
|
||||
{
|
||||
title: "Concierge",
|
||||
description: "Expert travel assistance for your trip.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/couple-having-date-together-luxurious-restaurant_23-2150517398.jpg",
|
||||
},
|
||||
{
|
||||
title: "Meeting Rooms",
|
||||
description: "Professional spaces for all events.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/gorgeous-italian-hall-with-paintings-wall_8353-656.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
42
src/pages/HomePage/sections/Testimonials.tsx
Normal file
42
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,42 @@
|
||||
// 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 TestimonialTrustCard from '@/components/sections/testimonial/TestimonialTrustCard';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialTrustCard
|
||||
quote="A truly unforgettable experience. Mövenpick set the standard for luxury hospitality."
|
||||
rating={5}
|
||||
author="Jennifer L."
|
||||
avatars={[
|
||||
{
|
||||
name: "Guest 1",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-woman-home-doing-her-beauty-routine_23-2150420952.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 2",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-airline-check-attendant-counter_107420-95799.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 3",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/glamorous-young-woman-looking-shoulder-while-drinking-pineapple-cocktail-smiling-blonde-girl-hat-sitting-near-pool-with-fruits_197531-20938.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 4",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-holding-donut_23-2148773571.jpg",
|
||||
},
|
||||
{
|
||||
name: "Guest 5",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-beautiful-smiling-female-white-lingerie-towel-head_158538-18051.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user