🔒
p0ny word required
tap anywhere to return
continue relaxing?

💖 nominate captain

🐴
your status will appear here
what's your situation
40
giving
mood
create timer
urgency
who
add note
0 / 140
visible to
edit room info
banner text
banner style
party name
schedule / set times

🏢 berghain


checking berghain...
~disclaimer~
p0ny is unaffiliated with berghain.
think of this tool like checking the weather.
<3
🐴
viel spaß
others will need this word to enter
👆 tap to pick
pony v22
slot 1 · carrot
size
no active timers
notes

are you sure?

`;return new Response(t,{status:200,headers:{"content-type":"text/html;charset=UTF-8","cache-control":"no-cache"}})}return i}};export{w as PonyRoom,S as default} $('statusBtn').addEventListener('click',function(){ if(!me)return; $('statusInput').value=me.location||''; currentModifier=me.modifierEmoji||''; var disp=$('modifierDisplay'),box=$('modifierBox'); if(currentModifier){disp.textContent=currentModifier;box.classList.remove('empty'); var cl=box.querySelector('.mod-clear');if(!cl){cl=document.createElement('span');cl.className='mod-clear';cl.textContent='✕';cl.addEventListener('click',function(ev){ev.stopPropagation();currentModifier='';disp.textContent='✨';box.classList.add('empty');cl.remove();$('modifierGrid').classList.remove('open')});box.appendChild(cl)} }else{disp.textContent='✨';box.classList.add('empty');var ex=box.querySelector('.mod-clear');if(ex)ex.remove()} $('statusOverlay').classList.add('open'); setTimeout(function(){$('statusInput').focus()},80); }); $('statusSubmit').addEventListener('click',function(){ if(!me)return; me.location=$('statusInput').value.trim(); me.modifierEmoji=currentModifier; send({type:'update-location',personId:me.id,location:me.location,modifierEmoji:currentModifier}); navigator.vibrate?.(50); $('statusOverlay').classList.remove('open');renderPeople(); }); $('statusInput').addEventListener('keydown',function(e){if(e.key==='Enter')$('statusSubmit').click()}); $('statusOverlay').addEventListener('click',function(e){if(e.target===$('statusOverlay')){$('statusOverlay').classList.remove('open');$('modifierGrid').classList.remove('open')}}); // ─── LEAVE ─── $('leaveBtn').addEventListener('click',function(){ if(!me)return; send({type:'kick',personId:me.id});me=null; try{localStorage.removeItem('pony_me_'+roomId);localStorage.removeItem('pony_unlocked_'+roomId)}catch(ex){} if(ws){ws.close();ws=null} $('mainView').classList.remove('active');$('onboarding').classList.remove('hidden'); if(!IS_PK)location.hash=''; roomId='';$('roomInput').value='';$('sessionId').textContent='---'; $('gearPanel').classList.remove('open'); toast('tschüssi! 👋'); }); // ─── NOMINATE ─── function openNominate(){ const chips=$('nominateChips');chips.innerHTML=''; var selected=null; people.forEach(function(p){ if(me&&p.id== [23] [12:07:20 PM] [LOG] =me.id)return; const c=document.createElement('button');c.className='nominate-chip';c.textContent=p.icon+' '+p.name; c.addEventListener('click',function(){chips.querySelectorAll('.nominate-chip').forEach(function(x){x.classList.remove('selected')});c.classList.add('selected');selected=p.id}); chips.appendChild(c); }); $('nominateOverlay').classList.add('open'); $('nominateSubmit').onclick=function(){ if(selected){send({type:'nominate',nominee:selected});if(me)send({type:'vote',vote:'yay',personId:me.id});$('nominateOverlay').classList.remove('open')} }; } $('nominateCancel').addEventListener('click',function(){$('nominateOverlay').classList.remove('open')}); $('nominateOverlay').addEventListener('click',function(e){if(e.target===$('nominateOverlay'))$('nominateOverlay').classList.remove('open')}); // ─── TIMERS ─── var selUrg2='urgent'; function buildTimerUrgency(){ const pk=$('tcUrgency');pk.innerHTML=''; [{key:'chill',e:'🔵'},{key:'casual',e:'🟢'},{key:'warn',e:'🟠'},{key:'urgent',e:'🔴'}].forEach(function(u){ const b=document.createElement('button');b.className='urgency-opt'+(u.key===selUrg2?' selected':'');b.textContent=u.e; b.addEventListener('click',function(){selUrg2=u.key;pk.querySelectorAll('.urgency-opt').forEach(function(x){x.classList.remove('selected')});b.classList.add('selected')}); pk.appendChild(b); }); } function updateTimerChips(){ const s=$('tcWho');s.innerHTML=''; const a=document.createElement('button');a.className='person-chip all-chip selected';a.textContent='everyone'; a.addEventListener('click',function(){s.querySelectorAll('.person-chip').forEach(function(c){c.classList.remove('selected')});a.classList.add('selected')}); s.appendChild(a); people.forEach(function(p){ const c=document.createElement('button');c.className='person-chip';c.textContent=p.icon;c.dataset.pid=p.id; c.addEventListener('click',function(){a.classList.remove('selected');c.classList.toggle('selected');if(!s.querySelectorAll('.person-chip:not(.all-chip).selected').length)a.classList.add('selected')}); s.appendChild(c); }); } $('createTimerBtn').addEventListener('click',function(){ updateTimerChips(); $('tcName').value='';$('tcMin').value=''; $('timerCreateOverlay').classList.add('open'); setTimeout(function(){$('tcName').focus()},80); }); $('tcCancel').addEventListener('click',function(){$('timerCreateOverlay').classList.remove('open')}); $('timerCreateOverlay').addEventListener('click',function(e){if(e.target===$('timerCreateOverlay'))$('timerCreateOverlay').classList.remove('open')}); $('tcStart').addEventListener('click',function(){ const name=$('tcName').value.trim(),mins=parseInt($('tcMin').value); if(!name||!mins||mins<1)return; const em={chill:'🔵',casual:'🟢',warn:'🟠',urgent:'🔴'}; var targets=[]; if($('tcWho').querySelector('.all-chip.selected'))targets=['all']; else $('tcWho').querySelectorAll('.person-chip:not(.all-chip).selected').forEach(function(c){targets.push(c.dataset.pid)}); if(!targets.length)targets=['all']; send({type:'add-timer',timer:{id:'t_'+Date.now()+'_'+gId(4),name:name,urgency:selUrg2,urgencyEmoji:em[selUrg2],endTime:Date.now()+mins*60000,targets:targets,createdBy:me?me.id:null,responses:{}}}); navigator.vibrate?.(50); $('timerCreateOverlay').classList.remove('open'); }); function renderTimers(){ const wrap=$('timersListWrap'); wrap.querySelectorAll('.timer-card').forEach(function(c){c.remove()}); const active=timers.filter(function(t){return Date.now()-t.endTime<300000}); $('noTimers').style.display=active.length?'none':''; active.forEach(function(t){ const card=document.createElement('div');card.className='timer-card'; var who='everyone'; if(t.targets[0]!=='all')who=t.targets.map(function(id){const p=people.find(function(x){return x.id===id});return p?p.icon:'?'}).join(' '); const resp=t.responses||{}; var rHtml=''; Object.entries(resp).forEach(function(entry){var pid=entry[0],st=entry[1];if(st==='cleared')return;const p=people.find(function(x){return x.id===pid});if(p){const cls=st==='accepted'?'accepted':'declined';const ic=st==='accepted'?'🐴':'✕';rHtml+=''+p.icon+ic+''}}); var actHtml=''; const amT=t.targets[0]==='all'||(me&&t.targets.includes(me.id)); const myR=me?(resp[me.id]||null):null; if(amT&&me)actHtml='
'; card.innerHTML='
'+t.urgencyEmoji+'
'+t.name+'
'+who+'
'+(rHtml?'
'+rHtml+'
':'')+actHtml+'
--:--
'; card.querySelector('.timer-dismiss').addEventListener('click',function(){send({type:'dismiss-timer',timerId:t.id})}); const aBtn=card.querySelector('.accept-btn'),dBtn=card.querySelector('.decline-btn'); if(aBtn)aBtn.addEventListener('click',function(){const cr=(t.responses||{})[me.id];const nr=cr==='accepted'?'cleared':'accepted';aBtn.classList.toggle('pressed',nr==='accepted');if(dBtn)dBtn.classList.remove('pressed');send({type:'timer-respond',timerId:t.id,personId:me.id,response:nr})}); if(dBtn)dBtn.addEventListener('click',function(){const cr=(t.responses||{})[me.id];const nr=cr==='declined'?'cleared':'declined';dBtn.classList.toggle('pressed',nr==='declined');if(aBtn)aBtn.classList.remove('pressed');send({type:'timer-respond',timerId:t.id,personId:me.id,response:nr})}); wrap.appendChild(card); }); } function tickTimers(){ document.querySelectorAll('.timer-countdown[data-end]').forEach(function(el){ const end=parseInt(el.dataset.end),rem=end-Date.now(); if(rem<=0){el.textContent='done!';el.className='timer-countdown done';return} const sec=Math.ceil(rem/1000);el.textContent=Math.floor(sec/60)+':'+(sec%60).toString().padStart(2,'0'); el.classList.toggle('final',sec<=30); }); } // ─── INFO PAGE ─── function renderInfo(){renderRoomInfoBubble();renderNotes()} function renderRoomInfoBubble(){ var bubble=$('roomInfoBubble');bubble.innerHTML=''; var isCap=me&&me.id===captainId; var hasInfo=roomBanner||roomPartyName||roomSetTimes.length; var div=document.createElement('div');div.className='room-info-bubble'; var labelHtml='
info'+(isCap?'':'')+'
'; var contentHtml=''; if(!hasInfo){contentHtml='
'+(isCap?'no info set — tap edit to add details':'no info set')+'
'} else{ if(roomBanner)contentHtml+='
'+roomBanner+'
'; if(roomPartyName)contentHtml+='
'+roomPartyName+'
'; if(roomSetTimes.length){ roomSetTimes.forEach(function(s){ var noteHtml=s.note?''+s.note+'':''; contentHtml+='
'+(s.time||'--:--')+''+(s.name||'TBA')+noteHtml+'
'; }); } } div.innerHTML=labelHtml+contentHtml; bubble.appendChild(div); var eb=document.getElementById('roomInfoEditBtn'); if(eb)eb.addEventListener('click',openRoomInfoEdit); } function renderNotes(){ var area=$('notesArea');area.innerHTML=''; if(!me){area.innerHTML='
join to see notes
';return} var visible=notes.filter(function(n){return n.visibility.indexOf('all')>=0||n.authorId===me.id||n.visibility.indexOf(me.id)>=0}); if(!visible.length){area.innerHTML='
no notes yet
';return} visible.forEach(function(n){ var ismine=me&&n.authorId===me.id; var author=people.find(function(p){return p.id===n.authorId}); var aIcon=author?author.icon:(n.authorIcon||''); var aName=author?author.name:(n.authorName||'?'); var isPrivate=n.visibility.indexOf('all')<0; var card=document.createElement('div');card.className='note-card'+(ismine?' is-mine':''); card.innerHTML='
'+escHtml(n.text)+'
'+(aIcon?aIcon+' ':'')+aName+(isPrivate?'private':'')+'
'; if(ismine)card.addEventListener('click',function(){openNoteOverlay(n)}); area.appendChild(card); }); } function escHtml(s){return s.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"')} // ─── ADD NOTE ─── $('addNoteBtn').addEventListener('click',function(){openNoteOverlay(null)}); function openNoteOverlay(note){ editingNoteId=note?note.id:null; $('noteText').value=note?note.text:''; $('noteSheetTitle').textContent=note?'edit note':'add note'; $('noteSave').textContent=note?'save':'post'; $('noteDelete').style.display=note?'':'none'; updateNoteCharCount(); buildNoteVisChips(note); $('noteOverlay').classList.add('open'); setTimeout(function(){$('noteText').focus()},80); } $('noteCancel').addEventListener('click',function(){$('noteOverlay').classList.remove('open')}); $('noteOverlay').addEventListener('click',function(e){if(e.target===$('noteOverlay'))$('noteOverlay').classList.remove('open')}); $('noteText').addEventListener('input',updateNoteCharCount); function updateNoteCharCount(){ var len=$('noteText').value.length; var cc=$('noteCharCount');cc.textContent=len+' / 140'; cc.className='char-count'+(len>=130?' near':'')+(len>=140?' full':''); } function buildNoteVisChips(existingNote){ var wrap=$('noteVisChips');wrap.innerHTML=''; var allSelected=!existingNote||existingNote.visibil [25] [12:07:20 PM] [LOG] ity.indexOf('all')>=0; var allChip=document.createElement('button');allChip.className='vis-chip'+(allSelected?' selected':'');allChip.textContent='everyone';allChip.dataset.val='all'; allChip.addEventListener('click',function(){wrap.querySelectorAll('.vis-chip').forEach(function(c){c.classList.remove('selected')});allChip.classList.add('selected')}); wrap.appendChild(allChip); people.forEach(function(p){ if(me&&p.id===me.id)return; var sel=existingNote&&existingNote.visibility.indexOf(p.id)>=0; var chip=document.createElement('button');chip.className='vis-chip'+(sel?' selected':'');chip.textContent=p.icon+' '+p.name;chip.dataset.val=p.id; chip.addEventListener('click',function(){allChip.classList.remove('selected');chip.classList.toggle('selected');if(!wrap.querySelectorAll('.vis-chip:not([data-val="all"]).selected').length)allChip.classList.add('selected')}); wrap.appendChild(chip); }); } function getNoteVisibility(){ var wrap=$('noteVisChips'); if(wrap.querySelector('.vis-chip[data-val="all"].selected'))return['all']; var ids=[];wrap.querySelectorAll('.vis-chip:not([data-val="all"]).selected').forEach(function(c){ids.push(c.dataset.val)}); if(!ids.length)return['all']; return ids; } $('noteSave').addEventListener('click',function(){ var text=$('noteText').value.trim();if(!text||!me)return; var vis=getNoteVisibility(); if(editingNoteId){send({type:'edit-note',noteId:editingNoteId,personId:me.id,text:text,visibility:vis})} else{send({type:'add-note',note:{id:'n_'+Date.now()+'_'+gId(4),authorId:me.id,authorName:me.name,authorIcon:me.icon,text:text,visibility:vis,createdAt:Date.now()}})} navigator.vibrate?.(50); $('noteOverlay').classList.remove('open'); }); $('noteDelete').addEventListener('click',function(){ if(editingNoteId&&me){send({type:'delete-note',noteId:editingNoteId,personId:me.id});$('noteOverlay').classList.remove('open')} }); // ─── ROOM INFO EDIT ─── var rioSetsArr=[]; $('rioAddSet').addEventListener('click',function(){rioSetsArr.push({time:'',name:'',note:''});renderRioSets()}); function renderRioSets(){ var l=$('rioSetList');l.innerHTML=''; rioSetsArr.forEach(function(s,i){ var row=document.createElement('div');row.className='set-row'; row.innerHTML=''; row.querySelectorAll('input').forEach(function(inp){inp.addEventListener('input',function(){rioSetsArr[parseInt(inp.dataset.i)][inp.dataset.f]=inp.value})}); row.querySelector('.set-remove-btn').addEventListener('click',function(){rioSetsArr.splice(i,1);renderRioSets()}); l.appendChild(row); }); } function openRoomInfoEdit(){ $('rioBanner').value=roomBanner||''; $('rioBannerStyle').value=roomBannerStyle||'rainbow'; $('rioPartyName').value=roomPartyName||''; rioSetsArr=roomSetTimes.map(function(s){return{time:s.time||'',name:s.name||'',note:s.note||''}}); renderRioSets(); $('roomInfoOverlay').classList.add('open'); } $('rioCancel').addEventListener('click',function(){$('roomInfoOverlay').classList.remove('open')}); $('roomInfoOverlay').addEventListener('click',function(e){if(e.target===$('roomInfoOverlay'))$('roomInfoOverlay').classList.remove('open')}); $('rioSave').addEventListener('click',function(){ if(!me||me.id!==captainId)return; var banner=$('rioBanner').value.trim(); var bannerStyle=$('rioBannerStyle').value; var partyName=$('rioPartyName').value.trim(); var setTimes=rioSetsArr.filter(function(s){return s.time||s.name}); send({type:'set-room-info',personId:me.id,banner:banner,bannerStyle:bannerStyle,partyName:partyName,setTimes:setTimes}); $('roomInfoOverlay').classList.remove('open'); toast('room info updated'); }); // ─── RELAX MODE ─── var relaxAnim=null,relaxLooping=false,relaxScrolling=false,relaxTimer=null; $('relaxExit').addEventListener('click',exitRelax); $('relaxStay').addEventListener('click',function(){$('relaxContinue').classList.remove('active');relaxLooping=true;$('relaxTapHint').classList.add('visible')}); $('relaxOverlay').addEventListener('click',function(e){ if(e.target.closest('.relax-continue-modal'))return; if(relaxLooping){exitRelax();return} if(relaxScrolling){$('relaxContinue').classList.add('active');relaxScrolling=false} }); function exitRelax(){ $('relaxOverlay').classList.remove('active');$('relaxContinue').classList.remove('active');$('relaxTapHint').classList.remove('visible'); relaxLooping=false;relaxScrolling=false; if(relaxAnim)cancelAnimationFrame(relaxAnim);relaxAnim=null; if(relaxTimer)clearTimeout(relaxTimer);relaxTimer=null; const c=$('relaxCredits');c.style.transition='none';c.style.top='100%'; } function startRelax(){ const o=$('relaxOverlay'),c=$('relaxCredits'),cv=$('relaxCanvas'); o.classList.add('active [26] [12:07:20 PM] [LOG] ');c.innerHTML='';$('relaxContinue').classList.remove('active');$('relaxTapHint').classList.remove('visible'); relaxLooping=false;relaxScrolling=true; const ctx=cv.getContext('2d');const dpr=window.devicePixelRatio||1; function rz(){cv.width=cv.offsetWidth*dpr;cv.height=cv.offsetHeight*dpr;ctx.scale(dpr,dpr)}rz(); const W=cv.offsetWidth,H=cv.offsetHeight;const pixelSize=3;const cols=Math.ceil(W/pixelSize);const rows=Math.ceil(H/pixelSize); const drops=[];for(let i=0;irows+d.len){d.y=-d.len;d.speed=0.15+Math.random()*0.25;d.len=8+Math.floor(Math.random()*20);d.hueOff=Math.random()*360} for(let j=0;j=rows)continue;const fade=1-(j/d.len);const hue=(baseHue+d.hueOff+j*3)%360;const alpha=fade*0.35;const glitchX=(Math.sin(t*100+i*7)>0.97)?Math.floor(Math.random()*3-1):0;ctx.fillStyle='hsla('+hue+',80%,60%,'+alpha+')';ctx.fillRect((i+glitchX)*pixelSize,py*pixelSize,pixelSize,pixelSize)}}); relaxAnim=requestAnimationFrame(drawRelax); }drawRelax(); const texts=[{text:'~ r e l a x ~',cls:'title'},{text:'hihi'},{text:'i hope you are having a lovely time.'},{text:'take a break for a moment, a deep breath.'},{text:'sometimes you need a reminder to slow down'},{text:"especially when you're having fun."},{text:"you're doing a great job"},{text:"and I know you're working so hard."},{text:'be kind to yourself.'},{text:'when you find your friends again,'},{text:'give them a hug and a kiss.'},{text:"it's all going to be alright"},{text:'and this time is yours.'},{text:'take care of each other…'},{text:'here are the latest updates:'}]; var groupHtml='
'; people.forEach(function(p){groupHtml+='
'+p.icon+''+p.name+''+(p.location||'~')+'
'}); groupHtml+='
';texts.push({html:groupHtml}); if(captainMsg)texts.push({text:'💖 "'+captainMsg+'"'}); timers.filter(function(tm){return tm.endTime>Date.now()}).forEach(function(tm){const sec=Math.ceil((tm.endTime-Date.now())/1000);const m=Math.floor(sec/60),s=sec%60;texts.push({text:tm.urgencyEmoji+' '+tm.name+' — '+m+':'+String(s).padStart(2,'0')})}); const nameRoll=people.map(function(p){return p.name}).join('... ')+'...';texts.push({text:nameRoll,cls:'nameroll'}); texts.push({text:"you're beautiful.",cls:'closing'});texts.push({text:'have a great time together.',cls:'closing'});texts.push({text:'xoxo',cls:'xoxo'});texts.push({text:'~~~~~~~~~~~~',cls:'wave'}); texts.forEach(function(l){const div=document.createElement('div');div.className='line'+(l.cls?' '+l.cls:'');if(l.html)div.innerHTML=l.html;else div.textContent=l.text;c.appendChild(div)}); const viewH=o.offsetHeight;c.style.transition='none';c.style.top=viewH+'px'; requestAnimationFrame(function(){requestAnimationFrame(function(){ const contentH=c.scrollHeight;const endTop=-(contentH+100);const distance=viewH-endTop;const duration=distance/35; c.style.transition='top '+duration+'s linear';c.style.top=endTop+'px'; relaxTimer=setTimeout(function(){relaxScrolling=false;$('relaxContinue').classList.add('active')},duration*1000); })}); } // ─── INIT ─── initSession();restorePrefs(); if(roomId){ try{ const stored=localStorage.getItem('pony_me_'+roomId); if(stored){ connect(); const prev=JSON.parse(stored); const orig=ws.onmessage; ws.onmessage=function(e){ orig(e); const f=people.find(function(p){return p.id===prev.id}); if(f){me=f;enterMain()} ws.onmessage=orig; }; } }catch(ex){} } setInterval(tickTimers,1000); // ─── CMYK PIXEL BACKGROUND ─── (function(){ const cv=$('pixelBg'),ctx=cv.getContext('2d');const PX=5;let pt=0;const dpr=window.devicePixelRatio||1; function rz(){cv.width=cv.offsetWidth*dpr;cv.height=cv.offsetHeight*dpr;ctx.scale(dpr,dpr)}rz(); const palette=[[0,200,255],[255,0,180],[255,230,0],[0,255,120],[120,0,255],[255,100,0],[0,255,200],[255,0,80],[0,150,255],[220,0,255],[180,255,0],[255,50,150]]; const cols=Math.ceil(cv.offsetWidth/PX);const rows=Math.ceil(cv.offsetHeight/PX); const grid=[];for(let i=0;i0.92)?0.15:0;const bayer=[0,2,3,1];const dith=(bayer[(x%2)+(y%2)*2]/4-0.5)*30; r=Math.round((r+dith)/36)*36;gr=Math.round((gr+dith)/36)*36;b=Math.round((b+dith)/36)*36; const alpha=desat?0.1:(0.18+sparkle);ctx.fillStyle='rgba('+Math.max(0,r)+','+Math.max(0,gr)+','+Math.max(0,b)+','+alpha+')';ctx.fillRect(x*PX,y*PX,PX,PX); if(Math.random()<0.0001)g.ci=(g.ci+1)%palette.length; }} requestAnimationFrame(frame); }frame(); })(); })();

are you sure?