Heartability
i heard there is a castle around here somewhere
©
untold until media
-♡- welcome -♡-
✕
how would you like to play today?
track your day ♡
explore as guest
/* ── Starfield ── */ const field = document.getElementById('stars'); for (let i = 0; i < 90; i++) { const s = document.createElement('div'); s.className = 'star'; const sz = (Math.random() * 5 + 2).toFixed(1); s.style.cssText = [ `width:${sz}px`, `height:${sz}px`, `left:${(Math.random() * 100).toFixed(1)}%`, `top:${(Math.random() * 100).toFixed(1)}%`, `--d:${(1.4 + Math.random() * 3.2).toFixed(2)}s`, `--del:${(-Math.random() * 4).toFixed(2)}s` ].join(';'); field.appendChild(s); } /* ── Swap rainbow image for mobile ── */ function swapRainbow() { const img = document.getElementById('rainbowPortal'); if (!img) return; img.src = window.innerWidth <= 768 ? 'assets/elements/circle-rainbow-m.png' : 'assets/elements/circle-rainbow.png'; } swapRainbow(); window.addEventListener('resize', swapRainbow); /* ── Mobile: tap heart to toggle speech bubble ── */ const heartGuide = document.getElementById('heartGuideWrap'); const bubbleWrap = document.getElementById('heartBubbleWrap'); heartGuide.addEventListener('click', () => { if (window.innerWidth <= 768) { bubbleWrap.classList.toggle('visible'); } }); /* Tap anywhere else to dismiss */ document.addEventListener('click', (e) => { if (window.innerWidth <= 768 && !heartGuide.contains(e.target) && !bubbleWrap.contains(e.target)) { bubbleWrap.classList.remove('visible'); } }); })();