Compare commits

...

55 Commits

Author SHA1 Message Date
kudinDmitriyUp
944faba57e Bob AI: Update Book Now button link to point to /booking page 2026-06-03 14:58:58 +00:00
7814a0a2da Merge version_31_1780498619863 into main
Merge version_31_1780498619863 into main
2026-06-03 14:57:58 +00:00
kudinDmitriyUp
83b2e130d8 Bob AI: Populate src/pages/BookingPage.tsx (snippet builder, 1 sections) 2026-06-03 14:57:54 +00:00
kudinDmitriyUp
93a02c1e80 Bob AI: Add booking page 2026-06-03 14:57:42 +00:00
e238609130 Merge version_30_1780498473353 into main
Merge version_30_1780498473353 into main
2026-06-03 14:56:19 +00:00
kudinDmitriyUp
0e7bd853f3 Bob AI: Put textbox in a box and aligned content to top 2026-06-03 14:55:40 +00:00
d30606b170 Merge version_29_1780498347738 into main
Merge version_29_1780498347738 into main
2026-06-03 14:53:54 +00:00
kudinDmitriyUp
9b3c370252 Bob AI: Fix grid columns in about section to show image on the right 2026-06-03 14:53:14 +00:00
9bada32657 Merge version_28_1780498219714 into main
Merge version_28_1780498219714 into main
2026-06-03 14:52:00 +00:00
kudinDmitriyUp
1271ebce90 Bob AI: Update about section layout with top text, left list, right 2026-06-03 14:51:24 +00:00
d74637374f Merge version_27_1780497940774 into main
Merge version_27_1780497940774 into main
2026-06-03 14:47:56 +00:00
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
8 changed files with 149 additions and 46 deletions

View File

@@ -2,11 +2,13 @@ import { Routes, Route } from 'react-router-dom';
import Layout from './components/Layout';
import HomePage from './pages/HomePage';
import BookingPage from "@/pages/BookingPage";
export default function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route path="/" element={<HomePage />} />
<Route path="/booking" element={<BookingPage />} />
</Route>
</Routes>
);

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"
@@ -30,19 +41,30 @@ export default function Layout() {
},
{
"name": "Contact", "href": "#contact"
}
},
{ name: "Booking", href: "/booking" },
];
return (
<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="/booking" variant="primary" />
</div>
</nav>
</SectionErrorBoundary>
<main className="flex-grow">
<Outlet />
@@ -90,4 +112,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;

17
src/pages/BookingPage.tsx Normal file
View File

@@ -0,0 +1,17 @@
import ContactSplitForm from "@/components/sections/contact/ContactSplitForm";
export default function BookingPage() {
return (
<>
<div data-webild-section="ContactSplitForm"><ContactSplitForm
tag="Book Your Session"
title="Schedule Your Appointment"
description="Easily book your preferred service or consultation with us. Fill out the form below, and we'll confirm your slot shortly."
inputs={[{"name":"name","type":"text","placeholder":"Your Full Name","required":true},{"name":"email","type":"email","placeholder":"Your Email Address","required":true},{"name":"phone","type":"tel","placeholder":"Your Phone Number (Optional)"},{"name":"service","type":"text","placeholder":"Desired Service (e.g., Consultation)"},{"name":"date","type":"date","placeholder":"Preferred Date"}]}
textarea={{"name":"message","placeholder":"Tell us more about your needs or questions...","rows":4}}
buttonText="Confirm Booking"
imageSrc="https://img.freepik.com/free-photo/young-woman-making-appointment-online_23-2149154371.jpg"
/></div>
</>
);
}

View File

@@ -14,6 +14,21 @@ 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 {

View File

@@ -1,18 +1,60 @@
// 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 AboutText from '@/components/sections/about/AboutText';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
import Tag from "@/components/ui/Tag";
import ScrollReveal from "@/components/ui/ScrollReveal";
import ImageOrVideo from "@/components/ui/ImageOrVideo";
import Button from "@/components/ui/Button";
import { Check } from "lucide-react";
export default function AboutSection(): React.JSX.Element {
export default function AboutSection() {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="Our Legacy of Hospitality"
/>
</SectionErrorBoundary>
<section data-webild-section="about" id="about" className="bg-background py-24">
<div className="max-w-content-width mx-auto px-6">
<ScrollReveal variant="slide-up">
<div className="bg-card border border-border rounded-theme p-8 md:p-12 mb-16 space-y-6 max-w-4xl mx-auto text-left">
<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>
</div>
</ScrollReveal>
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 items-start">
<ScrollReveal variant="slide-up">
<div className="space-y-8">
<ul className="space-y-4">
{[
"Award-winning fine dining restaurants",
"World-class spa and wellness center",
"24/7 personalized concierge service",
"Breathtaking panoramic city views",
"State-of-the-art fitness facilities"
].map((item, index) => (
<li key={index} className="flex items-center gap-3">
<div className="flex-shrink-0 w-6 h-6 rounded-full bg-primary/10 flex items-center justify-center">
<Check className="w-4 h-4 text-primary" />
</div>
<span className="text-foreground">{item}</span>
</li>
))}
</ul>
<Button text="Discover Our Story" variant="primary" />
</div>
</ScrollReveal>
<ScrollReveal variant="fade">
<div className="relative h-[500px] 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

@@ -24,36 +24,40 @@ export default function HeroSection(): React.JSX.Element {
const timer = setInterval(() => {
setProgress((prev) => {
if (prev >= 100) {
setCurrentIndex((prevIndex) => (prevIndex + 1) % images.length);
return 0;
}
if (prev >= 100) return 100;
return prev + step;
});
}, updateInterval);
return () => clearInterval(timer);
}, [images.length]);
}, []);
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 bg-background">
<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 gap-12">
<div className="flex flex-col items-center gap-6 max-w-4xl">
<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-7xl font-bold text-foreground">
<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 md:text-xl text-muted-foreground max-w-2xl">
<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 mt-4">
<Button text="Book Your Stay" variant="primary" href="#contact" className="text-lg px-8 py-6" />
<Button text="Explore Rooms" variant="secondary" href="#accommodation" className="text-lg px-8 py-6" />
<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 border border-border relative">
<div className="w-full rounded-3xl overflow-hidden shadow-2xl relative">
<div className="relative w-full h-[60vh]">
{images.map((src, index) => (
<div
@@ -67,7 +71,7 @@ export default function HeroSection(): React.JSX.Element {
</div>
))}
</div>
<div className="absolute bottom-6 left-1/2 -translate-x-1/2 flex gap-3 w-full max-w-md px-4 z-20">
<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

View File

@@ -6,4 +6,5 @@ export interface Route {
export const routes: Route[] = [
{ path: '/', label: 'Home', pageFile: 'HomePage' },
{ path: '/booking', label: 'Booking', pageFile: 'BookingPage' },
];