✦ Verified product
Junglebox
AUD 119.95
Casa Calm
Verified independent store
→
The Junglebox transforms your home into a lush rainforest escape. Crafted by sound engineers for perfect authenticity, this motion-activated box fills your space with the calming s
ounds of the jungle. The timber finish adds a warm, natural aesthetic to your wellness routine. Play Sound .audio-widget { display: inline-block; margin: 20px 0; font-family: inherit; font-size: inherit; line-height: inherit; width: 100%; text-align: center; } @media (min-width: 768px) { .audio-widget { width: auto; text-align: left; } } .audio-play-button { display: flex; align-items: center; gap: 12px; padding: 16px 24px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none; border-radius: 50px; color: white; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3); min-width: 140px; justify-content: center; } .audio-play-button:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); background: linear-gradient(135deg, #5a6fd8 0%, #6a4190 100%); } .audio-icon { width: 20px; height: 20px; position: relative; } .audio-icon svg { width: 100%; height: 100%; position: absolute; transition: opacity 0.3s ease; } .play-icon { opacity: 1; } .pause-icon { opacity: 0; } .loading-icon { opacity: 0; } .audio-widget.playing .play-icon { opacity: 0; } .audio-widget.playing .pause-icon { opacity: 1; } .audio-widget.loading .play-icon, .audio-widget.loading .pause-icon { opacity: 0; } .audio-widget.loading .loading-icon { opacity: 1; } .audio-button-text { font-size: 14px; letter-spacing: 0.5px; text-transform: uppercase; } .audio-progress { width: 100%; height: 4px; background-color: rgba(102, 126, 234, 0.2); border-radius: 2px; margin-top: 12px; opacity: 0; transition: opacity 0.3s ease; } .audio-widget.playing .audio-progress, .audio-widget.loading .audio-progress { opacity: 1; } .audio-progress-bar { height: 100%; background: linear-gradient(90deg, #667eea, #764ba2); border-radius: 2px; width: 0%; transition: width 0.3s ease; } .audio-error-message { margin-top: 8px; padding: 8px 12px; background-color: #fee; color: #c53030; border-radius: 6px; font-size: 12px; display: none; border: 1px solid #feb2b2; } .audio-widget.error .audio-error-message { display: block; } .audio-widget.error .audio-play-button { background: linear-gradient(135deg, #fc8181 0%, #e53e3e 100%); } document.querySelectorAll('.audio-widget').forEach(widget => { const audioSrc = widget.getAttribute('data-audio-src'); const playButton = widget.querySelector('.audio-play-button'); const progressBar = widget.querySelector('.audio-progress-bar'); const errorMessage = widget.querySelector('.audio-error-message'); const audio = new Audio(audioSrc); let isPlaying = false; audio.addEventListener('timeupdate', () => { const percent = (audio.currentTime / audio.duration) * 100; progressBar.style.width = percent + '%'; }); audio.addEventListener('ended', () => { widget.classList.remove('playing'); isPlaying = false; }); playButton.addEventListener('click', () => { if (isPlaying) { audio.pause(); widget.classList.remove('playing'); isPlaying = false; } else { widget.classList.add('loading'); audio.play().then(() => { widget.classList.remove('loading'); widget.classList.add('playing'); isPlaying = true; }).catch(err => { widget.classList.remove('loading'); widget.classList.add('error'); errorMessage.textContent = 'Audio failed to load. Please try again.'; }); } }); });