const DS=window.InvisionEcosystemDesignSystem_052092;
const {Button,Badge,Icon,Breadcrumb,Field,Checkbox,Dialog,StateBlock,AiDisclaimer,ProductCard,ModuleCard,ConfiguratorPanel,StepIndicator}=DS;
const A='assets/';
window.LANG=localStorage.getItem('iv-lang')||'it';
const T=(it,en)=>window.LANG==='en'?en:it;const tt=p=>T(p[0],p[1]);
const norm=h=>{let p=(h||'').replace(/^#/,'');if(!p.startsWith('/'))p='/'+p;if(!p.endsWith('/'))p+='/';return p};
function useRoute(){const [r,setR]=React.useState(norm(location.hash));React.useEffect(()=>{const f=()=>{setR(norm(location.hash));window.scrollTo(0,0)};window.addEventListener('hashchange',f);return()=>window.removeEventListener('hashchange',f)},[]);return r}
const L=({to,children,...p})=><a href={'#'+to} {...p}>{children}</a>;
const go=to=>{location.hash=to};
const P={home:'/',eco:'/ecosystem/',sol:'/solutions/',pole:'/solutions/smart-pole/',p15:'/solutions/smart-pole/modularity-15/',p17:'/solutions/smart-pole/smart-pole-17/',cfg:'/smart-pole-configurator/',ai:'/solutions/artificial-intelligence/',dp:'/solutions/digital-platforms/',auto:'/solutions/automation-integration/',infra:'/solutions/smart-infrastructure/',proj:'/projects/',about:'/about/',contact:'/contact/',priv:'/privacy-policy/',cook:'/cookie-policy/'};
const TBC=()=><Badge tone="tbc">{T('Da confermare','To be confirmed')}</Badge>;
const Ai=({children})=><AiDisclaimer>{children||T('Render generato con IA. L’aspetto è indicativo e può differire dal prodotto finale.','AI-generated render. Appearance is indicative and may differ from the final product.')}</AiDisclaimer>;
const Seg=({opts,value,onChange,label})=><div className="iv-seg" role="group" aria-label={label}>{opts.map(([id,l])=><button key={id} type="button" aria-pressed={id===value} onClick={()=>onChange(id)}>{l}</button>)}</div>;
const M=(id,icon,n,d)=>({id,icon,n,d});
const MODELS={
15:{id:15,name:'Modularity Smart Pole 15',short:'Smart Pole 15',img:A+'pole-15-3d.png',tag:['Modulare. Flessibile. Pronto per la città.','Modular. Flexible. Ready for the city.'],desc:['Fusto modulare a moduli sovrapposti che ospita illuminazione, sensori, connettività e servizi pubblici.','Modular shaft of stacked modules carrying lighting, sensing, connectivity and public-service functions.'],src:['Brochure «pole 15» e modello 3D','Brochure “pole 15” and 3D model'],
 mods:[M('emergenza','phone-call',['Chiamata di emergenza','Emergency call'],['Sistema di chiamata di emergenza.','Emergency call system.']),M('altoparlante','megaphone',['Altoparlante','Broadcasting speaker'],['Diffusione sonora.','Public address.']),M('ricarica','plug-zap',['Stazione di ricarica','Charging station'],['Servizi di ricarica.','Charging facilities.']),M('solare','sun',['Modulo solare','Solar module'],['Pannello fotovoltaico. Da confermare.','Photovoltaic panel. To be confirmed.']),M('ptz','video',['Telecamera PTZ','PTZ camera'],['Telecamera HD motorizzata.','Motorised HD camera.']),M('cameraBox','camera',['Telecamera box','Box camera'],['Telecamera HD su staffa.','HD camera on bracket.']),M('display','monitor',['Display LCD','LCD display'],['Display digitale, da brochure.','Digital display, per brochure.']),M('wifi','wifi',['Access point Wi-Fi','Wireless AP / Wi-Fi'],['Connettività Wi-Fi.','Wi-Fi connectivity.']),M('rgb','radio',['Luce di stato RGB','RGB status light'],['Segnalazione visiva di stato.','Visual status indication.']),M('lanterna','lamp',['Lanterna RGBW','RGBW lantern'],['Illuminazione RGBW in sommità.','RGBW lighting at the top.']),M('meteo','cloud-sun',['Stazione meteo','Weather station'],['Monitoraggio ambientale.','Environmental monitoring.'])]},
17:{id:17,name:'BS-Smart Pole 17',short:'Smart Pole 17',img:A+'pole-17-3d.png',tag:['Maggiore capacità. Più possibilità.','Higher capacity. Greater possibilities.'],desc:['Struttura scura con testa luminosa inclinata, display LCD, stazione meteo e basamento con servizi.','Dark structure with an angled luminaire head, LCD display, weather station and a service base.'],src:['Brochure «pole 17» e modello 3D','Brochure “pole 17” and 3D model'],
 mods:[M('presa','plug-zap',['Presa di ricarica','Charging socket'],['Sezione con presa di ricarica.','Section with charging socket.']),M('speaker','megaphone',['Altoparlante','Broadcasting speaker'],['Diffusione sonora.','Public address.']),M('piano','square',['Sezione piana','Plain section'],['Prolunga strutturale.','Structural extension.']),M('display','monitor',['Display LCD','LCD display'],['Display LCD, da brochure.','LCD display, per brochure.']),M('ptz','video',['Telecamera PTZ','PTZ camera'],['Telecamera HD motorizzata.','Motorised HD camera.']),M('kit','lamp',['Kit luce','Light kit'],['Testa inclinata con corpo illuminante.','Angled head with luminaire.']),M('meteo','cloud-sun',['Stazione meteo','Weather station'],['Monitoraggio ambientale.','Environmental monitoring.'])]}};
const ENVS=[
{id:'piazza',name:['Piazza italiana contemporanea','Contemporary Italian piazza'],prompt:['Piazza italiana contemporanea con pavimentazione urbana, alberi giovani, panchine, edifici moderni e persone per dare la scala.','Contemporary Italian piazza, paved surface, young trees, benches, modern façades, pedestrians for scale.']},
{id:'historic',name:['Piazza storica','Historic piazza'],prompt:['Piazza storica italiana con pavimentazione in pietra e architettura d’epoca; il palo resta discreto.','Historic Italian piazza with stone paving and period architecture; pole kept visually discreet.']},
{id:'carpark',name:['Parcheggio pubblico','Public car park'],prompt:['Parcheggio pubblico con stalli, auto parcheggiate e un palo a fine fila.','Public car park with marked bays, parked cars and a pole at the end of a row.']},
{id:'commercial',name:['Area commerciale','Commercial area'],prompt:['Area commerciale con vetrine, pedoni e arredo urbano.','Commercial district with shopfronts, pedestrians and street furniture.']},
{id:'avenue',name:['Viale urbano','Urban avenue'],img:A+'hero-pole15.png',m:15,prompt:['Viale urbano alberato con marciapiede, traffico e pedoni.','Tree-lined urban avenue with pavement, traffic and pedestrians.']},
{id:'park',name:['Parco pubblico','Public park'],prompt:['Parco pubblico con percorsi, prato, alberi maturi e panchine.','Public park with paths, lawn, mature trees and benches.']}];
const VIEWS=()=>[['front',T('Frontale','Front')],['side',T('Laterale','Side')],['tq',T('Tre quarti','Three-quarter')],['ctx',T('In contesto','In context')],['scale',T('Scala','Scale')]];
const LIGHTS=[['none',['Non specificata','Not specified']],['warm',['Calda','Warm']],['neutral',['Neutra','Neutral']],['cool',['Fredda','Cool']],['discuss',['Da discutere','To discuss']]];
const PRESETS={15:[[['Configurazione A (brochure)','Configuration A (brochure)'],['emergenza','altoparlante','ricarica','ptz','display','wifi','rgb','meteo']],[['Configurazione B (brochure)','Configuration B (brochure)'],['emergenza','altoparlante','solare','cameraBox','lanterna']],[['Sicurezza pubblica','Public safety'],['emergenza','altoparlante','ptz','meteo']]],17:[[['Configurazione completa','Full configuration'],['presa','speaker','display','ptz','kit','meteo']],[['Informazione','Information'],['display','kit']],[['Sicurezza pubblica','Public safety'],['speaker','ptz','kit','meteo']]]};
const CFG0={model:15,mods:{15:['emergenza','altoparlante','ricarica','ptz','display','wifi','rgb','meteo'],17:['presa','speaker','display','ptz','kit','meteo']},env:'piazza',time:'night',view:'front',light:'none',qty:1,slotB:null};
const store={s:(()=>{try{return {...CFG0,...JSON.parse(localStorage.getItem('iv-cfg3')||'{}')}}catch(e){return CFG0}})(),subs:new Set(),set(p){this.s={...this.s,...p};try{localStorage.setItem('iv-cfg3',JSON.stringify(this.s))}catch(e){}this.subs.forEach(f=>f())}};
function useCfg(){const [,f]=React.useReducer(x=>x+1,0);React.useEffect(()=>{store.subs.add(f);return()=>store.subs.delete(f)},[]);return [store.s,p=>store.set(p)]}
const modOf=(m,id)=>MODELS[m].mods.find(x=>x.id===id);
const modName=(m,id)=>{const x=modOf(m,id);return x?tt(x.n):''};
const envOf=id=>ENVS.find(e=>e.id===id)||ENVS[0];
const lightName=id=>tt((LIGHTS.find(l=>l[0]===id)||LIGHTS[0])[1]);
const NAV=()=>[{label:T('Ecosistema','Ecosystem'),to:P.eco},{label:T('Soluzioni','Solutions'),to:P.sol,cols:[{t:'Smart Pole',l:[[T('Panoramica','Overview'),P.pole],['Modularity Smart Pole 15',P.p15,T('Modulare','Modular')],['BS-Smart Pole 17',P.p17,T('Maggiore capacità','Higher capacity')]]},{t:T('Tecnologia','Technology'),l:[[T('Intelligenza artificiale','Artificial Intelligence'),P.ai],[T('Piattaforme digitali','Digital Platforms'),P.dp],[T('Automazione e integrazione','Automation & Integration'),P.auto]]},{t:T('Infrastruttura','Infrastructure'),l:[[T('Infrastrutture intelligenti','Smart Infrastructure'),P.infra],[T('Tutte le soluzioni','All solutions'),P.sol]]}]},{label:T('Progetti','Projects'),to:P.proj},{label:T('Chi siamo','About'),to:P.about},{label:T('Configuratore','Configurator'),to:P.cfg}];
function ThreeStage({model,ids,view,time,env,onHeight}){const ref=React.useRef(),vr=React.useRef(),[st,setSt]=React.useState('load'),[rdy,setRdy]=React.useState(!!window.PoleViewer);const ph=React.useRef(onHeight);ph.current=onHeight;
React.useEffect(()=>{if(window.PoleViewer){setRdy(true);return}const f=()=>setRdy(true);window.addEventListener('poleviewer-ready',f);return()=>window.removeEventListener('poleviewer-ready',f)},[]);
React.useEffect(()=>{if(!rdy)return;const v=window.PoleViewer.create(ref.current);vr.current=v;return()=>{v.dispose();vr.current=null}},[rdy]);
React.useEffect(()=>{if(!vr.current)return;setSt('load');vr.current.update({model,ids,view,time,env,onHeight:h=>ph.current&&ph.current(h),onReady:()=>setSt('ok'),onError:()=>setSt('err')}).then(()=>setSt(s=>s==='load'?'ok':s))},[rdy,model,ids.join(','),view,time,env]);
return <div style={{position:'absolute',inset:0}}><div ref={ref} style={{position:'absolute',inset:0}} aria-label={T('Modello 3D interattivo: trascina per ruotare','Interactive 3D model: drag to rotate')} role="img"/>{st==='load'&&<div style={{position:'absolute',inset:0,display:'grid',placeItems:'center',pointerEvents:'none'}}><div style={{display:'flex',flexDirection:'column',gap:10,alignItems:'center'}} aria-busy="true"><div className="iv-skel" style={{width:120,height:10}}/><div className="iv-skel" style={{width:200,height:10}}/><span className="t-small">{T('Caricamento modello 3D','Loading 3D model')}</span></div></div>}{st==='err'&&<div style={{position:'absolute',inset:0,display:'grid',placeItems:'center'}}><StateBlock kind="error" title={T('Modello 3D non disponibile','3D model unavailable')} message={T('Impossibile caricare i file 3D.','The 3D files could not be loaded.')}/></div>}</div>}
function LangSwitch({set}){return <div className="lang" role="group" aria-label="Language">{['it','en'].map(l=><button key={l} aria-pressed={window.LANG===l} onClick={()=>set(l)}>{l.toUpperCase()}</button>)}</div>}
function Header({route,setLang}){const [open,setOpen]=React.useState(null);const [m,setM]=React.useState(false);React.useEffect(()=>{setOpen(null);setM(false)},[route]);const nav=NAV();const s=nav.find(x=>x.label===open);
return <><header className="iv-header" onMouseLeave={()=>setOpen(null)}><L to={P.home} className="hd-logo" aria-label="Vision Ecosystem"><img src={A+'logo-vision.png'} alt="Vision Ecosystem" style={{height:40}}/></L><nav>{nav.map(x=><button key={x.to} className={'iv-nav-item'+(route.startsWith(x.to)&&x.to!=='/'?' on':'')} aria-expanded={open===x.label} onMouseEnter={()=>setOpen(x.cols?x.label:null)} onClick={()=>x.cols&&open!==x.label?setOpen(x.label):go(x.to)}>{x.label}</button>)}</nav><LangSwitch set={setLang}/><Button size="sm" onClick={()=>go(P.cfg)}>{T('Richiedi un preventivo','Request a quote')}</Button><button className="hd-burger" aria-label="Menu" onClick={()=>setM(!m)}><Icon name={m?'x':'menu'} size={22} color="var(--fg-1)"/></button>
{s&&s.cols&&<div className="iv-mega">{s.cols.map(c=><div key={c.t}><h4>{c.t}</h4>{c.l.map(([n,t,sub])=><L key={t} to={t} className="mega-link">{n}{sub&&<small>{sub}</small>}</L>)}</div>)}<div style={{background:'var(--bg-2)',borderRadius:8,display:'flex',alignItems:'center',justifyContent:'center',gap:16,padding:16}}><img src={A+'pole-15-3d.png'} alt="" style={{height:190,objectFit:'contain'}}/><img src={A+'pole-17-3d.png'} alt="" style={{height:190,objectFit:'contain'}}/></div></div>}</header>
{m&&<div className="mnav">{nav.map(x=><React.Fragment key={x.to}><L to={x.to}>{x.label}</L>{x.cols&&x.cols[0].l.slice(1).map(([n,t])=><L key={t} to={t} className="sub">{n}</L>)}</React.Fragment>)}<L to={P.contact}>{T('Contatti','Contact')}</L><div style={{marginTop:16}}><LangSwitch set={setLang}/></div><div style={{marginTop:16}}><Button size="lg" onClick={()=>go(P.cfg)}>{T('Richiedi un preventivo','Request a quote')}</Button></div></div>}</>}
function Footer(){const col=(t,l)=><div key={t}><h4>{t}</h4><ul className="footnav">{l.map(([n,to])=><li key={to+n}><L to={to}>{n}</L></li>)}</ul></div>;
return <footer className="iv-footer"><div className="iv-footer__grid"><div><img src={A+'logo-vision.png'} alt="Vision Ecosystem" style={{height:44,marginBottom:20}}/><p style={{margin:0,maxWidth:320,fontSize:14}}>{T('Soluzioni tecnologiche integrate per trasformare spazi pubblici, infrastrutture ed esperienze urbane.','Integrated technology solutions designed to transform public spaces, infrastructure and urban experiences.')}</p></div>
{col('Smart Pole',[[T('Panoramica','Overview'),P.pole],['Smart Pole 15',P.p15],['BS-Smart Pole 17',P.p17],[T('Configuratore','Configurator'),P.cfg]])}{col(T('Soluzioni','Solutions'),[[T('Intelligenza artificiale','Artificial Intelligence'),P.ai],[T('Piattaforme digitali','Digital Platforms'),P.dp],[T('Automazione e integrazione','Automation & Integration'),P.auto],[T('Infrastrutture intelligenti','Smart Infrastructure'),P.infra]])}{col(T('Azienda','Company'),[[T('Ecosistema','Ecosystem'),P.eco],[T('Progetti','Projects'),P.proj],[T('Chi siamo','About'),P.about],[T('Contatti','Contact'),P.contact]])}</div>
<div className="iv-footer__legal"><span>© Vision Ecosystem · Powered by <a href="https://www.fioravantipages.com" target="_blank" rel="noopener">Fioravanti Pages</a></span><span style={{display:'flex',gap:24,flexWrap:'wrap'}}><L to={P.priv}>Privacy policy</L><L to={P.cook}>Cookie policy</L><span>invisiontechgroup.com</span></span></div></footer>}
function Sec({eyebrow,title,lead,alt,children,id,style}){return <section id={id} className={'sec'+(alt?' sec--alt':'')} style={style}><div className="wrap">{(title||eyebrow)&&<div className="sec-h">{eyebrow&&<span className="t-eyebrow">{eyebrow}</span>}{title&&<h2 className="t-h1" style={{margin:0}}>{title}</h2>}{lead&&<p className="t-lead">{lead}</p>}</div>}{children}</div></section>}
function PageHero({crumbs,eyebrow,title,lead,children,visual}){return <section className="pagehero"><div className="wrap"><Breadcrumb items={crumbs.map(([label,to])=>({label,href:to?'#'+to:undefined}))}/><div className={visual?'split':''}><div style={{display:'flex',flexDirection:'column',gap:24,marginTop:visual?0:48,maxWidth:760}}><span className="t-eyebrow">{eyebrow}</span><h1 className="t-display" style={{fontSize:'var(--fs-h1)'}}>{title}</h1><p className="t-lead" style={{margin:0}}>{lead}</p><div className="row">{children}</div></div>{visual}</div></div></section>}
function Slot({title,prompt,img,pos,tag,icon='image',style}){return img?<figure className="slot slot--img" style={{margin:0,...style}}><img src={img} alt={title} style={pos?{objectPosition:pos}:null}/><div className="in"><Badge tone="cyan">{img.includes('hero-pole15')?T('Render da brochure · Pole 15','Brochure render · Pole 15'):T('Render concettuale IA','AI concept render')}</Badge><h4>{title}</h4>{prompt&&<p>{prompt}</p>}</div></figure>:<figure className="slot" style={{margin:0,...style}}><span className="ic"><Icon name={icon} size={32}/></span><div className="in"><Badge tone="tbc">{tag||T('Render da generare','Render to be generated')}</Badge><h4>{title}</h4>{prompt&&<p>{T('Render previsto: ','Planned render: ')}{prompt}</p>}</div></figure>}
function Cta({title,text,primary,secondary}){title=title||T('Parliamo del tuo progetto.','Discuss your project.');text=text||T('Richiedi una consulenza o un preventivo. Prezzi e dati tecnici sono forniti dopo la valutazione del progetto.','Request a consultation or a quote. Pricing and technical data are provided after review of your project.');primary=primary||[T('Richiedi un preventivo','Request a quote'),P.cfg];secondary=secondary||[T('Contattaci','Contact us'),P.contact];return <section className="sec"><div className="wrap"><div className="ctaband"><div><span className="t-eyebrow">{T('Prossimo passo','Next step')}</span><h2 className="t-h1" style={{margin:'16px 0 12px'}}>{title}</h2><p className="muted">{text}</p></div><div className="row"><Button size="lg" onClick={()=>go(primary[1])}>{primary[0]}</Button><Button size="lg" variant="secondary" onClick={()=>go(secondary[1])}>{secondary[0]}</Button></div></div></div></section>}
function SolCard({icon,title,description,onClick}){return <div className="iv-card iv-card--link iv-scard" tabIndex={0} role="link" onClick={onClick} onKeyDown={e=>e.key==='Enter'&&onClick()}><Icon name={icon} size={32}/><div><h3 style={{margin:'0 0 8px',font:'500 20px var(--font-display)'}}>{title}</h3><p style={{margin:0,color:'var(--fg-2)',fontSize:15}}>{description}</p></div><span className="iv-scard__arrow">{T('Scopri','Explore')} <Icon name="arrow-right" size={16}/></span></div>}
function PCard({m,onClick}){const mo=MODELS[m];return <ProductCard name={mo.name} tagline={tt(mo.tag)} image={mo.img} specs={[{label:T('Altezza','Height'),value:<TBC/>},{label:T('Prezzo','Price'),value:<TBC/>}]} onClick={onClick}/>}
function EcoDiagram({hl=2}){const c=[[T('Hardware sul campo','Field hardware'),['Smart Pole 15','BS-Smart Pole 17',T('Sensori e telecamere','Sensors & cameras'),'Display']],[T('Connettività','Connectivity'),[T('Access point Wi-Fi','Wireless AP / Wi-Fi'),T('Rete di trasporto (da definire)','Network backhaul (to be defined)')]],[T('Piattaforma','Platform'),['Smart City Control System',T('Piattaforme digitali','Digital platforms')]],[T('Intelligenza','Intelligence'),[T('Intelligenza artificiale','Artificial intelligence'),T('Regole di automazione','Automation rules')]],[T('Risultati','Outcomes'),[T('Monitoraggio','Monitoring'),T('Controllo','Control'),T('Informazione al pubblico','Public information'),T('Servizi','Services')]]];
return <div className="eco" role="img" aria-label={T('Schema: hardware, connettività, piattaforma, intelligenza, risultati','Diagram: field hardware, connectivity, platform, intelligence, outcomes')}>{c.map(([t,i],k)=><div key={k} className={k===hl?'hl':''}><h4>0{k+1} · {t}</h4>{i.map(x=><span className="i" key={x}>{x}</span>)}</div>)}</div>}
function ModDiagram({model}){const m=MODELS[model].mods;return <div><div className="mdg"><div className="nd l"/><div className="pl top"/><div className="nd"/>{m.map((x,i)=>{const left=i%2===0;const node=<div className={'nd'+(left?' l':'')}><Icon name={x.icon} size={20}/><div>{tt(x.n)}<small>{tt(x.d)}</small></div><span className="ln"/></div>;return <React.Fragment key={x.id}>{left?node:<div className="nd"/>}<div className="pl"/>{left?<div className="nd"/>:node}</React.Fragment>})}<div/><div className="pl base"/><div/></div><p className="t-small" style={{textAlign:'center',marginTop:24}}>{T('Schema indicativo. Posizioni e altezze dei moduli non sono in scala né implicite in questo diagramma.','Schematic. Module positions and heights are not to scale and are not implied by this diagram.')}</p></div>}
function Person({h=300,dim}){return <svg viewBox="0 0 40 120" height={h} style={{opacity:dim?.45:1,flex:'none'}} aria-label={T('Persona di riferimento','Reference person')}><circle cx="20" cy="9" r="7" fill="#9AA5B5"/><path d="M10 20h20l3 38h-5l-1 8v50h-8V70h-4v50h-8V66l-1-8h-5z" fill="#9AA5B5"/></svg>}
function Note({children}){return <div className="notice"><Icon name="info" size={18} color="var(--amber)"/><span>{children}</span></div>}
Object.assign(window,{ThreeStage,DS,Button,Badge,Icon,Breadcrumb,Field,Checkbox,Dialog,StateBlock,AiDisclaimer,ProductCard,ModuleCard,ConfiguratorPanel,StepIndicator,A,T,tt,useRoute,L,go,P,TBC,Ai,Seg,MODELS,ENVS,VIEWS,LIGHTS,PRESETS,store,useCfg,modOf,modName,envOf,lightName,NAV,Header,Footer,Sec,PageHero,Slot,Cta,SolCard,PCard,EcoDiagram,ModDiagram,Person,Note});
