diff --git a/web/src/components/FloatingBookingButton.css b/web/src/components/FloatingBookingButton.css new file mode 100644 index 0000000..b5f80ab --- /dev/null +++ b/web/src/components/FloatingBookingButton.css @@ -0,0 +1,58 @@ +/* One fixed stack keeps booking and cookie consent from covering each other. */ +.booking-dock { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 80; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 12px; + padding: 20px; + padding-right: max(20px, env(safe-area-inset-right)); + padding-bottom: max(20px, env(safe-area-inset-bottom)); + padding-left: max(20px, env(safe-area-inset-left)); + pointer-events: none; +} + +.floating-booking { + min-height: 54px; + max-width: 100%; + padding: 0 24px; + font-size: 16px; + box-shadow: 0 6px 22px rgba(242, 97, 84, 0.3); + pointer-events: auto; +} + +.floating-booking svg { + flex-shrink: 0; +} + +.floating-booking:focus-visible { + outline: 3px solid var(--navy); + outline-offset: 4px; +} + +.booking-dock > .cookie-banner { + position: static; + align-self: center; + width: min(900px, 100%); + transform: none; + pointer-events: auto; +} + +@media (max-width: 767px) { + .booking-dock { + padding: 12px; + padding-right: max(12px, env(safe-area-inset-right)); + padding-bottom: max(12px, env(safe-area-inset-bottom)); + padding-left: max(12px, env(safe-area-inset-left)); + } + + .floating-booking { + min-height: 50px; + padding: 0 20px; + font-size: 15px; + } +} diff --git a/web/src/components/FloatingBookingButton.jsx b/web/src/components/FloatingBookingButton.jsx new file mode 100644 index 0000000..eec2f9c --- /dev/null +++ b/web/src/components/FloatingBookingButton.jsx @@ -0,0 +1,21 @@ +import { useLeadModal } from '../context/LeadModalContext.jsx'; +import './FloatingBookingButton.css'; + +export default function FloatingBookingButton() { + const { open } = useLeadModal(); + + return ( + + ); +} diff --git a/web/src/components/Layout.jsx b/web/src/components/Layout.jsx index 34f0dee..3519c14 100644 --- a/web/src/components/Layout.jsx +++ b/web/src/components/Layout.jsx @@ -3,6 +3,7 @@ import { Outlet, useLocation } from 'react-router-dom'; import Header from './Header.jsx'; import Footer from './Footer.jsx'; import CookieBanner from './CookieBanner.jsx'; +import FloatingBookingButton from './FloatingBookingButton.jsx'; import { SiteDataProvider } from '../context/SiteData.jsx'; import { LeadModalProvider } from '../context/LeadModalContext.jsx'; import { getConsent, hit, startMetrika } from '../lib/metrika.js'; @@ -33,7 +34,10 @@ export default function Layout() {