COMPONENT
Border Beam
Border Beam
Een gloeiende punt cirkelt langs de rand.
/* Border Beam — Magic UI (MIT) */
.borderbeam-card{position:relative;width:280px;height:150px;border-radius:16px;background:#0b0b12;border:1px solid #23232e;overflow:hidden;display:flex;align-items:center;justify-content:center}
.borderbeam-content{padding:20px;color:#e7e7ef;text-align:center;z-index:1}.borderbeam-content h3{margin:0 0 6px;font:600 18px 'Switzer',sans-serif}.borderbeam-content p{margin:0;font:13px 'Switzer',sans-serif;color:#9b9ba8}
.borderbeam-beam{position:absolute;inset:-1px;background:conic-gradient(from 0deg,transparent 0 75%,#F5480F 85%,#ff9466 92%,transparent 100%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:1.5px;border-radius:16px;animation:borderbeam-spin 5s linear infinite}
@keyframes borderbeam-spin{to{transform:rotate(1turn)}}
COMPONENT
Shimmer Button
/* Shimmer Button — Magic UI (MIT) */
.shimmerbtn-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a10}
.shimmerbtn{position:relative;isolation:isolate;cursor:pointer;padding:14px 28px;border:none;border-radius:999px;background:#0a0a0a;color:#fff;font:600 15px 'Switzer',sans-serif;overflow:hidden;transition:transform .2s}
.shimmerbtn:active{transform:translateY(1px)}
.shimmerbtn-spark{position:absolute;inset:0;overflow:visible;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;padding:1.5px;border-radius:999px}
.shimmerbtn-spark-inner{position:absolute;inset:0;width:100%;height:100%;background:conic-gradient(from 0deg,transparent 0 340deg,#fff 360deg);animation:shimmerbtn-spin 3s linear infinite}
.shimmerbtn-label{position:relative;z-index:1}
.shimmerbtn-hl{position:absolute;inset:0;border-radius:999px;z-index:1;pointer-events:none;box-shadow:inset 0 -8px 10px rgba(255,255,255,.12)}
@keyframes shimmerbtn-spin{to{transform:rotate(1turn)}}
COMPONENT
Marquee
SnelVanillaAnimatedEigen
SnelVanillaAnimatedEigen
/* Marquee — Magic UI (MIT) */
.mqc-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a10}
.mqc{display:flex;overflow:hidden;gap:var(--gap,1rem);max-width:340px;-webkit-mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.mqc-track{display:flex;gap:var(--gap,1rem);flex-shrink:0;min-width:100%;animation:mqc-scroll var(--duration,18s) linear infinite}
.mqc:hover .mqc-track{animation-play-state:paused}
.mqc-item{white-space:nowrap;padding:10px 16px;border-radius:10px;background:#15151d;color:#dcdce6;border:1px solid #26262f;font:500 14px 'Switzer',sans-serif}
@keyframes mqc-scroll{from{transform:translateX(0)}to{transform:translateX(calc(-100% - var(--gap,1rem)))}}
COMPONENT
Meteors
/* Meteors — Magic UI (MIT) */
.meteors-root{position:absolute;inset:0;border-radius:0;overflow:hidden;background:radial-gradient(120% 120% at 50% 0%,#11111b,#05050a);display:flex;align-items:center;justify-content:center}
.meteors-label{color:#cfcfe0;font:600 18px 'Switzer',sans-serif;z-index:1}
.meteors-meteor{position:absolute;top:-10%;left:50%;width:2px;height:2px;border-radius:50%;background:#ffd2bf;box-shadow:0 0 6px 1px rgba(245,72,15,.6);transform:rotate(215deg);animation:meteors-fall linear infinite}
.meteors-meteor::before{content:"";position:absolute;top:50%;left:0;width:60px;height:1px;transform:translateY(-50%);background:linear-gradient(90deg,#ff9466,transparent)}
@keyframes meteors-fall{0%{transform:rotate(215deg) translateX(0);opacity:1}70%{opacity:1}100%{transform:rotate(215deg) translateX(420px);opacity:0}}
// init(root):
for(var i=0;i<14;i++){var m=document.createElement('span');m.className='meteors-meteor';m.style.left=Math.floor(Math.random()*100)+'%';m.style.top=Math.floor(Math.random()*40-20)+'%';m.style.animationDelay=(Math.random()*4).toFixed(2)+'s';m.style.animationDuration=(3+Math.random()*5).toFixed(2)+'s';root.appendChild(m);}
COMPONENT
Ripple
/* Ripple — Magic UI (MIT) */
.ripple-root{position:absolute;inset:0;overflow:hidden;background:#06060c;display:flex;align-items:center;justify-content:center}
.ripple-content{color:#e7e7ef;font:600 18px 'Switzer',sans-serif;z-index:1}
.ripple-circle{position:absolute;top:50%;left:50%;border-radius:50%;border:1px solid rgba(245,72,15,.35);background:rgba(245,72,15,.04);transform:translate(-50%,-50%) scale(1);animation:ripple-pulse 3s ease-out infinite}
@keyframes ripple-pulse{0%{opacity:.7}100%{transform:translate(-50%,-50%) scale(1.25);opacity:0}}
// init(root):
for(var i=0;i<6;i++){var c=document.createElement('div');c.className='ripple-circle';var size=60+i*36;c.style.width=c.style.height=size+'px';c.style.animationDelay=(i*0.18)+'s';c.style.opacity=(0.7-i*0.1).toFixed(2);c.style.borderColor='rgba(245,72,15,'+(0.4-i*0.05).toFixed(2)+')';root.appendChild(c);}
COMPONENT
Dot Pattern
/* Dot Pattern — Magic UI (MIT) */
.dotpattern-root{position:absolute;inset:0;overflow:hidden;background:#0a0a10;display:flex;align-items:center;justify-content:center}
.dotpattern-root::before{content:"";position:absolute;inset:0;background-image:radial-gradient(rgba(150,150,180,.45) 1px,transparent 1px);background-size:16px 16px;-webkit-mask:radial-gradient(220px 140px at 50% 50%,#000,transparent);mask:radial-gradient(220px 140px at 50% 50%,#000,transparent)}
.dotpattern-label{position:relative;z-index:1;color:#dcdce6;font:600 18px 'Switzer',sans-serif}
COMPONENT
Orbiting Circles
/* Orbiting Circles — Magic UI (MIT) */
.orbit-root{position:absolute;inset:0;background:radial-gradient(circle at 50% 50%,#0e0e18,#05050a);display:flex;align-items:center;justify-content:center}
.orbit-center{font-size:28px;z-index:2}
.orbit-path{position:absolute;top:50%;left:50%;width:0;height:0;animation:orbit-spin var(--dur) linear infinite;animation-delay:var(--delay,0s)}
.orbit-path.orbit-reverse{animation-direction:reverse}
.orbit-path::before{content:"";position:absolute;top:50%;left:50%;width:calc(var(--r)*2);height:calc(var(--r)*2);transform:translate(-50%,-50%);border-radius:50%;border:1px dashed rgba(140,140,180,.18)}
.orbit-item{position:absolute;top:0;left:var(--r);transform:translate(-50%,-50%);font-size:18px;animation:orbit-counter var(--dur) linear infinite reverse;animation-delay:var(--delay,0s)}
.orbit-reverse .orbit-item{animation-direction:normal}
@keyframes orbit-spin{to{transform:translate(-50%,-50%) rotate(1turn)}}@keyframes orbit-counter{to{transform:translate(-50%,-50%) rotate(1turn)}}
COMPONENT
Word Rotate
/* Word Rotate — Magic UI (MIT) */
.wrot-root{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a10;font:800 24px 'Boldonse','Switzer',sans-serif;color:#fff}
.wrot{display:inline-block;color:#F5480F;will-change:transform,opacity}
.wrot.is-out{animation:wrot-out .4s ease forwards}.wrot.is-in{animation:wrot-in .4s ease forwards}
@keyframes wrot-out{to{transform:translateY(-100%);opacity:0}}@keyframes wrot-in{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}
// init(root):
var el=root.querySelector('.wrot');var words=(el.dataset.words||'').split(',').map(function(s){return s.trim();}).filter(Boolean);if(words.length<2)return;var i=0;
setInterval(function(){el.classList.add('is-out');el.addEventListener('animationend',function done(){el.removeEventListener('animationend',done);i=(i+1)%words.length;el.textContent=words[i];el.classList.remove('is-out');el.classList.add('is-in');el.addEventListener('animationend',function(){el.classList.remove('is-in');},{once:true});},{once:true});},2200);
COMPONENT
Animated List
/* Animated List — Magic UI (MIT) */
.anl-root{position:absolute;inset:0;background:#0a0a10;padding:14px;overflow:hidden}
.anl-stack{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.anl-item{display:flex;gap:12px;align-items:center;padding:12px 14px;border-radius:12px;background:#15151d;border:1px solid #26262f;color:#e7e7ef;transform-origin:top;animation:anl-pop .45s cubic-bezier(.22,1,.36,1) both}
.anl-item b{font:600 14px 'Switzer',sans-serif}.anl-item p{margin:2px 0 0;font:12px 'Switzer',sans-serif;color:#9b9ba8}.anl-ico{font-size:20px}
@keyframes anl-pop{from{transform:translateY(120%) scale(.9);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}
// init(root):
var stack=root.querySelector('.anl-stack');var data=[['\uD83D\uDCAC','Nieuw bericht','Iemand reageerde'],['\u2B50','Nieuwe ster','Repo gestard'],['\uD83D\uDCB8','Betaling','\u20AC129 ontvangen'],['\uD83D\uDE80','Deploy','Build geslaagd']];var i=0;
function add(){var d=data[i%data.length];var li=document.createElement('li');li.className='anl-item';li.innerHTML='<span class="anl-ico">'+d[0]+'</span><div><b>'+d[1]+'</b><p>'+d[2]+'</p></div>';stack.prepend(li);while(stack.children.length>4)stack.lastElementChild.remove();i++;}
add();setInterval(add,1800);
COMPONENT
Confetti
/* Confetti — Magic UI (MIT) */
.conf-root{position:absolute;inset:0;overflow:hidden;background:#0a0a10;display:flex;align-items:center;justify-content:center}
.conf-canvas{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.conf-btn{position:relative;z-index:1;cursor:pointer;border:none;border-radius:999px;padding:12px 22px;font:600 15px 'Switzer',sans-serif;color:#0a0a10;background:#F5480F;transition:transform .1s}
.conf-btn:active{transform:scale(.96)}
// init(root):
var canvas=root.querySelector('.conf-canvas');var btn=root.querySelector('.conf-btn');var ctx=canvas.getContext('2d');var colors=['#F5480F','#ff9466','#ffd2bf','#fff','#1dd1a1'];var parts=[],raf=null;
function resize(){canvas.width=root.clientWidth;canvas.height=root.clientHeight;}resize();new ResizeObserver(resize).observe(root);
function burst(){var cx=canvas.width/2,cy=canvas.height/2;for(var i=0;i<120;i++){var a=Math.random()*Math.PI*2,sp=2+Math.random()*6;parts.push({x:cx,y:cy,vx:Math.cos(a)*sp,vy:Math.sin(a)*sp-2,size:4+Math.random()*4,rot:Math.random()*6.28,vr:(Math.random()-.5)*.3,color:colors[(Math.random()*colors.length)|0],life:1});}if(!raf)loop();}
function loop(){ctx.clearRect(0,0,canvas.width,canvas.height);parts.forEach(function(p){p.vy+=0.12;p.x+=p.vx;p.y+=p.vy;p.vx*=.99;p.rot+=p.vr;p.life-=.012;ctx.save();ctx.translate(p.x,p.y);ctx.rotate(p.rot);ctx.globalAlpha=Math.max(0,p.life);ctx.fillStyle=p.color;ctx.fillRect(-p.size/2,-p.size/2,p.size,p.size*0.6);ctx.restore();});parts=parts.filter(function(p){return p.life>0&&p.y<canvas.height+20;});if(parts.length){raf=requestAnimationFrame(loop);}else{raf=null;ctx.clearRect(0,0,canvas.width,canvas.height);}}
btn.addEventListener('click',burst);
COMPONENT
Dynamic Island
🎵 Now playing
🎧Midnight DriveNeon Waves
/* Dynamic Island — Cult UI (MIT) */
.isl-root{position:absolute;inset:0;background:#0a0a10;display:flex;align-items:center;justify-content:center}
.isl{background:#000;color:#fff;border-radius:28px;overflow:hidden;display:flex;align-items:center;justify-content:center;width:140px;height:34px;padding:0 14px;transition:width .5s cubic-bezier(.34,1.56,.64,1),height .5s cubic-bezier(.34,1.56,.64,1),border-radius .5s;box-shadow:0 8px 30px rgba(0,0,0,.5)}
.isl[data-state="expanded"]{width:240px;height:64px;border-radius:24px}
.isl-idle{display:flex;align-items:center;gap:8px;font:600 13px 'Switzer',sans-serif;white-space:nowrap}
.isl-exp{display:none;align-items:center;gap:12px;width:100%}
.isl[data-state="expanded"] .isl-idle{display:none}.isl[data-state="expanded"] .isl-exp{display:flex}
.isl-art{font-size:26px}.isl-meta b{display:block;font:600 13px 'Switzer',sans-serif}.isl-meta small{color:#9b9ba8;font:11px 'Switzer',sans-serif}
.isl-eq{margin-left:auto;display:flex;gap:2px;align-items:flex-end;height:18px}.isl-eq i{width:3px;background:#F5480F;border-radius:2px;animation:isl-eq .9s ease-in-out infinite}
.isl-eq i:nth-child(2){animation-delay:.2s}.isl-eq i:nth-child(3){animation-delay:.4s}.isl-eq i:nth-child(4){animation-delay:.1s}
@keyframes isl-eq{0%,100%{height:5px}50%{height:16px}}
// init(root):
var isl=root.querySelector('.isl');var exp=false;setInterval(function(){exp=!exp;isl.dataset.state=exp?'expanded':'idle';},2600);
COMPONENT
Texture Card
Texture Card
Gelaagde randen met een subtiele noise-grain voor diepte.
/* Texture Card — Cult UI (MIT) */
.texcard-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#06060a}
.texcard{width:280px;border-radius:20px;padding:1px;background:linear-gradient(145deg,#2a2a36,#0e0e16 40%,#2a2a36);box-shadow:0 10px 40px rgba(0,0,0,.4)}
.texcard-inner{position:relative;border-radius:19px;padding:22px;overflow:hidden;background:linear-gradient(145deg,rgba(255,255,255,.04),transparent 40%),#0c0c14;color:#e7e7ef}
.texcard-inner::after{content:"";position:absolute;inset:0;opacity:.5;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E")}
.texcard-inner h3{margin:0 0 8px;font:700 18px 'Switzer',sans-serif;position:relative}.texcard-inner p{margin:0;font:13px/1.5 'Switzer',sans-serif;color:#9b9ba8;position:relative}
COMPONENT
Direction-Aware Hover
Direction AwareKomt binnen vanaf jouw rand
/* Direction-Aware Hover — Cult UI (MIT) */
.dah-root{position:absolute;inset:0;overflow:hidden;cursor:pointer}
.dah-bg{position:absolute;inset:0;background:linear-gradient(135deg,#1a1a2e,#16213e,#0f3460)}
.dah-overlay{position:absolute;inset:0;background:rgba(245,72,15,.92);display:flex;align-items:center;justify-content:center;color:#fff;transition:transform .35s ease;transform:translate(var(--tx,0),var(--ty,100%))}
.dah-content{text-align:center;font-family:'Switzer',sans-serif}.dah-content b{display:block;font-size:18px;font-weight:700}.dah-content span{font-size:12px;opacity:.85}
// init(root):
var overlay=root.querySelector('.dah-overlay');
function setFrom(e){var r=root.getBoundingClientRect();var x=(e.clientX-r.left)/r.width-.5,y=(e.clientY-r.top)/r.height-.5;if(Math.abs(x)>Math.abs(y)){overlay.style.setProperty('--tx',x>0?'100%':'-100%');overlay.style.setProperty('--ty','0');}else{overlay.style.setProperty('--ty',y>0?'100%':'-100%');overlay.style.setProperty('--tx','0');}}
root.addEventListener('mouseenter',function(e){setFrom(e);requestAnimationFrame(function(){overlay.style.setProperty('--tx','0');overlay.style.setProperty('--ty','0');});});
root.addEventListener('mouseleave',function(e){setFrom(e);});
COMPONENT
Family Button
/* Family Button — Cult UI (MIT) */
.fam-root{position:absolute;inset:0;background:#0a0a10}
.fam{position:absolute;bottom:20px;right:20px;display:flex;flex-direction:column;align-items:flex-end;gap:10px}
.fam-panel{display:flex;flex-direction:column;gap:8px;overflow:hidden;background:#15151d;border:1px solid #26262f;border-radius:18px;padding:0 8px;max-height:0;opacity:0;transform:translateY(10px) scale(.96);transform-origin:bottom right;transition:max-height .4s cubic-bezier(.22,1,.36,1),opacity .3s,transform .4s cubic-bezier(.22,1,.36,1),padding .4s}
.fam[data-open="true"] .fam-panel{max-height:180px;opacity:1;transform:translateY(0) scale(1);padding:8px}
.fam-action{cursor:pointer;white-space:nowrap;border:none;background:transparent;color:#e7e7ef;font:500 14px 'Switzer',sans-serif;padding:8px 12px;border-radius:10px;text-align:left;transition:background .2s}
.fam-action:hover{background:#23232e}
.fam-toggle{width:54px;height:54px;border-radius:50%;border:none;cursor:pointer;background:#F5480F;color:#fff;font:300 30px/1 'Switzer',sans-serif;box-shadow:0 8px 24px rgba(245,72,15,.5);transition:transform .4s cubic-bezier(.22,1,.36,1)}
.fam[data-open="true"] .fam-toggle{transform:rotate(135deg)}
// init(root):
var fam=root.querySelector('.fam');var toggle=root.querySelector('.fam-toggle');toggle.addEventListener('click',function(){fam.dataset.open=fam.dataset.open==='true'?'false':'true';});
COMPONENT
Spotlight Card
Spotlight
Beweeg je cursor over de kaart.
/* Spotlight Card — React Bits / Aceternity (MIT/eigen) */
.spot-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#06060a}
.spot-root{--x:50%;--y:50%;position:relative;overflow:hidden;border-radius:16px;max-width:300px}
.spot-root::before{content:"";position:absolute;inset:0;opacity:0;transition:opacity .35s;pointer-events:none;background:radial-gradient(220px circle at var(--x) var(--y),rgba(245,72,15,.25),transparent 60%);z-index:1}
.spot-root:hover::before{opacity:1}
.spot-inner{position:relative;padding:28px;background:#0e0e12;border:1px solid #26262e;color:#cfcfd6;font-family:'Switzer',sans-serif;border-radius:16px}
.spot-inner h3{margin:0 0 .4em;color:#fff;font-size:1.25rem}.spot-inner p{margin:0;font-size:.92rem;line-height:1.5}
// init(root):
var card=root.querySelector('.spot-root');card.addEventListener('pointermove',function(e){var r=card.getBoundingClientRect();card.style.setProperty('--x',(e.clientX-r.left)+'px');card.style.setProperty('--y',(e.clientY-r.top)+'px');});
COMPONENT
Magnetic Button
/* Magnetic Button — React Bits (MIT) */
.magnet-root{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0c0c12}
.magnet-target{padding:16px 34px;border-radius:999px;border:0;cursor:pointer;font:600 1rem 'Switzer',sans-serif;color:#0a0a0a;background:#fff;will-change:transform}
.magnet-label{display:inline-block;will-change:transform;pointer-events:none}
// init(root):
var btn=root.querySelector('.magnet-target');var label=root.querySelector('.magnet-label');
root.addEventListener('pointermove',function(e){var r=btn.getBoundingClientRect();var x=e.clientX-(r.left+r.width/2),y=e.clientY-(r.top+r.height/2);if(window.gsap){gsap.to(btn,{x:x*.4,y:y*.4,duration:.5,ease:'power3.out'});gsap.to(label,{x:x*.7,y:y*.7,duration:.5,ease:'power3.out'});}else{btn.style.transform='translate('+x*.4+'px,'+y*.4+'px)';}});
root.addEventListener('pointerleave',function(){if(window.gsap){gsap.to([btn,label],{x:0,y:0,duration:.7,ease:'elastic.out(1,.4)'});}else{btn.style.transform='';}});
COMPONENT
3D Tilt + glare
/* 3D Tilt + glare — Cult UI / Aceternity (MIT/eigen) */
.tilt-root{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;perspective:900px;background:#0c0c14}
.tilt-card{position:relative;width:62%;aspect-ratio:4/3;border-radius:18px;overflow:hidden;background:linear-gradient(145deg,#202840,#11131f);transform-style:preserve-3d;will-change:transform;transition:transform .25s ease-out}
.tilt-glare{position:absolute;inset:0;pointer-events:none;opacity:0;background:radial-gradient(circle at var(--gx,50%) var(--gy,50%),rgba(255,255,255,.4),transparent 45%);transition:opacity .25s}
.tilt-card:hover .tilt-glare{opacity:1}
.tilt-body{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;padding:22px;color:#fff;transform:translateZ(40px)}
.tilt-cat{font:700 10px 'JetBrains Mono',monospace;letter-spacing:.16em;color:#F5480F}.tilt-body b{font:700 26px 'Boldonse','Switzer',sans-serif;text-transform:uppercase}.tilt-body em{font-style:normal;font:11px 'JetBrains Mono',monospace;opacity:.7}
// init(root):
var card=root.querySelector('.tilt-card');var glare=root.querySelector('.tilt-glare');var MAX=12;
card.addEventListener('pointermove',function(e){var r=card.getBoundingClientRect();var px=(e.clientX-r.left)/r.width,py=(e.clientY-r.top)/r.height;var ry=(px-.5)*MAX*2,rx=(.5-py)*MAX*2;if(window.gsap){gsap.to(card,{rotationX:rx,rotationY:ry,duration:.4,ease:'power2.out',transformPerspective:900});}else{card.style.transform='rotateX('+rx+'deg) rotateY('+ry+'deg)';}glare.style.setProperty('--gx',px*100+'%');glare.style.setProperty('--gy',py*100+'%');});
card.addEventListener('pointerleave',function(){if(window.gsap){gsap.to(card,{rotationX:0,rotationY:0,duration:.6,ease:'power3.out'});}else{card.style.transform='';}});
COMPONENT
Click Spark
/* Click Spark — React Bits (MIT) */
.cspark-root{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0c0c10;cursor:pointer;overflow:hidden;color:#9aa;font:600 1rem 'Switzer',sans-serif;user-select:none}
.cspark-canvas{position:absolute;inset:0;pointer-events:none}
// init(root):
var canvas=root.querySelector('.cspark-canvas');var ctx=canvas.getContext('2d');var dpr=window.devicePixelRatio||1;
function resize(){canvas.width=root.clientWidth*dpr;canvas.height=root.clientHeight*dpr;ctx.setTransform(dpr,0,0,dpr,0,0);}resize();new ResizeObserver(resize).observe(root);
var sparks=[];root.addEventListener('click',function(e){var r=root.getBoundingClientRect();var x=e.clientX-r.left,y=e.clientY-r.top,n=9;for(var i=0;i<n;i++)sparks.push({x:x,y:y,ang:(Math.PI*2*i)/n,t:performance.now()});if(sparks.length===n)requestAnimationFrame(draw);});
function draw(now){ctx.clearRect(0,0,canvas.width,canvas.height);var len=18;sparks=sparks.filter(function(s){var p=(now-s.t)/450;if(p>=1)return false;var e=1-Math.pow(1-p,3);var d=e*22,x1=s.x+Math.cos(s.ang)*d,y1=s.y+Math.sin(s.ang)*d;var x2=x1+Math.cos(s.ang)*len*(1-p),y2=y1+Math.sin(s.ang)*len*(1-p);ctx.strokeStyle='rgba(245,72,15,'+(1-p)+')';ctx.lineWidth=2;ctx.lineCap='round';ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke();return true;});if(sparks.length)requestAnimationFrame(draw);else ctx.clearRect(0,0,canvas.width,canvas.height);}
COMPONENT
Image Reveal on Hover
/* Image Reveal on Hover — Codrops (eigen) */
.irc-list{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;padding:0 9%;background:#fff;font-family:'Switzer',sans-serif}
.irc-row{position:relative;display:block;padding:.5em 0;font-weight:800;font-size:clamp(20px,5.4vw,40px);letter-spacing:-.02em;color:#0a0a0a;text-decoration:none;border-bottom:1px solid #e9e9e9;transition:color .35s,padding-left .35s;cursor:pointer;z-index:2}
.irc-row:hover{color:#F5480F;padding-left:18px}
.irc-thumb{position:absolute;width:140px;height:96px;border-radius:10px;background:var(--c,#F5480F);pointer-events:none;z-index:1;opacity:0;transform:translate(-50%,-50%) scale(.6);clip-path:inset(0 100% 0 0);transition:opacity .25s}
.irc-thumb::after{content:'';position:absolute;inset:0;border-radius:10px;background:radial-gradient(120% 120% at 30% 20%,rgba(255,255,255,.35),transparent 60%)}
// init(root):
var thumb=root.querySelector('.irc-thumb');var rows=root.querySelectorAll('.irc-row');var g=window.gsap;var rm=matchMedia('(prefers-reduced-motion:reduce)').matches;
function move(e){var r=root.getBoundingClientRect();var x=e.clientX-r.left,y=e.clientY-r.top;if(g)g.to(thumb,{left:x,top:y,duration:.5,ease:'power3.out'});else{thumb.style.left=x+'px';thumb.style.top=y+'px';}}
rows.forEach(function(row){row.addEventListener('mouseenter',function(){thumb.style.setProperty('--c',row.dataset.c);if(g&&!rm)g.to(thumb,{opacity:1,scale:1,clipPath:'inset(0 0% 0 0)',duration:.45,ease:'power3.out'});else thumb.style.opacity=1;});row.addEventListener('mouseleave',function(){if(g&&!rm)g.to(thumb,{opacity:0,scale:.6,clipPath:'inset(0 100% 0 0)',duration:.3,ease:'power2.in'});else thumb.style.opacity=0;});});
root.addEventListener('mousemove',move);
COMPONENT
Flip Card Grid
/* Flip Card Grid — eigen (eigen) */
.fcg-grid{position:absolute;inset:0;display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(2,1fr);gap:10px;padding:10%;background:#fff;font-family:'Switzer',sans-serif}
.fcg-card{perspective:600px}.fcg-in{position:relative;width:100%;height:100%;transition:transform .6s cubic-bezier(.2,.8,.2,1);transform-style:preserve-3d;border-radius:12px}
.fcg-card:hover .fcg-in{transform:rotateY(180deg)}
.fcg-f,.fcg-b{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;border-radius:12px;backface-visibility:hidden;font-weight:800}
.fcg-f{background:#0a0a0a;color:#fff;font-size:clamp(18px,4vw,30px)}.fcg-b{background:#F5480F;color:#fff;transform:rotateY(180deg);font-size:clamp(13px,2.4vw,18px)}
// init(root):
var g=window.gsap;if(!g)return;var rm=matchMedia('(prefers-reduced-motion:reduce)').matches;g.set(root.querySelectorAll('.fcg-card'),{opacity:0,y:14});g.to(root.querySelectorAll('.fcg-card'),{opacity:1,y:0,duration:rm?0:.5,stagger:rm?0:.06,ease:'power3.out',delay:.1});
COMPONENT
Infinite Logo Loop
COMOL5MOBILISMAKPB BOUWMULDER
COMOL5MOBILISMAKPB BOUWMULDER
/* Infinite Logo Loop — Osmo (eigen) */
.ill-stage{position:absolute;inset:0;display:flex;align-items:center;overflow:hidden;background:#fff;-webkit-mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);mask:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.ill-track{display:flex;will-change:transform}.ill-set{display:flex;flex:none}
.ill-set span{flex:none;padding:0 clamp(20px,4vw,46px);font-family:'Boldonse','Switzer',sans-serif;font-weight:800;font-size:clamp(18px,3.4vw,30px);color:#0a0a0a;letter-spacing:-.01em;white-space:nowrap}
.ill-set span:nth-child(odd){color:#F5480F}.ill-stage:hover .ill-track{animation-play-state:paused}
// init(root):
var track=root.querySelector('.ill-track');var g=window.gsap;var rm=matchMedia('(prefers-reduced-motion:reduce)').matches;if(rm)return;var w=root.querySelector('.ill-set').offsetWidth;
if(g){g.to(track,{x:-w,duration:14,ease:'none',repeat:-1});root.addEventListener('mouseenter',function(){g.getTweensOf(track).forEach(function(t){t.timeScale(.15);});});root.addEventListener('mouseleave',function(){g.getTweensOf(track).forEach(function(t){t.timeScale(1);});});}else{track.style.animation='ill-scroll 14s linear infinite';var s=document.createElement('style');s.textContent='@keyframes ill-scroll{to{transform:translateX(-'+w+'px)}}';root.appendChild(s);}
COMPONENT
Gooey Blob Nav
/* Gooey Blob Nav — Codrops (eigen) */
.gbh-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a0a;font-family:'Switzer',sans-serif}
.gbh-goo{position:absolute;inset:0;filter:url(#gbh-goo);pointer-events:none}
.gbh-blob{position:absolute;height:46px;border-radius:30px;background:#F5480F;top:50%;transform:translateY(-50%);transition:left .45s cubic-bezier(.5,1.5,.4,1),width .45s cubic-bezier(.5,1.5,.4,1)}
.gbh-nav{display:flex;gap:6px;position:relative;z-index:2}.gbh-i{padding:11px 20px;font-weight:700;font-size:clamp(13px,2.6vw,18px);color:#fff;cursor:pointer;transition:color .3s;border-radius:30px}
// init(root):
var blob=root.querySelector('.gbh-blob');var items=root.querySelectorAll('.gbh-i');
function place(el){var r=el.getBoundingClientRect();blob.style.left=(r.left-root.getBoundingClientRect().left)+'px';blob.style.width=r.width+'px';}
function set(el){items.forEach(function(i){i.classList.remove('is-on');});el.classList.add('is-on');place(el);}
items.forEach(function(el){el.addEventListener('mouseenter',function(){place(el);});el.addEventListener('mouseleave',function(){place(root.querySelector('.gbh-i.is-on'));});el.addEventListener('click',function(){set(el);});});
requestAnimationFrame(function(){set(root.querySelector('.gbh-i.is-on'));});
COMPONENT
Liquid Fill Button
/* Liquid Fill Button — Osmo (eigen) */
.lqb-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a0a}
.lqb-btn{position:relative;overflow:hidden;border:1.5px solid #F5480F;background:transparent;border-radius:40px;padding:18px 42px;cursor:pointer;font-family:'Switzer',sans-serif}
.lqb-fill{position:absolute;width:240px;height:240px;border-radius:50%;background:#F5480F;left:50%;top:120%;transform:translate(-50%,-50%) scale(0);transition:transform .55s cubic-bezier(.3,.8,.3,1);z-index:1}
.lqb-btn:hover .lqb-fill{transform:translate(-50%,-50%) scale(1.6)}
.lqb-txt{position:relative;z-index:2;font-weight:800;font-size:clamp(15px,3vw,20px);color:#F5480F;transition:color .4s}.lqb-btn:hover .lqb-txt{color:#fff}
// init(root):
var btn=root.querySelector('.lqb-btn');var fill=root.querySelector('.lqb-fill');var rm=matchMedia('(prefers-reduced-motion:reduce)').matches;if(rm)return;
btn.addEventListener('mouseenter',function(e){var r=btn.getBoundingClientRect();fill.style.left=(e.clientX-r.left)+'px';fill.style.top=(e.clientY-r.top)+'px';});
btn.addEventListener('mouseleave',function(e){var r=btn.getBoundingClientRect();fill.style.left=(e.clientX-r.left)+'px';fill.style.top=(e.clientY-r.top)+'px';});
COMPONENT
Day/Night Toggle
/* Day/Night Toggle — Uiverse (MIT) */
.tgs{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;cursor:pointer}
.tgs__in{position:absolute;opacity:0;pointer-events:none}
.tgs__track{position:relative;width:104px;height:50px;border-radius:50px;background:#0a0a0a;transition:background .45s cubic-bezier(.4,.1,.2,1);box-shadow:inset 0 2px 6px rgba(0,0,0,.4)}
.tgs__in:checked+.tgs__track{background:#F5480F}
.tgs__thumb{position:absolute;top:5px;left:5px;width:40px;height:40px;border-radius:50%;background:#fff;transition:transform .45s cubic-bezier(.4,.1,.2,1);box-shadow:0 3px 8px rgba(0,0,0,.3);z-index:2}
.tgs__in:checked+.tgs__track .tgs__thumb{transform:translateX(54px)}
.tgs__sun,.tgs__moon{position:absolute;top:50%;transform:translateY(-50%);width:22px;height:22px;transition:opacity .4s,transform .4s}
.tgs__sun{right:11px;fill:none;stroke:#FFD15C;stroke-width:2;stroke-linecap:round;opacity:0}.tgs__moon{left:12px;fill:#cfe0ff}
.tgs__in:checked+.tgs__track .tgs__sun{opacity:1}.tgs__in:checked+.tgs__track .tgs__moon{opacity:0}
COMPONENT
Draw-Tick Checkbox
/* Draw-Tick Checkbox — Uiverse (MIT) */
.cbk{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:14px;cursor:pointer;font:600 17px/1.2 'Switzer',sans-serif;color:#0a0a0a}
.cbk__in{position:absolute;opacity:0;pointer-events:none}
.cbk__box{width:34px;height:34px;border-radius:9px;border:2.5px solid #0a0a0a;display:grid;place-items:center;transition:background .3s,border-color .3s,transform .3s}
.cbk__svg{width:24px;height:24px;fill:none;stroke:#fff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.cbk__path{stroke-dasharray:24;stroke-dashoffset:24;transition:stroke-dashoffset .35s ease .05s}
.cbk__in:checked+.cbk__box{background:#F5480F;border-color:#F5480F;animation:cbkPop .4s}
.cbk__in:checked+.cbk__box .cbk__path{stroke-dashoffset:0}
@keyframes cbkPop{0%{transform:scale(1)}40%{transform:scale(.86)}100%{transform:scale(1)}}
COMPONENT
Loader Trio
/* Loader Trio — Animista (eigen) */
.ldt{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:56px;background:#fff}
.ldt__ring{width:48px;height:48px;border-radius:50%;border:5px solid #0a0a0a1a;border-top-color:#F5480F;animation:ldtSpin .8s linear infinite}
@keyframes ldtSpin{to{transform:rotate(360deg)}}
.ldt__dots{display:flex;gap:9px;align-items:center}.ldt__dots i{width:13px;height:13px;border-radius:50%;background:#0a0a0a;animation:ldtBounce 1.1s ease-in-out infinite}
.ldt__dots i:nth-child(2){animation-delay:.16s;background:#F5480F}.ldt__dots i:nth-child(3){animation-delay:.32s}
@keyframes ldtBounce{0%,80%,100%{transform:translateY(0);opacity:.5}40%{transform:translateY(-16px);opacity:1}}
.ldt__bars{display:flex;gap:6px;align-items:flex-end;height:44px}.ldt__bars i{width:8px;height:14px;border-radius:4px;background:#F5480F;animation:ldtBars .9s ease-in-out infinite}
.ldt__bars i:nth-child(2){animation-delay:.12s}.ldt__bars i:nth-child(3){animation-delay:.24s}.ldt__bars i:nth-child(4){animation-delay:.36s}
@keyframes ldtBars{0%,100%{height:14px}50%{height:42px}}
COMPONENT
Neon Glow Button
/* Neon Glow Button — Uiverse (MIT) */
.ngb-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a0a}
.ngb{position:relative;width:200px;height:62px;border:0;border-radius:14px;cursor:pointer;background:#141414;color:#fff;font:700 18px/1 'Switzer',sans-serif;letter-spacing:.04em;overflow:hidden;transition:box-shadow .35s,transform .2s}
.ngb::before{content:"";position:absolute;inset:0;border-radius:14px;padding:2px;background:linear-gradient(120deg,#F5480F,#ff8a3d,#F5480F);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .35s}
.ngb::after{content:"";position:absolute;top:0;left:-60%;width:40%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.55),transparent);transform:skewX(-20deg);transition:left .6s}
.ngb:hover{transform:translateY(-2px);box-shadow:0 0 22px rgba(245,72,15,.65),0 0 46px rgba(245,72,15,.35)}
.ngb:hover::before{opacity:1}.ngb:hover::after{left:120%}.ngb:active{transform:translateY(0) scale(.97)}.ngb__txt{position:relative;z-index:1}
COMPONENT
Underline Slide Links
/* Underline Slide Links — Hover.css (MIT) */
.usl{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:46px;background:#fff}
.usl__a{position:relative;color:#0a0a0a;text-decoration:none;font:600 22px/1 'Switzer',sans-serif;padding-bottom:6px}
.usl__a::after{content:"";position:absolute;left:50%;right:50%;bottom:0;height:3px;background:#F5480F;border-radius:2px;transition:left .3s ease,right .3s ease}
.usl__a:hover::after{left:0;right:0}.usl__a--c::after{background:#0a0a0a}
COMPONENT
Star Rating
/* Star Rating — Uiverse (MIT) */
.srt{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:8px;background:#fff}
.srt__s{width:42px;height:42px;border:0;background:transparent;cursor:pointer;padding:0;-webkit-mask:var(--m) center/contain no-repeat;mask:var(--m) center/contain no-repeat;--m:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2l2.9 6.3 6.9.7-5.1 4.6 1.4 6.8L12 17.8 5.9 20.4l1.4-6.8L2.2 9l6.9-.7z'/%3E%3C/svg%3E");background-color:#0a0a0a1f;transition:background-color .15s,transform .15s}
.srt__s:hover{transform:scale(1.18)}.srt:not(:hover) .srt__s.is-on,.srt__s.is-hot{background-color:#F5480F}
// init(root):
var stars=[].slice.call(root.querySelectorAll('.srt__s'));var locked=0;
function paint(n){stars.forEach(function(s,i){s.classList.toggle('is-hot',i<n);});}
stars.forEach(function(s,i){s.addEventListener('mouseenter',function(){paint(i+1);});s.addEventListener('click',function(){locked=i+1;stars.forEach(function(x,j){x.classList.toggle('is-on',j<locked);});});});
root.querySelector('.srt').addEventListener('mouseleave',function(){paint(0);});
COMPONENT
Segmented Control
/* Segmented Control — Uiverse (MIT) */
.sgc-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#fff}
.sgc{position:relative;width:316px;height:54px;display:flex;background:#0a0a0a0d;border-radius:14px;padding:6px}
.sgc__pill{position:absolute;top:6px;left:6px;width:calc((100% - 12px)/3);height:calc(100% - 12px);background:#fff;border-radius:10px;box-shadow:0 3px 10px rgba(0,0,0,.12);transition:transform .35s cubic-bezier(.4,.1,.2,1)}
.sgc__b{flex:1;border:0;background:transparent;cursor:pointer;font:600 15px/1 'Switzer',sans-serif;color:#0a0a0a99;z-index:1;transition:color .3s}.sgc__b.is-active{color:#F5480F}
// init(root):
var btns=[].slice.call(root.querySelectorAll('.sgc__b'));var pill=root.querySelector('.sgc__pill');
btns.forEach(function(b,i){b.addEventListener('click',function(){btns.forEach(function(x){x.classList.remove('is-active');});b.classList.add('is-active');pill.style.transform='translateX('+(i*100)+'%)';});});
COMPONENT
Hamburger to X
/* Hamburger to X — Animista (eigen) */
.hbx-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0a0a0a}
.hbx{width:72px;height:72px;border:0;border-radius:18px;background:#141414;cursor:pointer;display:grid;place-items:center;transition:background .3s}.hbx.is-open{background:#F5480F}
.hbx__lines{position:relative;width:34px;height:24px}.hbx__lines i{position:absolute;left:0;width:100%;height:3.5px;border-radius:3px;background:#fff;transition:transform .4s cubic-bezier(.5,0,.2,1),opacity .25s}
.hbx__lines i:nth-child(1){top:0}.hbx__lines i:nth-child(2){top:50%;transform:translateY(-50%)}.hbx__lines i:nth-child(3){bottom:0}
.hbx.is-open .hbx__lines i:nth-child(1){transform:translateY(10px) rotate(45deg)}.hbx.is-open .hbx__lines i:nth-child(2){opacity:0}.hbx.is-open .hbx__lines i:nth-child(3){transform:translateY(-10px) rotate(-45deg)}
// init(root):
var b=root.querySelector('.hbx');b.addEventListener('click',function(){b.classList.toggle('is-open');});
COMPONENT
Skeleton Shimmer
/* Skeleton Shimmer — Uiverse (MIT) */
.skl-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#f4f3f1}
.skl{width:340px;height:128px;background:#fff;border:1px solid #0a0a0a12;border-radius:16px;display:flex;gap:18px;padding:22px;align-items:center;box-shadow:0 8px 24px rgba(0,0,0,.06)}
.skl__avatar{width:72px;height:72px;border-radius:50%;flex:none}.skl__lines{flex:1;display:flex;flex-direction:column;gap:13px}
.skl__l{height:14px;border-radius:7px;width:100%}.skl__l--title{width:62%;height:18px}.skl__l--short{width:40%}
.skl__avatar,.skl__l{background:linear-gradient(100deg,#0a0a0a0d 30%,#F5480F26 50%,#0a0a0a0d 70%);background-size:220% 100%;animation:sklSh 1.4s ease-in-out infinite}
@keyframes sklSh{0%{background-position:180% 0}100%{background-position:-80% 0}}
COMPONENT
Copy Button
/* Copy Button — Uiverse (MIT) */
.cpb-wrap{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#fff}
.cpb{position:relative;width:206px;height:58px;border:2px solid #0a0a0a;border-radius:13px;background:#fff;color:#0a0a0a;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:11px;font:600 16px/1 'Switzer',sans-serif;transition:background .3s,color .3s,border-color .3s}
.cpb svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:opacity .25s,transform .25s}
.cpb__check{position:absolute;left:24px;opacity:0;transform:scale(.5)}.cpb__check path{stroke-dasharray:24;stroke-dashoffset:24;transition:stroke-dashoffset .3s}
.cpb.is-done{background:#F5480F;border-color:#F5480F;color:#fff}.cpb.is-done .cpb__copy{opacity:0;transform:scale(.5)}.cpb.is-done .cpb__check{opacity:1;transform:scale(1)}.cpb.is-done .cpb__check path{stroke-dashoffset:0}
// init(root):
var b=root.querySelector('.cpb');var t=b.querySelector('.cpb__txt');var busy=false;
b.addEventListener('click',function(){if(busy)return;busy=true;try{navigator.clipboard&&navigator.clipboard.writeText('npm i neddev-ui');}catch(e){}b.classList.add('is-done');t.textContent='Gekopieerd';setTimeout(function(){b.classList.remove('is-done');t.textContent='Kopieer code';busy=false;},1600);});