Abbiamo dato forma a mille idee. La prossima è la tua.
Studio di comunicazione e fotografia.
Tutta lacomunicazione.Un solo partner.
KaleidoscopioLab non è una semplice azienda: è una fucina di idee dove ogni frammento di visione trova la sua forma ideale. Un unico ecosistema in cui strategia, design e fotografia convergono per trasformare le intuizioni in progetti concreti.
Strategia e comunicazioneSiti web ed e-commerceSocial media managementFotografiaBrand identity e designProduzione e stampa
01La nostra mission
Idee. Creatività. Connessioni.
La fotografia e la comunicazione visiva prendono vita quando il talento creativo si sposa con una produzione impeccabile. Disegniamo su misura l’identità visiva del tuo brand: uniamo l’arte dello scatto alla cura artigianale della produzione per creare contenuti che arrivano al cuore del pubblico.
Il mestiere, prima dell’immagine
02Cosa facciamo
Affianchiamo brand e agenzie nel processo creativo, curando ogni fase.
Fotografia, video, web, social, grafica e produzione diventano parti di un unico progetto, pensato e coordinato dall’inizio alla fine.
Pianificazione, identità e narrazione. Sviluppiamo strategie su misura e campagne di comunicazione integrate per connettere le aziende con i loro pubblici chiave.
Creare un sito internet significa combinare estetica e funzionalità per accogliere i visitatori nel modo migliore. Si tratta di progettare non solo l’aspetto visivo ma anche l’esperienza d’uso, assicurandosi che ogni informazione sia facile da trovare e che la navigazione sia fluida su ogni tipo di schermo.
Più di un semplice feed curato: raccontiamo la storia del tuo brand. Ci occupiamo di grafiche, Reel, copywriting e strategie su misura per intercettare il tuo pubblico ideale e trasformare i follower in clienti fidelizzati. Tu ti concentri sul tuo lavoro, al resto ci pensiamo noi.
Ogni immagine racconta un’intenzione, un’emozione o un valore. Dai dettagli spontanei di un matrimonio alla precisione richiesta da un catalogo e-commerce, fino alla narrazione di eventi, volti aziendali e feed social: curiamo ogni scatto nei minimi dettagli per creare immagini che non si limitano a farsi guardare, ma si fanno ricordare.
Diamo forma, struttura e coerenza al tuo marchio. Dallo studio del logo alla realizzazione dell’intero sistema d’immagine coordinata, definiamo gli standard visivi che rendono la tua azienda immediatamente riconoscibile su ogni supporto web, cartaceo e pubblicitario.
Soluzioni di stampa e personalizzazione su misura per la tua comunicazione e i tuoi eventi. Ci occupiamo dell’intero processo produttivo per offrirti abbigliamento brandizzato, gadget promozionali, packaging d’impatto, cataloghi di pregio e prototipazione 3D. Un unico partner affidabile per trasformare la tua identità visiva in prodotti tangibili.
Dall’identità visiva di un brand alla magia di un matrimonio o di un grande evento: realizziamo scatti autentici e su misura, capaci di catturare l’essenza di ogni storia senza ricorrere ad immagini d’archivio.
(function(){
"use strict";
document.documentElement.className += ' js';
var U = 'https://www.kaleidoscopiolab.it/wp-content/uploads/';
var MOB = matchMedia('(max-width:900px)').matches; /* ---------- linee guida ---------- */
var gl = document.getElementById('gl');
if(gl){ for(var i=1;i<4;i++){ var b=document.createElement('i'); b.style.left=(i*25)+'%'; gl.appendChild(b); } }
var gd = document.getElementById('guides');
if(gd){ [['left','24%','w'],['left','76%','w'],['top','30%','h'],['top','70%','h']].forEach(function(g){ var e=document.createElement('i'); if(g[2]==='w'){ e.style.cssText='top:0;bottom:0;width:1px;left:'+g[1]; } else { e.style.cssText='left:0;right:0;height:1px;top:'+g[1]; } gd.appendChild(e); });
} /* ---------- marquee ---------- */
var words=['Strategia','Siti Web','E-commerce','Social Media','Fotografia','Brand Identity', 'Stampa 3D','Incisione laser','Packaging','Cataloghi'];
var mq=document.getElementById('mq'), h='';
for(var r=0;r<2;r++){ words.forEach(function(w){ h+=''+w+'•'; }); }
mq.innerHTML=h; /* ---------- pilastri: immagine guidata dal mouse ---------- */
/* Un'immagine per pilastro, nello stesso ordine dell'elenco, ed e' la stessa che si ritrova aprendo la pagina del servizio: cosi' l'anteprima e' una promessa e non una decorazione. Ritagliate 4:5, che e' il formato del riquadro; il terzo valore sposta il punto d'interesse dove serve. */
var PIMG=[ ['2026/09/kl-srv-strategia.jpg','Strategia e comunicazione','center'], ['2026/09/kl-srv-sitiweb.jpg','Siti web ed e-commerce','center'], ['2026/09/kl-srv-social.jpg','Social media management','center'], ['2026/09/kl-srv-fotografia.jpg','Fotografia','center'], ['2026/09/kl-srv-brand.jpg','Brand identity e design','center'], ['2026/09/kl-srv-produzione.jpg','Produzione e stampa','center']
];
var pm=document.getElementById('pmedia');
pm.innerHTML = PIMG.map(function(p,i){ return '';
}).join('') + '
'+PIMG[0][1]+'
'; /* ---------- hero: finestra che insegue il cursore ---------- */
(function(){ var hs=document.querySelector('.hsrv'); if(!hs||typeof PIMG==='undefined') return; var as=[].slice.call(hs.querySelectorAll('a')); as.forEach(function(a,i){ var p=PIMG[i]; if(!p) return; var tx=document.createElement('span'); tx.className='htx'; while(a.firstChild) tx.appendChild(a.firstChild); var th=document.createElement('span'); th.className='hthumb'; th.innerHTML=''; a.appendChild(th); a.appendChild(tx); }); if(window.matchMedia('(hover:none)').matches||innerWidth<900) return; var pk=document.createElement('div'); pk.className='hpeek'; pk.innerHTML=''; (document.getElementById('klroot')||document.body).appendChild(pk); var pim=pk.querySelector('img'), pcp=pk.querySelector('.hpk-cap'); var tx=innerWidth/2,ty=innerHeight/2,cx=tx,cy=ty,raf=null,cur=-1; function loop(){ cx+=(tx-cx)*0.16; cy+=(ty-cy)*0.16; pk.style.transform='translate3d('+cx+'px,'+cy+'px,0)'; raf=requestAnimationFrame(loop); } function move(e){ var w=pk.offsetWidth||220, hh=pk.offsetHeight||300; var x=e.clientX+26, y=e.clientY-hh*0.45; if(x+w>innerWidth-14) x=e.clientX-w-26; if(yinnerHeight-12) y=innerHeight-hh-12; tx=x; ty=y; } as.forEach(function(a,i){ a.addEventListener('mouseenter',function(e){ var p=PIMG[i]; if(!p) return; if(cur!==i){ cur=i; pim.src=U+p[0]; pcp.innerHTML=p[1]; } hs.classList.add('peeking'); a.classList.add('hot'); move(e); if(!raf){ cx=tx; cy=ty; pk.style.transform='translate3d('+cx+'px,'+cy+'px,0)'; loop(); } requestAnimationFrame(function(){ pk.classList.add('on'); }); }); a.addEventListener('mousemove',move,{passive:true}); a.addEventListener('mouseleave',function(){ a.classList.remove('hot'); }); }); hs.addEventListener('mouseleave',function(){ hs.classList.remove('peeking'); pk.classList.remove('on'); setTimeout(function(){ if(!pk.classList.contains('on')&&raf){ cancelAnimationFrame(raf); raf=null; cur=-1; } },600); });
})(); var lis=[].slice.call(document.querySelectorAll('#plist li'));
var figs=[].slice.call(pm.querySelectorAll('figure'));
var cap=document.getElementById('pcap');
var cur=0, auto=null;
function setPil(i){ if(i===cur) return; cur=i; lis.forEach(function(l,n){ l.classList.toggle('on', n===i); }); figs.forEach(function(f,n){ f.classList.toggle('on', n===i); }); cap.innerHTML = PIMG[i][1]; /* le didascalie contengono entita' HTML nostre */
}
lis.forEach(function(l,i){ var a=l.querySelector('a'); a.addEventListener('mouseenter', function(){ setPil(i); stopAuto(); }); a.addEventListener('focus', function(){ setPil(i); stopAuto(); }); a.addEventListener('click', function(e){ /* Su telefono la prima toccata apre la descrizione, la seconda porta alla pagina: e' il comportamento che la gente si aspetta da una fisarmonica, e evita che un dito di passaggio faccia cambiare pagina. */ if(MOB && !l.classList.contains('on')){ e.preventDefault(); setPil(i); return; } setPil(i); });
});
function startAuto(){ if(MOB||auto) return; auto=setInterval(function(){ setPil((cur+1)%lis.length); }, 3400); }
function stopAuto(){ if(auto){ clearInterval(auto); auto=null; } }
var pilSec=document.getElementById('servizi');
if('IntersectionObserver' in window){ new IntersectionObserver(function(es){ es.forEach(function(e){ e.isIntersecting ? startAuto() : stopAuto(); }); },{threshold:.35}).observe(pilSec);
}
document.querySelector('.pil').addEventListener('mouseleave', startAuto); /* ---------- 04 Fotografia: vetrina ---------- */
var PH=[ ['Matrimoni','2026/09/kl-wed-arco-mare.jpg',[ ['2026/09/kl-wed-arco-mare.jpg','Matrimonio — l’arco di pietra sul mare'], ['2026/09/kl-wed-tramonto.jpg','Matrimonio — il ritratto al tramonto'], ['2026/09/kl-wed-uscita-riso.jpg','Matrimonio — l’uscita dalla chiesa'], ['2026/09/kl-wed-velo.jpg','Matrimonio — il velo, prima della cerimonia']]], ['Eventi','2026/09/kl-evt-mangiafuoco.jpg',[ ['2026/09/kl-evt-mangiafuoco.jpg','Rievocazione storica — il mangiafuoco'], ['2026/09/kl-evt-giocoliere-bambino.jpg','Rievocazione storica — il gioco in piazza'], ['2026/09/kl-evt-corteo-storico.jpg','Rievocazione storica — il corteo'], ['2026/08/kl-gal-passio-fumo.jpg','Passio Christi — il corteo nel fumo']]], ['Moda','2026/09/kl-moda-completo-azzurro.jpg',[ ['2026/09/kl-moda-completo-azzurro.jpg','Editoriale moda — completo in studio'], ['2026/09/kl-moda-total-white.jpg','Editoriale moda — total white'], ['2026/09/kl-moda-giacca-pelle.jpg','Editoriale moda — capo indossato'], ['2026/09/kl-moda-esterna-gravina.jpg','Editoriale moda — scatto in esterna']]], ['Still life','2026/09/kl-still-borsa-dettaglio.jpg',[ ['2026/09/kl-still-borsa-dettaglio.jpg','Still life — dettaglio di una borsa'], ['2026/09/kl-still-anfibio.jpg','Still life — calzatura su fondo colore'], ['2026/09/kl-still-pochette.jpg','Still life — pochette in pelle'], ['2026/09/kl-still-stivaletti.jpg','Still life — stivaletti'], ['2026/08/kl-gal-hosteria.jpg','Brand identity e design']]], ['Aziendale','2026/08/kl-gal-edilmaggi.jpg',[ ['2026/08/kl-gal-edilmaggi.jpg','Cantiere Edil Maggì — fotografia aziendale'], ['2026/08/kl-set-edile-1.jpg','Cantiere — lavorazione in quota'], ['2026/08/kl-set-termo-2.jpg','Impianto termico — intervento in cantiere'], ['2026/08/kl-set-costruzioni-2.jpg','Cantiere ripreso dall’alto']]]
];
(function(){ var shot=document.getElementById('pshot'), th=document.getElementById('pthumbs'), nm=document.getElementById('pnums'), cap=document.getElementById('fcap'), b1=document.getElementById('pb1'), tg=document.getElementById('ptags'); if(!shot||!th) return; /* le miniature sono le categorie: una per tipo di lavoro */ th.innerHTML=PH.map(function(c,i){ return ''; }).join(''); if(tg) tg.innerHTML=['#reportage','#aziendale','#matrimoni','#eventi','#ritratto','#stilllife'].map(function(t){ return ''+t+''; }).join(''); var cat=0, idx=0; function render(){ var foto=PH[cat][2]; shot.innerHTML=foto.map(function(f,i){ return ''; }).join(''); nm.innerHTML=foto.map(function(f,i){ return ''; }).join(''); [].forEach.call(nm.children,function(el,i){ el.addEventListener('click',function(){ idx=i; paint(); }); }); paint(); } function paint(){ var foto=PH[cat][2]; [].forEach.call(shot.children,function(el,n){ el.classList.toggle('on',n===idx); }); [].forEach.call(nm.children,function(el,n){ el.classList.toggle('on',n===idx); }); [].forEach.call(th.children,function(el,n){ var a=(n===cat); el.classList.toggle('on',a); el.setAttribute('aria-pressed',a); if(a&&el.scrollIntoView){ try{ var pr=th.getBoundingClientRect(), er=el.getBoundingClientRect(); if(er.leftpr.right) th.scrollTo({left:el.offsetLeft-(th.clientWidth-el.offsetWidth)/2,behavior:'smooth'}); }catch(e){} } }); if(b1){ var s=b1.querySelector('span'); if(s) s.innerHTML=PH[cat][0]; } if(cap) cap.innerHTML=foto[idx][1]; } function setCat(i,keep){ cat=(i+PH.length)%PH.length; if(!keep) idx=0; render(); } function step(d){ var foto=PH[cat][2]; var n=idx+d; if(n=foto.length){ setCat(cat+1); return; } idx=n; paint(); } [].forEach.call(th.children,function(el,i){ el.addEventListener('click',function(){ setCat(i); }); }); var pv=document.getElementById('pprev'), nx=document.getElementById('pnext'); if(pv) pv.addEventListener('click',function(){ step(-1); }); if(nx) nx.addEventListener('click',function(){ step(1); }); /* si sfoglia anche trascinando o con le frecce della tastiera */ var x0=null; shot.addEventListener('pointerdown',function(e){ x0=e.clientX; }); shot.addEventListener('pointerup',function(e){ if(x0===null) return; var d=e.clientX-x0; x0=null; if(Math.abs(d)>45) step(d<0?1:-1); }); shot.setAttribute('tabindex','0'); shot.addEventListener('keydown',function(e){ if(e.key==='ArrowRight'){ e.preventDefault(); step(1); } if(e.key==='ArrowLeft'){ e.preventDefault(); step(-1); } }); render();
})(); /* ---------- produzione ---------- */
/* Ogni lavorazione ha la sua pagina: qui il link ci va davvero. */
var PROD=[['Stampa 3D','Dal prototipo all’oggetto finito: trasformiamo le tue idee e i tuoi progetti digitali in forme reali, curando ogni dettaglio e materiale.',6675,'2026/09/kl-pro-stampa3d.jpg','Stampa 3D'], ['Incisione laser','Ogni incisione è realizzata con cura e tecnologia di ultima generazione, per un risultato elegante, duraturo e senza limiti di creatività.',6676,'2026/09/kl-pro-laser.jpg','Incisione laser'], ['Packaging ed etichette','Soluzioni di confezionamento su misura studiate per catturare il cliente al primo sguardo.',6677,'2026/09/kl-pro-packaging.jpg','Packaging ed etichette'], ['Cataloghi e brochure','Racconta la tua azienda e i tuoi prodotti con strumenti editoriali di qualità. Carta, colori e finiture ideati per trasformare i lettori in acquirenti.',6678,'2026/09/kl-pro-cataloghi.jpg','Cataloghi e brochure']];
(function(){ var ul=document.getElementById('plist2'), pm=document.getElementById('pmedia2'); if(!ul||!pm) return; ul.innerHTML=PROD.map(function(p,i){ var n=(i+1<10?'0':'')+(i+1); return '
'; var lis=[].slice.call(ul.querySelectorAll('li')), figs=[].slice.call(pm.querySelectorAll('figure')), cap=document.getElementById('pcap2'), cur=0, MOB2=window.matchMedia('(hover:none)').matches||innerWidth<900; function set(i){ if(i===cur) return; cur=i; lis.forEach(function(l,n){ l.classList.toggle('on',n===i); }); figs.forEach(function(f,n){ f.classList.toggle('on',n===i); }); cap.innerHTML=PROD[i][4]; } lis.forEach(function(l,i){ var a=l.querySelector('a'); a.addEventListener('mouseenter',function(){ if(!MOB2) set(i); }); a.addEventListener('focus',function(){ set(i); }); a.addEventListener('click',function(e){ if(MOB2 && !l.classList.contains('on')){ e.preventDefault(); set(i); } }); });
})(); /* ---------- gli altri clienti ---------- Le altre tredici aziende dei ventuno loghi consegnati da Simi: nessuna ha una casella nella griglia qui sopra (SIFIN e Galante il progetto ce l'hanno, ma sta nella pagina Lavori). Il logo si vede, la scheda non si finge: il clic porta alla pagina dei lavori. */ /* ---------- 05 clienti: nastro dei loghi ---------- */
(function(){ var box=document.getElementById('lrib'); if(!box) return; var B='/wp-content/uploads/2026/08/kl-logo-'; var DIM={"wonder-ginosa":[100,62],"isolarsi":[155,41],"hosteria-del-secolo":[137,47],"mupa":[76,62],"eden-spazio-bellezza":[76,62],"climasat":[134,48],"tecnica-diesel":[143,45],"mediterranea-beton":[137,47],"loforese-group":[118,54],"edil-maggi":[100,62],"edils":[138,46],"agri-ionica":[158,40],"sifin-immobiliare":[99,62],"agenzia-galante":[110,58],"snaipay-vincendo":[104,61],"eclipse":[141,45],"il-quadrifoglio":[190,31],"piccoli-sogni":[80,62],"il-piccolo-principe":[129,50],"jogo-playhouse":[98,62],"alima":[95,62]}; var L=[['wonder-ginosa','Wonder Ginosa e Marina'],['isolarsi','Isolarsì'], ['hosteria-del-secolo','Hosteria del Secolo'],['mupa','MUPA'], ['eden-spazio-bellezza','Eden Spazio Bellezza'],['climasat','ClimaSat'], ['tecnica-diesel','Tecnica Diesel'],['mediterranea-beton','Mediterranea Beton'], ['loforese-group','Loforese Group'],['edil-maggi','Edil Maggì'],['edils','EDILS'], ['agri-ionica','Agri Ionica'],['sifin-immobiliare','SIFIN Immobiliare'], ['agenzia-galante','Agenzia Galante'],['snaipay-vincendo','Snaipay Vincendo'], ['eclipse','Eclipse'],['il-quadrifoglio','Il Quadrifoglio'],['piccoli-sogni','Piccoli Sogni'], ['il-piccolo-principe','Il Piccolo Principe'],['jogo-playhouse','Jogo Playhouse'],['alima','Alima']]; var one=L.map(function(l){ var d=DIM[l[0]]||[110,50];return ''; }).join(''); box.innerHTML=one+one+one;
})(); /* ---------- cursore: punto veloce + anello che insegue ---------- */
var curEl=document.querySelector('.cur'), ring=document.querySelector('.cring');
var ringLab=ring?ring.firstElementChild:null;
if(!MOB && curEl && ring){ var mx=innerWidth/2, my=innerHeight/2, dx=mx, dy=my, rx=mx, ry=my, pressed=false; var TW=34, TH=34, TR=17, rw=34, rh=34, rr=17, mode='', snapEl=null, px=mx, py=my, sq=0; addEventListener('mousemove',function(e){ mx=e.clientX; my=e.clientY; },{passive:true}); addEventListener('mousedown',function(){ pressed=true; },{passive:true}); addEventListener('mouseup',function(){ pressed=false; },{passive:true}); /* un link in linea che va a capo ha PIU' riquadri: getBoundingClientRect() restituisce l'unione, cioe' tutto il paragrafo. Serve la riga sotto il puntatore. */ function rectFor(el,x,y){ var rs=el.getClientRects(); if(rs.length<2) return el.getBoundingClientRect(); var best=rs[0], bd=Infinity; for(var i=0;i<rs.length;i++){ var r=rs[i]; var ax=Math.max(r.left-x,0,x-r.right), ay=Math.max(r.top-y,0,y-r.bottom); var dd=ax*ax+ay*ay; if(dd.004) ? Math.atan2(my-ry,mx-rx)*57.2958 : 0; curEl.style.transform='translate3d('+dx.toFixed(1)+'px,'+dy.toFixed(1)+'px,0) translate(-50%,-50%)'; ring.style.transform='translate3d('+rx.toFixed(1)+'px,'+ry.toFixed(1)+'px,0) translate(-50%,-50%) ' +'rotate('+ang.toFixed(1)+'deg) scale('+((1+sq)*(pressed?.82:1)).toFixed(3)+',' +((1-sq)*(pressed?.82:1)).toFixed(3)+') rotate('+(-ang).toFixed(1)+'deg)'; requestAnimationFrame(loop); })(); function setCur(cls,txt,el){ var cn='cring'+(cls?' '+cls:''); if(ring.className!==cn) ring.className=cn; if(ringLab.textContent!==(txt||'')) ringLab.textContent=txt||''; curEl.classList.toggle('off', cls==='lg'||cls==='txt'); mode=cls||''; snapEl=null; if(el){ var rb=el.getBoundingClientRect(); if(rb.width<=SNAP_MAX_W && rb.height<=SNAP_MAX_H) snapEl=el; } if(cls==='lg'){ TW=TH=94; TR=47; } else if(cls==='txt'){ TW=2; TH=30; TR=1; } else if(cls==='sm' && !el){ TW=TH=54; TR=27; } else if(!cls){ TW=TH=34; TR=17; } } /* Solo comandi piccoli e cliccabili. C'era dentro anche .mono.am, che pero' non e' un comando ed e' sempre un
largo quanto la colonna: l'anello ci si posava sopra diventando una pillola lunga mezzo schermo, e il magnetismo spostava l'etichetta. */ var MAG='nav.top a,.inline-link,.cgrid .blk a.b,.crumb a,.bar a'; /* rete di sicurezza: per quanto stretto sia il selettore, l'anello non deve mai posarsi su qualcosa piu' grande di un comando. */ var SNAP_MAX_W=300, SNAP_MAX_H=64; document.addEventListener('mouseover',function(e){ var t=e.target; if(!t || !t.closest) return; if(t.closest('[data-c]')) return setCur('lg','Vedi'); if(t.closest('.plist li,.hsrv a')) return setCur('lg','Apri'); if(t.closest('.prod a.it')) return setCur('lg','Apri'); if(t.closest('.btn')) return setCur('lg','Apri'); if(t.closest('.wlg,.wmlist a')) return setCur('lg','Cliente'); if(t.closest('a[href^="mailto"]')) return setCur('lg','Scrivi'); if(t.closest('a[href^="tel"]')) return setCur('lg','Chiama'); if(t.closest('.lb button')) return setCur('sm',''); if(t.closest('.lb')) return setCur('lg','Chiudi'); if(t.classList && t.classList.contains('zoomable')) return setCur('lg','Ingrandisci'); if(t.closest('.bleed figure,.photo figure,.pmedia')) return setCur('lg','Ingrandisci'); var sn=t.closest(MAG); if(sn) return setCur('sm','',sn); if(t.closest('a,button')) return setCur('sm',''); if(t.closest('p,.body,.lead,h1,h2,.big,.step,.crumb')) return setCur('txt',''); setCur('',''); }); /* magnetismo: i piccoli comandi si avvicinano al puntatore */ [].slice.call(document.querySelectorAll(MAG)).forEach(function(el){ if(el.getClientRects().length>1) return; /* niente magnetismo se va a capo */ if(el.getBoundingClientRect().width>SNAP_MAX_W) return; /* ne' se e' largo come una colonna */ el.style.transition='transform .55s cubic-bezier(.2,.7,.3,1)'; el.addEventListener('mousemove',function(e){ var r=el.getBoundingClientRect(); el.style.transitionDuration='.09s'; el.style.transform='translate('+((e.clientX-(r.left+r.width/2))*.26).toFixed(1)+'px,' +((e.clientY-(r.top+r.height/2))*.45).toFixed(1)+'px)'; },{passive:true}); el.addEventListener('mouseleave',function(){ el.style.transitionDuration='.55s'; el.style.transform='none'; }); });
} /* ---------- l'animazione parte dal lato da cui arriva il cursore ---------- */
var HOVER = matchMedia('(hover:hover)').matches;
function originFrom(el,e){ if(!e.clientX && !e.clientY) return; /* eventi sintetici senza coordinate */ var r=el.getBoundingClientRect(); var x=(e.clientX-r.left)/(r.width||1)-.5, y=(e.clientY-r.top)/(r.height||1)-.5; el.style.setProperty('--org', Math.abs(x)>=Math.abs(y) ? (x>0?'right':'left') : (y>0?'bottom':'top'));
}
[].slice.call(document.querySelectorAll('.plist li>a,.prod .it,.btn,nav.top .sub a')).forEach(function(el){ if(HOVER){ el.addEventListener('mouseenter',function(e){ originFrom(el,e); },{passive:true}); el.addEventListener('mouseleave',function(e){ originFrom(el,e); },{passive:true}); } else { el.addEventListener('pointerdown',function(e){ originFrom(el,e); },{passive:true}); }
}); /* ---------- etichette che ruotano al passaggio ---------- */
[].slice.call(document.querySelectorAll( 'nav.top a,.bar a,.cgrid .blk a.b,.mono.am,.crumb a,.sheet .foot a')) .forEach(function(a){ if(a.children.length) return; var txt=a.textContent; if(!txt || !txt.trim()) return; var wrap=document.createElement('span'); wrap.className='rl'; var i1=document.createElement('i'); i1.textContent=txt; var i2=document.createElement('i'); i2.textContent=txt; i2.setAttribute('aria-hidden','true'); wrap.appendChild(i1); wrap.appendChild(i2); a.textContent=''; a.appendChild(wrap);
}); /* ---------- onda al clic e al tocco (desktop e telefono) ---------- */
var ripRoot=document.getElementById('klroot')||document.body;
addEventListener('pointerdown',function(e){ var t=e.target; if(!t || !t.closest || !t.closest('a,button,.it,.wrow,.plist li')) return; var d=document.createElement('span'); d.className='rip'; d.style.left=e.clientX+'px'; d.style.top=e.clientY+'px'; ripRoot.appendChild(d); setTimeout(function(){ if(d.parentNode) d.parentNode.removeChild(d); }, 800);
},{passive:true}); /* ---------- caleidoscopio: tieni premuto il logo, digita "kaleido", o Konami ---------- */
var kale=document.getElementById('kale');
if(kale){ var rose=kale.querySelector('.rose'); /* tre corone di spicchi specchiati che ruotano a velocita' diverse */ [[ 'l1',18,3.4,'linear-gradient(180deg,#A4845B 0%,rgba(164,132,91,.05) 78%)'], [ 'l2',12,5.2,'linear-gradient(180deg,rgba(24,24,24,.62) 0%,rgba(24,24,24,0) 72%)'], [ 'l3', 8,8.5,'linear-gradient(180deg,#69543A 0%,rgba(105,84,58,.05) 70%)']].forEach(function(L){ var ly=document.createElement('div'); ly.className='ly '+L[0]; for(var i=0;i=0){ buf=''; kaleOn(); } }); var KON=['arrowup','arrowup','arrowdown','arrowdown','arrowleft','arrowright','arrowleft','arrowright','b','a']; var kp=0; addEventListener('keydown',function(e){ if(!e.key) return; var k=e.key.toLowerCase(); kp = (k===KON[kp]) ? kp+1 : (k===KON[0]?1:0); if(kp===KON.length){ kp=0; kaleOn(); } }); var lgo=document.querySelector('header .lg'), lpT=null, longPress=false; if(lgo){ lgo.addEventListener('pointerdown',function(){ longPress=false; lpT=setTimeout(function(){ longPress=true; kaleOn(); },700); },{passive:true}); ['pointerup','pointerleave','pointercancel'].forEach(function(ev){ lgo.addEventListener(ev,function(){ clearTimeout(lpT); },{passive:true}); }); lgo.addEventListener('click',function(e){ if(longPress){ e.preventDefault(); longPress=false; } }); }
} /* ---------- rivelazioni + header + parallasse ---------- */
/* ---------- titoli che salgono da dietro una maschera ---------- */
document.querySelectorAll('h2,.big,.claim p').forEach(function(h){ if(h.classList.contains('mskd')) return; var sp=document.createElement('span'); sp.className='msk'; sp.innerHTML=h.innerHTML; h.innerHTML=''; h.appendChild(sp); h.classList.add('mskd');
}); var els=[].slice.call(document.querySelectorAll('.rv')); /* ---------- comparse a cascata ---------- */
els.forEach(function(n){ if(/\bd[1-4]\b/.test(n.className)) return; var p=n.parentNode; if(p.__klg===undefined) p.__klg=0; var i=p.__klg++; if(i>0){ var d=(Math.min(i,7)*0.065)+'s'; n.style.transitionDelay=d; var m=n.firstElementChild; if(m && m.className==='msk') m.style.transitionDelay=d; }
}); var pcolImgs=[].slice.call(document.querySelectorAll('#pcol img'));
/* rete di sicurezza per le maschere: se la transizione resta bloccata (succede quando la scheda e' in secondo piano e la timeline si ferma) il testo deve comparire lo stesso. Una transizione bloccata vince anche sullo stile inline: per sbloccarla va prima annullata la transizione. */
function guardMask(m){ setTimeout(function(){ if(document.hidden){ guardMask(m); return; } var t=getComputedStyle(m).transform; if(t!=='none' && t!=='matrix(1, 0, 0, 1, 0, 0)'){ m.style.transition='none'; m.style.transform='none'; } }, 1900);
}
function markIn(n){ if(n.classList.contains('in')) return; n.classList.add('in'); var m=n.firstElementChild; if(m && m.className==='msk') guardMask(m);
}
function reveal(){ for(var i=els.length-1;i>=0;i--){ if(els[i].getBoundingClientRect().top < innerHeight - 40){ markIn(els[i]); els.splice(i,1); } }
}
function parallax(){ if(MOB) return; pcolImgs.forEach(function(im,n){ var r=im.parentNode.getBoundingClientRect(); if(r.bottominnerHeight) return; var p=(r.top+r.height/2-innerHeight/2)/innerHeight; im.style.transform='translate3d(0,'+(p*-26*(n%2?-1:1)).toFixed(1)+'px,0) scale(1.07)'; });
}
/* ---------- fascia claim: fondo vivo ---------- */
var RM = matchMedia('(prefers-reduced-motion: reduce)').matches;
(function(){ [].slice.call(document.querySelectorAll('.claim')).forEach(function(c){ if(c.querySelector('.cfx')) return; var f=document.createElement('div'); f.className='cfx'; f.setAttribute('aria-hidden','true'); f.innerHTML='' + ''; c.insertBefore(f, c.firstChild); var g=f.querySelector('.glow'); if(!MOB && !RM){ c.addEventListener('pointermove',function(e){ var r=c.getBoundingClientRect(); g.style.transform='translate3d('+(e.clientX-r.left).toFixed(0)+'px,'+(e.clientY-r.top).toFixed(0)+'px,0)'; g.style.opacity='1'; },{passive:true}); c.addEventListener('pointerleave',function(){ g.style.opacity='0'; },{passive:true}); } });
})(); /* ---------- dove sono: l'header segue i capitoli ---------- */
var doveEl=document.getElementById('dove');
var capitoli=[].slice.call(document.querySelectorAll('.eb')).map(function(e){ var sez=e.closest('section'); return {sez:sez, n:e.querySelector('b').textContent.trim(), nome:e.querySelector('i').textContent.trim()};
}).filter(function(c){ return c.sez; });
var doveDef = doveEl ? doveEl.innerHTML : '';
var dovePrev = '';
function dove(){ if(!doveEl || !capitoli.length) return; var att=null; for(var i=0;i<capitoli.length;i++){ if(capitoli[i].sez.getBoundingClientRect().top < 140) att=capitoli[i]; } var html = att ? ''+att.n+' / '+(capitoli.length<10?'0':'')+capitoli.length+' '+att.nome+'' : doveDef; if(html!==dovePrev){ doveEl.innerHTML=html; doveEl.classList.toggle('sez', !!att); dovePrev=html; }
} var hdr=document.getElementById('hdr');
var claimEl=document.querySelector('.claim');
var prog=document.querySelector('.prog i');
var mqi=document.querySelector('.mq-in');
function sy(){ var y=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0; return y>0?y:0; } /* il rimbalzo elastico va a zero, non sotto */ /* ---------- header ---------- La barra resta sempre visibile e sempre della stessa altezza: non si ritira e non cambia riquadro. L'unica cosa che commuta e' il fondo, e lo fa con isteresi (accende a 76px, spegne a 44px) perche' una soglia secca sfarfalla appena lo scroll oscilla di un pixel. */
var STUCK_ON=76, STUCK_OFF=44;
var yPrev=sy(), tPrev=0, stuck=false, dirPrev='';
function header(y,d,jump){ if(!hdr) return; if(!stuck && y>STUCK_ON){ stuck=true; hdr.classList.add('stuck'); } else if(stuck && y260 || Math.abs(d)>innerHeight; yPrev=y; tPrev=t; header(y,d,jump); if(prog){ var m=(document.documentElement.scrollHeight-innerHeight)||1; prog.style.transform='scaleX('+Math.max(0,Math.min(1,y/m)).toFixed(4)+')'; } if(mqi && !jump && Math.abs(d)>2){ var nd = d<0 ? 'reverse' : 'normal'; if(nd!==dirPrev){ mqi.style.animationDirection=nd; dirPrev=nd; } } if(claimEl){ var r=claimEl.getBoundingClientRect(); document.body.classList.toggle('on-am', r.top 90); } dove();
}
/* niente dipendenza dagli eventi di scroll: alcuni temi li intercettano */
var lastY=-1, idle=0;
(function frame(ts){ var y=sy(); if(y!==lastY){ lastY=y; idle=0; tick(ts); } else if(idle .msk').forEach(guardMask);
}, 6000); /* ---------- entrata hero ---------- */
setTimeout(function(){ document.getElementById('hero').classList.add('go'); }, 180); /* ---------- menu mobile ---------- */
/* ---------- visore immagini ---------------------------------------------- Tutte le fotografie editoriali (fasce, gallerie, ritratti) diventano cliccabili e si aprono a tutto schermo. Restano fuori le immagini che stanno dentro un link, perche' li' il clic deve continuare a portare da un'altra parte, e i loghi. */
(function(){ var root=document.getElementById('klroot')||document.body; /* niente .pmedia: sulla home quelle immagini seguono il passaggio del mouse sui cinque pilastri e il clic deve restare al pilastro. */ var SEL='.bleed figure img,.gal figure img,.photo figure img,' + '.sitedemo .shot img,.wrow .ph img,.team .ph img'; var shots=[]; [].slice.call(root.querySelectorAll(SEL)).forEach(function(im){ if(im.closest('a')) return; if(!im.getAttribute('src')) return; var fig=im.closest('figure')||im.parentElement; var capEl=fig?fig.querySelector('figcaption'):null; var tit=(capEl?capEl.textContent:'')||im.getAttribute('alt')||''; var sub=''; /* le fasce hanno la didascalia in una riga a parte, sotto */ var band=im.closest('.bleed'); if(band){ var sp=band.querySelectorAll('.cap-row span'); if(sp[0]) tit=sp[0].textContent; if(sp[1]) sub=sp[1].textContent; } im.classList.add('zoomable'); im.setAttribute('role','button'); im.setAttribute('tabindex','0'); im.setAttribute('aria-label','Ingrandisci: '+(tit||'immagine')); shots.push({el:im, t:tit.trim(), s:sub.trim()}); }); if(!shots.length) return; /* ATTENZIONE: qui non si usa innerHTML con dentro un tag immagine scritto per esteso. WordPress riscrive TUTTI i tag immagine che trova nella pagina per aggiungerci gli attributi di ottimizzazione, e non distingue fra un'immagine vera e una che sta dentro una stringa di codice: ci infila dentro fetchpriority con gli apici, quegli apici chiudono la stringa a meta' e il browser scarta l'intero file. Da qui, il 19 agosto, nove pagine su tredici senza cursore, senza animazioni e con meta' della home vuota. Il nodo si costruisce a mano: cosi' non c'e' niente da riscrivere. */ function el(tag, cls){ var e=document.createElement(tag); if(cls) e.className=cls; return e; } function btn(cls, lab, seg){ var b=document.createElement('button'); b.type='button'; b.className=cls; b.setAttribute('aria-label',lab); b.textContent=seg; return b; } var lb=el('div','lb'); lb.setAttribute('role','dialog'); lb.setAttribute('aria-modal','true'); lb.setAttribute('aria-hidden','true'); var stage=el('div','stage'); var fig=document.createElement('figure'); var img=document.createElement('img'); img.alt=''; fig.appendChild(img); stage.appendChild(el('span','ld')); stage.appendChild(fig); var num=el('div','num mono'), cap=el('div','cap'); var bx=btn('x','Chiudi','\u2715'); var bp=btn('nav prev','Immagine precedente','\u2190'); var bn=btn('nav next','Immagine successiva','\u2192'); lb.appendChild(stage); lb.appendChild(num); lb.appendChild(bx); lb.appendChild(bp); lb.appendChild(bn); lb.appendChild(cap); root.appendChild(lb); var i=0, open=false, lastFocus=null; function show(n,dir){ i=(n+shots.length)%shots.length; var s=shots[i]; lb.classList.remove('ready'); lb.classList.add('wait'); var src=s.el.currentSrc||s.el.src; var pre=new Image(); pre.onload=pre.onerror=function(){ img.src=src; img.alt=s.t||''; lb.classList.remove('wait'); requestAnimationFrame(function(){ lb.classList.add('ready'); }); }; pre.src=src; while(cap.firstChild) cap.removeChild(cap.firstChild); if(s.t){ var eb=document.createElement('b'); eb.textContent=s.t; cap.appendChild(eb); } if(s.s){ var ei=document.createElement('i'); ei.textContent=s.s; cap.appendChild(ei); } num.textContent=(i+1<10?'0':'')+(i+1)+' / '+(shots.length52) show(i+(d<0?1:-1)); },{passive:true}); window.KLLB={open:openAt, close:close};
})(); /* due bottoni per lo stesso pannello: quello nella barra alta su telefono e quello in fondo, che resta nel markup ma li' e' nascosto */
/* ---------- telefono: il testo lungo si apre a richiesta ---------------- Il capitolo 01 su telefono erano due paragrafi da nove righe l'uno: un muro. Il primo resta, il resto sta dietro un "Continua a leggere". Niente contenuto tolto, solo non tutto addosso al primo colpo d'occhio. */
if(MOB){ [['#studio .c2',1],['#lostudio .c2',1]].forEach(function(cfg){ var box=document.querySelector(cfg[0]); if(!box) return; var ps=[].slice.call(box.querySelectorAll('p.body')); if(ps.length40){ half=n; if(!ready){ ready=true; set(half); } } } function pause(ms){ paused=true; clearTimeout(tmr); tmr=setTimeout(function(){ paused=false; },ms||1600); } function wrap(){ if(!half) return; if(p>=half*2) set(p-half); else if(p<=0) set(p+half); } function loop(t){ if(!last) last=t; var dt=Math.min(64,t-last); last=t; if(!half) measure(); if(down){ p=get(); } else if(inert){ set(p+inert*dt/16); inert*=0.93; if(Math.abs(inert)0){ vel=-(c-lp)/dt*16; lt=now; lp=c; } e.preventDefault(); }); function up(e){ if(!down) return; down=false; p=get(); box.classList.remove('drag'); box.style.cursor='grab'; try{ box.releasePointerCapture(e.pointerId); }catch(x){} inert=Math.max(-80,Math.min(80,vel||0)); pause(1500); } box.addEventListener('pointerup',up); box.addEventListener('pointercancel',up); box.addEventListener('click',function(e){ if(moved>6){ e.preventDefault(); e.stopPropagation(); } },true);
};
(function(){ var b=document.querySelector('.lribbon'); if(b) klRibbon(b,26); })(); /* ---------- i titoli si adattano allo spazio che hanno ---------- */
/* KLFIT */
(function(){ function fit(el){ if(!el) return; el.style.fontSize=''; var box=el.clientWidth; if(!box) return; var parts=[].slice.call(el.querySelectorAll('.ln>span,.msk')); var max=0; parts.forEach(function(s){ max=Math.max(max,s.scrollWidth); }); if(!max) max=el.scrollWidth; if(max>box-1){ var cs=parseFloat(getComputedStyle(el).fontSize)||40; el.style.fontSize=Math.max(20,Math.floor(cs*(box/max)*0.985))+'px'; } } function all(){ [].slice.call(document.querySelectorAll('#klroot h1,#klroot .big,#klroot h2')).forEach(fit); } addEventListener('resize',all); addEventListener('load',all); if(document.fonts&&document.fonts.ready) document.fonts.ready.then(all); setTimeout(all,200); setTimeout(all,900); setTimeout(all,2200); all();
})();