APPLE IPHONE 17 PRO 256GB|RICONDIZIONATO|GRADO A

0,00€

APPLE IPHONE 17 PRO 256GB|RICONDIZIONATO|GRADO A

Esaurito

COD: 3P1711ZF/A_R Categorie: ,
/* BNO Informatica – Notebook 3D della landing Riparazione computer. Si attiva solo nelle pagine che contengono #bnoLaptop3d, quindi può stare anche nel footer globale. */ (function(run){ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', run); } else { run(); } })(function(){ (function(){ var stage = document.getElementById('bnoLaptop3d'); if(!stage){ if(window.console) console.info('BNO 3D: in questa pagina non c\'è #bnoLaptop3d'); return; } var section = stage.closest('.inside-section') || stage.parentNode; var root = stage.closest('.bno-landing') || document; var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; // Scorrimento verso le sezioni interne gestito via JS: funziona anche con header fisso, // dentro iframe e builder che bloccano i link #ancora function goTo(hash){ var el; try { el = document.querySelector(hash); } catch(e){ return false; } if(!el) return false; var head = 90; // spazio per l'header fisso del tema var y = el.getBoundingClientRect().top + window.pageYOffset - Math.max(head, (window.innerHeight - el.offsetHeight) / 2); window.scrollTo({top: Math.max(0, y), behavior: reduce ? 'auto' : 'smooth'}); if(el.classList.contains('service')){ el.classList.add('is-picked'); setTimeout(function(){ el.classList.remove('is-picked'); }, 2200); } try { history.replaceState(null, '', hash); } catch(e){} return true; } root.addEventListener('click', function(ev){ var a = ev.target.closest && ev.target.closest('a[href^="#"]'); if(!a) return; var h = a.getAttribute('href'); if(h.length > 1 && goTo(h)) ev.preventDefault(); }); var finePointer = window.matchMedia('(pointer: fine)').matches; function fail(){ section.classList.add('no-3d'); } // Three.js si scarica solo quando la sezione sta per entrare nello schermo (non pesa su LCP) var started = false; function load(){ if(started) return; started = true; if(window.THREE) return init(); var s = document.createElement('script'); s.src = 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'; s.onload = init; s.onerror = fail; document.head.appendChild(s); } if('IntersectionObserver' in window){ var io = new IntersectionObserver(function(es){ if(es[0].isIntersecting){ io.disconnect(); load(); } }, {rootMargin:'300px 0px'}); io.observe(stage); } else { window.addEventListener('load', load); } function init(){ try { build(); } catch(err){ fail(); if(window.console) console.warn('Notebook 3D non disponibile:', err); } } function build(){ var T = window.THREE; if(!T) return; var canvas = stage.querySelector('canvas'); var renderer; try { renderer = new T.WebGLRenderer({canvas:canvas, antialias:true, alpha:true}); } catch(e){ return fail(); } if(!renderer.getContext()) return fail(); renderer.setPixelRatio(Math.min(window.devicePixelRatio,2)); renderer.shadowMap.enabled = true; renderer.shadowMap.type = T.PCFSoftShadowMap; renderer.outputEncoding = T.sRGBEncoding; renderer.toneMapping = T.ACESFilmicToneMapping; section.classList.add('is-3d'); var scene = new T.Scene(); var camera = new T.PerspectiveCamera(30, 1, 0.1, 100); camera.position.set(0, 3.7, 9.0); camera.lookAt(0, 1.0, 0); // ambiente riflesso per l'alluminio var pmrem = new T.PMREMGenerator(renderer); var env = new T.Scene(); env.add(new T.Mesh(new T.BoxGeometry(20,20,20), new T.MeshBasicMaterial({color:0x5a6068, side:T.BackSide}))); [[0,9,0,12,.2,12],[-9.5,3,0,.2,6,14],[9.5,3,2,.2,6,6],[0,3,9.5,10,5,.2]].forEach(function(b){ var m = new T.Mesh(new T.BoxGeometry(b[3],b[4],b[5]), new T.MeshBasicMaterial({color:0xffffff})); m.position.set(b[0],b[1],b[2]); env.add(m); }); scene.environment = pmrem.fromScene(env, 0.04).texture; scene.add(new T.HemisphereLight(0xffffff, 0x8a939b, 0.55)); var key = new T.DirectionalLight(0xffffff, 1.0); key.position.set(3, 8, 5); key.castShadow = true; key.shadow.mapSize.set(1024,1024); key.shadow.camera.left=-4; key.shadow.camera.right=4; key.shadow.camera.top=4; key.shadow.camera.bottom=-4; key.shadow.radius = 8; key.shadow.bias = -0.0005; scene.add(key); function mat(o){ var m = new T.MeshStandardMaterial(o); m.color.convertSRGBToLinear(); return m; } var alu = mat({color:0xc4c8cd, roughness:0.32, metalness:0.85}); var aluDk = mat({color:0xaeb3b9, roughness:0.45, metalness:0.7}); var dark = mat({color:0x1a1d22, roughness:0.55, metalness:0.1}); var pcb = mat({color:0x1d5e44, roughness:0.6, metalness:0.1}); var chip = mat({color:0x111316, roughness:0.4, metalness:0.2}); var gold = mat({color:0xd4a64a, roughness:0.3, metalness:0.9}); var batt = mat({color:0x2b2f36, roughness:0.5, metalness:0.2}); var blue = mat({color:0x33a6da, roughness:0.4, metalness:0.1}); var cast = function(m){ m.castShadow = true; m.receiveShadow = true; return m; }; function rshape(w,h,r){ var s = new T.Shape(), x=-w/2, y=-h/2; s.moveTo(x+r,y); s.lineTo(x+w-r,y); s.quadraticCurveTo(x+w,y,x+w,y+r); s.lineTo(x+w,y+h-r); s.quadraticCurveTo(x+w,y+h,x+w-r,y+h); s.lineTo(x+r,y+h); s.quadraticCurveTo(x,y+h,x,y+h-r); s.lineTo(x,y+r); s.quadraticCurveTo(x,y,x+r,y); return s; } // lastra arrotondata distesa: larghezza w (x), profondità d (z), spessore h (y da 0 a h) function slab(w,d,h,r,m){ var g = new T.ExtrudeGeometry(rshape(w,d,r),{depth:h,bevelEnabled:false,curveSegments:10}); g.rotateX(-Math.PI/2); return cast(new T.Mesh(g,m)); } function box(w,h,d,m){ return cast(new T.Mesh(new T.BoxGeometry(w,h,d),m)); } var laptop = new T.Group(); scene.add(laptop); var floor = new T.Mesh(new T.PlaneGeometry(16,16), new T.ShadowMaterial({opacity:0.16})); floor.rotation.x = -Math.PI/2; floor.position.y = -0.75; floor.receiveShadow = true; scene.add(floor); var parts = []; function part(obj, base, off, label){ obj.position.copy(base); laptop.add(obj); var p = {obj:obj, base:base.clone(), off:off, label:label}; parts.push(p); return p; } var V = function(x,y,z){ return new T.Vector3(x,y,z); }; // Scocca inferiore var bottom = new T.Group(); bottom.add(slab(3.2,2.2,0.05,0.14,alu)); part(bottom, V(0,0,0), V(0,-0.5,0)); // Scheda madre con chip e porte var mb = new T.Group(); mb.add(slab(2.9,1.0,0.03,0.05,pcb)); [[-0.2,0.05,0.34,0.3],[0.25,-0.2,0.22,0.22],[-0.95,0.2,0.18,0.12]].forEach(function(c){ var b = box(c[2],0.04,c[3],chip); b.position.set(c[0],0.05,c[1]); mb.add(b); }); [[-1.36,-0.25],[-1.36,0.05],[1.36,-0.1]].forEach(function(p){ var port = box(0.12,0.06,0.18,aluDk); port.position.set(p[0],0.06,p[1]); mb.add(port); }); part(mb, V(0,0.06,-0.5), V(0,0.38,0), {text:'Porte e scheda', href:'#svc-connettori', side:-1, anchor:V(-1.45,0.05,0)}); // Batteria var bt = new T.Group(); bt.add(slab(2.5,0.75,0.07,0.05,batt)); var stripe = box(0.5,0.005,0.75,blue); stripe.position.set(-0.8,0.072,0); bt.add(stripe); part(bt, V(0,0.06,0.5), V(0,0.6,0.5), {text:'Batteria', href:'#svc-batteria', side:1, anchor:V(1.25,0.04,0)}); // SSD var ssd = new T.Group(); ssd.add(slab(0.8,0.26,0.02,0.02,pcb)); var c1 = box(0.3,0.03,0.18,chip); c1.position.set(0.05,0.03,0); ssd.add(c1); var gc = box(0.06,0.01,0.22,gold); gc.position.set(-0.37,0.025,0); ssd.add(gc); part(ssd, V(-0.7,0.1,-0.5), V(-1.25,0.95,0.45), {text:'SSD e dati', href:'#svc-recupero-dati', side:-1, anchor:V(-0.4,0.03,0)}); // Ventola var fan = new T.Group(); var housing = cast(new T.Mesh(new T.CylinderGeometry(0.32,0.32,0.03,40), dark)); housing.position.y = 0.015; fan.add(housing); var ringF = cast(new T.Mesh(new T.TorusGeometry(0.31,0.02,8,40), aluDk)); ringF.rotation.x = Math.PI/2; ringF.position.y = 0.05; fan.add(ringF); var rotor = new T.Group(); rotor.position.y = 0.05; fan.add(rotor); var hub = cast(new T.Mesh(new T.CylinderGeometry(0.08,0.08,0.05,24), aluDk)); rotor.add(hub); for(var i=0;i<9;i++){ var bl = box(0.2,0.012,0.07,dark); bl.position.set(0.16,0,0); var holder = new T.Group(); holder.rotation.y = i*2*Math.PI/9; bl.rotation.x = 0.4; holder.add(bl); rotor.add(holder); } part(fan, V(0.85,0.09,-0.5), V(1.3,1.05,0.4), {text:'Ventola', href:'#svc-surriscaldamento', side:1, anchor:V(0.32,0.05,0)}); // Scocca superiore con trackpad var top = new T.Group(); top.add(slab(3.2,2.2,0.07,0.14,alu)); var pad = slab(1.1,0.62,0.004,0.06,aluDk); pad.position.set(0,0.07,0.66); top.add(pad); part(top, V(0,0.13,0), V(0,1.45,0)); // Tastiera var kc = document.createElement('canvas'); kc.width = 1024; kc.height = 360; var kx = kc.getContext('2d'); kx.fillStyle = '#121418'; kx.fillRect(0,0,1024,360); function drawKey(x,y,w,h){ kx.fillStyle='#262a31'; kx.beginPath(); if(kx.roundRect){kx.roundRect(x,y,w,h,8);} else {kx.rect(x,y,w,h);} kx.fill(); kx.fillStyle='#2f343c'; kx.fillRect(x+4,y+4,w-8,3); } var kw = 64, gap = 6, x0 = 12, y0 = 10, rh = 50; for(var r=0;r<5;r++){ for(var k=0;k<15;k++){ drawKey(x0+k*(kw+gap)*0.97, y0+r*(rh+gap)+ (r===0?0:6), kw*0.97-gap, r===0?30:rh); } } var y5 = y0+5*(rh+gap)+6; drawKey(x0,y5,kw*1.3,rh); drawKey(x0+kw*1.4,y5,kw,rh); drawKey(x0+kw*2.5,y5,kw,rh); drawKey(x0+kw*3.6,y5,kw*6.6,rh); for(var a=0;a<4;a++) drawKey(x0+kw*10.3+a*(kw+gap), y5, kw, rh); var ktex = new T.CanvasTexture(kc); ktex.encoding = T.sRGBEncoding; ktex.anisotropy = 4; var kb = new T.Group(); kb.add(slab(2.75,0.95,0.025,0.03,dark)); var kp = new T.Mesh(new T.PlaneGeometry(2.7,0.92), new T.MeshStandardMaterial({map:ktex, roughness:0.7})); kp.rotation.x = -Math.PI/2; kp.position.y = 0.027; kp.receiveShadow = true; kb.add(kp); part(kb, V(0,0.2,-0.3), V(0,2.0,0.05), {text:'Tastiera', href:'#svc-tastiera', side:-1, anchor:V(-1.38,0.03,0)}); // Schermo (coperchio incernierato) var lidPivot = new T.Group(); var lid = new T.Group(); lid.rotation.x = -0.3; lidPivot.add(lid); var lg = new T.ExtrudeGeometry(rshape(3.2,2.1,0.14),{depth:0.06,bevelEnabled:false,curveSegments:10}); lg.translate(0,1.05,-0.06); lid.add(cast(new T.Mesh(lg, alu))); var bezel = new T.Mesh(new T.PlaneGeometry(3.12,2.02), new T.MeshStandardMaterial({color:0x08090b, roughness:0.2, metalness:0.3})); bezel.position.set(0,1.05,0.001); lid.add(bezel); var sc = document.createElement('canvas'); sc.width = 768; sc.height = 480; var sx = sc.getContext('2d'); var stex = new T.CanvasTexture(sc); stex.encoding = T.sRGBEncoding; stex.anisotropy = 4; var screen = new T.Mesh(new T.PlaneGeometry(2.98,1.86), new T.MeshBasicMaterial({map:stex, toneMapped:false})); screen.position.set(0,1.07,0.003); lid.add(screen); part(lidPivot, V(0,0.2,-1.1), V(0,0.35,-0.75), {text:'Schermo', href:'#svc-schermo', side:1, anchor:V(1.5,1.7,0), anchorObj:lid}); var FONT = 'system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif'; function drawScreen(mode, t){ var g = sx.createLinearGradient(0,0,768,480); g.addColorStop(0,'#0e2f45'); g.addColorStop(1,'#07131d'); sx.fillStyle = g; sx.fillRect(0,0,768,480); sx.textAlign = 'center'; if(mode === 'ok'){ sx.fillStyle = '#ffffff'; sx.font = '900 150px '+FONT; sx.fillText('BNO', 384, 250); sx.fillStyle = '#33a6da'; sx.font = '700 46px '+FONT; sx.fillText('Informatica', 384, 312); sx.fillStyle = 'rgba(255,255,255,.6)'; sx.font = '600 24px '+FONT; sx.fillText('Riparazione computer · Messina', 384, 380); } else { sx.fillStyle = '#ffffff'; sx.font = '800 44px '+FONT; sx.fillText('Diagnosi in corso', 384, 130); sx.fillStyle = 'rgba(255,255,255,.12)'; sx.fillRect(134,170,500,16); var p = (t*0.45) % 1; sx.fillStyle = '#33a6da'; sx.fillRect(134,170,500*p,16); sx.textAlign = 'left'; sx.font = '600 28px '+FONT; ['Batteria','Schermo','SSD e dati','Ventola'].forEach(function(n,i){ var done = p > (i+1)*0.22; sx.fillStyle = done ? '#FFC400' : 'rgba(255,255,255,.35)'; sx.fillText((done ? '✓ ' : '• ') + n, 250, 250 + i*48); }); } stex.needsUpdate = true; } drawScreen('ok',0); // Etichette cliccabili verso i servizi var layer = stage.querySelector('.bno3d-labels'); parts.forEach(function(p){ if(!p.label) return; var a = document.createElement('a'); a.className = 'bno3d-label'; a.href = p.label.href; a.textContent = p.label.text; a.tabIndex = -1; layer.appendChild(a); p.el = a; }); // Interazione var target = {x:0,y:0}, cur = {x:0,y:0}, hovering = false, pinned = false, e = 0; function openAmount(){ return e*e*(3-2*e); } window.addEventListener('pointermove', function(e){ var r = canvas.getBoundingClientRect(); target.x = Math.max(-1, Math.min(1, (e.clientX - (r.left + r.width/2)) / (window.innerWidth*0.5))); target.y = Math.max(-1, Math.min(1, (e.clientY - (r.top + r.height/2)) / (window.innerHeight*0.5))); }, {passive:true}); stage.addEventListener('pointerenter', function(e){ if(e.pointerType === 'mouse') hovering = true; }); stage.addEventListener('pointerleave', function(e){ if(e.pointerType === 'mouse') hovering = false; }); var btn = stage.querySelector('.bno3d-toggle'); function setPinned(v){ pinned = v; btn.textContent = pinned ? 'Richiudi il notebook' : 'Guarda dentro il notebook'; btn.setAttribute('aria-pressed', pinned ? 'true' : 'false'); parts.forEach(function(p){ if(p.el) p.el.tabIndex = pinned ? 0 : -1; }); } btn.addEventListener('click', function(){ setPinned(!pinned); }); // Clic (o tocco) direttamente sul pezzo smontato: porta al servizio parts.forEach(function(p){ if(p.label) p.obj.traverse(function(o){ if(o.isMesh) o.userData.part = p; }); }); var ray = new T.Raycaster(), ndc = new T.Vector2(), hot = null; function pick(ev){ var r = canvas.getBoundingClientRect(); ndc.set(((ev.clientX - r.left) / r.width) * 2 - 1, -((ev.clientY - r.top) / r.height) * 2 + 1); ray.setFromCamera(ndc, camera); var hits = ray.intersectObjects(laptop.children, true); for(var i=0;i 0.6 ? pick(ev) : null; canvas.style.cursor = hot ? 'pointer' : ''; }); canvas.addEventListener('pointerleave', function(){ hot = null; canvas.style.cursor = ''; }); canvas.addEventListener('click', function(ev){ var open = openAmount() > 0.6; var p = open ? pick(ev) : null; if(p){ go(p); return; } if(!finePointer) setPinned(!open); // su touch: tocca per aprire, tocca fuori dai pezzi per chiudere }); // passando sui pulsanti dei componenti il notebook si apre var chipHover = false; section.querySelectorAll('.inside-chip').forEach(function(c){ c.addEventListener('pointerenter', function(){ chipHover = true; }); c.addEventListener('pointerleave', function(){ chipHover = false; }); c.addEventListener('focus', function(){ chipHover = true; }); c.addEventListener('blur', function(){ chipHover = false; }); }); function resize(){ var w = stage.clientWidth, h = stage.clientHeight; renderer.setSize(w, h, false); camera.aspect = w/h; var dist = w/h < 1 ? 9.0 / Math.max(w/h, 0.7) : 9.0; camera.position.set(0, 3.7 * dist/9, dist); camera.lookAt(0, 1.0, 0); camera.updateProjectionMatrix(); } new ResizeObserver(resize).observe(stage); resize(); var visible = true; if('IntersectionObserver' in window) new IntersectionObserver(function(es){ visible = es[0].isIntersecting; }).observe(stage); var clock = new T.Clock(), mode = 'ok', v = new T.Vector3(); function tick(){ requestAnimationFrame(tick); if(!visible){ clock.getDelta(); return; } var dt = Math.min(clock.getDelta(), 0.05), t = clock.elapsedTime; var k = 1 - Math.pow(0.0015, dt); cur.x += (target.x - cur.x) * k; cur.y += (target.y - cur.y) * k; var intro = !reduce && t > 0.8 && t < 3.6; // all'avvio si apre una volta, per far capire che si può fare var want = (hovering || pinned || chipHover || intro) ? 1 : 0; e += (want - e) * (1 - Math.pow(0.02, dt)); var ee = e*e*(3-2*e); laptop.rotation.y = -0.42 + (finePointer ? cur.x * 0.45 : (reduce ? 0 : Math.sin(t*0.5) * 0.3)); laptop.rotation.x = cur.y * 0.1; laptop.position.y = -0.15 * ee; parts.forEach(function(p){ p.lift = (p.lift || 0) + (((p === hot) ? 0.14 : 0) - (p.lift || 0)) * k; p.obj.position.copy(p.base).addScaledVector(p.off, ee); p.obj.position.y += p.lift; }); rotor.rotation.y += dt * (1 + 14*ee); var newMode = ee > 0.5 ? 'scan' : 'ok'; if(newMode === 'scan') drawScreen('scan', t); else if(mode !== 'ok') drawScreen('ok', 0); mode = newMode; renderer.render(scene, camera); var w = stage.clientWidth, h = stage.clientHeight, op = Math.max(0, Math.min(1, (ee - 0.6) / 0.3)); parts.forEach(function(p){ if(!p.el) return; (p.label.anchorObj || p.obj).localToWorld(v.copy(p.label.anchor)); v.project(camera); var x = (v.x + 1) / 2 * w, y = (1 - v.y) / 2 * h; p.el.style.transform = 'translate(' + x.toFixed(1) + 'px,' + y.toFixed(1) + 'px) translate(' + (p.label.side < 0 ? '-100%' : '0') + ',-50%) translateX(' + (p.label.side*14) + 'px)'; p.el.style.opacity = op; p.el.classList.toggle('on', op > 0.5); p.el.classList.toggle('hot', p === hot); }); } tick(); } })(); });