{"id":51503,"date":"2022-01-11T11:12:48","date_gmt":"2022-01-11T11:12:48","guid":{"rendered":"http:\/\/wp.vergaplast.com\/?page_id=51503"},"modified":"2026-01-20T08:39:19","modified_gmt":"2026-01-20T07:39:19","slug":"vacuum-thermoforming","status":"publish","type":"page","link":"https:\/\/vergaplast.com\/en\/termoformatura-sottovuoto\/","title":{"rendered":"Vacuum Thermoforming"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"51503\" class=\"elementor elementor-51503\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6da896cc elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"6da896cc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-36392f74\" data-id=\"36392f74\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-78f52788 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"78f52788\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Termoformatura Sottovuoto<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4a3c4aab elementor-widget__width-auto elementor-widget elementor-widget-heading\" data-id=\"4a3c4aab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">Dal 1958 VERGA-Plast \u00e8 stata Pioniera in Italia nella termoformatura sottovuoto.<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-32c9ee8a elementor-section-content-middle elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"32c9ee8a\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5a46ff40\" data-id=\"5a46ff40\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-be02851 elementor-widget elementor-widget-global elementor-global-55515 elementor-widget-html\" data-id=\"be02851\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- VERGAPLAST THERMOFORMER WIDGET - MOBILE OPTIMIZED & REFINED -->\n\n<!-- copyright vergaplast 2026 e' assolutamente vietata la riproduzione del codice e del software -->\n<!-- VERGAPLAST THERMOFORMER WIDGET - MOBILE OPTIMIZED V2.0 + CNC UPDATE -->\n<!-- copyright vergaplast 2026 -->\n<!-- VERGAPLAST THERMOFORMER WIDGET - MOBILE OPTIMIZED V2.6 FINAL PRODUCT -->\n<!-- copyright vergaplast 2026 -->\n<div id=\"vergaplast-isolated-container\">\n\n    <!-- LOAD EXTERNAL DEPENDENCIES -->\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@mediapipe\/camera_utils@0.3.1640029074\/camera_utils.js\" crossorigin=\"anonymous\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@mediapipe\/control_utils@0.6.1629159505\/control_utils.js\" crossorigin=\"anonymous\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@mediapipe\/drawing_utils@0.3.1620248257\/drawing_utils.js\" crossorigin=\"anonymous\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@mediapipe\/hands@0.4.1646424915\/hands.js\" crossorigin=\"anonymous\"><\/script>\n\n    <!-- SCOPED CSS STYLES -->\n    <style>\n        \/* --- GLOBAL RESET & THEME --- *\/\n        #vergaplast-isolated-container {\n            font-family: 'Inter', system-ui, -apple-system, sans-serif;\n            -webkit-font-smoothing: antialiased;\n            width: 100%;\n            height: 90vh; \/* Fallback *\/\n            height: 90dvh; \/* Dynamic Viewport Height for mobile bars *\/\n            min-height: 600px; \n            border-radius: 24px;\n            overflow: hidden;\n            margin: 0 auto;\n            position: relative;\n            background: #050505;\n            color: #e5e7eb;\n            font-size: 16px;\n            line-height: 1.5;\n            z-index: 1;\n            display: flex;\n            flex-direction: column;\n            box-sizing: border-box;\n            text-align: left;\n            -webkit-tap-highlight-color: transparent; \/* Removes tap highlight color *\/\n        }\n        \n        \/* FULLSCREEN FIX FOR MOBILE *\/\n        #vergaplast-isolated-container.force-fullscreen {\n            position: fixed !important;\n            top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important;\n            width: 100vw !important; height: 100vh !important;\n            height: 100dvh !important;\n            z-index: 999999 !important;\n            border-radius: 0 !important;\n            margin: 0 !important;\n        }\n\n        @media (max-width: 768px) {\n            #vergaplast-isolated-container:not(.force-fullscreen) {\n                height: 85vh;\n                min-height: 500px;\n                border-radius: 16px;\n            }\n        }\n\n        #vergaplast-isolated-container *,\n        #vergaplast-isolated-container *::before,\n        #vergaplast-isolated-container *::after {\n            box-sizing: border-box;\n            font-family: inherit;\n            outline-color: #ff5f1f; \/* Force orange focus ring *\/\n        }\n\n        \/* --- LAYOUT STRUCTURE --- *\/\n        #vergaplast-isolated-container .app-container {\n            position: relative; \n            width: 100%; \n            height: 100%;\n            background: radial-gradient(circle at 50% 30%, #1a1a1c 0%, #000000 90%);\n            display: flex; \n            flex-direction: column; \/* Mobile: Stack *\/\n            overflow: hidden;\n        }\n        \n        @media (min-width: 1024px) { \n            #vergaplast-isolated-container .app-container { flex-direction: row; } \n        }\n\n        \/* --- SIDEBAR --- *\/\n        #vergaplast-isolated-container .sidebar-panel {\n            order: 2; \/* Mobile: Bottom *\/\n            width: 100%;\n            height: auto;\n            max-height: 50%;\n            display: flex;\n            flex-direction: column;\n            border-top: 1px solid rgba(255,255,255,0.1);\n            background: rgba(20, 20, 25, 0.98);\n            backdrop-filter: blur(20px);\n            z-index: 50;\n            padding-bottom: env(safe-area-inset-bottom);\n        }\n\n        @media (min-width: 1024px) {\n            #vergaplast-isolated-container .sidebar-panel {\n                order: 1; \/* Desktop: Left *\/\n                width: 384px;\n                height: 100%;\n                max-height: none;\n                border-top: none;\n                border-right: 1px solid rgba(255,255,255,0.1);\n                background: rgba(20, 20, 25, 0.75);\n            }\n        }\n\n        \/* --- CANVAS --- *\/\n        #vergaplast-isolated-container #canvasWrapper {\n            order: 1; \/* Mobile: Top *\/\n            flex: 1; \n            min-height: 0;\n            position: relative;\n            width: 100%;\n            overflow: hidden;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        @media (min-width: 1024px) {\n            #vergaplast-isolated-container #canvasWrapper {\n                order: 2; \/* Desktop: Right *\/\n                height: 100%;\n            }\n        }\n        \n        #vergaplast-isolated-container #simCanvas {\n            display: block; width: 100%; height: 100%; object-fit: contain;\n        }\n\n        \/* --- SCROLLBAR --- *\/\n        #vergaplast-isolated-container .custom-scroll {\n            scrollbar-width: thin;\n            scrollbar-color: rgba(255,255,255,0.2) transparent;\n        }\n        #vergaplast-isolated-container .custom-scroll::-webkit-scrollbar { width: 4px; }\n        #vergaplast-isolated-container .custom-scroll::-webkit-scrollbar-track { background: transparent; }\n        #vergaplast-isolated-container .custom-scroll::-webkit-scrollbar-thumb { background-color: rgba(255,255,255,0.2); border-radius: 10px; }\n\n        \/* --- UI ELEMENTS --- *\/\n        #vergaplast-isolated-container button {\n            cursor: pointer; font-family: inherit; border: none; outline: none !important;\n            transition: all 0.2s ease;\n        }\n        \n        \/* Buttons *\/\n        #vergaplast-isolated-container .btn-future {\n            background: rgba(255,255,255,0.08) !important; \n            border: 1px solid rgba(255,255,255,0.15) !important;\n            color: #9ca3af !important; \n            border-radius: 0.75rem !important; \n            padding: 1rem !important;\n            font-size: 13px !important; font-weight: 700 !important;\n            letter-spacing: 0.05em !important;\n            display: flex !important; align-items: center !important; justify-content: center !important; gap: 0.5rem !important;\n        }\n        #vergaplast-isolated-container .btn-future:hover:not(.disabled) {\n            background: rgba(255,255,255,0.15) !important; color: #fff !important;\n            border-color: #ff5f1f !important; \/* Orange hover border *\/\n        }\n        #vergaplast-isolated-container .btn-future.active {\n            background: rgba(255, 95, 31, 0.2) !important; \n            border-color: #ff5f1f !important; color: #ff5f1f !important;\n            box-shadow: 0 0 25px rgba(255, 95, 31, 0.2) !important;\n        }\n        #vergaplast-isolated-container .btn-future.disabled {\n            opacity: 0.5; cursor: not-allowed; pointer-events: none;\n        }\n        \n        #vergaplast-isolated-container .btn-primary {\n            background: #ff5f1f !important; color: #000 !important; font-weight: 800 !important; \n            border-radius: 0.75rem !important;\n            box-shadow: 0 0 20px rgba(255, 95, 31, 0.5) !important;\n            padding: 1rem !important;\n            font-size: 14px !important;\n            text-transform: uppercase !important; letter-spacing: 0.05em !important;\n            display: block !important;\n        }\n        #vergaplast-isolated-container .btn-primary:active { transform: scale(0.96); }\n\n        \/* --- EDIT CONTROL PANEL (ADAPTIVE) --- *\/\n        #vergaplast-isolated-container #radiusControl {\n            position: absolute;\n            background: rgba(10, 10, 12, 0.95);\n            backdrop-filter: blur(16px);\n            border: 1px solid rgba(255, 95, 31, 0.3);\n            border-radius: 16px;\n            padding: 16px;\n            z-index: 1000;\n            box-shadow: 0 10px 40px rgba(0,0,0,0.8);\n            display: flex; flex-direction: column; gap: 8px;\n            width: 220px;\n            pointer-events: auto;\n            transition: opacity 0.2s;\n        }\n        \n        \/* FIX: Ensure hidden class overrides ID specificity *\/\n        #vergaplast-isolated-container #radiusControl.hidden {\n            display: none !important;\n        }\n\n        \/* Range slider styling to avoid default colors *\/\n        #vergaplast-isolated-container input[type=range] {\n            accent-color: #ff5f1f;\n        }\n\n        \/* Mobile specific overrides for Edit Control *\/\n        @media (max-width: 768px) {\n            #vergaplast-isolated-container #radiusControl {\n                \/* Dock to bottom on mobile *\/\n                top: auto !important;\n                left: 50% !important;\n                bottom: 20px !important;\n                transform: translateX(-50%) !important;\n                width: 90% !important;\n                max-width: 300px;\n                border-color: #ff5f1f;\n            }\n        }\n\n        \/* --- HUD --- *\/\n        #vergaplast-isolated-container .hud-scroll-container {\n            display: flex; gap: 10px; overflow-x: auto; padding: 10px 20px;\n            -webkit-overflow-scrolling: touch; scrollbar-width: none;\n            mask-image: linear-gradient(to right, transparent, black 5%, black 95%, transparent);\n            transition: opacity 0.5s ease;\n        }\n        #vergaplast-isolated-container .hud-scroll-container.hidden-hud { opacity: 0; pointer-events: none; }\n        #vergaplast-isolated-container .hud-scroll-container::-webkit-scrollbar { display: none; }\n        \n        #vergaplast-isolated-container .glass-panel {\n            background: rgba(20, 20, 25, 0.75);\n            backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n        }\n        \n        #vergaplast-isolated-container .desc-glass {\n            background: rgba(30, 30, 35, 0.85);\n            backdrop-filter: blur(20px); border: 1px solid rgba(255,255,255,0.1);\n            box-shadow: 0 15px 50px rgba(0,0,0,0.5);\n        }\n\n        \/* --- MOBILE TWEAKS --- *\/\n        @media (max-width: 1023px) {\n            #vergaplast-isolated-container .steps-list-wrapper {\n                height: 110px !important;\n                min-height: 0 !important;\n                margin-bottom: 5px;\n            }\n            #vergaplast-isolated-container #descPanel { display: none !important; }\n            #vergaplast-isolated-container #legendPanel {\n                padding: 8px 16px !important;\n                gap: 12px !important;\n                background: rgba(10, 10, 12, 0.95) !important;\n                border: 1px solid rgba(255,255,255,0.05);\n                transform: scale(0.95);\n                transform-origin: bottom center;\n            }\n        }\n\n        \/* Terminal *\/\n        #vergaplast-isolated-container .terminal-log {\n            position: absolute; bottom: 80px; left: 20px; \n            width: 200px; height: 80px; \n            overflow: hidden; pointer-events: none; z-index: 10;\n            font-family: 'JetBrains Mono', monospace; font-size: 9px; color: rgba(255,255,255,0.5);\n            text-shadow: 0 0 2px rgba(0,0,0,0.8);\n            mask-image: linear-gradient(to bottom, transparent, black 20%);\n        }\n        #vergaplast-isolated-container .terminal-line { margin-bottom: 2px; animation: vp-fade-in-up 0.3s forwards; }\n        @keyframes vp-fade-in-up { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }\n\n        \/* Hand Control Cursor *\/\n        #vergaplast-isolated-container #webcamVideo { position: absolute; opacity: 0; pointer-events: none; z-index: -1; }\n        #vergaplast-isolated-container #gestureCanvas { position: absolute; inset: 0; pointer-events: none; z-index: 9000; }\n        #vergaplast-isolated-container .gesture-cursor {\n            position: absolute; width: 40px; height: 40px; border: 2px solid #00f0ff; border-radius: 50%;\n            transform: translate(-50%, -50%); pointer-events: none; z-index: 9999; \n            transition: transform 0.1s ease-out; will-change: transform, left, top;\n        }\n        #vergaplast-isolated-container .gesture-cursor.pinched { border-color: #ff5f1f; transform: translate(-50%, -50%) scale(0.8); }\n        #vergaplast-isolated-container .click-ripple {\n            position: absolute; border-radius: 50%; border: 2px solid #ff5f1f;\n            transform: translate(-50%, -50%); pointer-events: none; z-index: 9998;\n            box-shadow: 0 0 20px rgba(255, 95, 31, 0.6); animation: vp-ripple-anim 0.5s ease-out forwards;\n        }\n        @keyframes vp-ripple-anim { 0% { width: 0; opacity: 1; } 100% { width: 80px; opacity: 0; } }\n\n        \/* Modal *\/\n        #vergaplast-isolated-container .modal-overlay {\n            position: absolute; inset: 0; background: rgba(0,0,0,0.85); backdrop-filter: blur(15px);\n            z-index: 20000; display: flex; align-items: center; justify-content: center;\n            opacity: 0; pointer-events: none; transition: opacity 0.3s ease; padding: 20px;\n        }\n        #vergaplast-isolated-container .modal-overlay.active { opacity: 1; pointer-events: auto; }\n        #vergaplast-isolated-container .modal-content {\n            background: #111; border: 1px solid rgba(0, 240, 255, 0.3); border-radius: 24px; \n            padding: 25px; width: 100%; max-width: 400px; max-height: 90vh; overflow-y: auto;\n            transform: scale(0.95); transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n        }\n        #vergaplast-isolated-container .modal-overlay.active .modal-content { transform: scale(1); }\n    <\/style>\n\n    <!-- HTML STRUCTURE -->\n    <video id=\"webcamVideo\" autoplay playsinline muted><\/video>\n    <canvas id=\"gestureCanvas\"><\/canvas>\n    <div id=\"gestureCursor\" class=\"gesture-cursor hidden\"><\/div>\n\n    <!-- MODAL -->\n    <div id=\"gestureModal\" class=\"modal-overlay\">\n        <div class=\"modal-content custom-scroll\">\n            <h2 class=\"text-xl font-bold text-white tracking-widest uppercase mb-4 text-center\">CONTROLLO MANUALE<\/h2>\n            <div class=\"space-y-4 mb-6 text-sm text-gray-300\">\n                <div class=\"flex gap-3\"><span class=\"text-cyan-400 font-bold\">1.<\/span> <span>Unisci dita e muovi per navigare.<\/span><\/div>\n                <div class=\"flex gap-3\"><span class=\"text-cyan-400 font-bold\">2.<\/span> <span>Usa l'indice per puntare.<\/span><\/div>\n                <div class=\"flex gap-3\"><span class=\"text-orange-500 font-bold\">3.<\/span> <span>Pizzica (Pinch) per cliccare.<\/span><\/div>\n            <\/div>\n            <div class=\"flex gap-3\">\n                <button type=\"button\" id=\"btnCancelGesture\" class=\"btn-future w-1\/2\">Chiudi<\/button>\n                <button type=\"button\" id=\"btnStartGesture\" class=\"btn-primary w-1\/2 bg-cyan-500 !text-black\">Avvia<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"app-container\" class=\"app-container\">\n        <!-- Ambient -->\n        <div class=\"absolute inset-0 z-0 bg-[radial-gradient(circle_at_50%_0%,_#1a1a1a_0%,_#000_80%)]\"><\/div>\n        <div class=\"absolute inset-0 z-0 scanlines opacity-20 pointer-events-none\"><\/div>\n        \n        <!-- SIDEBAR (CONTROLS) -->\n        <div class=\"sidebar-panel p-6 lg:p-10 flex flex-col justify-between transition-none\">\n            <div class=\"flex flex-col h-full\"> \n                <!-- Header -->\n                <div class=\"shrink-0 mb-4 lg:mb-10 flex items-center justify-between\">\n                    <div>\n                        <div class=\"flex items-center gap-3\">\n                            <div class=\"w-3 h-3 bg-orange-500 rounded-full shadow-[0_0_15px_#ff5f1f]\"><\/div>\n                            <h1 class=\"text-base lg:text-lg font-bold tracking-[0.2em] text-white !m-0\">VERGAPLAST<span class=\"font-light text-gray-500\">OS<\/span><\/h1>\n                        <\/div>\n                        <div class=\"text-[10px] text-gray-500 tracking-[0.2em] pl-6 uppercase opacity-60\">Thermoformer v2.6 FINAL<\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- Steps List -->\n                <div class=\"relative pl-8 lg:pl-10 flex-1 overflow-y-auto custom-scroll steps-list-wrapper\" id=\"stepsScrollWrapper\">\n                    <div class=\"absolute left-[37px] lg:left-[45px] top-2 bottom-2 w-[2px] bg-white\/10\"><\/div>\n                    <div id=\"progressLine\" class=\"absolute left-[37px] lg:left-[45px] top-2 w-[2px] bg-orange-500 transition-all duration-700 ease-[cubic-bezier(0.22,1,0.36,1)] shadow-[0_0_15px_#ff5f1f]\" style=\"height: 0px\"><\/div>\n                    <div id=\"stepsContainer\" class=\"space-y-6 lg:space-y-10 relative py-1\"><\/div>\n                <\/div>\n\n                <!-- Buttons Area -->\n                <div class=\"pt-4 lg:pt-10 border-t border-white\/5 mt-4 controls-wrapper shrink-0 relative z-10\">\n                    <div class=\"grid grid-cols-2 gap-3 mb-3\">\n                         <button type=\"button\" id=\"btnGesture\" class=\"btn-future w-full flex items-center justify-center gap-2 group\">\n                            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"w-4 h-4 text-cyan-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 00-3 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" \/><\/svg>\n                            <span class=\"text-[10px] lg:text-xs\">HAND <span id=\"gestureStatus\" class=\"opacity-50\">(OFF)<\/span><\/span>\n                        <\/button>\n                        <button type=\"button\" id=\"btnEditMode\" class=\"btn-future w-full flex items-center justify-center gap-2 group\">\n                            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"w-4 h-4 text-gray-400 group-hover:text-orange-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" \/><\/svg>\n                            <span class=\"text-[10px] lg:text-xs\">MODIFICA STAMPO<\/span>\n                        <\/button>\n                    <\/div>\n\n                    <div class=\"flex gap-3 mb-4\">\n                        <button type=\"button\" id=\"btnPrev\" class=\"btn-future flex-1 uppercase text-gray-400 hover:text-white\">Indietro<\/button>\n                        <button type=\"button\" id=\"btnNext\" class=\"btn-primary flex-1 uppercase text-black\">Avanti<\/button>\n                    <\/div>\n                    \n                    <div class=\"flex justify-between items-center text-[10px] text-gray-600 tracking-wider uppercase\">\n                        <span class=\"flex items-center gap-2\"><span class=\"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse shadow-[0_0_10px_#10b981]\"><\/span>Ready<\/span>\n                        <button type=\"button\" id=\"btnReset\" class=\"text-gray-600 hover:text-orange-500 transition-colors bg-transparent border-none p-0\">Reset<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- VISUALIZATION AREA -->\n        <div id=\"canvasWrapper\">\n            \n            <div id=\"terminalLog\" class=\"terminal-log flex flex-col justify-end\">\n                <div class=\"terminal-line\">>> SYSTEM INIT... OK<\/div>\n            <\/div>\n\n            <!-- Radius Control (Auto-docks to bottom on mobile) -->\n            <div id=\"radiusControl\" class=\"hidden\">\n                <div class=\"flex justify-between items-center mb-1\">\n                    <span class=\"text-[10px] font-bold text-orange-500 uppercase tracking-wider\">RAGGIO CURVATURA<\/span>\n                    <span id=\"radiusVal\" class=\"text-[10px] text-white font-mono\">0px<\/span>\n                <\/div>\n                <input type=\"range\" id=\"radiusInput\" min=\"0\" max=\"80\" value=\"0\" class=\"w-full h-8 cursor-pointer\">\n            <\/div>\n\n            <!-- Top HUD -->\n            <div id=\"hudScroll\" class=\"absolute top-0 left-0 w-full z-30 select-none hud-scroll-container\">\n                    <div class=\"glass-panel px-4 py-3 rounded-xl border border-white\/5 flex flex-col min-w-[100px] justify-center bg-black\/40 hud-panel\">\n                        <span class=\"text-[9px] font-bold text-gray-500 tracking-widest uppercase mb-2\">RISCALDI<\/span>\n                        <div class=\"w-full h-1 bg-gray-700\/50 rounded-full overflow-hidden\">\n                            <div id=\"tempBar\" class=\"h-full bg-orange-500 shadow-[0_0_10px_#ff5f1f] transition-all duration-500 w-0\"><\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"glass-panel px-4 py-3 rounded-xl border border-white\/5 flex flex-col min-w-[100px] justify-center bg-black\/40 hud-panel\">\n                        <span class=\"text-[9px] font-bold text-gray-500 tracking-widest uppercase mb-2\">ARIA<\/span>\n                        <div class=\"w-full h-1 bg-gray-700\/50 rounded-full overflow-hidden\">\n                            <div id=\"blowBar\" class=\"h-full bg-cyan-400 shadow-[0_0_10px_#22d3ee] transition-all duration-300 w-0\"><\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"glass-panel px-4 py-3 rounded-xl border border-white\/5 flex flex-col min-w-[100px] justify-center bg-black\/40 hud-panel\">\n                        <span class=\"text-[9px] font-bold text-gray-500 tracking-widest uppercase mb-2\">VUOTO<\/span>\n                        <div class=\"w-full h-1 bg-gray-700\/50 rounded-full overflow-hidden\">\n                            <div id=\"vacuumBar\" class=\"h-full bg-emerald-500 shadow-[0_0_10px_#10b981] transition-all duration-300 w-0\"><\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"glass-panel px-4 py-3 rounded-xl border border-white\/5 flex flex-col min-w-[100px] justify-center bg-black\/40 hud-panel\">\n                        <span class=\"text-[9px] font-bold text-gray-500 tracking-widest uppercase mb-2\">COOLING<\/span>\n                        <div class=\"w-full h-1 bg-gray-700\/50 rounded-full overflow-hidden\">\n                            <div id=\"coolingBar\" class=\"h-full bg-cyan-200 shadow-[0_0_10px_#a5f3fc] transition-all duration-300 w-0\"><\/div>\n                        <\/div>\n                    <\/div>\n            <\/div>\n\n            <div class=\"absolute top-4 right-4 flex gap-2 z-40\">\n                <button type=\"button\" id=\"btnMute\" class=\"p-3 rounded-full bg-black\/40 border border-white\/10 text-gray-300 backdrop-blur-md pointer-events-auto hover:text-white\">\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" \/><\/svg>\n                <\/button>\n                <button type=\"button\" id=\"btnFullscreen\" class=\"p-3 rounded-full bg-black\/40 border border-white\/10 text-gray-300 backdrop-blur-md pointer-events-auto hover:text-white\">\n                    <svg id=\"iconMax\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\" \/><\/svg>\n                    <svg id=\"iconMin\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"w-5 h-5 hidden\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M6 18L18 6M6 6l12 12\" \/><\/svg>\n                <\/button>\n            <\/div>\n\n            <canvas id=\"simCanvas\"><\/canvas>\n\n            <!-- Bottom Area: Legend & Description -->\n            <div class=\"absolute bottom-4 w-full flex flex-col items-center pointer-events-none z-30 px-4 gap-4\">\n                \n                <!-- Legend Panel -->\n                <div id=\"legendPanel\" class=\"glass-panel px-6 py-3 rounded-full border border-white\/5 flex items-center gap-6 shrink-0 bg-[#0a0a0c]\/80 backdrop-blur-xl transition-all\"> \n                    <div class=\"flex flex-col items-center\">\n                        <span class=\"text-[9px] font-bold text-gray-500 uppercase tracking-widest mb-1\">Fase<\/span>\n                        <div id=\"phaseWrapper\" class=\"morph-content\"><span id=\"phaseLabel\" class=\"text-xs lg:text-sm font-bold text-white tracking-wide\">Caricamento<\/span><\/div>\n                    <\/div>\n                    <div class=\"w-px h-8 bg-white\/10\"><\/div>\n                    <div class=\"flex flex-col items-center\">\n                        <span class=\"text-[9px] font-bold text-gray-500 uppercase tracking-widest mb-1\">Azione<\/span>\n                        <div id=\"actionWrapper\" class=\"morph-content\"><span id=\"actionLabel\" class=\"text-xs lg:text-sm font-bold text-orange-500 tracking-wide\">Bloccaggio<\/span><\/div>\n                    <\/div>\n                <\/div>\n\n                <!-- Description Panel -->\n                <div id=\"descPanel\" class=\"hidden lg:flex desc-glass px-8 py-4 rounded-full border-l-4 border-l-orange-500 backdrop-blur-md\">\n                    <p id=\"descText\" class=\"text-xs font-medium text-gray-300\">Inizializzazione del sistema.<\/p>\n                 <\/div>\n            <\/div>\n            \n        <\/div>\n    <\/div>\n    \n    <script>\n    (function() {\n        const container = document.getElementById('vergaplast-isolated-container');\n        if(!container) return;\n\n        const canvas = container.querySelector('#simCanvas');\n        const ctx = canvas.getContext('2d', { alpha: false });\n        const canvasWrapper = container.querySelector('#canvasWrapper');\n        const appContainer = container.querySelector('#app-container');\n        const btnFullscreen = container.querySelector('#btnFullscreen');\n        const btnMute = container.querySelector('#btnMute');\n        const iconMax = container.querySelector('#iconMax');\n        const iconMin = container.querySelector('#iconMin');\n        const radiusControl = container.querySelector('#radiusControl');\n        const radiusInput = container.querySelector('#radiusInput');\n        const radiusVal = container.querySelector('#radiusVal');\n        const hudScroll = container.querySelector('#hudScroll');\n        \n        const btnGesture = container.querySelector('#btnGesture');\n        const gestureStatus = container.querySelector('#gestureStatus');\n        const gestureCanvas = container.querySelector('#gestureCanvas');\n        const gCtx = gestureCanvas.getContext('2d');\n        const webcamVideo = container.querySelector('#webcamVideo');\n        const gestureCursor = container.querySelector('#gestureCursor');\n        \n        const gestureModal = container.querySelector('#gestureModal');\n        const btnStartGesture = container.querySelector('#btnStartGesture');\n        const btnCancelGesture = container.querySelector('#btnCancelGesture');\n        \n        const terminalLog = container.querySelector('#terminalLog');\n\n        \/\/ State\n        let isGestureMode = false;\n        let isProcessingFrame = false;\n        let hands = null;\n        let camera = null;\n        let handCursor = { x: 0, y: 0, pinched: false, startX: 0, startY: 0, startTime: 0 };\n        let currentStep = 1;\n        let isFullscreenMode = false;\n        let audioEnabled = true;\n        let audioCtx = null;\n\n        \/\/ --- AUDIO ENGINE ---\n        const SoundFX = {\n            init() {\n                if(!audioCtx) {\n                    const AudioContext = window.AudioContext || window.webkitAudioContext;\n                    if(AudioContext) audioCtx = new AudioContext();\n                }\n                if(audioCtx && audioCtx.state === 'suspended') audioCtx.resume();\n            },\n            playTone(freq, type, duration, vol=0.1) {\n                if(!audioEnabled || !audioCtx) return;\n                const osc = audioCtx.createOscillator();\n                const gain = audioCtx.createGain();\n                osc.type = type;\n                osc.frequency.setValueAtTime(freq, audioCtx.currentTime);\n                gain.gain.setValueAtTime(vol, audioCtx.currentTime);\n                gain.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + duration);\n                osc.connect(gain);\n                gain.connect(audioCtx.destination);\n                osc.start();\n                osc.stop(audioCtx.currentTime + duration);\n            },\n            click() { this.playTone(800, 'sine', 0.1, 0.05); },\n            swipe() { this.playTone(300, 'triangle', 0.2, 0.05); },\n            cncDrill() { this.playTone(150, 'sawtooth', 0.1, 0.02); },\n            stepChange() {\n                if(!audioEnabled || !audioCtx) return;\n                const now = audioCtx.currentTime;\n                [440, 554, 659].forEach((f, i) => {\n                    const osc = audioCtx.createOscillator();\n                    const gain = audioCtx.createGain();\n                    osc.type = 'sine';\n                    osc.frequency.setValueAtTime(f, now + i*0.05);\n                    gain.gain.setValueAtTime(0.05, now + i*0.05);\n                    gain.gain.exponentialRampToValueAtTime(0.001, now + i*0.05 + 0.3);\n                    osc.connect(gain);\n                    gain.connect(audioCtx.destination);\n                    osc.start(now + i*0.05);\n                    osc.stop(now + i*0.05 + 0.3);\n                });\n            }\n        };\n\n        function logMsg(text) {\n            const line = document.createElement('div');\n            line.className = 'terminal-line';\n            line.innerText = `>> ${text}`;\n            terminalLog.appendChild(line);\n            if(terminalLog.children.length > 5) terminalLog.removeChild(terminalLog.firstChild);\n        }\n\n        const COL_NEON_ORANGE = '#ff5f1f';\n        const COL_NEON_BLUE = '#00f0ff';\n        \n        const stepsInfo = [\n            { id: 1, title: \"CARICAMENTO\", desc: \"Bloccaggio\", details: \"La lastra viene posizionata e bloccata ermeticamente dalla cornice.\" },\n            { id: 2, title: \"RISCALDAMENTO\", desc: \"Plastificazione\", details: \"Riscaldamento IR bilaterale per raggiungere la temperatura di transizione vetrosa.\" },\n            { id: 3, title: \"RITIRO\", desc: \"Arretramento\", details: \"I banchi riscaldanti si ritirano rapidamente per liberare l'area di formatura.\" },\n            { id: 4, title: \"IMBUTITURA\", desc: \"Bolla\", details: \"Pre-stiramento del materiale tramite aria compressa per uniformare gli spessori.\" },\n            { id: 5, title: \"STAMPAGGIO\", desc: \"Salita Stampo\", details: \"Lo stampo sale meccanicamente. La lastra si tende sulle geometrie principali.\" },\n            { id: 6, title: \"VUOTO\", desc: \"Formatura\", details: \"Il vuoto crea una depressione istantanea, copiando perfettamente i dettagli.\" },\n            { id: 7, title: \"COOLING\", desc: \"Raffreddamento\", details: \"Ventole ad alta portata stabilizzano dimensionale il pezzo.\" },\n            { id: 8, title: \"ESTRAZIONE\", desc: \"Sformatura\", details: \"L'aria compressa (controsformo) stacca il pezzo dallo stampo che scende.\" },\n            { id: 9, title: \"CNC 5-ASSi\", desc: \"Finitura\", details: \"Il robot a 5 assi rifila i bordi (sfrido) e crea fori e asole sul pezzo finito.\" },\n            { id: 10, title: \"FINITO\", desc: \"Eccellenza\", details: \"Il prodotto Vergaplast finito. Rifinito, pulito e pronto.\" }\n        ];\n\n        let simState = {\n            frameOpen: 1.0, heaterPos: -1.0, heaterTemp: 0, \n            sheetTemp: 25, sheetPoints: [], sheetSag: 0, \n            moldPos: 0, vacuum: 0, airBlow: 0, airEject: 0,\n            fanIntensity: 0, fanAngle: 0,\n            presentationProgress: 0,\n            \n            \/\/ CNC STATE\n            cncOpIndex: 0,\n            cncTimer: 0,\n            cncToolPos: {x: -100, y: -100},\n            cncToolType: 'LAMA', \/\/ LAMA, FRESA\n            scrapLeft: { active: false, y: 0, r: 0 },\n            scrapRight: { active: false, y: 0, r: 0 },\n            drawnHoles: [], \/\/ {x, y, r}\n            \n            editingMode: false, draggingPointIndex: -1, selectedPointIndex: -1, \n            moldPoints: [\n                {x: 0.0, y: 1.0, r: 0}, {x: 0.1, y: 0.4, r: 10}, {x: 0.3, y: 0.4, r: 20},\n                {x: 0.35, y: 0.0, r: 5}, {x: 0.65, y: 0.0, r: 5}, {x: 0.7, y: 0.4, r: 20},\n                {x: 0.9, y: 0.4, r: 10}, {x: 1.0, y: 1.0, r: 0}\n            ],\n            bakedMoldSegments: [] \n        };\n\n        const NUM_POINTS = 180; \n        const SHEET_Y_RATIO = 0.5;\n        const TARGET_HEAT = 180;\n        const airflowSettings = { speed: 0.3, turbulence: 1.4, density: 150, showLines: true, mouseX: -1000, mouseY: -1000 };\n\n        \/\/ --- UTILS & CORE ---\n        function lerp(start, end, t) { return start * (1 - t) + end * t; }\n        function pseudoNoise(x, y, t) { return Math.sin(x*0.01+t) * Math.cos(y*0.01-t*0.5); }\n        function drawRoundedRect(ctx, x, y, w, h, r) {\n            ctx.beginPath(); \n            if(ctx.roundRect) ctx.roundRect(x,y,w,h,r); else ctx.rect(x,y,w,h);\n            ctx.closePath();\n        }\n\n        function initPoints() {\n            simState.sheetPoints = [];\n            for(let i=0; i<=NUM_POINTS; i++) simState.sheetPoints.push({ x: i\/NUM_POINTS, y: 0, finalFormY: 0, dy: 0, vy: 0 });\n            bakeMoldGeometry(canvas.width, canvas.height); \n        }\n\n        function resize() {\n            if(canvasWrapper) {\n                const rect = canvasWrapper.getBoundingClientRect();\n                if(rect.width > 0 && rect.height > 0) {\n                    canvas.width = rect.width;\n                    canvas.height = rect.height;\n                    bakeMoldGeometry(canvas.width, canvas.height);\n                    updateProgressLine(); \n                }\n            }\n            if(container) {\n                const rect = container.getBoundingClientRect();\n                if(rect.width > 0 && rect.height > 0) {\n                    gestureCanvas.width = rect.width;\n                    gestureCanvas.height = rect.height;\n                }\n            }\n        }\n        \n        const resizeObserver = new ResizeObserver(() => resize());\n        resizeObserver.observe(container);\n\n        function toggleFullscreen() {\n            isFullscreenMode = !isFullscreenMode;\n            if (isFullscreenMode) {\n                container.classList.add('force-fullscreen');\n                iconMax.classList.add('hidden'); iconMin.classList.remove('hidden');\n                if (container.requestFullscreen) container.requestFullscreen().catch(()=>{});\n            } else {\n                container.classList.remove('force-fullscreen');\n                iconMax.classList.remove('hidden'); iconMin.classList.add('hidden');\n                if (document.fullscreenElement) document.exitFullscreen().catch(()=>{});\n            }\n            setTimeout(resize, 100);\n            setTimeout(resize, 500);\n        }\n        btnFullscreen.addEventListener('click', toggleFullscreen);\n\n        btnMute.addEventListener('click', () => {\n            audioEnabled = !audioEnabled;\n            btnMute.style.opacity = audioEnabled ? '1' : '0.5';\n            SoundFX.init();\n            logMsg(audioEnabled ? 'AUDIO: ENABLED' : 'AUDIO: MUTED');\n        });\n\n        const bEdit = container.querySelector('#btnEditMode');\n        bEdit.onclick = () => {\n            SoundFX.click();\n            if(currentStep === 9 || currentStep === 10) return; \n            if(simState.editingMode) { setEditMode(false); } \n            else if(currentStep === 1 || currentStep === 8) { setEditMode(true); }\n        };\n\n        \/\/ --- GESTURE LOGIC START ---\n        btnGesture.onclick = () => {\n            SoundFX.click();\n            if(!isGestureMode) {\n                gestureModal.classList.add('active');\n            } else {\n                stopGestureControl();\n            }\n        };\n\n        btnCancelGesture.onclick = () => {\n            gestureModal.classList.remove('active');\n        };\n\n        btnStartGesture.onclick = async () => {\n            gestureModal.classList.remove('active');\n            gestureStatus.innerText = '(INIT...)';\n            SoundFX.init();\n            try {\n                await initGestureControl();\n                isGestureMode = true;\n                btnGesture.classList.add('btn-gesture-active');\n                gestureStatus.innerText = '(ONLINE)';\n                gestureCursor.classList.remove('hidden');\n                logMsg('NEURAL LINK: ESTABLISHED');\n                resize(); \n            } catch(e) {\n                console.error(e);\n                gestureStatus.innerText = '(ERROR)';\n                alert('Errore Webcam: ' + e.message);\n            }\n        };\n\n        function stopGestureControl() {\n            isGestureMode = false;\n            btnGesture.classList.remove('btn-gesture-active');\n            gestureStatus.innerText = '(OFF)';\n            gestureCursor.classList.add('hidden');\n            logMsg('NEURAL LINK: OFFLINE');\n            if(camera) { \n                const stream = webcamVideo.srcObject;\n                if(stream) stream.getTracks().forEach(track => track.stop());\n                webcamVideo.srcObject = null;\n            }\n            gCtx.clearRect(0,0,gestureCanvas.width, gestureCanvas.height);\n        }\n\n        async function initGestureControl() {\n            if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n                throw new Error(\"Browser API not supported\");\n            }\n            \n            hands = new Hands({locateFile: (file) => {\n                return `https:\/\/cdn.jsdelivr.net\/npm\/@mediapipe\/hands@0.4.1646424915\/${file}`;\n            }});\n            \n            hands.setOptions({ maxNumHands: 1, modelComplexity: 1, minDetectionConfidence: 0.7, minTrackingConfidence: 0.7 });\n            hands.onResults(onHandResults);\n\n            camera = new Camera(webcamVideo, {\n                onFrame: async () => {\n                    if (!isProcessingFrame && isGestureMode) {\n                        isProcessingFrame = true;\n                        await hands.send({image: webcamVideo});\n                        isProcessingFrame = false;\n                    }\n                },\n                width: 320, height: 240\n            });\n            await camera.start();\n        }\n\n        function onHandResults(results) {\n            if(!isGestureMode) return;\n            gCtx.save();\n            gCtx.clearRect(0, 0, gestureCanvas.width, gestureCanvas.height);\n            \n            if (results.multiHandLandmarks && results.multiHandLandmarks.length > 0) {\n                const landmarks = results.multiHandLandmarks[0];\n                gCtx.translate(gestureCanvas.width, 0); gCtx.scale(-1, 1);\n                drawTacticalHand(landmarks);\n\n                const indexTip = landmarks[8];\n                const thumbTip = landmarks[4];\n                const x = (1 - indexTip.x) * gestureCanvas.width;\n                const y = indexTip.y * gestureCanvas.height;\n                \n                handCursor.x = lerp(handCursor.x, x, 0.4);\n                handCursor.y = lerp(handCursor.y, y, 0.4);\n\n                gestureCursor.style.left = handCursor.x + 'px';\n                gestureCursor.style.top = handCursor.y + 'px';\n\n                const wrapperRect = canvasWrapper.getBoundingClientRect();\n                const containerRect = container.getBoundingClientRect();\n                const offsetX = wrapperRect.left - containerRect.left;\n                const offsetY = wrapperRect.top - containerRect.top;\n                \n                airflowSettings.mouseX = handCursor.x - offsetX;\n                airflowSettings.mouseY = handCursor.y - offsetY;\n\n                const dx = (thumbTip.x - indexTip.x) * gestureCanvas.width;\n                const dy = (thumbTip.y - indexTip.y) * gestureCanvas.height;\n                const dist = Math.sqrt(dx*dx + dy*dy);\n                \n                if(dist < 50) {\n                    if(!handCursor.pinched) {\n                        handCursor.pinched = true;\n                        handCursor.startX = handCursor.x;\n                        handCursor.startY = handCursor.y;\n                        gestureCursor.classList.add('pinched');\n                    }\n                } else {\n                    if(handCursor.pinched) {\n                        handCursor.pinched = false;\n                        gestureCursor.classList.remove('pinched');\n                        handleGestureRelease(handCursor.x, handCursor.y, handCursor.startX, handCursor.startY);\n                    }\n                }\n            } else {\n                airflowSettings.mouseX = -1000;\n            }\n            gCtx.restore();\n        }\n\n        function drawTacticalHand(landmarks) {\n            const w = gestureCanvas.width; const h = gestureCanvas.height;\n            gCtx.lineWidth = 1; gCtx.strokeStyle = 'rgba(255, 255, 255, 0.15)'; gCtx.setLineDash([2, 4]);\n            gCtx.beginPath();\n            for (const conn of HAND_CONNECTIONS) {\n                const p1 = landmarks[conn[0]]; const p2 = landmarks[conn[1]];\n                gCtx.moveTo(p1.x * w, p1.y * h); gCtx.lineTo(p2.x * w, p2.y * h);\n            }\n            gCtx.stroke(); gCtx.setLineDash([]); \n            for (let i = 0; i < landmarks.length; i++) {\n                const lm = landmarks[i]; const px = lm.x * w; const py = lm.y * h;\n                const isTip = [4, 8, 12, 16, 20].includes(i);\n                if (isTip) {\n                    gCtx.strokeStyle = i === 8 ? '#00f0ff' : 'rgba(255, 255, 255, 0.5)';\n                    gCtx.lineWidth = 2; gCtx.beginPath(); gCtx.arc(px, py, 4, 0, 2 * Math.PI); gCtx.stroke();\n                } else {\n                    gCtx.fillStyle = 'rgba(0, 240, 255, 0.5)'; gCtx.fillRect(px - 1, py - 1, 2, 2);\n                }\n            }\n        }\n\n        function handleGestureRelease(x, y, sx, sy) {\n            const dx = x - sx; const dy = y - sy; const dist = Math.sqrt(dx*dx + dy*dy);\n            if (dist > 100) {\n                 SoundFX.swipe();\n                 if (dx > 50) {\n                       container.querySelector('#btnPrev').click();\n                       createSwipeVisual(x, y, '>> INDIETRO');\n                 } else if (dx < -50) {\n                       container.querySelector('#btnNext').click();\n                       createSwipeVisual(x, y, 'AVANTI >>');\n                 }\n            } else if (dist < 40) { handleGestureClick(sx, sy); }\n        }\n\n        function handleGestureClick(x, y) {\n            SoundFX.click(); createRipple(x, y); gestureCanvas.style.display = 'none';\n            const containerRect = container.getBoundingClientRect();\n            const clientX = containerRect.left + x; const clientY = containerRect.top + y;\n            let target = document.elementFromPoint(clientX, clientY);\n            gestureCanvas.style.display = 'block';\n            if(target) {\n                const clickable = target.closest('button') || target.closest('input') || target.closest('.step-dot');\n                if(clickable) {\n                    clickable.click(); clickable.classList.add('active');\n                    setTimeout(() => clickable.classList.remove('active'), 200);\n                }\n            }\n        }\n        \n        function createRipple(x, y) {\n            const ripple = document.createElement('div');\n            ripple.className = 'click-ripple'; ripple.style.left = x + 'px'; ripple.style.top = y + 'px';\n            container.appendChild(ripple); setTimeout(() => ripple.remove(), 600);\n        }\n        \n        function createSwipeVisual(x, y, text) {\n             const el = document.createElement('div');\n             el.className = 'swipe-arrow'; el.innerText = text; el.style.left = x + 'px'; el.style.top = y + 'px';\n             container.appendChild(el); setTimeout(() => el.remove(), 700);\n        }\n\n        function setEditMode(active) {\n            simState.editingMode = active;\n            logMsg(active ? 'MODE: EDIT MOLD' : 'MODE: SIMULATION');\n            if(active) { bEdit.classList.add('active'); } \n            else { \n                bEdit.classList.remove('active'); simState.draggingPointIndex = -1; \n                simState.selectedPointIndex = -1; radiusControl.classList.add('hidden'); \n            }\n            if((currentStep === 8 || currentStep === 9 || currentStep === 10) && !active) { currentStep = 1; simState.sheetTemp = 25; updateUI(); } \n            else { updateUI(); }\n        }\n\n        radiusInput.addEventListener('input', (e) => {\n            const val = parseInt(e.target.value); radiusVal.innerText = val + 'px';\n            if(simState.selectedPointIndex !== -1) {\n                simState.moldPoints[simState.selectedPointIndex].r = val; bakeMoldGeometry(canvas.width, canvas.height);\n            }\n        });\n        \/\/ Prevent click\/touch on range slider from triggering canvas events\n        radiusInput.addEventListener('mousedown', (e) => e.stopPropagation());\n        radiusInput.addEventListener('touchstart', (e) => e.stopPropagation());\n        radiusControl.addEventListener('mousedown', (e) => e.stopPropagation());\n        radiusControl.addEventListener('touchstart', (e) => e.stopPropagation());\n\n        function bakeMoldGeometry(w, h) {\n            const mw=w*0.5, mh=h*0.25; simState.bakedMoldSegments = [];\n            function addSegment(x1, y1, x2, y2) { simState.bakedMoldSegments.push({x1, y1, x2, y2}); }\n            let curr = {x: simState.moldPoints[0].x, y: simState.moldPoints[0].y};\n            for(let i=0; i<simState.moldPoints.length-1; i++) {\n                const p1=curr, p2=simState.moldPoints[i+1], p3=simState.moldPoints[i+2];\n                if(!p3) { addSegment(p1.x, p1.y, p2.x, p2.y); break; }\n                const P1={x:p1.x*mw, y:p1.y*mh}, P2={x:p2.x*mw, y:p2.y*mh}, P3={x:p3.x*mw, y:p3.y*mh};\n                const v1={x:P1.x-P2.x, y:P1.y-P2.y}, v2={x:P3.x-P2.x, y:P3.y-P2.y};\n                const len1=Math.hypot(v1.x, v1.y), len2=Math.hypot(v2.x, v2.y);\n                const effR = Math.min(p2.r||0, Math.min(len1,len2)\/2);\n                if(effR<=1) { addSegment(p1.x, p1.y, p2.x, p2.y); curr={x:p2.x, y:p2.y}; continue; }\n                const S={x:P2.x+(v1.x\/len1)*effR, y:P2.y+(v1.y\/len1)*effR};\n                const E={x:P2.x+(v2.x\/len2)*effR, y:P2.y+(v2.y\/len2)*effR};\n                addSegment(curr.x, curr.y, S.x\/mw, S.y\/mh);\n                const steps=6; let pax=S.x\/mw, pay=S.y\/mh;\n                for(let s=1; s<=steps; s++) {\n                    const t=s\/steps, it=1-t;\n                    const bx=(it*it*S.x + 2*it*t*P2.x + t*t*E.x)\/mw;\n                    const by=(it*it*S.y + 2*it*t*P2.y + t*t*E.y)\/mh;\n                    addSegment(pax, pay, bx, by); pax=bx; pay=by;\n                }\n                curr={x:E.x\/mw, y:E.y\/mh};\n            }\n        }\n        function getMoldSurfaceY(lx) {\n            if(lx<=0||lx>=1) return 1.0;\n            for(let s of simState.bakedMoldSegments) {\n                if(lx >= Math.min(s.x1,s.x2)-0.001 && lx <= Math.max(s.x1,s.x2)+0.001) {\n                    if(Math.abs(s.x2-s.x1)<0.0001) return s.y1;\n                    return s.y1 + (s.y2-s.y1)*((lx-s.x1)\/(s.x2-s.x1));\n                }\n            }\n            return 1.0;\n        }\n\n        \/\/ --- AIRFLOW ENGINE (SIMPLIFIED) ---\n        const AirflowEngine = {\n            particles:[], bubbleParticles:[], vacuumStreams:[], heatStreams:[], ejectionStreams:[],\n            init() { \n                this.particles=[]; this.bubbleParticles=[]; this.vacuumStreams=[]; this.heatStreams=[]; this.ejectionStreams=[];\n            },\n            updateAndDraw(ctx,w,h,sy,t) {\n                if(simState.fanIntensity<0.05) return;\n                const req = Math.floor(100*simState.fanIntensity);\n                const safeMinX = w*0.15+15, safeMaxX = w*0.85-15;\n                while(this.particles.length<req) this.particles.push({x: safeMinX+Math.random()*(safeMaxX-safeMinX), y:-20-Math.random()*100, age:0, life:100+Math.random()*100, trail:[]});\n                ctx.save();\n                for(let i=this.particles.length-1; i>=0; i--) {\n                    let p=this.particles[i];\n                    p.x+= -((p.x-w\/2)*0.003) + pseudoNoise(p.x,p.y,t*2)*7; p.y+=4; p.age++;\n                    if(p.age%2===0) { p.trail.push({x:p.x,y:p.y}); if(p.trail.length>10) p.trail.shift(); }\n                    if(p.y>=sy) { p.y=sy; p.life-=5; }\n                    if(p.life<=0 || p.x<safeMinX || p.x>safeMaxX) { this.particles.splice(i,1); continue; }\n                    if(p.trail.length>2) {\n                        ctx.beginPath(); ctx.moveTo(p.trail[0].x, p.trail[0].y);\n                        for(let j=1; j<p.trail.length-1; j++) ctx.quadraticCurveTo(p.trail[j].x, p.trail[j].y, (p.trail[j].x+p.trail[j+1].x)\/2, (p.trail[j].y+p.trail[j+1].y)\/2);\n                        ctx.strokeStyle=`rgba(165,243,252,${Math.min(1,p.age\/40)*(p.life\/100)*simState.fanIntensity*0.4})`; ctx.stroke();\n                    }\n                }\n                ctx.restore();\n            },\n            updateAndDrawHeat(ctx, w, h, sy, yTop, yBot, heaterW, heaterX, t) {\n                if(simState.heaterTemp<0.05) return;\n                const spawnRate = Math.max(1, Math.floor(2 * simState.heaterTemp));\n                const safeMinX = heaterX+20, safeMaxX = heaterX+heaterW-20;\n                for(let i=0; i<spawnRate; i++) {\n                    if(this.heatStreams.length<40) {\n                        this.heatStreams.push({\n                            x: safeMinX + Math.random()*(safeMaxX-safeMinX),\n                            y: 0, isBottom: Math.random()>0.5, speed: 1.0+Math.random()*1.5, life: 1.0, size: 30+Math.random()*30, offset: Math.random()*100\n                        });\n                        const last = this.heatStreams[this.heatStreams.length-1];\n                        last.y = last.isBottom ? yBot-10 : yTop+35;\n                    }\n                }\n                ctx.save(); ctx.globalCompositeOperation='screen';\n                for(let i=this.heatStreams.length-1; i>=0; i--) {\n                    let p=this.heatStreams[i];\n                    if(p.isBottom) p.y-=p.speed; else p.y+=p.speed;\n                    p.x += Math.sin(t+p.y*0.01+p.offset)*0.3; p.life-=0.015;\n                    if(Math.abs(p.y-sy)<60) p.life-=0.03;\n                    if(p.life<=0) { this.heatStreams.splice(i,1); continue; }\n                    const alpha = p.life*simState.heaterTemp*0.2;\n                    const grad = ctx.createRadialGradient(p.x,p.y,0,p.x,p.y,p.size);\n                    grad.addColorStop(0, `rgba(255,140,40,${alpha})`); grad.addColorStop(1, `rgba(100,50,0,0)`);\n                    ctx.fillStyle=grad; ctx.beginPath(); ctx.arc(p.x,p.y,p.size,0,Math.PI*2); ctx.fill();\n                }\n                ctx.restore();\n            },\n            updateAndDrawBubble(ctx, w, h, sy, t) {\n                if(simState.airBlow<0.05) return;\n                const density=50, spawnRate=Math.floor(density*simState.airBlow);\n                const safeMinX = w*0.15+20, safeMaxX = w*0.85-20, spawnWidth=(safeMaxX-safeMinX)*0.6, cx=w\/2;\n                for(let i=0; i<spawnRate; i++) {\n                    if(this.bubbleParticles.length<100) this.bubbleParticles.push({x: cx+(Math.random()-0.5)*spawnWidth, y: h, speed: 4+Math.random()*4, vx: (Math.random()-0.5)*0.5, life: 100, trail:[]});\n                }\n                ctx.save(); ctx.globalCompositeOperation='screen';\n                for(let i=this.bubbleParticles.length-1; i>=0; i--) {\n                    let p=this.bubbleParticles[i];\n                    p.y-=p.speed; p.x+=p.vx+Math.sin(p.y*0.02+t)*0.5; p.life--;\n                    if(p.life%2===0){ p.trail.push({x:p.x,y:p.y}); if(p.trail.length>8) p.trail.shift(); }\n                    if(p.y<sy-100) p.life-=10;\n                    if(p.life<=0 || p.x<safeMinX || p.x>safeMaxX) { this.bubbleParticles.splice(i,1); continue; }\n                    if(p.trail.length>2) {\n                        ctx.beginPath(); ctx.moveTo(p.trail[0].x, p.trail[0].y);\n                        for(let j=1; j<p.trail.length-1; j++) ctx.quadraticCurveTo(p.trail[j].x, p.trail[j].y, (p.trail[j].x+p.trail[j+1].x)\/2, (p.trail[j].y+p.trail[j+1].y)\/2);\n                        ctx.strokeStyle=`rgba(0,240,255,${(p.life\/100)*simState.airBlow*0.5})`; ctx.lineWidth=2; ctx.stroke();\n                    }\n                }\n                ctx.restore();\n            },\n            updateAndDrawVacuum(ctx, w, h, sy, moldBox, t, intensity) {\n                if(intensity<0.05) return;\n                const spawnRate=3*intensity, cx=w\/2, mbY=moldBox.y+moldBox.h;\n                const safeMinX=w*0.15+20, safeMaxX=w*0.85-20, sw=safeMaxX-safeMinX;\n                for(let i=0; i<spawnRate; i++) {\n                    if(this.vacuumStreams.length<100) {\n                        let sx=cx+(Math.random()-0.5)*sw; if(sx<safeMinX) sx=safeMinX; if(sx>safeMaxX) sx=safeMaxX;\n                        this.vacuumStreams.push({x: sx, y: sy-20-Math.random()*60, life: 1.0, width: 1+Math.random()*2, offset: Math.random()*100, trail:[]});\n                    }\n                }\n                ctx.save(); ctx.globalCompositeOperation='screen';\n                for(let i=this.vacuumStreams.length-1; i>=0; i--) {\n                    let p=this.vacuumStreams[i];\n                    let dx=cx-p.x, dy=(mbY+50)-p.y, dist=Math.sqrt(dx*dx+dy*dy);\n                    let speed=(12+(600\/(dist+1)))*intensity;\n                    p.x+=(dx\/dist)*speed + Math.sin(t*20+p.y*0.05+p.offset)*10*intensity*0.2;\n                    p.y+=(dy\/dist)*speed; p.life-=0.02;\n                    p.trail.push({x:p.x,y:p.y}); if(p.trail.length>8) p.trail.shift();\n                    if(p.y>=mbY || p.life<=0 || p.x<safeMinX || p.x>safeMaxX) { this.vacuumStreams.splice(i,1); continue; }\n                    if(p.trail.length>2) {\n                        const head=p.trail[p.trail.length-1], tail=p.trail[0];\n                        const grad=ctx.createLinearGradient(tail.x, tail.y, head.x, head.y);\n                        const a=p.life*intensity;\n                        grad.addColorStop(0, `rgba(16,185,129,0)`); grad.addColorStop(1, `rgba(110,231,183,${a})`);\n                        ctx.strokeStyle=grad; ctx.lineWidth=p.width; ctx.lineCap='round'; ctx.lineJoin='round';\n                        ctx.beginPath(); ctx.moveTo(tail.x, tail.y);\n                        for(let j=1; j<p.trail.length-1; j++) {\n                            const pt=p.trail[j]; if(pt.y>mbY) break;\n                            ctx.quadraticCurveTo(pt.x, pt.y, (pt.x+p.trail[j+1].x)\/2, (pt.y+p.trail[j+1].y)\/2);\n                        }\n                        if(head.y<=mbY) ctx.lineTo(head.x, head.y);\n                        ctx.stroke(); \n                    }\n                }\n                ctx.restore();\n            },\n            updateAndDrawEjection(ctx, w, h, sy, moldBox, t) {\n                if(simState.airEject<0.05) return;\n                const spawnRate = 4;\n                const mw = moldBox.w;\n                for(let i=0; i<spawnRate; i++) {\n                    if(this.ejectionStreams.length<100) {\n                        const rLoc = Math.random();\n                        const rX = moldBox.x + rLoc * mw;\n                        const rY = moldBox.y + getMoldSurfaceY(rLoc)*moldBox.h;\n                        this.ejectionStreams.push({\n                            x: rX, y: rY, \n                            vx: (Math.random()-0.5)*1.5, \n                            vy: -8 - Math.random()*4, \n                            life: 1.0, \n                            width: 1+Math.random()*3,\n                            trail:[]\n                        });\n                    }\n                }\n                ctx.save(); ctx.globalCompositeOperation='screen';\n                for(let i=this.ejectionStreams.length-1; i>=0; i--) {\n                    let p=this.ejectionStreams[i];\n                    p.x += p.vx; p.y += p.vy;\n                    p.vy *= 0.96; p.life -= 0.04;\n                    p.trail.push({x:p.x, y:p.y}); \n                    if(p.trail.length > 8) p.trail.shift();\n                    if(p.life<=0 || p.y < sy-150) { this.ejectionStreams.splice(i,1); continue; }\n                    if(p.trail.length > 2) {\n                        const head = p.trail[p.trail.length-1], tail = p.trail[0];\n                        const alpha = p.life * simState.airEject;\n                        const grad = ctx.createLinearGradient(tail.x, tail.y, head.x, head.y);\n                        grad.addColorStop(0, `rgba(255, 255, 255, 0)`); \n                        grad.addColorStop(0.5, `rgba(200, 240, 255, ${alpha*0.8})`);\n                        grad.addColorStop(1, `rgba(255, 255, 255, ${alpha})`);\n                        ctx.strokeStyle = grad; ctx.lineWidth = p.width; ctx.lineCap = 'round'; ctx.lineJoin = 'round';\n                        ctx.beginPath(); ctx.moveTo(tail.x, tail.y);\n                        for(let j=1; j<p.trail.length-1; j++) {\n                            const xc = (p.trail[j].x + p.trail[j+1].x) \/ 2;\n                            const yc = (p.trail[j].y + p.trail[j+1].y) \/ 2;\n                            ctx.quadraticCurveTo(p.trail[j].x, p.trail[j].y, xc, yc);\n                        }\n                        ctx.lineTo(head.x, head.y);\n                        ctx.stroke();\n                    }\n                }\n                ctx.restore();\n            }\n        };\n\n        \/\/ --- CNC SYSTEM ---\n        function initCNC() {\n            simState.cncOpIndex = 0;\n            simState.cncTimer = 0;\n            simState.scrapLeft = {active: false, y: 0, r: 0};\n            simState.scrapRight = {active: false, y: 0, r: 0};\n            simState.holes = [];\n            simState.cncToolPos = {x: canvas.width\/2, y: -100}; \n            simState.drawnPaths = []; \n            simState.drawnHoles = [];\n        }\n\n        function getMoldBounds() {\n            const w = canvas.width;\n            const mw = w * 0.5;\n            const mx = (w - mw)\/2; \n            \n            let startIdx = 0;\n            let endIdx = simState.moldPoints.length - 1;\n            let found = false;\n\n            \/\/ Scansione da sinistra\n            for(let i=0; i<simState.moldPoints.length; i++) {\n                if(simState.moldPoints[i].y < 0.98) {\n                    startIdx = Math.max(0, i - 1); \/\/ Prende il punto base prima della salita\n                    found = true;\n                    break;\n                }\n            }\n\n            \/\/ Scansione da destra\n            for(let i=simState.moldPoints.length-1; i>=0; i--) {\n                if(simState.moldPoints[i].y < 0.98) {\n                    endIdx = Math.min(simState.moldPoints.length - 1, i + 1); \/\/ Prende il punto base dopo la discesa\n                    break;\n                }\n            }\n\n            if(!found) { startIdx = 0; endIdx = simState.moldPoints.length - 1; }\n\n            let minX = simState.moldPoints[startIdx].x;\n            let maxX = simState.moldPoints[endIdx].x;\n\n            return {\n                trimLeftX: mx + minX * mw, \n                trimRightX: mx + maxX * mw, \n                centerX: mx + ((minX+maxX)\/2) * mw,\n                width: (maxX-minX) * mw,\n                normMin: minX,\n                normMax: maxX\n            };\n        }\n\n        function updateCNCLogic() {\n            if(currentStep !== 9) return;\n            \n            const w = canvas.width;\n            const h = canvas.height;\n            const sy = h * SHEET_Y_RATIO;\n            const bounds = getMoldBounds();\n            const mh = h * 0.25;\n            const moldY = sy - mh + 25; \n            \n            let targetX = simState.cncToolPos.x;\n            let targetY = -50; \n            \n            const op = simState.cncOpIndex;\n            \n            const moveSpeed = 0.02; \n            const cutDuration = 180; \n            \n            if(op === 0) { \n                simState.cncOpIndex++;\n            }\n            else if(op === 1) { \/\/ Left Trim (TAGLIO ASIMMETRICO 1)\n                targetX = bounds.trimLeftX; \n                if(Math.abs(simState.cncToolPos.x - targetX) < 5) {\n                    targetY = sy + 80; \/\/ Molto pi\u00f9 in basso rispetto ai fori (che sono max a sy+10)\n                    if(simState.cncToolPos.y >= sy + 70) { \/\/ Attiva appena arriva in zona\n                        if(!simState.scrapLeft.active) { SoundFX.cncDrill(); simState.scrapLeft.active = true; }\n                        simState.cncTimer++;\n                        if(simState.cncTimer > cutDuration) { simState.cncOpIndex++; simState.cncTimer=0; }\n                    } else targetY = sy + 80;\n                }\n            }\n            else if(op === 2) { \/\/ Right Trim (TAGLIO ASIMMETRICO 2 - PROFONDO)\n                targetX = bounds.trimRightX; \n                if(Math.abs(simState.cncToolPos.x - targetX) < 5) {\n                    targetY = sy + 160; \/\/ Drasticamente pi\u00f9 basso\n                    if(simState.cncToolPos.y >= sy + 150) {\n                        if(!simState.scrapRight.active) { SoundFX.cncDrill(); simState.scrapRight.active = true; }\n                        simState.cncTimer++;\n                        if(simState.cncTimer > cutDuration) { simState.cncOpIndex++; simState.cncTimer=0; }\n                    } else targetY = sy + 160;\n                }\n            }\n            else if(op >= 3 && op <= 6) { \n                const factors = [0.15, 0.35, 0.65, 0.85];\n                const factor = factors[op-3];\n                targetX = bounds.trimLeftX + bounds.width * factor;\n                \n                const mx = (w - w*0.5)\/2;\n                const mw = w * 0.5;\n                const relX = (targetX - mx) \/ mw;\n                \n                const surfaceY = (sy - mh) + getMoldSurfaceY(relX) * mh;\n                const innerOffset = 25; \/\/ AUMENTATO: Fori pi\u00f9 distanti dal profilo (era 10)\n                \n                if(Math.abs(simState.cncToolPos.x - targetX) < 5) {\n                    targetY = surfaceY + innerOffset; \n                    if(Math.abs(simState.cncToolPos.y - targetY) < 5) {\n                        if(simState.cncTimer === 0) {\n                            const fixedR = 5; \n                            simState.drawnHoles.push({x: targetX, y: targetY, r: fixedR});\n                            SoundFX.click();\n                        }\n                        simState.cncTimer++;\n                        if(simState.cncTimer > cutDuration) {\n                            simState.cncOpIndex++; simState.cncTimer=0;\n                        }\n                    }\n                } else {\n                   targetY = sy - 120; \n                }\n            }\n            else {\n                \/\/ Done\n                targetX = w\/2; targetY = -200;\n            }\n\n            simState.cncToolPos.x = lerp(simState.cncToolPos.x, targetX, moveSpeed);\n            simState.cncToolPos.y = lerp(simState.cncToolPos.y, targetY, moveSpeed);\n            \n            if(simState.scrapLeft.active) { simState.scrapLeft.y += 10; simState.scrapLeft.r -= 0.1; }\n            if(simState.scrapRight.active) { simState.scrapRight.y += 10; simState.scrapRight.r += 0.1; }\n        }\n\n        function drawCNCTool(ctx, w, h) {\n            if(currentStep !== 9) return;\n            const p = simState.cncToolPos;\n            ctx.save();\n            ctx.translate(p.x, p.y);\n            ctx.fillStyle = '#222'; ctx.strokeStyle = '#444'; ctx.lineWidth = 2;\n            ctx.beginPath();\n            ctx.moveTo(-10, -80); ctx.lineTo(10, -80);\n            ctx.lineTo(10, -20); ctx.lineTo(4, 0);\n            ctx.lineTo(-4, 0); ctx.lineTo(-10, -20);\n            ctx.closePath(); ctx.fill(); ctx.stroke();\n            ctx.fillStyle = '#ff5f1f';\n            ctx.beginPath(); ctx.arc(0, 2, 3, 0, Math.PI*2); ctx.fill();\n            ctx.restore();\n        }\n        \n        function drawCNCTracks(ctx) {\n            \/\/ Draw holes with a glow in Step 10\n            const isFinished = currentStep === 10;\n            for(let h of simState.drawnHoles) {\n                ctx.save();\n                if(isFinished) {\n                     ctx.shadowColor = '#00f0ff';\n                     ctx.shadowBlur = 10;\n                     ctx.strokeStyle = '#00f0ff';\n                     ctx.fillStyle = '#000';\n                } else {\n                     ctx.strokeStyle = 'rgba(255,255,255,0.9)';\n                }\n                ctx.lineWidth = 2;\n                ctx.beginPath(); ctx.arc(h.x, h.y, h.r, 0, Math.PI*2); \n                if(isFinished) ctx.fill();\n                ctx.stroke();\n                ctx.restore();\n            }\n        }\n\n        function drawCNCSheet(w, h, sy, mBox) {\n            const sl=w*0.15, sr=w*0.85, sw=sr-sl;\n            const bounds = getMoldBounds();\n            \n            \/\/ For Step 10 presentation: Cool Color\n            const tr = (simState.sheetTemp-20)\/160;\n            let r=lerp(220,255,tr), g=lerp(230,140,tr), b=lerp(240,50,tr);\n            \n            \/\/ Override for step 10 to make it look \"finished product\" white\/grey\n            if (currentStep === 10) { r=240; g=240; b=245; }\n\n            \/\/ In Step 10, presentation mode, scrap fades out completely\n            const scrapAlpha = (currentStep === 10) ? 0 : 0.6;\n            \n            \/\/ 1. LEFT SCRAP (Hide in Step 10)\n            if(currentStep !== 10) {\n                ctx.save();\n                if(simState.scrapLeft.active) {\n                    const scrapW = bounds.trimLeftX;\n                    ctx.translate(scrapW\/2, sy + simState.scrapLeft.y);\n                    ctx.rotate(simState.scrapLeft.r);\n                    ctx.translate(-scrapW\/2, -sy);\n                    ctx.globalAlpha = scrapAlpha;\n                }\n                ctx.beginPath();\n                ctx.moveTo(0, sy);\n                for(let i=0; i<=NUM_POINTS; i++) {\n                    const pt=simState.sheetPoints[i];\n                    const rx=sl+(pt.x*sw);\n                    if(rx > bounds.trimLeftX) break;\n                    ctx.lineTo(rx, sy + pt.finalFormY);\n                }\n                ctx.strokeStyle=`rgba(${r},${g},${b},0.95)`; ctx.lineWidth=4; ctx.stroke();\n                ctx.restore();\n            }\n            \n            \/\/ 2. MAIN PART (Stable - The Star of Step 10)\n            ctx.save();\n            if(currentStep === 10) {\n                 \/\/ Presentation floating effect\n                 const floatY = Math.sin(Date.now() * 0.002) * 5;\n                 ctx.translate(0, floatY);\n                 \/\/ Add subtle glow\n                 ctx.shadowColor = 'rgba(255,255,255,0.5)';\n                 ctx.shadowBlur = 15;\n            }\n\n            ctx.beginPath();\n            let first=true;\n            for(let i=0; i<=NUM_POINTS; i++) {\n                const pt=simState.sheetPoints[i];\n                const rx=sl+(pt.x*sw);\n                if(rx < bounds.trimLeftX || rx > bounds.trimRightX) continue;\n                if(first) { ctx.moveTo(rx, sy + pt.finalFormY); first=false; }\n                else ctx.lineTo(rx, sy + pt.finalFormY);\n            }\n            ctx.strokeStyle=`rgba(${r},${g},${b},0.95)`; ctx.lineWidth=4; ctx.stroke();\n            \n            drawCNCTracks(ctx); \/\/ Holes move with the sheet\n            ctx.restore();\n\n            \/\/ 3. RIGHT SCRAP (Hide in Step 10)\n            if(currentStep !== 10) {\n                ctx.save();\n                if(simState.scrapRight.active) {\n                     const scrapStart = bounds.trimRightX;\n                     const scrapW = w - scrapStart;\n                     ctx.translate(scrapStart + scrapW\/2, sy + simState.scrapRight.y);\n                     ctx.rotate(simState.scrapRight.r);\n                     ctx.translate(-(scrapStart + scrapW\/2), -sy);\n                     ctx.globalAlpha = scrapAlpha;\n                }\n                ctx.beginPath();\n                let started=false;\n                for(let i=0; i<=NUM_POINTS; i++) {\n                    const pt=simState.sheetPoints[i];\n                    const rx=sl+(pt.x*sw);\n                    if(rx < bounds.trimRightX) continue;\n                    if(!started) { ctx.moveTo(rx, sy + pt.finalFormY); started=true; }\n                    else ctx.lineTo(rx, sy + pt.finalFormY);\n                }\n                ctx.lineTo(w, sy); \n                ctx.strokeStyle=`rgba(${r},${g},${b},0.95)`; ctx.lineWidth=4; ctx.stroke();\n                ctx.restore();\n            }\n        }\n\n        function drawGrid(w, h) {\n            ctx.strokeStyle = 'rgba(255, 255, 255, 0.03)'; ctx.lineWidth = 1; ctx.beginPath();\n            for (let x = 0; x <= w; x += 100) { ctx.moveTo(x, 0); ctx.lineTo(x, h); }\n            for (let y = 0; y <= h; y += 100) { ctx.moveTo(0, y); ctx.lineTo(w, y); }\n            ctx.stroke();\n            ctx.strokeStyle = 'rgba(255, 255, 255, 0.08)'; ctx.lineWidth = 1; ctx.beginPath();\n            ctx.setLineDash([4, 6]);\n            ctx.moveTo(0, h * SHEET_Y_RATIO); ctx.lineTo(w, h * SHEET_Y_RATIO); ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        function drawClamps(w, h, sheetY) {\n            \/\/ FADE OUT IN STEP 10\n            const alpha = 1.0 - simState.presentationProgress;\n            if(alpha <= 0.01) return;\n\n            const cw = w * 0.15; const ch = 20; const gap = 100 * simState.frameOpen;\n            \n            ctx.save();\n            ctx.globalAlpha = alpha;\n            ctx.fillStyle = '#0f0f11'; ctx.strokeStyle = '#333';\n            drawRoundedRect(ctx, 0, sheetY - ch - gap, cw, ch, 6); ctx.fill(); ctx.stroke();\n            drawRoundedRect(ctx, 0, sheetY + gap, cw, ch, 6); ctx.fill(); ctx.stroke();\n            drawRoundedRect(ctx, w - cw, sheetY - ch - gap, cw, ch, 6); ctx.fill(); ctx.stroke();\n            drawRoundedRect(ctx, w - cw, sheetY + gap, cw, ch, 6); ctx.fill(); ctx.stroke();\n            if (simState.frameOpen < 0.1) {\n                ctx.fillStyle = 'rgba(34, 197, 94, 0.3)';\n                ctx.beginPath(); ctx.arc(cw - 20, sheetY - 10, 8, 0, Math.PI*2); ctx.fill();\n                ctx.fillStyle = '#22c55e';\n                ctx.beginPath(); ctx.arc(cw - 20, sheetY - 10, 3, 0, Math.PI*2); ctx.fill();\n            }\n            ctx.restore();\n        }\n\n        function drawHeaters(w, h) {\n            if(currentStep === 9 || currentStep === 10) return null;\n            const hw = w * 0.9; const hh = 25;\n            const targetX = (w\/2) - (hw\/2); const startX = -hw - 100;\n            const currentX = lerp(startX, targetX, simState.heaterPos + 1);\n            const yTop = h * 0.35; const yBot = h * 0.65; \n            ctx.save();\n            if (simState.heaterTemp > 0.1) {\n                ctx.fillStyle = `rgba(255, 95, 31, ${simState.heaterTemp * 0.2})`;\n                drawRoundedRect(ctx, currentX - 10, yTop - 10, hw + 20, hh + 20, 20); ctx.fill();\n                drawRoundedRect(ctx, currentX - 10, yBot - 10, hw + 20, hh + 20, 20); ctx.fill();\n            }\n            ctx.fillStyle = '#111'; ctx.strokeStyle = simState.heaterTemp > 0.1 ? '#552211' : '#333';\n            ctx.lineWidth = 2;\n            drawRoundedRect(ctx, currentX, yTop, hw, hh, 12); ctx.fill(); ctx.stroke();\n            drawRoundedRect(ctx, currentX, yBot, hw, hh, 12); ctx.fill(); ctx.stroke();\n            const cols = 20; const pad = hw \/ cols;\n            for(let i=0; i<cols; i++) {\n                let ex = currentX + (i*pad) + pad\/2; \n                const heat = simState.heaterTemp;\n                const r = 40 + (215 * heat); const g = 40 + (160 * heat); const b = 40 + (0 * heat);\n                if(heat > 0.5) {\n                    ctx.fillStyle = `rgba(255, 95, 31, ${heat * 0.4})`;\n                    ctx.beginPath(); ctx.arc(ex, yTop + hh\/2, 6, 0, Math.PI*2); ctx.fill();\n                    ctx.beginPath(); ctx.arc(ex, yBot + hh\/2, 6, 0, Math.PI*2); ctx.fill();\n                }\n                ctx.fillStyle = `rgb(${Math.floor(r)},${Math.floor(g)},${Math.floor(b)})`;\n                ctx.beginPath(); ctx.arc(ex, yTop + hh\/2, 2, 0, Math.PI*2); ctx.fill(); \n                ctx.beginPath(); ctx.arc(ex, yBot + hh\/2, 2, 0, Math.PI*2); ctx.fill();\n            }\n            ctx.restore();\n            return { x: currentX, w: hw, yTop: yTop, yBot: yBot };\n        }\n\n        function drawSheet(w, h, sy, mBox) {\n            if(currentStep === 9 || currentStep === 10) {\n                drawCNCSheet(w, h, sy, mBox);\n                return;\n            }\n\n            if(simState.editingMode) return;\n            const sl=w*0.15, sr=w*0.85, sw=sr-sl;\n            const mh=h*0.25, dy=h*0.85, uy=sy-mh;\n            const cmy=lerp(dy, uy, simState.moldPos);\n            const cfl=cmy+mh;\n            ctx.beginPath(); ctx.moveTo(0, sy); ctx.lineTo(sl, sy);\n            if (currentStep === 3 && simState.sheetTemp > 50 && !simState.editingMode) {\n                const mx = airflowSettings.mouseX, my = airflowSettings.mouseY;\n                if (mx > sl && mx < sr && Math.abs(my - sy) < 150) { \n                   const relX = (mx - sl) \/ (sr - sl); \n                   const centerIdx = Math.floor(relX * NUM_POINTS);\n                   const start = Math.max(0, centerIdx - 50), end = Math.min(NUM_POINTS, centerIdx + 50);\n                   for(let i=start; i<end; i++) {\n                       const pt = simState.sheetPoints[i];\n                       const px = sl + pt.x * (sr - sl), py = sy + pt.dy;\n                       const dist = Math.sqrt((px-mx)**2 + (py-my)**2);\n                       if (dist < 70) {\n                           const influence = Math.pow(1 - dist\/70, 2);\n                           pt.vy += (my - sy - pt.dy) * 0.3 * influence; pt.vy *= 0.6; \n                       }\n                   }\n                }\n            }\n            let tension = 0.5; \n            if (currentStep === 5) tension = 0.95; \n            if (currentStep === 6 && simState.vacuum > 0.1) tension = 0.1;\n            const k=0.005, damp=0.5;\n            if(simState.vacuum>0.01 && currentStep===6) {\n                for(let p of simState.sheetPoints) p.vy += simState.vacuum * 2.5;\n            }\n            for(let i=0; i<=NUM_POINTS; i++) {\n                const pt=simState.sheetPoints[i];\n                const rx=sl+(pt.x*sw);\n                if(currentStep>=7) {\n                    let fv = pt.finalFormY;\n                    if(currentStep===8 && simState.airEject>0) fv -= 20*simState.airEject;\n                    ctx.lineTo(rx, sy+fv); continue;\n                }\n                const soft = Math.min(1, Math.max(0, (simState.sheetTemp-80)\/100));\n                let tdy = Math.sin(pt.x*Math.PI)*simState.sheetSag*soft*(h*0.25);\n                pt.vy += (tdy-pt.dy)*k; pt.vy *= damp; pt.dy += pt.vy;\n                if (currentStep === 3) {\n                      const limit = 60; \n                      if (pt.dy > tdy + limit) { pt.dy = tdy + limit; pt.vy = 0; }\n                      if (pt.dy < tdy - limit) { pt.dy = tdy - limit; pt.vy = 0; }\n                }\n                let dispy = pt.dy;\n                let limy = cfl;\n                if(rx>mBox.x && rx<(mBox.x+mBox.w)) limy = mBox.y + getMoldSurfaceY((rx-mBox.x)\/mBox.w)*mBox.h;\n                if(dispy > (limy-sy)) { dispy = limy-sy; pt.dy=dispy; pt.vy=0; }\n                const maxS = cfl-sy;\n                if(dispy > maxS) { dispy = maxS; pt.dy=dispy; }\n                pt.y = dispy;\n                if(currentStep === 6) pt.finalFormY = dispy; \n                ctx.lineTo(rx, sy+pt.y);\n            }\n            if(currentStep < 7) {\n                for(let pass=0; pass<10; pass++) {\n                    for(let i=1; i<NUM_POINTS; i++) {\n                        const prev=simState.sheetPoints[i-1], curr=simState.sheetPoints[i], next=simState.sheetPoints[i+1];\n                        if(prev && next) {\n                            const avg = (prev.dy + curr.dy + next.dy)\/3;\n                            curr.dy = curr.dy*(1-tension) + avg*tension;\n                        }\n                    }\n                }\n            }\n            ctx.lineTo(sr, sy); ctx.lineTo(w, sy);\n            const tr = (simState.sheetTemp-20)\/160;\n            const r=lerp(220,255,tr), g=lerp(230,140,tr), b=lerp(240,50,tr);\n            ctx.save();\n            ctx.strokeStyle=`rgba(${r},${g},${b},0.3)`; ctx.lineWidth=10; ctx.stroke();\n            ctx.strokeStyle=`rgba(${r},${g},${b},0.95)`; ctx.lineWidth=4; ctx.stroke();\n            ctx.restore();\n            ctx.strokeStyle='rgba(255,255,255,0.4)'; ctx.lineWidth=1; ctx.stroke();\n        }\n\n        function drawMold(w,h,sy) {\n            \/\/ FADE OUT IN STEP 10\n            const alpha = 1.0 - simState.presentationProgress;\n            if(alpha <= 0.01) return {x:0,y:0,w:0,h:0};\n\n            const mw=w*0.5, mh=h*0.25, mx=(w-mw)\/2;\n            const cy=lerp(h*0.85, sy-mh, simState.moldPos);\n            \n            ctx.save();\n            ctx.globalAlpha = alpha;\n            ctx.fillStyle='#121214'; ctx.strokeStyle='#333';\n            drawRoundedRect(ctx, mx-10, cy+mh, mw+20, 30, 8); ctx.fill(); ctx.stroke();\n            ctx.translate(mx, cy);\n            const gr=ctx.createLinearGradient(0,0,0,mh); gr.addColorStop(0,'#2a2a2c'); gr.addColorStop(1,'#0a0a0c');\n            ctx.fillStyle=gr;\n            ctx.beginPath(); ctx.moveTo(0,mh);\n            if(simState.bakedMoldSegments.length) {\n                for(let s of simState.bakedMoldSegments) { ctx.lineTo(s.x1*mw, s.y1*mh); ctx.lineTo(s.x2*mw, s.y2*mh); }\n            } else {\n                simState.moldPoints.forEach(p=>ctx.lineTo(p.x*mw, p.y*mh));\n            }\n            ctx.lineTo(mw,mh); ctx.closePath(); ctx.fill(); ctx.stroke();\n            \n            if(simState.editingMode) {\n                ctx.lineWidth = 2;\n                simState.moldPoints.forEach((p, idx) => {\n                    const px = p.x * mw;\n                    const py = p.y * mh;\n                    ctx.beginPath(); ctx.arc(px, py, 7, 0, Math.PI*2);\n                    ctx.fillStyle = '#000'; ctx.strokeStyle = COL_NEON_ORANGE;\n                    ctx.fill(); ctx.stroke();\n                    if(simState.selectedPointIndex === idx) {\n                        ctx.beginPath(); ctx.arc(px, py, 14, 0, Math.PI*2);\n                        ctx.strokeStyle = 'rgba(255, 95, 31, 0.8)'; ctx.stroke();\n                    }\n                });\n            }\n\n            ctx.restore();\n            return {x:mx, y:cy, w:mw, h:mh};\n        }\n        \n        function drawProductSpotlight(w, h, sy) {\n             if(simState.presentationProgress < 0.1) return;\n             const alpha = simState.presentationProgress;\n             \n             ctx.save();\n             \/\/ Darken Background\n             ctx.fillStyle = `rgba(0,0,0,${alpha * 0.7})`;\n             ctx.fillRect(0,0,w,h);\n             \n             \/\/ Spotlight behind product\n             const cx = w\/2;\n             const cy = sy;\n             const grad = ctx.createRadialGradient(cx, cy, 10, cx, cy, 400);\n             grad.addColorStop(0, `rgba(255, 255, 255, ${alpha * 0.15})`);\n             grad.addColorStop(0.5, `rgba(0, 240, 255, ${alpha * 0.05})`);\n             grad.addColorStop(1, 'rgba(0,0,0,0)');\n             \n             ctx.globalCompositeOperation = 'screen';\n             ctx.fillStyle = grad;\n             ctx.fillRect(0,0,w,h);\n             ctx.restore();\n        }\n\n        function loop() {\n            ctx.clearRect(0,0,canvas.width,canvas.height);\n            drawGrid(canvas.width, canvas.height);\n            \n            \/\/ Presentation Transition Logic\n            const targetPres = (currentStep === 10) ? 1.0 : 0.0;\n            simState.presentationProgress = lerp(simState.presentationProgress, targetPres, 0.05);\n\n            \/\/ Hide HUD in step 10\n            if(currentStep === 10) hudScroll.classList.add('hidden-hud');\n            else hudScroll.classList.remove('hidden-hud');\n            \n            \/\/ Background Presentation Effect\n            drawProductSpotlight(canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO);\n            \n            const tf = (currentStep===1||currentStep===8||currentStep===9)?1:0; \n            simState.frameOpen=lerp(simState.frameOpen, tf, 0.1);\n            \n            let thp=-1, thi=0; if(currentStep===2){thp=0;thi=1;} else if(currentStep>=3 && currentStep<=6){thp=-1;thi=0.2;}\n            simState.heaterPos=lerp(simState.heaterPos, thp, 0.05); simState.heaterTemp=lerp(simState.heaterTemp, thi, 0.05);\n            \n            if(currentStep===2 && simState.sheetTemp<TARGET_HEAT) simState.sheetTemp+=1;\n            else if(currentStep>=3 && currentStep<=6 && simState.sheetTemp<160) simState.sheetTemp+=5;\n            else if(currentStep>=7 && simState.sheetTemp>40) simState.sheetTemp-=2;\n            \n            let ts=0, tab=0;\n            if(currentStep===2) ts=0.35; \n            if(currentStep===3) ts=0.35; \n            if(currentStep===4) { ts=-1.2; tab=1.0; }\n            if(currentStep===5) { ts=-0.5; tab=0.5; }\n            if(currentStep>=6) { ts=0.8; tab=0; }\n            simState.sheetSag=lerp(simState.sheetSag, ts, 0.05);\n            simState.airBlow=lerp(simState.airBlow, tab, 0.1);\n            \n            let tm=0; if(currentStep>=5 && currentStep<8) tm=1;\n            if(currentStep === 9) tm=1; \n            if(simState.editingMode) tm=1; \n            simState.moldPos=lerp(simState.moldPos, tm, 0.04);\n            \n            let tv=0; if(currentStep>=6 && currentStep<8) tv=1;\n            simState.vacuum=lerp(simState.vacuum, tv, 0.1);\n            \n            if(currentStep===8 && !simState.editingMode) simState.airEject = simState.moldPos; else simState.airEject = 0;\n            simState.fanIntensity=lerp(simState.fanIntensity, (currentStep===7)?1:0, 0.05);\n\n            updateCNCLogic();\n\n            const heatInfo = drawHeaters(canvas.width, canvas.height); \n            const mBox = drawMold(canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO); \n            drawSheet(canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, mBox); \n            drawClamps(canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO); \n            drawCNCTool(ctx, canvas.width, canvas.height); \n            \n            const now = Date.now()*0.001;\n            if(heatInfo) AirflowEngine.updateAndDrawHeat(ctx, canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, heatInfo.yTop, heatInfo.yBot, heatInfo.w, heatInfo.x, now);\n            AirflowEngine.updateAndDraw(ctx, canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, now);\n            if(currentStep===4) AirflowEngine.updateAndDrawBubble(ctx, canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, now);\n            if(currentStep===5 || (currentStep===6 && simState.vacuum<0.9)) {\n                let fi = (currentStep===5)?0.5:(1.0-simState.vacuum);\n                AirflowEngine.updateAndDrawVacuum(ctx, canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, mBox, now, fi);\n            }\n            if(simState.airEject > 0.01) AirflowEngine.updateAndDrawEjection(ctx, canvas.width, canvas.height, canvas.height*SHEET_Y_RATIO, mBox, now);\n            \n            const tBar = container.querySelector('#tempBar');\n            if(tBar) { tBar.style.width = (simState.heaterTemp*100)+'%'; tBar.style.backgroundColor = (simState.heaterTemp<0.3)?'#60a5fa':'#ff5f1f'; }\n            const bBar = container.querySelector('#blowBar');\n            if (bBar) {\n                let blowInt = 0; if (simState.airBlow > 0.01) blowInt = simState.airBlow; else if (simState.airEject > 0.01) blowInt = simState.airEject;\n                bBar.style.width = (blowInt * 100) + '%';\n            }\n            const vBar = container.querySelector('#vacuumBar'); if (vBar) vBar.style.width = (simState.vacuum * 100) + '%';\n            const cBar = container.querySelector('#coolingBar'); if (cBar) cBar.style.width = (simState.fanIntensity * 100) + '%';\n            \n            requestAnimationFrame(loop);\n        }\n\n        \/\/ --- UPDATED AUTO-SCROLL FUNCTION (CUSTOM TO AVOID PAGE JUMP) ---\n        function scrollToActiveStep() {\n            const wrapper = document.getElementById('stepsScrollWrapper'); \n            const stepsList = document.getElementById('stepsContainer');\n            if(!wrapper || !stepsList) return;\n\n            const steps = stepsList.children;\n            if(steps[currentStep-1]) {\n                const activeEl = steps[currentStep-1];\n                \n                \/\/ Calculate target scroll position manually to avoid scrolling the parent window\n                const wrapperHeight = wrapper.clientHeight;\n                const elHeight = activeEl.clientHeight;\n                \n                const wrapperRect = wrapper.getBoundingClientRect();\n                const elRect = activeEl.getBoundingClientRect();\n                \n                \/\/ Offset of element from top of visible wrapper\n                const offset = elRect.top - wrapperRect.top;\n                \n                const desiredOffset = (wrapperHeight - elHeight) \/ 2;\n                const currentScrollTop = wrapper.scrollTop;\n                const targetScrollTop = currentScrollTop + (offset - desiredOffset);\n\n                wrapper.scrollTo({\n                    top: targetScrollTop,\n                    behavior: 'smooth'\n                });\n            }\n        }\n\n        function updateProgressLine() {\n            const line = container.querySelector('#progressLine');\n            const wrapper = container.querySelector('#stepsScrollWrapper');\n            const cont = container.querySelector('#stepsContainer');\n            if(!line || !wrapper || !cont) return;\n            const dots = cont.querySelectorAll('.step-dot');\n            if(dots.length < currentStep) return;\n            const dot = dots[currentStep-1];\n            \/\/ Calculate height based on container context\n            const contRect = cont.getBoundingClientRect();\n            const dotRect = dot.getBoundingClientRect();\n            \/\/ Relative position inside the container. Add half dot height (6px) to center.\n            const relativeTop = dotRect.top - contRect.top;\n            line.style.height = (relativeTop) + 'px';\n        }\n\n        function updateButtons() {\n            const bEdit = container.querySelector('#btnEditMode');\n            if(currentStep === 1 || currentStep === 8 || currentStep === 9) {\n                bEdit.classList.remove('disabled');\n                bEdit.style.pointerEvents = 'auto';\n                bEdit.style.opacity = '1';\n            } else {\n                bEdit.classList.add('disabled');\n                bEdit.style.pointerEvents = 'none';\n                bEdit.style.opacity = '0.3';\n                if(simState.editingMode) setEditMode(false); \n            }\n        }\n\n        function animateContainerResize(element, contentElement, newText) {\n            if(!element || !contentElement) return;\n            const startWidth = element.offsetWidth;\n            const startHeight = element.offsetHeight;\n            element.style.width = startWidth + 'px';\n            element.style.height = startHeight + 'px';\n            contentElement.classList.add('hiding');\n            setTimeout(() => {\n                contentElement.innerText = newText;\n                element.style.width = 'auto';\n                element.style.height = 'auto';\n                const targetWidth = element.offsetWidth;\n                const targetHeight = element.offsetHeight;\n                element.style.width = startWidth + 'px';\n                element.style.height = startHeight + 'px';\n                void element.offsetWidth;\n                element.style.width = targetWidth + 'px';\n                element.style.height = targetHeight + 'px';\n                contentElement.classList.remove('hiding');\n                setTimeout(() => {\n                    element.style.width = '';\n                    element.style.height = '';\n                }, 500); \n            }, 250);\n        }\n\n        function updateTexts() {\n            const s = stepsInfo[currentStep-1];\n            animateContainerResize(container.querySelector('#legendPanel'), container.querySelector('#phaseLabel'), s.title);\n            setTimeout(() => {\n                animateContainerResize(container.querySelector('#legendPanel'), container.querySelector('#actionLabel'), s.desc);\n            }, 50);\n            animateContainerResize(container.querySelector('#descPanel'), container.querySelector('#descText'), s.details);\n            \n            \/\/ Log update\n            logMsg(`STEP ${currentStep}: ${s.title}`);\n        }\n\n        function renderSteps() {\n            const c = container.querySelector('#stepsContainer');\n            c.innerHTML = '';\n            stepsInfo.forEach((s, i) => {\n                const active = (i+1)===currentStep;\n                const past = (i+1)<currentStep;\n                let dc = 'bg-[#111] border-gray-800', tc='text-gray-600';\n                if(active) { dc='bg-orange-500 border-orange-500 dot-aura scale-110 shadow-[0_0_20px_#ff5f1f]'; tc='text-white font-bold'; }\n                else if(past) { dc='bg-orange-500 border-orange-500 shadow-[0_0_10px_rgba(255,95,31,0.4)]'; tc='text-gray-300'; }\n                \n                const el = document.createElement('div');\n                el.className = \"flex items-start gap-4 cursor-pointer group\";\n                el.onclick = () => { \n                    SoundFX.click();\n                    if(!simState.editingMode) { currentStep=s.id; updateUI(); } \n                };\n                el.innerHTML = `\n                    <div class=\"mt-1 w-3 h-3 rounded-full border ${dc} step-dot transition-transform\"><\/div>\n                    <div class=\"flex flex-col transition-colors duration-300 ${tc} group-hover:text-gray-200\">\n                        <span class=\"text-[10px] font-tech tracking-widest font-bold\">${(s.id<10?'0':'')+s.id}<\/span>\n                        <span class=\"text-[11px] font-medium tracking-wide uppercase\">${s.title}<\/span>\n                    <\/div>`;\n                c.appendChild(el);\n            });\n            updateButtons(); \n            setTimeout(updateProgressLine, 0);\n        }\n\n        function updateUI() {\n            renderSteps();\n            updateTexts();\n            scrollToActiveStep(); \/\/ Trigger auto-scroll\n            SoundFX.stepChange(); \/\/ Trigger sound\n            if(currentStep === 9) {\n                initCNC();\n            }\n        }\n\n        container.querySelector('#btnNext').onclick = () => { \n            SoundFX.click();\n            if(simState.editingMode) {\n                setEditMode(false);\n                setTimeout(() => { if(currentStep<10){ currentStep++; updateUI(); } }, 200);\n            } else {\n                if(currentStep<10){ currentStep++; updateUI(); } \n            }\n        };\n        \n        container.querySelector('#btnPrev').onclick = () => { \n            SoundFX.click();\n            if(simState.editingMode) return; \n            if(currentStep>1){ currentStep--; updateUI(); } \n        };\n        container.querySelector('#btnReset').onclick = () => { \n            SoundFX.click();\n            currentStep=1; simState.sheetTemp=25; updateUI(); \n            logMsg('SYSTEM: RESET COMPLETE');\n        };\n\n        AirflowEngine.init();\n        initPoints();\n        resize(); \/\/ Initial resize\n        updateUI(); \n        loop();\n        \n        \/\/ --- MOUSE HANDLERS FOR RADIUS CONTROL ---\n        function showRadiusControl(x, y, r) {\n            radiusControl.classList.remove('hidden');\n            const containerRect = canvasWrapper.getBoundingClientRect();\n            let left = x + 20; let top = y - 50;\n            if(left + 200 > containerRect.width) left = x - 220;\n            if(top < 0) top = y + 20;\n            radiusControl.style.left = left + 'px';\n            radiusControl.style.top = top + 'px';\n            radiusInput.value = r;\n            radiusVal.innerText = r + 'px';\n        }\n\n        function handleDrag(mx, my) {\n             const mw = canvas.width * 0.5, mh = canvas.height * 0.25, mOffsetX = (canvas.width - mw) \/ 2;\n             const sheetY = canvas.height * SHEET_Y_RATIO, upY = sheetY - mh, downY = canvas.height * 0.85;\n             const cy = lerp(downY, upY, simState.moldPos);\n             let nx = (mx - mOffsetX) \/ mw, ny = (my - cy) \/ mh;\n             nx = Math.max(0, Math.min(1, nx)); ny = Math.max(0, Math.min(1, ny));\n             if(simState.draggingPointIndex === 0) nx = 0;\n             if(simState.draggingPointIndex === simState.moldPoints.length - 1) nx = 1;\n             \n             \/\/ Undercut Check\n             const prevP = (simState.draggingPointIndex > 0) ? simState.moldPoints[simState.draggingPointIndex - 1] : null;\n             const nextP = (simState.draggingPointIndex < simState.moldPoints.length - 1) ? simState.moldPoints[simState.draggingPointIndex + 1] : null;\n             const minX = prevP ? prevP.x : 0; const maxX = nextP ? nextP.x : 1;\n             nx = Math.max(minX, Math.min(maxX, nx));\n\n             const p = simState.moldPoints[simState.draggingPointIndex];\n             p.x = nx; p.y = ny;\n             bakeMoldGeometry(canvas.width, canvas.height);\n             showRadiusControl(mOffsetX + nx * mw, cy + ny * mh, p.r);\n        }\n        \n        canvas.addEventListener('mousedown', (e) => {\n            if(!simState.editingMode) return;\n            const rect = canvas.getBoundingClientRect();\n            const mouseX = e.clientX - rect.left, mouseY = e.clientY - rect.top;\n            const mw = canvas.width * 0.5, mh = canvas.height * 0.25, mx = (canvas.width - mw) \/ 2;\n            const sheetY = canvas.height * SHEET_Y_RATIO, upY = sheetY - mh, downY = canvas.height * 0.85;\n            const cy = lerp(downY, upY, simState.moldPos);\n            simState.draggingPointIndex = -1; \n            simState.moldPoints.forEach((p, idx) => {\n                const px = mx + p.x * mw, py = cy + p.y * mh;\n                const dx = mouseX - px, dy = mouseY - py;\n                if (Math.sqrt(dx*dx + dy*dy) < 20) {\n                    simState.draggingPointIndex = idx;\n                    simState.selectedPointIndex = idx; \n                    showRadiusControl(px, py, p.r);\n                }\n            });\n        });\n\n        canvas.addEventListener('mousemove', (e) => {\n            const rect = canvas.getBoundingClientRect();\n            if(isGestureMode && airflowSettings.mouseX > -100) return;\n            airflowSettings.mouseX = e.clientX - rect.left;\n            airflowSettings.mouseY = e.clientY - rect.top;\n            if(simState.editingMode && simState.draggingPointIndex !== -1) handleDrag(airflowSettings.mouseX, airflowSettings.mouseY);\n        });\n\n        window.addEventListener('mouseup', () => { simState.draggingPointIndex = -1; });\n        \n        canvas.addEventListener('touchstart', (e) => {\n            if(!simState.editingMode) return;\n            const rect = canvas.getBoundingClientRect();\n            const touch = e.touches[0];\n            const mouseX = touch.clientX - rect.left, mouseY = touch.clientY - rect.top;\n            const mw = canvas.width * 0.5, mh = canvas.height * 0.25, mx = (canvas.width - mw) \/ 2;\n            const sheetY = canvas.height * SHEET_Y_RATIO, upY = sheetY - mh, downY = canvas.height * 0.85;\n            const cy = lerp(downY, upY, simState.moldPos);\n            simState.draggingPointIndex = -1;\n            let hit = false;\n            simState.moldPoints.forEach((p, idx) => {\n                const px = mx + p.x * mw, py = cy + p.y * mh;\n                const dx = mouseX - px, dy = mouseY - py;\n                if (Math.sqrt(dx*dx + dy*dy) < 30) {\n                    simState.draggingPointIndex = idx;\n                    simState.selectedPointIndex = idx;\n                    showRadiusControl(px, py, p.r);\n                    hit = true;\n                }\n            });\n            if(hit) e.preventDefault(); \n        }, { passive: false });\n\n        canvas.addEventListener('touchmove', (e) => {\n            const rect = canvas.getBoundingClientRect();\n            const touch = e.touches[0];\n            airflowSettings.mouseX = touch.clientX - rect.left;\n            airflowSettings.mouseY = touch.clientY - rect.top;\n            if (simState.editingMode && simState.draggingPointIndex !== -1) {\n                e.preventDefault(); \n                handleDrag(airflowSettings.mouseX, airflowSettings.mouseY);\n            }\n        }, { passive: false });\n\n        window.addEventListener('touchend', () => {\n            simState.draggingPointIndex = -1;\n            airflowSettings.mouseX = -1000; \n        });\n\n        canvas.addEventListener('mouseleave', () => { \n            if(!isGestureMode) airflowSettings.mouseX = -1000; \n            simState.draggingPointIndex = -1; \n        });\n\n    })();\n    <\/script>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-53cd28d9 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"53cd28d9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-27a819e0\" data-id=\"27a819e0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2b369107 elementor-widget elementor-widget-image\" data-id=\"2b369107\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"\/fresatura-e-realizzazione-stampi\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/elementor\/thumbs\/termoformatura2_home-p1r1a0jufvf1qw4dc6ghnhnfzwvrfq1hhllyi90rnc.jpg\" title=\"termoformatura2_home\" alt=\"Questa foto mostra un prodotto termoforomato\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-55856218\" data-id=\"55856218\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fba0faf elementor-widget elementor-widget-heading\" data-id=\"fba0faf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\"><a href=\"\/termoformatura-sottovuoto-da-lastra\/\">Termoformatura sottovuoto<\/a><\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-34b2d652 elementor-widget elementor-widget-text-editor\" data-id=\"34b2d652\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"\/termoformatura-sottovuoto-da-lastra\/\">Dal 1958 VERGA-Plast \u00e8 stata Pioniera in Italia nella termoformatura sottovuoto conto terzi di termoplastici da lastra in piccole, medie e grandi serie.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f24639f elementor-align-center elementor-widget elementor-widget-button\" data-id=\"f24639f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-xl elementor-animation-grow\" href=\"\/termoformatura-sottovuoto-da-lastra\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Scopri di pi\u00f9<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-1fe44e57 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1fe44e57\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-476685bf\" data-id=\"476685bf\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-342db977 elementor-widget elementor-widget-image\" data-id=\"342db977\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"\/termoformatura-sottovuoto-da-lastra\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/elementor\/thumbs\/stampi2-piy8i1aupjjmdvb2ab8uffxzb3acl7z7gq65adypyw.jpg\" title=\"stampi2\" alt=\"stampi2\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1215051a\" data-id=\"1215051a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1c4fd930 elementor-widget elementor-widget-heading\" data-id=\"1c4fd930\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\"><a href=\"\/fresatura-e-realizzazione-stampi\/\">Stampi in resina e in alluminio<\/a><\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4fe1aca6 elementor-widget elementor-widget-text-editor\" data-id=\"4fe1aca6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"\/fresatura-e-realizzazione-stampi\/\">Realizziamo direttamente modelli e stampi in resina e in alluminio mediante l&#8217;utilizzo di CAD\/CAM e CNC a 5 assi.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-985cdd3 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"985cdd3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-xl elementor-animation-grow\" href=\"\/fresatura-e-realizzazione-stampi\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Scopri di pi\u00f9<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-a0099b3 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a0099b3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-becd851\" data-id=\"becd851\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-37994aa elementor-widget elementor-widget-image\" data-id=\"37994aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"\/termoformatura-sottovuoto-da-lastra\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/elementor\/thumbs\/contornatura-piuzrngxrksq2pi69b42dee9q6aycnsy0utvievqbc.jpg\" title=\"Contornatura\" alt=\"Questa immagine rappresenta una contornatura\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-02e4716\" data-id=\"02e4716\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-751db71 elementor-widget elementor-widget-heading\" data-id=\"751db71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\"><a href=\"\/fresatura-e-realizzazione-stampi\/\">Contornatura dei termoformati<\/a><\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54f18a7 elementor-widget elementor-widget-text-editor\" data-id=\"54f18a7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><a href=\"https:\/\/vergaplast.com\/fresatura-e-realizzazione-stampi\/\">Dopo il processo di termoformatura, e dopo aver realizzato la dima di taglio, \u00e8 necessario fresare il termoformato per ottenere il prodotto finito come da disegno, con fori, asole e contornatura.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-89e1ae4 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"89e1ae4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-xl elementor-animation-grow\" href=\"\/fresatura-e-realizzazione-stampi\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Scopri di pi\u00f9<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8a81851 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8a81851\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d3a3993\" data-id=\"d3a3993\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0c8d87c elementor-align-center elementor-widget elementor-widget-button\" data-id=\"0c8d87c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-xl elementor-animation-grow\" href=\"mailto:info@vergaplast.com\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Richiedi un preventivo<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-71c1d1c8 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"71c1d1c8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70709492\" data-id=\"70709492\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-5e314dfb elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5e314dfb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-2e78cbbb\" data-id=\"2e78cbbb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4972dc53 elementor-widget elementor-widget-image\" data-id=\"4972dc53\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/eco.jpg\" class=\"attachment-large size-large wp-image-51556\" alt=\"Questa immagine rappresenta la scritta Eco\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/eco.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/eco-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/eco-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-4bcf1446\" data-id=\"4bcf1446\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-18dbe372 elementor-widget elementor-widget-heading\" data-id=\"18dbe372\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"elementor-heading-title elementor-size-default elementor-inline-editing pen\" data-elementor-setting-key=\"title\" data-pen-placeholder=\"Digita qui...\" style=\"clear: both;font-style: normal;text-decoration: none\">Vuoi Passare Dalla Lamiera Alla Plastica?<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-1cb3869\" data-id=\"1cb3869\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4145d931 elementor-widget elementor-widget-image\" data-id=\"4145d931\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/stampo.jpg\" class=\"attachment-large size-large wp-image-51558\" alt=\"Questa immagine rappresenta uno stampo\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/stampo.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/stampo-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/stampo-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-4001535 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4001535\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-d802fb0\" data-id=\"d802fb0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1877559 elementor-widget elementor-widget-heading\" data-id=\"1877559\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Diamo nuova vita alla plastica<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-427279a\" data-id=\"427279a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c0b03a5 elementor-widget elementor-widget-image\" data-id=\"c0b03a5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/lamiera.jpg\" class=\"attachment-large size-large wp-image-51557\" alt=\"Questa immagine rappresenta un prodotto realizzato in lamiera\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/lamiera.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/lamiera-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/lamiera-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-339142f\" data-id=\"339142f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b7dfb79 elementor-widget elementor-widget-heading\" data-id=\"b7dfb79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Hai gi\u00e0 uno stampo ma vuoi provare il nostro servizio?\u200b<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-ebec25c elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ebec25c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-2a4dc1a\" data-id=\"2a4dc1a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a26db4a elementor-widget elementor-widget-image\" data-id=\"a26db4a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/idea.jpg\" class=\"attachment-large size-large wp-image-51560\" alt=\"Questa immagine rappresenta la lampadina accesa appena avuta un&apos;idea\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/idea.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/idea-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/idea-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-1f6a8a9\" data-id=\"1f6a8a9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5474938 elementor-widget elementor-widget-heading\" data-id=\"5474938\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vuoi Realizzare I Vassoi Di Movimentazione Per L'automazione O Per I Robot Antropomorfi?\u200b\u200b<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-2ccd31e\" data-id=\"2ccd31e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8a8984e elementor-widget elementor-widget-image\" data-id=\"8a8984e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/choco3d.jpg\" class=\"attachment-large size-large wp-image-51561\" alt=\"Questa immagine rappresenta un modello 3D\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/choco3d.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/choco3d-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/choco3d-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-4ea20ab1 elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4ea20ab1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-46c7cca8\" data-id=\"46c7cca8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-68fec286 elementor-widget elementor-widget-heading\" data-id=\"68fec286\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Vuoi realizzare un'idea in plastica?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-1e2b9f14\" data-id=\"1e2b9f14\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5abe4cc0 elementor-widget elementor-widget-image\" data-id=\"5abe4cc0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"729\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/vassoiautomazione.jpg\" class=\"attachment-large size-large wp-image-51559\" alt=\"Questa immagine rappresenta un vassoio di movimentazione per l&apos;automazione\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/vassoiautomazione.jpg 854w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/vassoiautomazione-300x273.jpg 300w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/vassoiautomazione-768x700.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-15fcbd5f\" data-id=\"15fcbd5f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-82fa034 elementor-widget elementor-widget-heading\" data-id=\"82fa034\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Cerchi l'aiuto di un esperto nella realizzazione del Disegno 3D ottimizzato per la termoformatura?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c96c13f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c96c13f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b484d15\" data-id=\"b484d15\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4d786e4 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"4d786e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-xl elementor-animation-grow\" href=\"mailto:info@vergaplast.com\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Chiedi pi\u00f9 informazioni<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-72e982af elementor-section-content-middle elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"72e982af\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-384e8c0a\" data-id=\"384e8c0a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3bf5b9dc elementor-widget elementor-widget-heading\" data-id=\"3bf5b9dc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Altri servizi<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-6a3dd040 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6a3dd040\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-493ece89\" data-id=\"493ece89\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5a553061 elementor-widget elementor-widget-heading\" data-id=\"5a553061\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Piegatura a caldo<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78f966dc elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"78f966dc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ab04b2c elementor-widget elementor-widget-text-editor\" data-id=\"7ab04b2c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Ideale per piegare lastre precedentemente tagliate mediante l&#8217;utilizzo di Robot CNC 5 Axis o del Taglio Laser.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-63b9ad93\" data-id=\"63b9ad93\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1a0fe67e elementor-widget elementor-widget-heading\" data-id=\"1a0fe67e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Stampa 3D<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-252c0994 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"252c0994\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20d1c3b5 elementor-widget elementor-widget-text-editor\" data-id=\"20d1c3b5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Servizio di Stampa 3D FDM d&#8217;alta qualit\u00e0.<\/p><p>Ideale per la realizzazione di campionature o pezzi unici.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-2d32830a\" data-id=\"2d32830a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7503a369 elementor-widget elementor-widget-heading\" data-id=\"7503a369\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><span class=\"elementor-heading-title elementor-size-default elementor-inline-editing pen\" data-elementor-setting-key=\"title\" data-pen-placeholder=\"Digita qui...\" style=\"clear: both;font-style: normal;text-decoration: none\">Taglio Laser<\/span><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a7a3a35 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"a7a3a35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-28e5ad23 elementor-widget elementor-widget-text-editor\" data-id=\"28e5ad23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>La tecnica di taglio laser permette di ottenere prodotti dai bordi netti e puliti, con incisioni di scritte o di loghi, per prodotti d&#8217;alta qualit\u00e0 con un design accattivante.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-bd6be37 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bd6be37\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-a08ba1a\" data-id=\"a08ba1a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ac765cc elementor-widget elementor-widget-heading\" data-id=\"ac765cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Saldatura ad ultrasuoni<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c8229e elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1c8229e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cfc70da elementor-widget elementor-widget-text-editor\" data-id=\"cfc70da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Grazie alla saldatura ultrasuoni \u00e8 possibile effettuare un&#8217;affidabile saldatura a punti tra elementi plastici.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5c0f8486 elementor-section-full_width elementor-section-height-min-height elementor-section-items-stretch elementor-section-content-middle elementor-section-height-default\" data-id=\"5c0f8486\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-37ee4195\" data-id=\"37ee4195\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2029a119 elementor-widget elementor-widget-spacer\" data-id=\"2029a119\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-26c24978\" data-id=\"26c24978\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b22e9d1 elementor-view-default elementor-position-block-start elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box\" data-id=\"b22e9d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" id=\"babd51c6-232f-4668-aa27-cf262924e93d\" data-name=\"Layer 1\" width=\"61.8\" height=\"53.9999\" viewBox=\"0 0 61.8 53.9999\"><path d=\"M58.6,34.2a11.0935,11.0935,0,0,0-8.4-3.6,4.0745,4.0745,0,0,1-3-1,4.5281,4.5281,0,0,1-1-3q0-6.6,4.8-13A39.3606,39.3606,0,0,1,62,3.4L59.8.2Q47.2,6.4,41,15.6a35.6044,35.6044,0,0,0-6,20.2q0,8.2,4,13.4a13.8883,13.8883,0,0,0,11.2,5A11.7892,11.7892,0,0,0,58.6,51a11.0936,11.0936,0,0,0,3.6-8.4A11.0936,11.0936,0,0,0,58.6,34.2Z\" transform=\"translate(-0.4 -0.2)\"><\/path><path d=\"M15.6,30.6a4.0745,4.0745,0,0,1-3-1,4.5281,4.5281,0,0,1-1-3q0-6.6,4.8-13a39.3606,39.3606,0,0,1,11-10.2L25.2.2Q12.6,6.4,6.4,15.6a35.6044,35.6044,0,0,0-6,20.2q0,8.2,4,13.4a13.8883,13.8883,0,0,0,11.2,5A11.7892,11.7892,0,0,0,24,51a11.0936,11.0936,0,0,0,3.6-8.4A11.0936,11.0936,0,0,0,24,34.2,11.0935,11.0935,0,0,0,15.6,30.6Z\" transform=\"translate(-0.4 -0.2)\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\t\t\t<div class=\"elementor-icon-box-content\">\n\n\t\t\t\t\t\t\t\t\t<h3 class=\"elementor-icon-box-title\">\n\t\t\t\t\t\t<span  >\n\t\t\t\t\t\t\t\"Tradizione, Qualit\u00e0, Passione Ed Innovazione contraddistinguono VERGA-Plast dalla sua fondazione\u201d\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/h3>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<p class=\"elementor-icon-box-description\">\n\t\t\t\t\t\tVERGA-plast\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a9e1718 elementor-section-full_width elementor-section-content-middle elementor-section-height-default elementor-section-height-default\" data-id=\"a9e1718\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-89eea9c\" data-id=\"89eea9c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c525373 elementor-widget elementor-widget-heading\" data-id=\"c525373\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\">una storia di passione e d'amore<\/h6>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-44db6da elementor-widget elementor-widget-heading\" data-id=\"44db6da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Made in Italy<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-277e85d elementor-widget elementor-widget-text-editor\" data-id=\"277e85d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il rispetto e l&#8217;amore \u00a0per le persone e per il pianeta sono alla base del nostro pensiero.<\/p><p>Questi pilastri sono stati alla base della nostra scelta etica di continuare a produrre ininterrottamente in Italia dal 1958.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-646d47a\" data-id=\"646d47a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8f2526c elementor-widget__width-initial elementor-widget-tablet__width-initial animated-slow elementor-invisible elementor-widget elementor-widget-image\" data-id=\"8f2526c\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"961\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita-flag.jpg\" class=\"elementor-animation-float attachment-full size-full wp-image-51589\" alt=\"Questa foto mostra la bandiera italiana\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita-flag.jpg 640w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita-flag-200x300.jpg 200w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fc6b349 elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-image\" data-id=\"fc6b349\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"1138\" src=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita.jpg\" class=\"elementor-animation-float attachment-full size-full wp-image-51584\" alt=\"Questa foto mostra uno scorcio italiano\" srcset=\"https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita.jpg 640w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita-169x300.jpg 169w, https:\/\/vergaplast.com\/wp-content\/uploads\/2022\/01\/ita-576x1024.jpg 576w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Termoformatura sottovuoto di lastre di plastica: produzione su misura di carter, coperture, pannelli e componenti tecnici per settori industriali, nautici, medicali e design. Qualit\u00e0 e know-how Made in Italy VERGA-Plast.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_seopress_titles_title":"%%post_title%% %%sep%% %%sitetitle%%","_seopress_titles_desc":"Termoformatura sottovuoto di lastre di plastica: produzione su misura di carter, coperture, pannelli e componenti tecnici per settori industriali, nautici, medicali e design. Qualit\u00e0 e know-how Made in Italy VERGA-Plast.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"","footnotes":""},"class_list":["post-51503","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/pages\/51503","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/comments?post=51503"}],"version-history":[{"count":5,"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/pages\/51503\/revisions"}],"predecessor-version":[{"id":55524,"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/pages\/51503\/revisions\/55524"}],"wp:attachment":[{"href":"https:\/\/vergaplast.com\/en\/wp-json\/wp\/v2\/media?parent=51503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}