{"version":3,"file":"BookingEmbed.Cz9CU76k.mjs","names":["useRef","useState"],"sources":["https:/framerusercontent.com/modules/FNh1MjDxayfn5KMXsTQx/2BrxQBThugeUPgQWkLmG/BookingEmbed.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";const SCRIPT_SRC=\"https://heritagehomecleaners.bookingkoala.com/resources/embed.js\";// BookingKoala's embed.js looks the iframe up by this exact id.\nconst IFRAME_ID=\"iFrameResizer0\";// Heights below this are BookingKoala boot placeholders, not the loaded form\nconst MIN_REAL_HEIGHT=300;// BookingKoala's documented preselect parameters (\"Query parameters & preselected\n// fields on the booking form\"). Only these are passed from the page URL to the form.\n// hhc_start is Heritage's own flag, not BookingKoala's: hhc_start=deep makes the BookingKoala header\n// script answer \"No - start with a Deep Cleaning\" on the form (see New Header Code Override.txt).\nconst BK_PARAM=/^(industry_id|form_id|location|f_name|l_name|email|phone|service_id|frequency_id|zipcode|minutes|coupon|date|hhc_start|(pricing_parameter|area_parameter|extras)\\[\\d+\\])$/;// Copy BookingKoala parameters from the page URL (e.g. /booknow?zipcode=92660&service_id=1)\n// onto the booking form URL. Returns src unchanged when there are none.\nfunction withPageParams(src){if(typeof window===\"undefined\"||!/\\/booknow\\//.test(src))return src;const page=new URLSearchParams(window.location.search);const extra=[];page.forEach((value,key)=>{if(BK_PARAM.test(key)&&value!==\"\")extra.push(`${key}=${encodeURIComponent(value)}`);});if(!extra.length)return src;return src+(src.includes(\"?\")?\"&\":\"?\")+extra.join(\"&\");}// BookingKoala's form script reads offsetTop/offsetTopM from the form URL. Without\n// offsetTopM, a form that loads narrower than 786px places every popup at the top\n// of the form instead of where the visitor is.\nfunction withPopupOffsets(src){if(!/bookingkoala\\.com/.test(src)||/[?&]offsetTopM=/.test(src))return src;return src+(src.includes(\"?\")?\"&\":\"?\")+\"offsetTop=0&offsetTopM=0\";}// Customer account frame (any BookingKoala page that isn't a /booknow/ form, e.g. the\n// /dashboard embed on /login). The site header's account links open /login?account=info\n// etc. The frame always starts on its normal page (BookingKoala shows \"Oops\" if an embed\n// starts on /info or /notifications); once it reports the customer is logged in, the\n// request goes to the Heritage script in BookingKoala's header code, which switches pages\n// inside the app or clicks BookingKoala's own Logout.\nconst BK_ORIGIN=\"https://heritagehomecleaners.bookingkoala.com\";// Switched to inside the app after the dashboard loads\nconst ACCOUNT_PAGES={dashboard:\"/dashboard\",info:\"/info\"};const ACCOUNT_KEY=\"hhcAccount\";// Conversion tracking. The BookingKoala frame reports when the booking form is first used\n// and when its thank-you screen shows; they're sent to Google Analytics from this page, where\n// Google can connect them to the ad click (it can't from inside the frame). Each is sent at\n// most once per browser session, and nothing about the customer is included.\nfunction trackOnce(eventName){if(typeof window===\"undefined\")return;const key=`hhc_tracked_${eventName}`;try{if(window.sessionStorage.getItem(key))return;window.sessionStorage.setItem(key,\"1\");}catch(e){}const w=window;if(typeof w.gtag===\"function\")w.gtag(\"event\",eventName,{});else(w.dataLayer=w.dataLayer||[]).push([\"event\",eventName,{}]);}function isAccountEmbed(src){return/bookingkoala\\.com/.test(src)&&!/\\/booknow\\//.test(src)&&!isThankYouEmbed(src);}// Thank-you frame (on /thank-you). BookingKoala opens its thank-you page (booking details +\n// \"set your password\") in the whole browser tab; its header code sends that address here as\n// /thank-you#booked=<address>. It's after the #, so the customer's details never reach this\n// site's server or analytics. It's kept for this browser tab so a reload still shows it.\n// Without one (someone just visiting /thank-you), the frame isn't shown.\nconst THANK_YOU_KEY=\"hhcThankYou\";function isThankYouEmbed(src){return/bookingkoala\\.com\\/thank-you/.test(src);}function takeThankYou(){if(typeof window===\"undefined\")return null;let path=new URLSearchParams(window.location.hash.slice(1)).get(\"booked\");if(path){try{window.sessionStorage.setItem(THANK_YOU_KEY,path);}catch{}window.history.replaceState(window.history.state,\"\",window.location.pathname+window.location.search);}else{try{path=window.sessionStorage.getItem(THANK_YOU_KEY);}catch{}}return path&&/^\\/thank-you\\?[^#]*$/.test(path)?path:null;}// Reads ?account= (and an invoice ?path=) from the page URL and removes them, so a\n// reload doesn't repeat them\nfunction takeAccountRequest(){if(typeof window===\"undefined\")return{request:null,path:null};const url=new URL(window.location.href);const request=url.searchParams.get(\"account\");const path=url.searchParams.get(\"path\");if(!request)return{request:null,path:null};url.searchParams.delete(\"account\");url.searchParams.delete(\"path\");window.history.replaceState(window.history.state,\"\",url.pathname+url.search+url.hash);return{request,path};}// Pages BookingKoala shows \"Oops\" for when embedded with ?embed=true, so they load as a\n// plain address instead (the header code still hides BookingKoala's own header and footer):\n// Notifications, and invoices opened from Info & Billing (in a new tab of this site, so\n// the customer stays logged in)\nfunction directAccountUrl(src,request,path){let target=null;if(request===\"notifications\")target=\"/notifications\";if(request===\"invoice\"&&path&&/^\\/booking-invoice\\/[\\w-]+(\\?[^#]*)?$/.test(path))target=path;if(!target)return null;try{return new URL(target,new URL(src).origin).toString();}catch{return null;}}// Remembered for the site header's \"Your Account\" menu (AccountMenu overrides)\nfunction rememberLogin(loggedIn){try{if(loggedIn)window.localStorage.setItem(ACCOUNT_KEY,JSON.stringify({in:true,at:Date.now()}));else window.localStorage.removeItem(ACCOUNT_KEY);}catch{}window.dispatchEvent(new CustomEvent(\"hhc-account\"));}/**\n * BookingKoala Embed: renders the BookingKoala iframe and loads its embed script.\n *\n * embed.js only initializes iframes once, on the first full page load. Framer\n * navigates between pages client-side, so when this component mounts after a\n * link click we re-run the resizer and BookingKoala's load handshake ourselves.\n *\n * The form's sticky Booking Summary is positioned by the parent page posting\n * { bodyscroll, posi, top, scrollTop, height } into the iframe. embed.js measures\n * the iframe's position with offsetTop, which is wrong inside Framer's nested\n * layout, so we replace its scroll handler with one that measures correctly and\n * keeps the summary below the sticky site header (topOffset).\n *\n * BookingKoala preselect parameters on the page URL (zipcode, service_id,\n * frequency_id, pricing_parameter[ID], extras[ID], ...) are passed on to the form.\n *\n * When the form loads at phone width, selecting an extra that shows a notice popup\n * makes BookingKoala ask the page to scroll to the top of the form (iframe-resizer\n * scrollToOffset). That throws the visitor far from where they were and the popup\n * gets placed up there. Such requests are held and only carried out if the form's\n * content changes size (a new booking step), not for popups.\n *\n * Opening a popup in the form (e.g. an extra's info tooltip) moves focus into it.\n * Because the whole form is one tall iframe, the browser scrolls the page to show\n * the focused popup, often far from where the visitor was. Sudden jumps like that,\n * while the form has focus and the visitor isn't scrolling the page, are undone.\n *\n * While BookingKoala's app boots inside the iframe, a branded loading state\n * covers the form area; it fades out once the form has loaded and sized itself.\n * The frame keeps its starting height (the Height control) until the form reports\n * a real height, so the footer doesn't jump up and back down during loading.\n *\n * @framerIntrinsicWidth 1000\n * @framerIntrinsicHeight 1000\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n */export default function BookingEmbed(props){const{src=\"https://heritagehomecleaners.bookingkoala.com/booknow/home_cleaning?embed=true&bar=false&banner=false\",frameHeight=1e3,title=\"Book your home cleaning\",topOffset=72}=props;// (Not named \"height\": Framer passes its own layout height, e.g. \"100%\", under that name)\nconst height=Number(frameHeight)>0?Number(frameHeight):1e3;const isStatic=useIsStaticRenderer();const formSrc=withPopupOffsets(src);const iframeRef=useRef(null);const wrapRef=useRef(null);const iframeLoaded=useRef(false);const scriptReady=useRef(false);const needsHandshake=useRef(false);const topOffsetRef=useRef(topOffset);const jumpGuardRef=useRef(null);topOffsetRef.current=topOffset;// Loading state: \"loading\" -> \"fading\" -> \"done\"\nconst[loadState,setLoadState]=useState(\"loading\");const finishLoading=()=>setLoadState(s=>s===\"loading\"?\"fading\":s);// Keeps the frame at its starting height until the form reports a real height\nconst[holdHeight,setHoldHeight]=useState(true);// Thank-you frame with no booking to show\nconst[hidden,setHidden]=useState(false);// Tell the form where it sits relative to the viewport so it can pin the\n// summary (top on desktop/tablet, bottom edge of the screen on phones).\nconst sendPosition=()=>{const iframe=iframeRef.current;if(!iframe||!iframe.contentWindow)return;// A popup opening in the form can jump the page before our scroll handler\n// runs. Undo that first so the popup is placed where the visitor is.\njumpGuardRef.current?.();const scrollTop=window.scrollY;const rect=iframe.getBoundingClientRect();const top=Math.round(rect.top+scrollTop);const viewHeight=window.innerHeight;const posi=Math.max(0,scrollTop+topOffsetRef.current-top);// The phone summary is pinned to the viewport's bottom edge using scrollTop.\n// Cap it so that edge never goes below the form's bottom, otherwise the\n// summary slides out of the iframe and gets clipped.\nconst summaryScrollTop=Math.min(scrollTop,Math.round(top+rect.height-viewHeight));iframe.contentWindow.postMessage({bodyscroll:true,posi,top,scrollTop:summaryScrollTop,height:viewHeight},\"*\");// Popups (e.g. extras' info tooltips) are placed from this shorter message,\n// the same one embed.js's setPopupPosi sends.\niframe.contentWindow.postMessage({bodyscroll:true,posi},\"*\");};const resizerOptions={log:false,checkOrigin:false,heightCalculationMethod:\"bodyOffset\",resizedCallback:()=>sendPosition()};// Swap embed.js's offsetTop-based scroll handler for ours.\nconst takeOverScrollHandling=()=>{const w=window;if(typeof w.winScroll===\"function\")window.removeEventListener(\"scroll\",w.winScroll);w.winScroll=sendPosition;w.setPopupPosi=sendPosition;};// embed.js sends its setup message on window \"load\". If the page had already\n// loaded when we mounted, that event is gone, so send it once both are ready.\nconst sendHandshake=()=>{if(!iframeLoaded.current||!scriptReady.current)return;if(needsHandshake.current){needsHandshake.current=false;const w=window;w.fe=iframeRef.current;if(typeof w.onLoadWindow===\"function\")w.onLoadWindow();}sendPosition();};useEffect(()=>{const iframe=iframeRef.current;if(!iframe||typeof document===\"undefined\")return;const w=window;needsHandshake.current=document.readyState===\"complete\";// Thank-you frame: show the booking's thank-you page, or nothing without one\nconst thankYouEmbed=isThankYouEmbed(formSrc);const thankYouPath=thankYouEmbed?takeThankYou():null;if(thankYouEmbed&&!thankYouPath){setHidden(true);return;}const thankYouUrl=thankYouPath?new URL(thankYouPath,BK_ORIGIN).toString():null;// A real booking just finished (only BookingKoala's thank-you page sends customers here\n// with #booked): count the conversion. Visiting /thank-you without one counts nothing.\nif(thankYouUrl)trackOnce(\"purchase\");// Account frame: open the page the header asked for (?account=), or log out\nconst accountEmbed=isAccountEmbed(formSrc);const{request,path:requestPath}=accountEmbed?takeAccountRequest():{request:null,path:null};// (No popup-offset parameters here: logged in, BookingKoala shows \"Oops\" for them on\n// these pages. The Heritage script in its header code fixes the offset instead.)\nconst direct=accountEmbed?directAccountUrl(formSrc,request,requestPath):null;let logoutPending=request===\"logout\";let logoutSent=false;let goPending=request?ACCOUNT_PAGES[request]??null:null;let thankYouSawPasswordForm=false;// The page is prerendered without its query string, so point the form at the\n// preselected options now. The new form load gets its own handshake.\nconst target=thankYouUrl??direct??(accountEmbed?formSrc:withPageParams(formSrc));if(target!==formSrc&&iframe.src!==target){iframeLoaded.current=false;needsHandshake.current=true;iframe.src=target;setLoadState(\"loading\");setHoldHeight(true);}const existing=document.querySelector(`script[src=\"${SCRIPT_SRC}\"]`);if(existing&&typeof w.iFrameResize===\"function\"){// Script already ran for an earlier page: wire up this new iframe.\nw.fe=iframe;w.iFrameResize(resizerOptions,iframe);takeOverScrollHandling();scriptReady.current=true;sendHandshake();}else{const s=existing??document.createElement(\"script\");s.addEventListener(\"load\",()=>{takeOverScrollHandling();scriptReady.current=true;sendHandshake();});if(!existing){s.src=SCRIPT_SRC;s.defer=true;document.body.appendChild(s);}}let frame=0;const schedule=()=>{if(frame)return;frame=requestAnimationFrame(()=>{frame=0;sendPosition();});};window.addEventListener(\"scroll\",schedule,{passive:true});window.addEventListener(\"resize\",schedule);// Content above the form can shift it (images loading, fonts, form steps).\nconst observer=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(schedule):null;observer?.observe(document.body);observer?.observe(iframe);// Hold BookingKoala's \"scroll the page to the form\" requests (see above).\n// iframe-resizer carries out the request with window.scrollTo while handling\n// the form's message, so scrollTo calls made during that message are held.\nconst realScrollTo=window.scrollTo;let heldTimer=0;const isFormScrollRequest=()=>{const ev=window.event;return ev instanceof MessageEvent&&ev.source===iframe.contentWindow&&typeof ev.data===\"string\"&&/^\\[iFrameSizer\\][^:]*:[^:]*:[^:]*:scrollTo(Offset)?$/.test(ev.data);};const heldScrollTo=function(...args){if(!isFormScrollRequest())return realScrollTo.apply(window,args);const heightBefore=iframe.offsetHeight;window.clearTimeout(heldTimer);heldTimer=window.setTimeout(()=>{if(Math.abs(iframe.offsetHeight-heightBefore)<40)return;lastInput=Date.now()// a real step change: let the jump guard allow it\n;realScrollTo.apply(window,args);},450);};window.scrollTo=heldScrollTo;// Undo focus-driven page jumps caused by popups opening inside the form.\nlet lastY=window.scrollY;let lastInput=0;let lastPointerMove=0;const markInput=()=>{lastInput=Date.now();};const markPointerMove=()=>{lastPointerMove=Date.now();};let resends=[];// Returns true when it undid a jump.\nconst undoJump=()=>{const y=window.scrollY;const now=Date.now();const bigJump=Math.abs(y-lastY)>Math.max(300,window.innerHeight*.6);const visitorScrolling=now-lastInput<600||now-lastPointerMove<150;if(bigJump&&!visitorScrolling&&document.activeElement===iframe){realScrollTo.call(window,{top:lastY,behavior:\"instant\"});return true;}lastY=y;return false;};jumpGuardRef.current=undoJump;const guardScroll=()=>{if(!undoJump())return;// The form may already have placed the popup at the jumped position:\n// re-send the visitor's real position while the popup settles.\nresends.forEach(t=>window.clearTimeout(t));resends=[0,60,150,300,600].map(ms=>window.setTimeout(sendPosition,ms));sendPosition();};const inputEvents=[\"pointerdown\",\"wheel\",\"touchstart\",\"keydown\"];inputEvents.forEach(e=>window.addEventListener(e,markInput,{capture:true,passive:true}));window.addEventListener(\"pointermove\",markPointerMove,{capture:true,passive:true});window.addEventListener(\"scroll\",guardScroll,{passive:true});// Hide the loading state once the form has loaded and its height has settled.\n// BookingKoala reports a few in-between heights while its app boots (some only\n// a few pixels tall), so wait for a real height that has stopped changing for\n// a moment. Until then the iframe keeps at least its starting height\n// (minHeight below), so those in-between heights don't collapse the page.\n// Fallbacks for the loading cover: 4s after the iframe loads (if the form has\n// a real height by then), or 15s after mount at most. The height hold only ends once a real height arrives.\nlet loadedAt=0;let fallback=0;let settle=0;const initialHeight=iframe.style.height;const hasRealHeight=()=>iframe.style.height!==initialHeight&&parseFloat(iframe.style.height)>=MIN_REAL_HEIGHT;const settleSoon=()=>{window.clearTimeout(settle);settle=window.setTimeout(()=>{finishLoading();setHoldHeight(false);},250);};// Watch the height iframe-resizer sets (the box itself may not change while\n// the minimum height holds it open).\nconst sizeWatch=typeof MutationObserver!==\"undefined\"?new MutationObserver(()=>{if(loadedAt&&hasRealHeight())settleSoon();}):null;sizeWatch?.observe(iframe,{attributes:true,attributeFilter:[\"style\"]});const onFrameLoad=()=>{loadedAt=Date.now();window.clearTimeout(fallback);fallback=window.setTimeout(()=>{if(hasRealHeight())finishLoading();},4e3);if(hasRealHeight())settleSoon();};iframe.addEventListener(\"load\",onFrameLoad);const hardStop=window.setTimeout(finishLoading,15e3);// Messages from the Heritage script in BookingKoala's header code (inside the frame):\n// \"ready\" -> tell it which kind of frame it is; \"state\" -> logged in or out;\n// \"open\" -> a link that belongs to this site (e.g. Add New Booking -> /booknow)\nconst toFrame=msg=>iframe.contentWindow?.postMessage({type:\"hhc-bk\",...msg},BK_ORIGIN);const sendContext=()=>toFrame({kind:\"context\",role:accountEmbed?\"account\":\"booking\"});// Pages loaded without ?embed=true (Notifications, invoices) don't run BookingKoala's\n// resizer; for those the frame takes the height the Heritage script reports\nlet resizerActive=false;// Fixed-width pages (invoices) wider than the screen: the frame takes their width\n// and the box around it scrolls sideways. Only clearly wider content counts, so a\n// page that's a few pixels over never gets a scrollbar.\nconst setFrameWidth=contentWidth=>{const wrap=wrapRef.current;const wide=contentWidth!==null&&wrap!==null&&contentWidth>wrap.clientWidth+40;iframe.style.width=wide?`${Math.round(contentWidth)}px`:\"100%\";if(wrap)wrap.style.overflowX=wide?\"auto\":\"\";};const onFrameNavigate=()=>{resizerActive=false;setFrameWidth(null);};// A popup opened in a short frame can run past its bottom: while it's open, make the\n// frame at least one screen tall and, if its bottom edge is on screen, scroll up so\n// the bottom of the frame meets the bottom of the screen\nconst onPopup=open=>{if(!open){iframe.style.minHeight=\"\";schedule();return;}iframe.style.minHeight=`${Math.max(0,window.innerHeight-topOffsetRef.current)}px`;requestAnimationFrame(()=>{const gap=window.innerHeight-iframe.getBoundingClientRect().bottom;if(gap>1){lastInput=Date.now()// our own scroll: the jump guard should allow it\n;realScrollTo.call(window,{top:Math.max(0,window.scrollY-gap),behavior:\"instant\"});}sendPosition();});};const onBkMessage=e=>{if(e.origin!==BK_ORIGIN||e.source!==iframe.contentWindow)return;if(typeof e.data===\"string\"&&e.data.startsWith(\"[iFrameSizer]\")){resizerActive=true;return;}const d=e.data;if(!d||typeof d!==\"object\"||d.type!==\"hhc-bk\")return;if(d.kind===\"ready\")sendContext();if(d.kind===\"height\"&&!resizerActive&&typeof d.height===\"number\"&&d.height>0){iframe.style.height=`${Math.round(d.height)}px`;if(typeof d.width===\"number\")setFrameWidth(d.width);}if(d.kind===\"popup\")onPopup(!!d.open);if(d.kind===\"form-start\")trackOnce(\"begin_checkout\");if(d.kind===\"booked\")trackOnce(\"purchase\");if(d.kind===\"state\"&&typeof d.loggedIn===\"boolean\"){rememberLogin(d.loggedIn);// Password just set (the frame showed the set-password form, now reports logged in),\n// or BookingKoala moved on to the customer's account: show the account on /login.\n// A customer who was already logged in stays on their thank-you page.\nif(thankYouEmbed&&!d.loggedIn)thankYouSawPasswordForm=true;if(thankYouEmbed&&d.loggedIn&&(thankYouSawPasswordForm||typeof d.path===\"string\"&&!/^\\/thank-you/.test(d.path))){try{window.sessionStorage.removeItem(THANK_YOU_KEY);}catch{}window.location.href=\"/login\";}if(logoutPending&&d.loggedIn&&!logoutSent){logoutSent=true;toFrame({kind:\"logout\"});}if(goPending&&d.loggedIn&&!logoutPending){if(d.path!==goPending)toFrame({kind:\"go\",path:goPending});goPending=null;}if(!d.loggedIn){logoutPending=false;goPending=null;}}if(d.kind===\"open\"&&typeof d.path===\"string\"&&/^\\/(?!\\/)/.test(d.path))window.location.href=d.path;// Something the frame couldn't find; details for troubleshooting in the browser console\nif(d.kind===\"logout-missing\"||d.kind===\"logout-server\"||d.kind===\"go-fallback\")console.warn(\"[Heritage account]\",d.kind,d);};window.addEventListener(\"message\",onBkMessage);iframe.addEventListener(\"load\",onFrameNavigate);iframe.addEventListener(\"load\",sendContext);return()=>{window.removeEventListener(\"message\",onBkMessage);iframe.removeEventListener(\"load\",onFrameNavigate);iframe.removeEventListener(\"load\",sendContext);sizeWatch?.disconnect();iframe.removeEventListener(\"load\",onFrameLoad);window.clearTimeout(fallback);window.clearTimeout(settle);window.clearTimeout(hardStop);window.removeEventListener(\"scroll\",schedule);window.removeEventListener(\"scroll\",guardScroll);window.clearTimeout(heldTimer);if(window.scrollTo===heldScrollTo)window.scrollTo=realScrollTo;resends.forEach(t=>window.clearTimeout(t));jumpGuardRef.current=null;inputEvents.forEach(e=>window.removeEventListener(e,markInput,{capture:true}));window.removeEventListener(\"pointermove\",markPointerMove,{capture:true});window.removeEventListener(\"resize\",schedule);observer?.disconnect();if(frame)cancelAnimationFrame(frame);iframe.iFrameResizer?.removeListeners?.();};},[src]);useEffect(()=>{if(loadState!==\"fading\")return;const t=window.setTimeout(()=>setLoadState(\"done\"),350);return()=>window.clearTimeout(t);},[loadState]);if(isStatic){return /*#__PURE__*/_jsxs(\"div\",{style:{...props.style,width:\"100%\",height,border:\"1px dashed #3D7A5B\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",fontFamily:\"Jost, sans-serif\",color:\"#163324\",background:\"#FBF8F1\"},children:[\"BookingKoala embed (\",title,\") renders on the live site\"]});}if(hidden)return null;return /*#__PURE__*/_jsxs(\"div\",{ref:wrapRef,style:{...props.style,width:\"100%\",position:\"relative\"},children:[/*#__PURE__*/_jsx(\"iframe\",{ref:iframeRef,id:IFRAME_ID,src:isThankYouEmbed(formSrc)?\"about:blank\":formSrc,title:title,style:{border:\"none\",height,minHeight:holdHeight?height:undefined,width:\"100%\",display:\"block\"},width:\"100%\",scrolling:\"no\",onLoad:()=>{iframeLoaded.current=true;sendHandshake();}}),loadState!==\"done\"?/*#__PURE__*/_jsxs(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",inset:0,zIndex:2,display:\"flex\",flexDirection:\"column\",alignItems:\"center\",justifyContent:\"flex-start\",gap:14,paddingTop:96,background:\"var(--token-96798232-f905-499d-aada-92d5a2694e8b, #FBF8F1)\",opacity:loadState===\"fading\"?0:1,transition:\"opacity 0.35s ease\",pointerEvents:loadState===\"fading\"?\"none\":\"auto\"},children:[/*#__PURE__*/_jsx(\"style\",{children:`@keyframes hhcSpin{to{transform:rotate(360deg)}}`}),/*#__PURE__*/_jsx(\"div\",{style:{width:34,height:34,flexShrink:0,boxSizing:\"border-box\",borderRadius:\"50%\",border:\"3px solid rgba(61,122,91,0.18)\",borderTopColor:\"#3D7A5B\",animation:\"hhcSpin 0.9s linear infinite\"}}),/*#__PURE__*/_jsx(\"div\",{style:{flexShrink:0,fontFamily:\"Jost, sans-serif\",fontSize:15,letterSpacing:\"0.02em\",color:\"#163324\"},children:\"Loading…\"})]}):null]});}addPropertyControls(BookingEmbed,{src:{type:ControlType.String,title:\"Embed URL\",defaultValue:\"https://heritagehomecleaners.bookingkoala.com/booknow/home_cleaning?embed=true&bar=false&banner=false\"},frameHeight:{type:ControlType.Number,title:\"Height\",defaultValue:1e3,min:300,max:3e3,unit:\"px\"},title:{type:ControlType.String,title:\"Title\",defaultValue:\"Book your home cleaning\"},topOffset:{type:ControlType.Number,title:\"Top Offset\",defaultValue:72,min:0,max:300,unit:\"px\",description:\"Height of the sticky site header, so the Booking Summary pins just below it.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"BookingEmbed\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"auto\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"1000\",\"framerIntrinsicHeight\":\"1000\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BookingEmbed.map"],"mappings":"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"}