From a4dc8173fc088221b3fda03e814b654f14c9b063 Mon Sep 17 00:00:00 2001 From: "diana.dolgolyova" Date: Tue, 10 Mar 2026 20:22:12 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20global=20booking=20button=20=E2=80=94?= =?UTF-8?q?=20header=20nav,=20mobile=20menu,=20floating=20CTA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- src/components/layout/Header.tsx | 38 ++++++++++++++++++++++++++++++++ src/components/sections/Hero.tsx | 7 +----- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index b03eebc..adac84d 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -5,11 +5,13 @@ import { Menu, X } from "lucide-react"; import { useState, useEffect } from "react"; import { BRAND, NAV_LINKS } from "@/lib/constants"; import { HeroLogo } from "@/components/ui/HeroLogo"; +import { BookingModal } from "@/components/ui/BookingModal"; export function Header() { const [menuOpen, setMenuOpen] = useState(false); const [scrolled, setScrolled] = useState(false); const [activeSection, setActiveSection] = useState(""); + const [bookingOpen, setBookingOpen] = useState(false); useEffect(() => { function handleScroll() { @@ -19,6 +21,15 @@ export function Header() { return () => window.removeEventListener("scroll", handleScroll); }, []); + // Listen for booking open events from other components + useEffect(() => { + function onOpenBooking() { + setBookingOpen(true); + } + window.addEventListener("open-booking", onOpenBooking); + return () => window.removeEventListener("open-booking", onOpenBooking); + }, []); + useEffect(() => { const sectionIds = NAV_LINKS.map((l) => l.href.replace("#", "")); const observers: IntersectionObserver[] = []; @@ -99,6 +110,12 @@ export function Header() { ); })} +
@@ -136,8 +153,29 @@ export function Header() { ); })} +
+ + {/* Floating booking button — visible on scroll, mobile */} + + + setBookingOpen(false)} /> ); } diff --git a/src/components/sections/Hero.tsx b/src/components/sections/Hero.tsx index 9cc286c..6e2d832 100644 --- a/src/components/sections/Hero.tsx +++ b/src/components/sections/Hero.tsx @@ -1,16 +1,13 @@ "use client"; -import { useState } from "react"; import { siteContent } from "@/data/content"; import { Button } from "@/components/ui/Button"; import { FloatingHearts } from "@/components/ui/FloatingHearts"; import { HeroLogo } from "@/components/ui/HeroLogo"; -import { BookingModal } from "@/components/ui/BookingModal"; import { ChevronDown } from "lucide-react"; export function Hero() { const { hero } = siteContent; - const [bookingOpen, setBookingOpen] = useState(false); return (
@@ -66,12 +63,10 @@ export function Hero() {

-
- - setBookingOpen(false)} /> {/* Scroll indicator */}