DevPlatform
Home
Components
Search
Submit
Earn
Login
Sign Up Free
Partners Logo - Preview | DevPlatform
DevPlatform
Categories
Accordion
Animation
Box Shadow
Button
Card
Footer
Form
Gallery
Hero Section
Inputs
Loader
Marquee
Modal
Modules
Navbar
Progress Bar
Radio Buttons
Search-Bar
Sections
Slider
Tab
Timeline
Toggle
Partners Logo
rohit
Feb 13, 2026
4
0
Share
Live Preview
Refresh
Live Editor
HTML
CSS
JS
HTML
CSS
JavaScript
1
<div class="bg-glow"></div> <div class="wrapper"> <div class="header"> <div class="header-label">// trusted by teams at</div> <div class="header-title">Our Partners</div> </div> <div class="stage"> <div class="carousel" id="carousel"></div> </div> <div class="brand-info"> <div class="brand-info-name" id="brandName">—</div> </div> <div class="controls"> <div class="dots" id="dots"></div> <div class="btn-row"> <button class="btn" id="prevBtn">←</button> <button class="btn" id="nextBtn">→</button> </div> <div class="progress"><div class="progress-fill" id="progressFill"></div></div> <button class="autoplay-btn on" id="autoBtn">⏸ Auto</button> </div> </div>
1
:root { --bg: #050508; --surface: #0d0d14; --accent: #c8ff00; --accent2: #ff3cac; --accent3: #00d4ff; --text: #e8e8f0; --muted: #555570; --card-w: 200px; --card-h: 110px; --gap: 40px; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { background: var(--bg); color: var(--text); font-family: 'DM Mono', monospace; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; overflow: hidden; position: relative; } /* Scanline overlay */ body::before { content: ''; position: fixed; inset: 0; background: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(255,255,255,0.015) 2px, rgba(255,255,255,0.015) 4px ); pointer-events: none; z-index: 100; } /* Radial glow background */ .bg-glow { position: fixed; inset: 0; pointer-events: none; z-index: 0; background: radial-gradient(ellipse 60% 40% at 50% 60%, rgba(200,255,0,0.04) 0%, transparent 70%), radial-gradient(ellipse 40% 60% at 20% 50%, rgba(255,60,172,0.05) 0%, transparent 60%), radial-gradient(ellipse 50% 40% at 80% 40%, rgba(0,212,255,0.04) 0%, transparent 60%); } .wrapper { position: relative; z-index: 1; width: 100%; display: flex; flex-direction: column; align-items: center; gap: 56px; } /* ── Header ── */ .header { text-align: center; line-height: 1; } .header-label { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: 0.35em; color: var(--accent); text-transform: uppercase; margin-bottom: 12px; opacity: 0.8; } .header-title { font-family: 'Bebas Neue', sans-serif; font-size: clamp(52px, 8vw, 96px); letter-spacing: 0.04em; background: linear-gradient(135deg, #e8e8f0 30%, var(--muted) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ── Slider Stage ── */ .stage { width: 100%; perspective: 1200px; perspective-origin: 50% 40%; position: relative; height: 340px; display: flex; align-items: center; justify-content: center; overflow: hidden; } /* Fade masks */ .stage::before, .stage::after { content: ''; position: absolute; top: 0; bottom: 0; width: 220px; z-index: 10; pointer-events: none; } .stage::before { left: 0; background: linear-gradient(to right, var(--bg) 0%, transparent 100%); } .stage::after { right: 0; background: linear-gradient(to left, var(--bg) 0%, transparent 100%); } /* ── Carousel ── */ .carousel { position: relative; transform-style: preserve-3d; width: var(--card-w); height: var(--card-h); transition: transform 0.75s cubic-bezier(0.34, 1.2, 0.64, 1); } .card { position: absolute; width: var(--card-w); height: var(--card-h); border-radius: 16px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; cursor: pointer; transition: box-shadow 0.4s, border-color 0.4s; user-select: none; backface-visibility: hidden; } /* Card inner layout */ .card-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 22px; transition: transform 0.4s; } .card-name { font-family: 'Bebas Neue', sans-serif; font-size: 15px; letter-spacing: 0.12em; color: rgba(232,232,240,0.6); transition: color 0.4s; } /* Active card highlight */ .card.active .card-name { color: var(--text); } .card.active .card-icon { transform: scale(1.1); } /* ── Brand color themes ── */ .card[data-brand="stripe"] { background: linear-gradient(145deg, #0a0a18 0%, #111128 100%); border: 1px solid rgba(99, 91, 255, 0.3); } .card[data-brand="stripe"].active { box-shadow: 0 0 60px rgba(99,91,255,0.25), 0 0 120px rgba(99,91,255,0.1), inset 0 1px 0 rgba(99,91,255,0.4); border-color: rgba(99,91,255,0.7); } .card[data-brand="stripe"] .card-icon { background: linear-gradient(135deg,#635bff,#0045d5); } .card[data-brand="vercel"] { background: linear-gradient(145deg, #080808 0%, #111111 100%); border: 1px solid rgba(255,255,255,0.12); } .card[data-brand="vercel"].active { box-shadow: 0 0 60px rgba(255,255,255,0.1), 0 0 100px rgba(255,255,255,0.05), inset 0 1px 0 rgba(255,255,255,0.2); border-color: rgba(255,255,255,0.4); } .card[data-brand="vercel"] .card-icon { background: #000; border: 1.5px solid rgba(255,255,255,0.3); } .card[data-brand="figma"] { background: linear-gradient(145deg, #0a080f 0%, #130d1a 100%); border: 1px solid rgba(162,89,255,0.3); } .card[data-brand="figma"].active { box-shadow: 0 0 60px rgba(162,89,255,0.2), 0 0 100px rgba(162,89,255,0.1), inset 0 1px 0 rgba(162,89,255,0.3); border-color: rgba(162,89,255,0.6); } .card[data-brand="figma"] .card-icon { background: linear-gradient(135deg, #a259ff, #f24e1e 50%, #ff7262); } .card[data-brand="notion"] { background: linear-gradient(145deg, #0a0a0a 0%, #141414 100%); border: 1px solid rgba(255,255,255,0.1); } .card[data-brand="notion"].active { box-shadow: 0 0 60px rgba(255,255,255,0.08), 0 0 100px rgba(255,255,255,0.04), inset 0 1px 0 rgba(255,255,255,0.15); border-color: rgba(255,255,255,0.35); } .card[data-brand="notion"] .card-icon { background: #fff; } .card[data-brand="linear"] { background: linear-gradient(145deg, #08091a 0%, #0d0e22 100%); border: 1px solid rgba(90,120,255,0.25); } .card[data-brand="linear"].active { box-shadow: 0 0 60px rgba(90,120,255,0.2), 0 0 100px rgba(90,120,255,0.1), inset 0 1px 0 rgba(90,120,255,0.3); border-color: rgba(90,120,255,0.6); } .card[data-brand="linear"] .card-icon { background: linear-gradient(135deg, #5a78ff, #9b6bff); } .card[data-brand="github"] { background: linear-gradient(145deg, #080c10 0%, #0d1117 100%); border: 1px solid rgba(33,139,120,0.25); } .card[data-brand="github"].active { box-shadow: 0 0 60px rgba(33,139,120,0.2), 0 0 100px rgba(33,139,120,0.1), inset 0 1px 0 rgba(33,139,120,0.3); border-color: rgba(33,139,120,0.6); } .card[data-brand="github"] .card-icon { background: linear-gradient(135deg, #2ea043, #238b78); } .card[data-brand="supabase"] { background: linear-gradient(145deg, #060e0a 0%, #0a1a10 100%); border: 1px solid rgba(62,207,142,0.25); } .card[data-brand="supabase"].active { box-shadow: 0 0 60px rgba(62,207,142,0.2), 0 0 100px rgba(62,207,142,0.1), inset 0 1px 0 rgba(62,207,142,0.3); border-color: rgba(62,207,142,0.6); } .card[data-brand="supabase"] .card-icon { background: linear-gradient(135deg, #3ecf8e, #1c7a52); } .card[data-brand="aws"] { background: linear-gradient(145deg, #100800 0%, #1a1000 100%); border: 1px solid rgba(255,153,0,0.2); } .card[data-brand="aws"].active { box-shadow: 0 0 60px rgba(255,153,0,0.18), 0 0 100px rgba(255,153,0,0.08), inset 0 1px 0 rgba(255,153,0,0.25); border-color: rgba(255,153,0,0.55); } .card[data-brand="aws"] .card-icon { background: linear-gradient(135deg, #ff9900, #e87722); } /* ── Controls ── */ .controls { display: flex; align-items: center; gap: 24px; flex-direction: column; } .dots { display: flex; gap: 8px; align-items: center; } .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--muted); cursor: pointer; transition: all 0.3s; } .dot.active { width: 24px; border-radius: 3px; background: var(--accent); } .btn-row { display: flex; gap: 12px; } .btn { width: 48px; height: 48px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.1); background: rgba(255,255,255,0.04); color: var(--text); font-size: 18px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.25s; backdrop-filter: blur(8px); } .btn:hover { background: rgba(200,255,0,0.12); border-color: rgba(200,255,0,0.5); color: var(--accent); transform: scale(1.08); box-shadow: 0 0 20px rgba(200,255,0,0.2); } .btn:active { transform: scale(0.95); } /* Auto-play toggle */ .autoplay-btn { font-family: 'DM Mono', monospace; font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; padding: 8px 18px; border-radius: 100px; border: 1px solid rgba(255,255,255,0.1); background: transparent; color: var(--muted); cursor: pointer; transition: all 0.25s; } .autoplay-btn.on { color: var(--accent); border-color: rgba(200,255,0,0.4); background: rgba(200,255,0,0.06); } .autoplay-btn:hover { opacity: 0.8; } /* ── Brand info strip ── */ .brand-info { text-align: center; height: 36px; display: flex; flex-direction: column; align-items: center; justify-content: center; } .brand-info-name { font-family: 'Bebas Neue', sans-serif; font-size: 28px; letter-spacing: 0.08em; opacity: 0; transform: translateY(8px); transition: all 0.35s ease; color: var(--text); } .brand-info-name.visible { opacity: 1; transform: translateY(0); } /* Progress bar */ .progress { width: 200px; height: 2px; background: rgba(255,255,255,0.06); border-radius: 1px; overflow: hidden; } .progress-fill { height: 100%; background: var(--accent); border-radius: 1px; width: 0%; transition: width linear; }
1
const brands = [ { name:'Stripe', brand:'stripe', icon:'💳' }, { name:'Vercel', brand:'vercel', icon:'▲' }, { name:'Figma', brand:'figma', icon:'✦' }, { name:'Notion', brand:'notion', icon:'◻' }, { name:'Linear', brand:'linear', icon:'⬡' }, { name:'GitHub', brand:'github', icon:'⌬' }, { name:'Supabase', brand:'supabase', icon:'⚡' }, { name:'AWS', brand:'aws', icon:'☁' }, ]; const CARD_W = 200; const GAP = 48; const RADIUS = (CARD_W + GAP) * brands.length / (2 * Math.PI); const carousel = document.getElementById('carousel'); const dotsEl = document.getElementById('dots'); const brandName = document.getElementById('brandName'); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const autoBtn = document.getElementById('autoBtn'); const progFill = document.getElementById('progressFill'); let current = 0; let autoplay = true; let autoTimer = null; const AUTO_DELAY = 2800; /* Build cards */ brands.forEach((b, i) => { const card = document.createElement('div'); card.className = 'card'; card.dataset.brand = b.brand; card.dataset.idx = i; card.innerHTML = ` <div class="card-icon">${b.icon}</div> <div class="card-name">${b.name}</div> `; card.addEventListener('click', () => goTo(i)); carousel.appendChild(card); const dot = document.createElement('div'); dot.className = 'dot'; dot.addEventListener('click', () => goTo(i)); dotsEl.appendChild(dot); }); function positionCards(idx) { const cards = carousel.querySelectorAll('.card'); const total = brands.length; cards.forEach((card, i) => { const offset = i - idx; // Wrap offset so it's always -4 to +3 range (shortest path) let norm = ((offset % total) + total) % total; if (norm > total / 2) norm -= total; const x = norm * (CARD_W + GAP); const rotateY = norm * -8; const z = -Math.abs(norm) * 80; const scale = 1 - Math.abs(norm) * 0.08; const opacity = Math.max(0.15, 1 - Math.abs(norm) * 0.22); card.style.transform = `translateX(${x}px) translateZ(${z}px) rotateY(${rotateY}deg) scale(${scale})`; card.style.opacity = opacity; card.style.zIndex = 100 - Math.abs(norm); card.classList.toggle('active', norm === 0); }); // Dots dotsEl.querySelectorAll('.dot').forEach((d, i) => { d.classList.toggle('active', i === idx); }); // Brand name brandName.classList.remove('visible'); setTimeout(() => { brandName.textContent = brands[idx].name; brandName.classList.add('visible'); }, 120); } function goTo(idx) { current = ((idx % brands.length) + brands.length) % brands.length; positionCards(current); if (autoplay) resetProgress(); } function next() { goTo(current + 1); } function prev() { goTo(current - 1); } prevBtn.addEventListener('click', () => { prev(); resetAuto(); }); nextBtn.addEventListener('click', () => { next(); resetAuto(); }); /* Keyboard */ document.addEventListener('keydown', e => { if (e.key === 'ArrowRight') { next(); resetAuto(); } if (e.key === 'ArrowLeft') { prev(); resetAuto(); } }); /* Touch/drag */ let touchStartX = 0; carousel.addEventListener('touchstart', e => { touchStartX = e.touches[0].clientX; }, {passive:true}); carousel.addEventListener('touchend', e => { const dx = e.changedTouches[0].clientX - touchStartX; if (Math.abs(dx) > 40) { dx > 0 ? prev() : next(); resetAuto(); } }); /* Autoplay */ function startAutoProgress() { progFill.style.transition = 'none'; progFill.style.width = '0%'; requestAnimationFrame(() => { requestAnimationFrame(() => { progFill.style.transition = `width ${AUTO_DELAY}ms linear`; progFill.style.width = '100%'; }); }); } function resetProgress() { clearTimeout(autoTimer); startAutoProgress(); autoTimer = setTimeout(() => { next(); }, AUTO_DELAY); } function resetAuto() { if (autoplay) resetProgress(); } autoBtn.addEventListener('click', () => { autoplay = !autoplay; autoBtn.textContent = autoplay ? '⏸ Auto' : '▶ Auto'; autoBtn.classList.toggle('on', autoplay); if (autoplay) { resetProgress(); } else { clearTimeout(autoTimer); progFill.style.transition = 'none'; progFill.style.width = '0%'; } }); // Init positionCards(0); resetProgress();
Comments
0
Want to comment?
Please
login
or
sign up
to post comments.
No comments yet
Be the first to comment on this component!
Comments 0
Want to comment?
Please login or sign up to post comments.
No comments yet
Be the first to comment on this component!