HPBLK Artist • Producer • Illustrator
Press Kit / 2026
↓
(function () { function hpwInitialise() { const root = document.getElementById("hpw-works"); if (!root) { console.warn("HPW works wrapper was not found."); return; } if (root.dataset.hpwReady === "true") { return; } root.dataset.hpwReady = "true"; /* ========================================= ELEMENTS ========================================== */ const projects = [ ...root.querySelectorAll(".hpw-project") ]; const audioPlayer = document.getElementById("hpw-audio-player"); const playButton = document.getElementById("hpw-play-button"); const playIcon = document.getElementById("hpw-play-icon"); const playLabel = document.getElementById("hpw-play-label"); const downloadButton = document.getElementById("hpw-download-button"); const downloadLabel = document.getElementById("hpw-download-label"); const externalButton = document.getElementById("hpw-external-button"); const externalLabel = document.getElementById("hpw-external-label"); const projectInformation = document.getElementById("hpw-project-information"); const fixedDescription = document.getElementById("hpw-fixed-description"); const projectTitle = document.getElementById("hpw-project-title"); const projectType = document.getElementById("hpw-project-type"); const projectDescription = document.getElementById("hpw-project-description"); const projectDate = document.getElementById("hpw-project-date"); const projectNumber = document.getElementById("hpw-project-number"); const brand = document.getElementById("hpw-hypeism-brand"); if (!projects.length) { console.error("No .hpw-project sections found."); return; } let activeProject = projects[0]; let textTimer = null; /* ========================================= DROPBOX LINKS ========================================== */ function hpwAudioLink(link) { if (!link) { return ""; } if (!link.includes("dropbox.com")) { return link; } try { const url = new URL(link); url.searchParams.delete("dl"); url.searchParams.set("raw", "1"); return url.toString(); } catch (error) { return link; } } function hpwDownloadLink(link) { if (!link) { return ""; } if (!link.includes("dropbox.com")) { return link; } try { const url = new URL(link); url.searchParams.delete("raw"); url.searchParams.set("dl", "1"); return url.toString(); } catch (error) { return link.replace("dl=0", "dl=1"); } } /* ========================================= AUDIO ========================================== */ function hpwUpdatePlayButton() { const playing = !audioPlayer.paused && !audioPlayer.ended; playIcon.textContent = playing ? "Ⅱ" : "▶"; playLabel.textContent = playing ? "Pause" : "Play"; playButton.setAttribute( "aria-label", playing ? "Pause current track" : "Play current track" ); } function hpwStopAudio() { audioPlayer.pause(); try { audioPlayer.currentTime = 0; } catch (error) {} hpwUpdatePlayButton(); } function hpwLoadAudio(project) { const source = hpwAudioLink(project.dataset.audio); audioPlayer.pause(); if (!source) { audioPlayer.removeAttribute("src"); audioPlayer.load(); hpwUpdatePlayButton(); return; } if ( audioPlayer.getAttribute("src") !== source ) { audioPlayer.src = source; audioPlayer.load(); } hpwUpdatePlayButton(); } /* ========================================= DYNAMIC CONTROLS A project can now independently have: - audio - download - external link So HYPEISM can have Play + Press Assets, while other sections can have no controls. ========================================== */ function hpwUpdateControls(project) { const hasAudio = Boolean(project.dataset.audio); const hasDownload = Boolean(project.dataset.download); const hasExternal = Boolean(project.dataset.external); playButton.hidden = !hasAudio; downloadButton.hidden = !hasDownload; externalButton.hidden = !hasExternal; if (hasAudio) { hpwLoadAudio(project); } else { hpwStopAudio(); } if (hasDownload) { downloadButton.href = hpwDownloadLink( project.dataset.download ); downloadLabel.textContent = project.dataset.downloadLabel || "Download"; } else { downloadButton.href = "#"; } if (hasExternal) { externalButton.href = project.dataset.external; externalLabel.textContent = project.dataset.externalLabel || "Open"; } else { externalButton.href = "#"; } } /* ========================================= PROJECT TEXT ========================================== */ function hpwRenderProject(project) { const index = projects.indexOf(project); projectTitle.textContent = project.dataset.title || ""; projectType.textContent = project.dataset.type || ""; projectDescription.textContent = project.dataset.description || ""; projectDate.textContent = project.dataset.date || ""; projectNumber.textContent = String(index + 1).padStart(2, "0") + " / " + String(projects.length).padStart(2, "0"); hpwUpdateControls(project); } function hpwActivateProject(project) { if ( !project || project === activeProject ) { return; } activeProject = project; projects.forEach(function (item) { item.classList.toggle( "hpw-active", item === project ); }); window.clearTimeout(textTimer); projectInformation.classList.add( "hpw-changing" ); fixedDescription.classList.add( "hpw-changing" ); textTimer = window.setTimeout( function () { hpwRenderProject(project); projectInformation.classList.remove( "hpw-changing" ); fixedDescription.classList.remove( "hpw-changing" ); }, 220 ); } /* ========================================= PLAY ========================================== */ playButton.addEventListener( "click", async function () { const source = hpwAudioLink( activeProject.dataset.audio ); if (!source) { return; } try { if ( !audioPlayer.paused && !audioPlayer.ended ) { audioPlayer.pause(); return; } if ( audioPlayer.getAttribute("src") !== source ) { audioPlayer.src = source; audioPlayer.load(); } await audioPlayer.play(); } catch (error) { console.error( "Audio playback failed:", error ); } hpwUpdatePlayButton(); } ); audioPlayer.addEventListener( "play", hpwUpdatePlayButton ); audioPlayer.addEventListener( "pause", hpwUpdatePlayButton ); audioPlayer.addEventListener( "ended", hpwUpdatePlayButton ); /* ========================================= DETECT ACTIVE SECTION ========================================== */ const observer = new IntersectionObserver( function (entries) { const visible = entries .filter(function (entry) { return entry.isIntersecting; }) .sort(function (a, b) { return ( b.intersectionRatio - a.intersectionRatio ); }); if (visible.length) { hpwActivateProject( visible[0].target ); } }, { threshold: [ 0.35, 0.5, 0.65, 0.8 ] } ); projects.forEach(function (project) { observer.observe(project); }); /* ========================================= HPBLK / HYPERBOLIC / PHONETIC ANIMATION ========================================== */ if (brand) { const brandStates = [ { text: "HPBLK", className: "hpw-brand-state-wordmark" }, { text: "HYPERBOLIC", className: "hpw-brand-state-hyperbolic" }, { text: "haɪ.pɚˈbɑː.lɪk", className: "hpw-brand-state-phonetic" } ]; let brandIndex = 0; function hpwChangeBrand() { brand.classList.add( "hpw-is-changing" ); window.setTimeout( function () { brandIndex = (brandIndex + 1) % brandStates.length; brand.classList.remove( "hpw-brand-state-wordmark", "hpw-brand-state-hyperbolic", "hpw-brand-state-phonetic" ); const state = brandStates[brandIndex]; brand.textContent = state.text; brand.classList.add( state.className ); window.requestAnimationFrame( function () { brand.classList.remove( "hpw-is-changing" ); } ); }, 260 ); } window.setInterval( hpwChangeBrand, 2400 ); } /* ========================================= INITIAL STATE ========================================== */ hpwRenderProject(activeProject); hpwUpdatePlayButton(); } if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", hpwInitialise, { once: true } ); } else { hpwInitialise(); } })();