:root{
–slider-w: 1100px;
–radius: 18px;
–dot: 12px;
}
.slider{ max-width:var(–slider-w); margin:24px auto; }
/* Image viewport */
.slider-viewport{
position:relative; overflow:hidden; border-radius:var(–radius);
/* pick one: fixed ratio or natural height */
aspect-ratio: 16/9; /* comment this line to let images set height */
background:#000;
}
.slider-track{ display:flex; height:100%; transition:transform .5s ease; }
.slide{ min-width:100%; height:100%; position:relative; }
.slide img{ width:100%; height:100%; object-fit:cover; display:block; }
/* Optional dark gradient for readability */
.slide::after{
content:””; position:absolute; inset:0;
background: linear-gradient(to bottom, rgba(0,0,0,0) 60%, rgba(0,0,0,.25) 100%);
pointer-events:none;
}
/* Arrows: perfectly centered in the viewport using flex overlay */
.slider-arrows{
position:absolute; inset:0; display:flex; align-items:center; justify-content:space-between;
padding:0 16px; pointer-events:none; /* container ignores clicks except buttons */
}
.slider-btn{
pointer-events:auto; width:42px; height:42px; border-radius:999px; border:0; cursor:pointer;
display:grid; place-items:center; font-size:22px; color:#fff;
background:rgba(0,0,0,.45); transition:background .2s ease, transform .05s ease;
}
.slider-btn:hover{ background:rgba(0,0,0,.65); }
.slider-btn:active{ transform:scale(.97); }
@media (max-width:640px){ .slider-btn{ width:42px; height:42px; } }
/* Dots OUTSIDE the image so they never overlap */
.slider-dots{
display:flex; justify-content:center; gap:10px; padding:12px 0;
}
.slider-dots button{
width:var(–dot); height:var(–dot); border-radius:999px; border:0; cursor:pointer;
background:rgba(255,255,255,.55); box-shadow:0 0 0 2px rgba(0,0,0,.15) inset;
}
.slider-dots button[aria-current=”true”]{ background:#fff; }
(function(){
const root = document.currentScript.previousElementSibling;
const track = root.querySelector(‘.slider-track’);
const slides = […root.querySelectorAll(‘.slide’)];
const prev = root.querySelector(‘.prev’);
const next = root.querySelector(‘.next’);
const dotsEl = root.querySelector(‘.slider-dots’);
let i = 0;
// Build dots
slides.forEach((_, idx)=>{
const b = document.createElement(‘button’);
b.type = ‘button’;
b.setAttribute(‘aria-label’,’Go to slide ‘ + (idx+1));
b.addEventListener(‘click’, ()=>go(idx));
dotsEl.appendChild(b);
});
const dots = […dotsEl.children];
function go(n){
i = (n + slides.length) % slides.length;
track.style.transform = `translateX(-${100*i}%)`;
dots.forEach(d=>d.removeAttribute(‘aria-current’));
dots[i]?.setAttribute(‘aria-current’,’true’);
}
prev.addEventListener(‘click’, ()=>go(i-1));
next.addEventListener(‘click’, ()=>go(i+1));
// Keyboard & focus
root.querySelector(‘.slider-viewport’).setAttribute(‘tabindex’,’0′);
root.querySelector(‘.slider-viewport’).addEventListener(‘keydown’, (e)=>{
if(e.key===’ArrowLeft’) go(i-1);
if(e.key===’ArrowRight’) go(i+1);
});
go(0);
})();
Proud Supporters of
:root{
–carousel-duration: 40s; /* speed */
–logo-h: 56px; /* logo height */
–gap: 48px; /* spacing */
}
.partners-wrap{
max-width: 1100px;
margin: 24px auto;
padding-inline: 16px;
text-align: center;
}
.logo-carousel{
position: relative;
overflow: hidden;
border-radius: 14px;
background: rgba(255,255,255,0.04);
}
.logo-track{
display: flex;
align-items: center;
gap: var(–gap);
width: max-content;
animation: scroll var(–carousel-duration) linear infinite;
padding: 18px var(–gap);
will-change: transform;
}
.logo-carousel:hover .logo-track{
animation-play-state: paused;
}
.logo-item{
display: inline-flex;
align-items: center;
justify-content: center;
}
.logo-item img{
height: var(–logo-h);
width: auto;
object-fit: contain;
filter: grayscale(100%);
opacity: .85;
transition: .2s ease;
}
.logo-item:hover img{
filter: grayscale(0%);
opacity: 1;
transform: translateY(-2px);
}
@keyframes scroll{
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}