<nav>
accueil
/
fonctionnement
/
pourquoi bitcoin ?
/
garantie
/
à propos
</nav>
Fair-B — Hero + Carrousel (déclenchement après 1er scroll centré)
▌
",gray:true,indent:1}, {text:"",gray:true}, {signature:true,indent:23} ]; const grayEls=[]; let signatureLine=null; spec.forEach(line=>{ if(line.signature){ const sig=document.createElement('div'); sig.className='code-line line-white fade-in-line'; sig.innerHTML=indent(line.indent)+"Bienvenue dans
[FAIR-B]
"; container.appendChild(sig); line.sig=sig; signatureLine=line; return; } const el=document.createElement('div'); el.className='code-line '+(line.gray?'line-gray':'line-white'); el.append(indent(line.indent||0)); const span=document.createElement('span'); el.appendChild(span); container.appendChild(el); if(line.gray) grayEls.push(el); line.el=el; line.span=span; }); container.style.height = container.offsetHeight + 'px';function moveCursor(span){ const termRect=terminal.getBoundingClientRect(); try{ const range=document.createRange(); const node=span.firstChild||span; const len=node.nodeType===3?node.length:(span.textContent||'').length; if(node.nodeType===3){range.setStart(node,len);range.setEnd(node,len);} else {range.selectNodeContents(span);range.collapse(false);} const rects=range.getClientRects(); const rect=rects.length?rects[rects.length-1]:span.getBoundingClientRect(); cursor.style.left=(rect.right-termRect.left)+'px'; cursor.style.top =(rect.top-termRect.top)+'px'; }catch(e){ const rect=span.getBoundingClientRect(); cursor.style.left=(rect.right-termRect.left)+'px'; cursor.style.top =(rect.top-termRect.top)+'px'; } } function typeLine(line, cb){ const span=line.span; let i=0; const step=line.gray?SPEED_GRAY_CHARS_PER_FRAME:SPEED_WHITE_CHARS_PER_FRAME; (function tick(){ if(i < line.text.length){ for(let k=0;k
=spec.length-1){ setTimeout(()=>{ grayEls.forEach(g=> g.style.opacity=0); setTimeout(()=>{ if(signatureLine && signatureLine.sig){ signatureLine.sig.classList.add('visible'); } cursor.style.display='none'; // Déverrouille (rétablit la position initiale) document.body.style.position = ''; document.body.style.top = ''; document.body.style.width = ''; window.scrollTo(0, _lockY);// 🔔 Pont minimal : signaler que le hero est terminé window.dispatchEvent(new CustomEvent('fairb:hero:done')); }, SIGNATURE_REVEAL_DELAY); }, FADE_START_DELAY); return; } const line=spec[idx]; typeLine(line, ()=>{ const remaining = (spec.length-1) - (idx+1); const immediate = (remaining < LAST_N_IMMEDIATE); idx++; setTimeout(next, immediate ? 0 : PAUSE_BETWEEN_LINES_MS); }); })(); })();
Cet objet est couvert pour un usage à vie
‹
›