\n \n \n \n \n Loading...\n \n `)}loadAllImages(){document.querySelectorAll("img[data-src]").forEach((e=>{e.dataset.src&&this.loadLazyImage(e)}))}initFontLoading(){function e(){const e=document.createElement("link");e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;1,400&display=swap",document.head.appendChild(e)}console.log("🔤 Initializing font loading..."),"complete"===document.readyState?e():(window.addEventListener("load",e),setTimeout(e,2e3)),"fonts"in document&&document.fonts.ready.then((()=>{document.body.classList.add("fonts-loaded"),console.log("✅ Fonts loaded successfully"),this.optimizeLayoutAfterFonts()})),console.log("✅ Font loading initialized")}optimizeLayoutAfterFonts(){document.querySelectorAll(".hero__content, .btn, .header").forEach((e=>{e.style.visibility="hidden",e.offsetHeight,e.style.visibility="visible"}))}initPerformanceMonitoring(){console.log("📊 Initializing performance monitoring..."),this.monitorLCP(),this.monitorCLS(),this.monitorFCP(),this.monitorImagePerformance(),console.log("✅ Performance monitoring initialized")}monitorLCP(){"PerformanceObserver"in window&&new PerformanceObserver((e=>{const t=e.getEntries(),o=t[t.length-1].startTime;console.log(`📈 LCP: ${o.toFixed(2)}ms`),window.performanceMetrics=window.performanceMetrics||{},window.performanceMetrics.lcp=o,o>2500?console.warn("⚠️ LCP is slower than recommended (>2.5s)"):console.log("✅ LCP is within good range (<2.5s)")})).observe({entryTypes:["largest-contentful-paint"]})}monitorCLS(){if("PerformanceObserver"in window){let e=0;new PerformanceObserver((t=>{for(const o of t.getEntries())o.hadRecentInput||(e+=o.value);console.log(`📊 CLS: ${e.toFixed(3)}`),window.performanceMetrics=window.performanceMetrics||{},window.performanceMetrics.cls=e,e>.1?console.warn("⚠️ CLS is higher than recommended (>0.1)"):console.log("✅ CLS is within good range (<0.1)")})).observe({entryTypes:["layout-shift"]})}}monitorFCP(){"PerformanceObserver"in window&&new PerformanceObserver((e=>{for(const t of e.getEntries())if("first-contentful-paint"===t.name){const e=t.startTime;console.log(`🎨 FCP: ${e.toFixed(2)}ms`),window.performanceMetrics=window.performanceMetrics||{},window.performanceMetrics.fcp=e}})).observe({entryTypes:["paint"]})}monitorImagePerformance(){const e=document.querySelectorAll("img");let t=0,o=0;e.forEach((n=>{n.addEventListener("load",(()=>{t++,console.log(`🖼️ Image loaded: ${n.src.substring(n.src.lastIndexOf("/")+1)} (${t}/${e.length})`)})),n.addEventListener("error",(()=>{o++,console.error(`❌ Image failed: ${n.src.substring(n.src.lastIndexOf("/")+1)} (${o} errors)`)}))})),window.addEventListener("load",(()=>{setTimeout((()=>{console.log(`📊 Image Loading Stats: ${t} loaded, ${o} errors, ${e.length} total`)}),1e3)}))}}const utils={formatCurrency:(e,t="EUR")=>new Intl.NumberFormat("en-US",{style:"currency",currency:t}).format(e),generateId:()=>Math.random().toString(36).substr(2,9),debounce(e,t){let o;return function(...n){clearTimeout(o),o=setTimeout((()=>{clearTimeout(o),e(...n)}),t)}},async copyToClipboard(e){try{return await navigator.clipboard.writeText(e),!0}catch(e){return console.error("Failed to copy: ",e),!1}}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",(()=>{new TemplateEngine})):new TemplateEngine,window.TemplateEngine=TemplateEngine,window.utils=utils