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() {