Liveloop

An interactive timeline for social media. Every post is a tiny app you can play, save, and remix.

Product

  • Feed
  • Create
  • Claude Code plugin
  • Blog

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy
  • DMCA

Project

  • Templates
© 2026 Liveloop. All rights reserved.
LiveloopVersion history

v1Current

@liveloop · 5/17/2026, 11:52:13 AM

Initial version — all lines are new.

+<style>
+ html,body{height:100%;margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#0b1020;color:#f8fafc;overflow:hidden;}
+ .wrap{display:flex;flex-direction:column;height:100%;box-sizing:border-box;padding:.8rem;gap:.5rem;}
+ .top{display:flex;align-items:baseline;justify-content:space-between;gap:.5rem;}
+ h1{margin:0;font-size:1rem;}
+ #label{font-size:.82rem;font-weight:800;color:#fbbf24;}
+ #stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;}
+ #frame{position:relative;height:100%;aspect-ratio:3/4;max-width:100%;border-radius:1rem;border:4px solid #334155;background:#1e293b;background-size:cover;background-position:center;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.45);}
+ #ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;color:#94a3b8;font-size:.78rem;text-align:center;padding:1rem;}
+ #ph .big{font-size:3rem;}
+ #acc{position:absolute;left:50%;top:22%;transform:translate(-50%,-50%);font-size:64px;line-height:1;cursor:grab;touch-action:none;user-select:none;-webkit-user-select:none;display:none;filter:drop-shadow(0 3px 7px rgba(0,0,0,.45));}
+ .strip{display:flex;gap:.4rem;overflow-x:auto;padding:.15rem;}
+ .cos{flex:none;font:inherit;font-size:1.45rem;border:2px solid #334155;background:#1e293b;border-radius:.7rem;width:3rem;height:3rem;cursor:pointer;touch-action:manipulation;}
+ .cos.on{border-color:#fbbf24;}
+ .controls{display:flex;gap:.4rem;align-items:center;justify-content:center;flex-wrap:wrap;}
+ .btn{font:inherit;font-size:.8rem;font-weight:600;border:0;border-radius:9999px;padding:.45rem .95rem;background:#3b82f6;color:#fff;cursor:pointer;touch-action:manipulation;display:inline-flex;align-items:center;gap:.3rem;}
+ .ghost{background:transparent;border:1px solid #475569;color:#cbd5e1;}
+ .sz{font:inherit;font-weight:800;font-size:1rem;border:1px solid #475569;background:transparent;color:#cbd5e1;width:2.1rem;height:2.1rem;border-radius:.5rem;cursor:pointer;touch-action:manipulation;}
+ .hint{font-size:.68rem;color:#64748b;text-align:center;}
+ .hidden{display:none;}
+</style>
+<div class="wrap">
+ <div class="top"><h1>🎭 Change Your Costume</h1><span id="label"></span></div>
+ <div id="stage">
+ <div id="frame">
+ <div id="ph"><div class="big">🙂</div><div>Add your photo, then pick a costume below</div></div>
+ <div id="acc">🎩</div>
+ </div>
+ </div>
+ <div class="strip" id="strip"></div>
+ <div class="controls">
+ <label class="btn">📷 Photo<input type="file" accept="image/*" id="pick" class="hidden"></label>
+ <button class="sz" id="minus" type="button">−</button>
+ <button class="sz" id="plus" type="button">+</button>
+ <button class="btn ghost" id="reset" type="button">Clear</button>
+ </div>
+ <div class="hint">Drag the costume onto your photo · − / + to resize</div>
+</div>
+<script>
+(function(){
+ var COSTUMES=[
+ {name:'Cowboy',emoji:'🤠',color:'#b45309'},
+ {name:'Royal',emoji:'👑',color:'#a855f7'},
+ {name:'Dapper',emoji:'🎩',color:'#0f172a'},
+ {name:'Party',emoji:'🥳',color:'#ec4899'},
+ {name:'Wizard',emoji:'🧙',color:'#7c3aed'},
+ {name:'Graduate',emoji:'🎓',color:'#2563eb'},
+ {name:'Disguise',emoji:'🥸',color:'#0891b2'},
+ {name:'Festive',emoji:'🎅',color:'#dc2626'},
+ {name:'Sporty',emoji:'🧢',color:'#16a34a'},
+ {name:'Sunny',emoji:'👒',color:'#f59e0b'}
+ ];
+ var frame=document.getElementById('frame'),acc=document.getElementById('acc'),
+ ph=document.getElementById('ph'),strip=document.getElementById('strip'),
+ label=document.getElementById('label'),pick=document.getElementById('pick');
+ var pos={x:0.5,y:0.22},size=64;
+
+ function onTap(el,fn){
+ var sx=0,sy=0,armed=false;
+ el.addEventListener('pointerdown',function(e){ armed=true;sx=e.clientX;sy=e.clientY; });
+ el.addEventListener('pointercancel',function(){ armed=false; });
+ el.addEventListener('pointerup',function(e){
+ if(!armed) return; armed=false;
+ if(Math.abs(e.clientX-sx)<14&&Math.abs(e.clientY-sy)<14) fn();
+ });
+ }
+ function renderAcc(){
+ acc.style.left=(pos.x*100)+'%';
+ acc.style.top=(pos.y*100)+'%';
+ acc.style.fontSize=size+'px';
+ }
+ COSTUMES.forEach(function(c,i){
+ var b=document.createElement('button');
+ b.type='button'; b.className='cos'; b.textContent=c.emoji;
+ onTap(b,function(){
+ acc.textContent=c.emoji; acc.style.display='block';
+ frame.style.borderColor=c.color; label.textContent=c.name;
+ var btns=strip.querySelectorAll('.cos');
+ for(var k=0;k<btns.length;k++) btns[k].classList.toggle('on',btns[k]===b);
+ renderAcc();
+ acc.animate([{transform:'translate(-50%,-50%) scale(.5)'},{transform:'translate(-50%,-50%) scale(1.15)'},{transform:'translate(-50%,-50%) scale(1)'}],{duration:240,easing:'ease-out'});
+ });
+ strip.appendChild(b);
+ });
+
+ var dragging=false;
+ acc.addEventListener('pointerdown',function(e){
+ if(acc.style.display==='none') return;
+ dragging=true;
+ try{ acc.setPointerCapture(e.pointerId); }catch(_){}
+ e.preventDefault();
+ });
+ acc.addEventListener('pointermove',function(e){
+ if(!dragging) return;
+ var r=frame.getBoundingClientRect();
+ pos.x=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width));
+ pos.y=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height));
+ renderAcc();
+ e.preventDefault();
+ });
+ function endDrag(e){ dragging=false; try{ acc.releasePointerCapture(e.pointerId); }catch(_){} }
+ acc.addEventListener('pointerup',endDrag);
+ acc.addEventListener('pointercancel',endDrag);
+
+ onTap(document.getElementById('minus'),function(){ size=Math.max(24,size-12); renderAcc(); });
+ onTap(document.getElementById('plus'),function(){ size=Math.min(220,size+12); renderAcc(); });
+ onTap(document.getElementById('reset'),function(){
+ acc.style.display='none'; label.textContent=''; frame.style.borderColor='#334155';
+ var btns=strip.querySelectorAll('.cos');
+ for(var k=0;k<btns.length;k++) btns[k].classList.remove('on');
+ });
+
+ pick.addEventListener('change',function(e){
+ var file=e.target.files&&e.target.files[0]; if(!file) return;
+ var reader=new FileReader();
+ reader.onload=function(){
+ var img=new Image();
+ img.onload=function(){
+ try{
+ var max=760,sc=Math.min(1,max/Math.max(img.width,img.height));
+ var c=document.createElement('canvas');
+ c.width=Math.round(img.width*sc); c.height=Math.round(img.height*sc);
+ c.getContext('2d').drawImage(img,0,0,c.width,c.height);
+ frame.style.backgroundImage='url("'+c.toDataURL('image/jpeg',0.85)+'")';
+ }catch(err){ frame.style.backgroundImage='url("'+reader.result+'")'; }
+ ph.style.display='none';
+ };
+ img.onerror=function(){ frame.style.backgroundImage='url("'+reader.result+'")'; ph.style.display='none'; };
+ img.src=reader.result;
+ };
+ reader.readAsDataURL(file);
+ });
+
+ renderAcc();
+})();
+</script>

v1Current

@liveloop · 5/17/2026, 11:52:13 AM

Initial version — all lines are new.

+<style>
+ html,body{height:100%;margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#0b1020;color:#f8fafc;overflow:hidden;}
+ .wrap{display:flex;flex-direction:column;height:100%;box-sizing:border-box;padding:.8rem;gap:.5rem;}
+ .top{display:flex;align-items:baseline;justify-content:space-between;gap:.5rem;}
+ h1{margin:0;font-size:1rem;}
+ #label{font-size:.82rem;font-weight:800;color:#fbbf24;}
+ #stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;}
+ #frame{position:relative;height:100%;aspect-ratio:3/4;max-width:100%;border-radius:1rem;border:4px solid #334155;background:#1e293b;background-size:cover;background-position:center;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.45);}
+ #ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;color:#94a3b8;font-size:.78rem;text-align:center;padding:1rem;}
+ #ph .big{font-size:3rem;}
+ #acc{position:absolute;left:50%;top:22%;transform:translate(-50%,-50%);font-size:64px;line-height:1;cursor:grab;touch-action:none;user-select:none;-webkit-user-select:none;display:none;filter:drop-shadow(0 3px 7px rgba(0,0,0,.45));}
+ .strip{display:flex;gap:.4rem;overflow-x:auto;padding:.15rem;}
+ .cos{flex:none;font:inherit;font-size:1.45rem;border:2px solid #334155;background:#1e293b;border-radius:.7rem;width:3rem;height:3rem;cursor:pointer;touch-action:manipulation;}
+ .cos.on{border-color:#fbbf24;}
+ .controls{display:flex;gap:.4rem;align-items:center;justify-content:center;flex-wrap:wrap;}
+ .btn{font:inherit;font-size:.8rem;font-weight:600;border:0;border-radius:9999px;padding:.45rem .95rem;background:#3b82f6;color:#fff;cursor:pointer;touch-action:manipulation;display:inline-flex;align-items:center;gap:.3rem;}
+ .ghost{background:transparent;border:1px solid #475569;color:#cbd5e1;}
+ .sz{font:inherit;font-weight:800;font-size:1rem;border:1px solid #475569;background:transparent;color:#cbd5e1;width:2.1rem;height:2.1rem;border-radius:.5rem;cursor:pointer;touch-action:manipulation;}
+ .hint{font-size:.68rem;color:#64748b;text-align:center;}
+ .hidden{display:none;}
+</style>
+<div class="wrap">
+ <div class="top"><h1>🎭 Change Your Costume</h1><span id="label"></span></div>
+ <div id="stage">
+ <div id="frame">
+ <div id="ph"><div class="big">🙂</div><div>Add your photo, then pick a costume below</div></div>
+ <div id="acc">🎩</div>
+ </div>
+ </div>
+ <div class="strip" id="strip"></div>
+ <div class="controls">
+ <label class="btn">📷 Photo<input type="file" accept="image/*" id="pick" class="hidden"></label>
+ <button class="sz" id="minus" type="button">−</button>
+ <button class="sz" id="plus" type="button">+</button>
+ <button class="btn ghost" id="reset" type="button">Clear</button>
+ </div>
+ <div class="hint">Drag the costume onto your photo · − / + to resize</div>
+</div>
+<script>
+(function(){
+ var COSTUMES=[
+ {name:'Cowboy',emoji:'🤠',color:'#b45309'},
+ {name:'Royal',emoji:'👑',color:'#a855f7'},
+ {name:'Dapper',emoji:'🎩',color:'#0f172a'},
+ {name:'Party',emoji:'🥳',color:'#ec4899'},
+ {name:'Wizard',emoji:'🧙',color:'#7c3aed'},
+ {name:'Graduate',emoji:'🎓',color:'#2563eb'},
+ {name:'Disguise',emoji:'🥸',color:'#0891b2'},
+ {name:'Festive',emoji:'🎅',color:'#dc2626'},
+ {name:'Sporty',emoji:'🧢',color:'#16a34a'},
+ {name:'Sunny',emoji:'👒',color:'#f59e0b'}
+ ];
+ var frame=document.getElementById('frame'),acc=document.getElementById('acc'),
+ ph=document.getElementById('ph'),strip=document.getElementById('strip'),
+ label=document.getElementById('label'),pick=document.getElementById('pick');
+ var pos={x:0.5,y:0.22},size=64;
+
+ function onTap(el,fn){
+ var sx=0,sy=0,armed=false;
+ el.addEventListener('pointerdown',function(e){ armed=true;sx=e.clientX;sy=e.clientY; });
+ el.addEventListener('pointercancel',function(){ armed=false; });
+ el.addEventListener('pointerup',function(e){
+ if(!armed) return; armed=false;
+ if(Math.abs(e.clientX-sx)<14&&Math.abs(e.clientY-sy)<14) fn();
+ });
+ }
+ function renderAcc(){
+ acc.style.left=(pos.x*100)+'%';
+ acc.style.top=(pos.y*100)+'%';
+ acc.style.fontSize=size+'px';
+ }
+ COSTUMES.forEach(function(c,i){
+ var b=document.createElement('button');
+ b.type='button'; b.className='cos'; b.textContent=c.emoji;
+ onTap(b,function(){
+ acc.textContent=c.emoji; acc.style.display='block';
+ frame.style.borderColor=c.color; label.textContent=c.name;
+ var btns=strip.querySelectorAll('.cos');
+ for(var k=0;k<btns.length;k++) btns[k].classList.toggle('on',btns[k]===b);
+ renderAcc();
+ acc.animate([{transform:'translate(-50%,-50%) scale(.5)'},{transform:'translate(-50%,-50%) scale(1.15)'},{transform:'translate(-50%,-50%) scale(1)'}],{duration:240,easing:'ease-out'});
+ });
+ strip.appendChild(b);
+ });
+
+ var dragging=false;
+ acc.addEventListener('pointerdown',function(e){
+ if(acc.style.display==='none') return;
+ dragging=true;
+ try{ acc.setPointerCapture(e.pointerId); }catch(_){}
+ e.preventDefault();
+ });
+ acc.addEventListener('pointermove',function(e){
+ if(!dragging) return;
+ var r=frame.getBoundingClientRect();
+ pos.x=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width));
+ pos.y=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height));
+ renderAcc();
+ e.preventDefault();
+ });
+ function endDrag(e){ dragging=false; try{ acc.releasePointerCapture(e.pointerId); }catch(_){} }
+ acc.addEventListener('pointerup',endDrag);
+ acc.addEventListener('pointercancel',endDrag);
+
+ onTap(document.getElementById('minus'),function(){ size=Math.max(24,size-12); renderAcc(); });
+ onTap(document.getElementById('plus'),function(){ size=Math.min(220,size+12); renderAcc(); });
+ onTap(document.getElementById('reset'),function(){
+ acc.style.display='none'; label.textContent=''; frame.style.borderColor='#334155';
+ var btns=strip.querySelectorAll('.cos');
+ for(var k=0;k<btns.length;k++) btns[k].classList.remove('on');
+ });
+
+ pick.addEventListener('change',function(e){
+ var file=e.target.files&&e.target.files[0]; if(!file) return;
+ var reader=new FileReader();
+ reader.onload=function(){
+ var img=new Image();
+ img.onload=function(){
+ try{
+ var max=760,sc=Math.min(1,max/Math.max(img.width,img.height));
+ var c=document.createElement('canvas');
+ c.width=Math.round(img.width*sc); c.height=Math.round(img.height*sc);
+ c.getContext('2d').drawImage(img,0,0,c.width,c.height);
+ frame.style.backgroundImage='url("'+c.toDataURL('image/jpeg',0.85)+'")';
+ }catch(err){ frame.style.backgroundImage='url("'+reader.result+'")'; }
+ ph.style.display='none';
+ };
+ img.onerror=function(){ frame.style.backgroundImage='url("'+reader.result+'")'; ph.style.display='none'; };
+ img.src=reader.result;
+ };
+ reader.readAsDataURL(file);
+ });
+
+ renderAcc();
+})();
+</script>
← Version history