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 */}