© 2026 Horizon Argent. Tous droits réservés.
Mode sombre
Nous utilisons des cookies techniques pour le fonctionnement du site (thème, session, consentement). En continuant, vous acceptez leur usage.
J’accepte
Thème du site
Clair (par défaut)
Sombre
Système
Fermer
Nous utilisons des cookies pour améliorer l’expérience. Vous pouvez changer d’avis à tout moment.
Accepter
Fermer
'),
fetch('footer.html').then(r=>r.text()).catch(()=>'
© 2026 Horizon Argent. Tous droits réservés.
Mode sombre
Nous utilisons des cookies techniques pour le fonctionnement du site (thème, session, consentement). En continuant, vous acceptez leur usage.
J’accepte
')
]);
document.getElementById('site-header').innerHTML=h;
document.getElementById('site-footer').innerHTML=f;
bindHeaderActions();
initCookieBanner();
}
function bindHeaderActions(){
document.querySelectorAll('[data-open]').forEach(b=>b.addEventListener('click',()=>openModal(b.getAttribute('data-open'))));
document.querySelectorAll('[data-theme]').forEach(b=>b.addEventListener('click',()=>{const t=b.getAttribute('data-theme');window.__setTheme?.(t)}));
document.addEventListener('keydown',e=>{
if(e.key==='Escape'){document.querySelectorAll('dialog[open]').forEach(d=>d.close());}
});
}
function openModal(sel){
const d=document.querySelector(sel);
if(d&&d.showModal)d.showModal();
}
document.addEventListener('click',e=>{
if(e.target.matches('dialog [data-close]')) e.target.closest('dialog')?.close();
if(e.target.matches('#cookie-banner [data-close]')) document.getElementById('cookie-banner')?.classList.add('hidden');
});
function initCookieBanner(){
const b=document.getElementById('cookie-banner');
if(!b) return;
if(localStorage.getItem('cookieConsent')!=='1'){b.classList.remove('hidden');}
b.querySelector('[data-accept]')?.addEventListener('click',()=>{localStorage.setItem('cookieConsent','1');b.classList.add('hidden');});
}
(function impactControl(){
const val=document.getElementById('impact-val');
const bar=document.getElementById('impact-bar');
const detail=document.getElementById('impact-detail');
const btnCal=document.getElementById('btn-calibrate');
const metrics={skills:60,projects:65,community:62};
const saved = JSON.parse(localStorage.getItem('impactData')||'null');
let n = 62;
function computeIndex(){
return Math.round(metrics.skills*0.4 + metrics.projects*0.35 + metrics.community*0.25);
}
function render(target){
const current = typeof target==='number'?target:n;
val.textContent=current;
bar.style.width=current+'%';
bar.classList.toggle('bg-emerald-600', current>=50);
bar.classList.toggle('bg-amber-500', current<50 && current>=25);
bar.classList.toggle('bg-rose-600', current<25);
}
if(saved && typeof saved.n==='number' && saved.m){
metrics.skills = +saved.m.skills||metrics.skills;
metrics.projects = +saved.m.projects||metrics.projects;
metrics.community = +saved.m.community||metrics.community;
n = Math.max(0,Math.min(100,+saved.n));
document.querySelectorAll('[data-metric]').forEach(r=>{
const k=r.getAttribute('data-metric');
if(metrics[k]!=null){r.value=metrics[k];}
});
document.querySelectorAll('[data-metric-val]').forEach(s=>{
const k=s.getAttribute('data-metric-val');
if(metrics[k]!=null){s.textContent=metrics[k];}
});
}else{
n = computeIndex();
}
render(n);
function persist(){
localStorage.setItem('impactData', JSON.stringify({n, m:metrics}));
}
document.querySelectorAll('[data-impact]').forEach(btn=>btn.addEventListener('click',()=>{
const dir = btn.dataset.impact==='up'?+5:-5;
n = Math.max(0,Math.min(100,n+dir));
render(n);
persist();
}));
btnCal?.addEventListener('click',()=>{
const isHidden = detail.classList.contains('hidden');
detail.classList.toggle('hidden',!isHidden?true:false);
btnCal.setAttribute('aria-expanded', String(isHidden));
});
document.querySelectorAll('[data-metric]').forEach(input=>{
input.addEventListener('input',()=>{
const k=input.getAttribute('data-metric');
metrics[k]=+input.value;
const s=document.querySelector(`[data-metric-val="${k}"]`);
if(s) s.textContent=metrics[k];
n=computeIndex();
render(n);
persist();
});
});
const sec=document.getElementById('impact');
sec.addEventListener('keydown',(e)=>{
if(e.key==='ArrowUp'){e.preventDefault();n=Math.min(100,n+1);render(n);persist();}
if(e.key==='ArrowDown'){e.preventDefault();n=Math.max(0,n-1);render(n);persist();}
},{passive:false});
})();
(function tocEnhancements(){
const links=[...document.querySelectorAll('[data-toc]')];
const map = new Map(links.map(a=>[a.getAttribute('data-toc'),a]));
links.forEach(a=>{
a.addEventListener('click',e=>{
e.preventDefault();
const id=a.getAttribute('href').slice(1);
const el=document.getElementById(id);
if(el){el.scrollIntoView({behavior:'smooth',block:'start'});history.replaceState(null,'','#'+id);}
});
});
const obs=new IntersectionObserver((entries)=>{
entries.forEach(en=>{
const id=en.target.id;
const l=map.get(id);
if(!l) return;
if(en.isIntersecting){
links.forEach(x=>x.classList.remove('text-blue-900','dark:text-blue-300','font-extrabold'));
l.classList.add('text-blue-900','dark:text-blue-300','font-extrabold');
}
});
},{rootMargin:'-40% 0px -55% 0px',threshold:0.01});
['mission','histoire','valeurs','equipe','impact'].forEach(id=>{
const el=document.getElementById(id);
if(el) obs.observe(el);
});
})();
loadPartials();