/** Public interactions replacing the old Angular renderer; no legacy services. */ export declare const preserveRuntime = "(() => {\n const bottomNav = document.getElementById('navbar-bottom-nav');\n const footer = document.getElementById('vitris-footer');\n if (bottomNav && footer) {\n const reserveBottomNav = () => { footer.style.paddingBottom = bottomNav.getBoundingClientRect().height + 'px'; };\n new ResizeObserver(reserveBottomNav).observe(bottomNav);\n window.addEventListener('resize', reserveBottomNav); document.fonts.ready.then(reserveBottomNav); reserveBottomNav();\n }\n let openModal, opener;\n const reactClosedClasses = new WeakMap();\n const notice=(container,text)=>{\n let note=container.querySelector('[data-preserve-status]');\n if(!note){note=document.createElement('p');note.dataset.preserveStatus='';note.setAttribute('role','status');container.append(note);}note.textContent=text;\n };\n document.querySelectorAll('services-general[data-preserve-service-cards]').forEach(block=>{\n const cards=JSON.parse(block.dataset.preserveServiceCards),grid=block.querySelector('[data-preserve-service-grid]'),select=block.querySelector('[data-vitrisid=\"servicesPerPage\"]'),search=block.querySelector('[data-vitrisid=\"servicesSearch\"]'),left=block.querySelector('[data-vitrisid=\"servicesLeftArrow\"]'),right=block.querySelector('[data-vitrisid=\"servicesRightArrow\"]');let offset=0;\n const render=()=>{const filtered=cards.filter(card=>!search?.value||card.toLowerCase().includes(search.value.toLowerCase())),size=Number(select?.value||5);offset=Math.max(0,Math.min(offset,Math.max(0,Math.ceil(filtered.length/size)-1)));grid.innerHTML=filtered.slice(offset*size,(offset+1)*size).join('');grid.querySelectorAll('[data-toggle=\"modal\"]').forEach(el=>{el.tabIndex=0;el.setAttribute('role','button');});bindHovers(grid);left?.parentElement.classList.toggle('disabled',offset===0);right?.parentElement.classList.toggle('disabled',(offset+1)*size>=filtered.length);};\n select?.addEventListener('change',()=>{offset=0;render();});search?.addEventListener('input',()=>{offset=0;render();});left?.addEventListener('click',event=>{event.preventDefault();if(offset>0){offset--;render();}});right?.addEventListener('click',event=>{event.preventDefault();if((offset+1)*Number(select?.value||5){if(!img.dataset.preserveDeferredSrc)return;img.src=img.dataset.preserveDeferredSrc;img.removeAttribute('data-preserve-deferred-src');};\n const observer=new IntersectionObserver(entries=>entries.forEach(entry=>{if(entry.isIntersecting){loadImage(entry.target);observer.unobserve(entry.target);}}),{rootMargin:'0px 0px 200px 0px'});\n deferred.forEach(img=>observer.observe(img));\n if(window.innerWidth<992)deferred.forEach(loadImage);\n window.addEventListener('resize',()=>deferred.filter(img=>img.hasAttribute('data-preserve-deferred-src')).forEach(loadImage));\n document.querySelectorAll('[data-preserve-product-states]').forEach(panel=>{\n const states=JSON.parse(panel.dataset.preserveProductStates),initial=states[0].values;let values=[...initial];\n const bind=()=>panel.querySelectorAll('select').forEach((select,index)=>{if(index>=values.length)return;select.value=values[index];select.addEventListener('change',()=>{\n values[index]=select.value;\n if(index===0)values=values.map((v,i)=>i===0?v:'');\n const state=states.find(s=>JSON.stringify(s.values)===JSON.stringify(values));\n if(state){panel.innerHTML=state.html;bind();bindHovers(panel);}\n });});bind();\n });\n document.querySelectorAll('.carousel[data-preserve-carousel]').forEach(carousel=>{\n const slides=[...carousel.querySelectorAll('.carousel__slide')],dots=[...carousel.querySelectorAll('.carousel__dot')];let selected=0;\n const choose=index=>{selected=(index+slides.length)%slides.length;carousel.querySelector('.carousel__slider-tray').style.transform='translateX(-'+(selected*100/slides.length)+'%) translateX(0px)';\n slides.forEach((slide,i)=>{slide.classList.toggle('carousel__slide--visible',i===selected);slide.classList.toggle('carousel__slide--hidden',i!==selected);slide.setAttribute('aria-selected',String(i===selected));slide.tabIndex=i===selected?0:-1;});\n dots.forEach((dot,i)=>{dot.disabled=i===selected;dot.classList.toggle('carousel__dot--selected',i===selected);});};\n dots.forEach((dot,i)=>dot.addEventListener('click',()=>choose(i)));\n const slider=carousel.querySelector('.carousel__slider');slider.addEventListener('keydown',event=>{if(['ArrowRight','ArrowLeft'].includes(event.key)){event.preventDefault();choose(selected+(event.key==='ArrowRight'?1:-1));}});\n let start;slider.addEventListener('touchstart',event=>{start=event.touches[0]?.clientX;},{passive:true});slider.addEventListener('touchend',event=>{const end=event.changedTouches[0]?.clientX;if(start!==undefined&&Math.abs(end-start)>30)choose(selected+(endcontainer.querySelectorAll('[data-preserve-hover]').forEach(button=>{\n if(boundHovers.has(button))return;boundHovers.add(button);\n const hover=JSON.parse(button.dataset.preserveHover);let resting;\n button.addEventListener('mouseenter',()=>{resting=button.getAttribute('style');for(const [property,value]of Object.entries(hover))button.style.setProperty(property,value);});\n button.addEventListener('mouseleave',()=>{if(resting===null)button.removeAttribute('style');else if(resting!==undefined)button.setAttribute('style',resting);});\n });bindHovers(document);\n document.querySelectorAll('iframe[data-preserve-disabled-embed]').forEach(frame => {\n const notice = () => {\n const doc = frame.contentDocument;\n if (!doc || doc.querySelector('[data-preserve-embed-notice]')) return;\n const note = doc.createElement('p'); note.dataset.preserveEmbedNotice = ''; note.setAttribute('role','status');\n note.textContent = 'This preview does not run this embedded application. Please use the listed contact details.';\n doc.body.append(note);\n };\n frame.addEventListener('load', notice); notice();\n });\n const close = () => {\n if (!openModal) return;\n openModal.classList.remove('show'); openModal.style.display = 'none';\n openModal.setAttribute('aria-hidden', 'true'); openModal.removeAttribute('aria-modal');\n document.querySelector('[data-preserve-backdrop]')?.remove();\n document.body.classList.remove('modal-open'); openModal = null; opener?.focus();\n };\n document.querySelectorAll('[data-toggle=\"modal\"]').forEach(el => { el.tabIndex = 0; el.setAttribute('role','button'); });\n document.querySelectorAll('.dropdown-toggle').forEach(el => { el.tabIndex = 0; el.setAttribute('role','button'); el.setAttribute('aria-expanded','false'); });\n document.addEventListener('click', event => {\n const disabled=event.target.closest('[data-preserve-disabled-action]');\n if(disabled){event.preventDefault();const booking=disabled.dataset.preserveDisabledAction==='booking',container=disabled.closest('[data-preserve-disabled-booking], #vb, form')||disabled.parentElement;notice(container,booking?(container.querySelector('#days-container')?'This preview cannot book appointments. Calendar availability is a captured snapshot. Please use the listed contact details.':'This preview cannot book appointments. Please use the listed contact details.'):'This preview cannot place orders or accept payments. Please use the listed contact details.');return;}\n if(event.target.closest('[data-preserve-inert-action]')){event.preventDefault();return;}\n const dropdown = event.target.closest('.dropdown-toggle');\n if (dropdown) {\n const menu = dropdown.parentElement.querySelector('.dropdown-menu');\n if (menu) {\n event.preventDefault();\n const wasOpen = !!document.querySelector('.dropdown-menu.show');\n document.querySelectorAll('.dropdown-menu.show').forEach(el=>el.classList.remove('show'));\n document.querySelectorAll('.dropdown-toggle').forEach(el=>el.setAttribute('aria-expanded','false'));\n if (!wasOpen) { menu.classList.add('show'); dropdown.setAttribute('aria-expanded','true'); }\n }\n }\n const toggle = event.target.closest('[data-toggle]');\n if (toggle) {\n const selector = toggle.getAttribute('data-target') || toggle.getAttribute('href');\n const target = selector?.startsWith('#') ? document.getElementById(selector.slice(1)) : null;\n if (!target) return;\n if (toggle.dataset.toggle === 'collapse') {\n event.preventDefault();\n const groupSelector=toggle.getAttribute('data-parent')||target.getAttribute('data-parent');\n const group=groupSelector?.startsWith('#')?document.getElementById(groupSelector.slice(1)):null;\n if(group&&!target.classList.contains('show'))group.querySelectorAll('.collapse.show').forEach(sibling=>{\n if(sibling===target)return;sibling.classList.remove('show');\n group.querySelectorAll('[data-toggle=\"collapse\"]').forEach(control=>{if((control.getAttribute('data-target')||control.getAttribute('href'))==='#'+sibling.id)control.setAttribute('aria-expanded','false');});\n });\n const reactNav = target.classList.contains('navbar-collapse');\n if (reactNav && !reactClosedClasses.has(target)) reactClosedClasses.set(target, target.className);\n target.classList.toggle('show');\n if (reactNav) {\n if (target.classList.contains('show')) { target.classList.remove('d-none'); target.classList.add('d-block','in'); }\n else target.className = reactClosedClasses.get(target);\n }\n toggle.setAttribute('aria-expanded', String(target.classList.contains('show')));\n } else if (toggle.dataset.toggle === 'modal') {\n event.preventDefault(); close(); opener = toggle; openModal = target;\n target.style.display = 'block'; target.classList.add('show'); target.removeAttribute('aria-hidden');\n target.setAttribute('aria-modal','true'); target.tabIndex = -1;\n const backdrop = document.createElement('div'); backdrop.className = 'modal-backdrop fade show';\n backdrop.dataset.preserveBackdrop = ''; backdrop.onclick = close; document.body.append(backdrop);\n document.body.classList.add('modal-open'); target.focus();\n if (toggle.closest('services-general[uniquecomponent=\"service-1\"]') && !target.querySelector('[data-preserve-booking-notice]')) {\n const note = document.createElement('p'); note.dataset.preserveBookingNotice = ''; note.setAttribute('role','status');\n note.textContent = 'This preview cannot book appointments. Please use the listed contact details.';\n (target.querySelector('.modal-content, .modal-dialog') || target).append(note);\n }\n }\n }\n if (event.target.closest('[data-dismiss=\"modal\"]') || event.target === openModal) close();\n const send = event.target.closest('[data-vitrisid=\"emailSendButton\"]');\n if (send) { event.preventDefault();const form=send.closest('form');if(form?.hasAttribute('data-preserve-disabled-custom-form'))notice(form,'This preview does not send messages or upload files. Please use the listed contact details.');else form?.requestSubmit(); }\n });\n document.addEventListener('keydown', event => {\n if (event.key === 'Escape') close();\n if ((event.key === 'Enter' || event.key === ' ') && event.target.matches('[data-toggle=\"modal\"], [data-vitrisid=\"emailSendButton\"], .dropdown-toggle, [data-preserve-disabled-action]')) { event.preventDefault(); event.target.click(); }\n if (event.key === 'Tab' && openModal) { event.preventDefault(); openModal.focus(); }\n });\n document.querySelectorAll('form[data-preserve-forms]').forEach(form => {\n form.removeAttribute('novalidate');\n const send = form.querySelector('[data-vitrisid=\"emailSendButton\"]');\n if (send) { send.tabIndex = 0; send.setAttribute('role','button'); }\n form.addEventListener('submit', event => {\n if (form.dataset.preserveForms === 'live') return;\n event.preventDefault();\n if(form.hasAttribute('data-preserve-disabled-custom-form')){notice(form,'This preview does not send messages or upload files. Please use the listed contact details.');return;}\n let note = form.querySelector('[data-preserve-status]');\n if (!note) { note = document.createElement('p'); note.dataset.preserveStatus = ''; note.setAttribute('role','status'); form.append(note); }\n note.textContent = 'This preview does not send messages. Please use the listed contact details.';\n });\n });\n})();";