{"title":"Electro","description":"","products":[{"product_id":"munir-nadir-paratoxical-ep","title":"Munir Nadir - Paratoxical EP","description":"\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist.bg-art::before{\n    background:url(https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_front.jpg?v=1758743050) center\/cover no-repeat;\n    filter:grayscale(.05) contrast(1.05) saturate(1.05);transform:scale(1.02);\n  }\n  .tracklist.bg-art::after{\n    \/* LICHTERE overlay voor betere zichtbaarheid van de art *\/\n    background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));\n    backdrop-filter: blur(.2px);\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist.bg-art::after{\n      \/* ook lichter in light mode *\/\n      background:linear-gradient(180deg, rgba(255,255,255,.45), rgba(255,255,255,.30));\n    }\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ODDOT03\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(4 tracks)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\n      \u003cli class=\"tracklist-item\" tabindex=\"0\" data-src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_A1.mp3?v=1758742689\"\u003e\n        \u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003eA1. Give Me A Second\u003c\/strong\u003e\u003c\/span\u003e\n      \u003c\/li\u003e\n      \u003cli class=\"tracklist-item\" tabindex=\"0\" data-src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_A2.mp3?v=1758742692\"\u003e\n        \u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003eA2. Paratoxical\u003c\/strong\u003e\u003c\/span\u003e\n      \u003c\/li\u003e\n      \u003cli class=\"tracklist-item\" tabindex=\"0\" data-src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_B1.mp3?v=1758742695\"\u003e\n        \u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003eB1. Sniper\u003c\/strong\u003e\u003c\/span\u003e\n      \u003c\/li\u003e\n      \u003cli class=\"tracklist-item\" tabindex=\"0\" data-src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_B2.mp3?v=1758742696\"\u003e\n        \u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003eB2. Flying Adder\u003c\/strong\u003e\u003c\/span\u003e\n      \u003c\/li\u003e\n    \u003c\/ul\u003e\n\n    \u003c!-- gedeelde audio player --\u003e\n    \u003caudio id=\"player-ODDOT03\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ODDOT03\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ODDOT03\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ODDOT03\"\u003eCouldn’t start audio. Tap a track to try again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  const root = document.getElementById('tracklist-ODDOT03');\n  if(!root) return;\n\n  const items = Array.from(root.querySelectorAll('.tracklist-item'));\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const player = root.querySelector('#player-ODDOT03');\n  const announcer = root.querySelector('#ann-ODDOT03');\n  const toast = root.querySelector('#toast-ODDOT03');\n\n  const bar = root.querySelector('#progress-ODDOT03');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2800); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src'); \/\/ force reload op sommige browsers\n    player.src = src;\n    player.load();\n\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) { tryPlay(); }\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){ player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n})();\n\u003c\/script\u003e\n","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52407437656391,"sku":null,"price":21.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT03_front.jpg?v=1758743050"},{"product_id":"cristian-sarde-bakked-untitled-1-violet-vinyl","title":"Cristian Sarde \u0026 Bakked - Untitled 1 [violet vinyl]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CB001_front.jpg?v=1758804726'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CB001_A1.mp3?v=1758804825',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CB001_B1.mp3?v=1758804825',\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\nThis item is pre-order and will be available from approximtely 3rd of October 2025.Limited copies. Graphic by Ludovica Padovani","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52411992310087,"sku":null,"price":18.49,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CB001.jpg?v=1758804726"},{"product_id":"delta-funktionen-black-endlessness","title":"Delta Funktionen - Black Endlessness","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_front.jpg?v=1758806226'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_A1.mp3?v=1758806246',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_A2.mp3?v=1758806243',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_B1.mp3?v=1758806246',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_B2.mp3?v=1758806246'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\nRepress alert! Due to high demand and increasing\npopularity, it was just about time to repress this Delta\nclassic! And since a new cut was required, we decided to\ninclude a very special bonus track: a neo-classical piano\nrework of Black Endlessness, composed and conducted\nby the highly talented Area Forty_One.\nThis a a pre order and approximately available from the 26th of september","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52412246098247,"sku":null,"price":13.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RAM-X-04_front_85d924c6-f0b6-403a-87ad-f47cc7f4ee7c.jpg?v=1758806533"},{"product_id":"dj-scyther-aka-dj-tjizza-get-sliced-ep","title":"DJ Scyther (aka DJ Tjizza) - Get Sliced EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PICTURE2_INSECTOID_AUDIO_001_8834314a-f743-42e6-9dd1-123c05d180b7.jpg?v=1760125299'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Downloaded_Brain.mp3?v=1760123561',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Notafreak_snippet.mp3?v=1760123561',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Voltage_Controle.mp3?v=1760123561',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_DeeDeexter_snippet.mp3?v=1760123560'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\nDJ Tjizza transforms into his Pokémon alter ego, DJ Scyther, delivering four trippy club\nbangers.\nThe party starting Pokémon DJ Scyther steps out of the world of anime with four chunky,\nrave leaning cuts from the mysterious alias in the “Get Sliced” EP on Insectoid Audio. A Fury\nCutting Record, making a Bug Buzz this summer.","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52506224558407,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PICTURE3_INSECTOIDAUDIO001.jpg?v=1760125287"},{"product_id":"shkedul-oho-nord-010","title":"Shkedul \u0026 Oho – NORD 010","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A_Side_2000.png?v=1760128017'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Shkedul_-_Together_Preview.mp3?v=1760128020',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Shkedul_-_Mystic_Drums_Preview.mp3?v=1760128020',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Oho_-_Like_That_Preview.mp3?v=1760128020',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Oho_-_Voice_Of_Dr._Preview.mp3?v=1760128020'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\n\n\u003cp\u003e\u003cstrong\u003eThis is a pre-order item and avaiable from the 15th of november\u003c\/strong\u003e\u003c\/p\u003e\nMarking its tenth release, NORD LTD unveils a powerful four-track record split between label founder Shkedul and rising talent Oho.\n\nOn the A-side, Shkedul delivers two hypnotic techno cuts: “Together”, a deep yet driving trip built on layered grooves and immersive textures, followed by “Mystic Drums”, where tribal percussion and dark atmospheres merge into pure dancefloor hypnosis.\n\nThe flip side introduces Oho with a sharp electro-infused approach. “Like That” strikes with raw basslines and crisp rhythms, while “Voice Of Dr.” closes the release in style, blending eerie voices and tense grooves into an uncompromising club weapon.\n\nA milestone release that highlights the label’s essence —dark, forward-thinking, and made for the floor","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52506398261575,"sku":null,"price":18.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B_Side_2000.png?v=1760128017"},{"product_id":"dj-tjizza-gauvain-tho-lamalice-va-vol-3","title":"Dj Tjizza, Gauvain, Tho, Lamalice – VA Vol.3","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/UNS005_B_3000x3000_fa05b724-21b8-4f18-bdb8-eb223334e513.png?v=1760131222'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Snippet_-_A1_-_Dj_Tjizza.mp3?v=1760131213',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Snippet_-_A2_-_Gauvain.mp3?v=1760131213',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Snippet_-_B1_-_Tho.mp3?v=1760131213',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Snippet_-_B2_-_Lamalice.mp3?v=1760131213'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003e\u003cstrong\u003eThis is a pre-order and available from the 17th of October \u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003eUnsilenced proudly marks its fifth release with a Various Artists showcase, bringing together four distinctive voices for a collection of club-ready cuts.\u2028Dj Tjizza, Gauvain, Tho, and Lamalice each contribute their own unique energy, shaping an EP that celebrates groove, drive, and the shared joy of the dancefloor. From crisp rhythms to deep rolling cuts, this release reflects both the spirit of the label and its growing family of artists.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52506575208775,"sku":null,"price":18.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/UNS005_A3000x3000.png?v=1760131296"},{"product_id":"ffriend-fated-friendship","title":"FFriend – Fated Friendship [300 Copies] [Vinyl Only]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RREV2_Mockup_v2.png?v=1761335936'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FFRIEND_-_A1._BREAK_THE_WALL_Snippet.mp3?v=1761335944',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FFRIEND_-_A2._SULPHATE_Snippet.mp3?v=1761335947',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FFRIEND_-_B1._MEDITATIVE_Snippet.mp3?v=1761335947',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FFRIEND_-_B2._MELANCHOLIA_Snippet.mp3?v=1761335947'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\nHand Stamped \u0026amp; Numbered (limited to 300 copies)\nGainax’ alliance, “oyster sunrise”, had their base a couple light-years off the galactic ice ring. Unassumingly sitting in-between shelves of hyperspace artillery was a black sturdy box, with aluminium details revealing it’s conventionally terrestrial design. Stuck to the box was a label tracing it back to recon-mission-3.31 with a hand-written note that read “destiny’s best FFriend”\nRecon Mission 3.31 was the last of a series of top-secret visits to a remote-community of terrestrials who had abandoned the global hegemony. Defined by their abrasive aesthetic but warm nature these self-defined spiritualists welcomed Gainax’ legion with caution. This courageous openness was part of their hopeful prophecy, one that saw the terror of Project-ST as an essential step in the global awakening.\n","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52618447061319,"sku":null,"price":14.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/RREV2Mockupv2.png?v=1761336217"},{"product_id":"shkedul-omar-akhrif-high-altitude-001","title":"Shkedul \u0026 Omar Akhrif – High Altitude 001","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B_Side.png?v=1762034905'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Shkedul_-_Yourmind_Snippet.mp3?v=1762034905',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Shkedul_-_Gravitation_Snippet.mp3?v=1762034904',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Omar_Akhrif_Marco_Mellere_-_Shady_Witness_Snippet.mp3?v=1762034905',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Omar_Akhrif_-_111_Snippet.mp3?v=1762034904'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\nHigh Altitude (HGH001)\n1x Vinyl 12\"\nElectronic, Acid, Electro, Progressive, Techno\nRelease date: 26 nov 2025","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52669894787399,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ASide.png?v=1762035021"},{"product_id":"muster-men-shattering-the-shutters-ep","title":"Muster Men - Shattering The Shutters EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/AOD020_2b4bae0a-9442-4d46-970b-1dee9d61d478.png?v=1762942387'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1._Muster_Men_-_Moving_Shady_Master_Digital_90sec_clip.mp3?v=1762941770',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2._Muster_Men_-_Electrical_Itch_Master_Digital_90sec_clip_2.mp3?v=1762941770',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1._Muster_Men_-_Et_Maintenant__Master_Digital_90sec_clip.mp3?v=1762941770',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2._Muster_Men_-_Tight_Arse_Master_Digital_90sec_clip.mp3?v=1762941770',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B3._Muster_Men_-_Muster_Tool_Master_Digital_90sec_clip.mp3?v=1762941769'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\nArt Of Dark (AOD020)\n1x Vinyl 12\"\nElectronic, Progressive, Tech House\nRelease date: 21 nov 2025","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52742164087111,"sku":null,"price":13.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/AOD020_2b4bae0a-9442-4d46-970b-1dee9d61d478.png?v=1762942387"},{"product_id":"various-artists-outcast-planet-compilation-vol-1-2x12","title":"Various Artists - Outcast Planet Compilation Vol.1 [2x12\"]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05.jpg?v=1764108149'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_A1.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_A2.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_B1.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_B2.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_C1.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_C2.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_D1.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_D2.mp3?v=1764108160',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05_D3.mp3?v=1764108160'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\n\u003cp\u003e\u003cbr\u003eOutcast Planet (OTP05)\u003cbr\u003e2x Vinyl 12\"\u003cbr\u003eElectronic, Techno\u003cbr\u003eRelease date: 9 apr 2025, Italy\u003c\/p\u003e\n\u003cp\u003eOutcast Planet Compilation vol.1 is the first in a series of volumes by Outcast Torino and features two records and 9 tracks, one for each resident DJ: Alex Dima, Bakked, Cristian Sarde, Denaila, Emanuele Montalto, Lorenzo Aribone, Munir Nadir, Paolo Macri and Paul Lution.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":52833860845895,"sku":null,"price":34.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OTP05.jpg?v=1764108149"},{"product_id":"otis-storm-in-the-matrix","title":"Otis - Storm In The Matrix","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Side_B.png?v=1766574435'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_SC.mp3?v=1766574427',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_SC.mp3?v=1766574427',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A3_SC.mp3?v=1766574427',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_SC.mp3?v=1766574426',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_SC.mp3?v=1766574427'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\n\u003cp\u003eOtis - Storm In The Matrix\u003cbr\u003eArt Of Dark (AOD021)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eElectronic, Electro, Progressive, Tech House\u003cbr\u003eRelease date: 30 jan 2026\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53019149009223,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Side_B.png?v=1766574435"},{"product_id":"villaca-trajano-campana-ep","title":"Villaça, Trajano - Campana EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CMPN001-SIDEA.png?v=1766576788'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Villaca_-_3_things_to_say_snippet_2min.mp3?v=1766576782',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Villaca_-_Facil_snippet_2min.mp3?v=1766576782',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Trajano_-_The_Hearse_snippet_2min.mp3?v=1766576783',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Trajano_-_Z_O_snippet_2min.mp3?v=1766576782'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\n\u003cp\u003eCampana Records (CMPN001)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eElectronic, Techno, Trance\u003cbr\u003eRelease date: 25 sep 2025, Brazil\u003c\/p\u003e\n\u003cp\u003eA new label is born. With artists based both in Barcelona and São Paulo, CAMPANA Records' first release showcases the personalities of two of its members with a split EP. On the A side, Villaça brings two techno-trance tracks made in 2023 for his live act, and after two years of testing these tracks all around Latin and North America, he arranged these high-energy pieces for this release! And on the other side, we have the always evolving, fresh, and intelligent dark grooves from Trajano - two tracks made with care that showcase his unique vision for dance floors. Above all, this release is about resilience, friendship, and dedication from two Brazilian artists who have a deep love for making people dance with underground music.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53019221590343,"sku":null,"price":15.25,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/CMPN001-SIDEA.png?v=1766576788"},{"product_id":"munir-nadir-mental-map-vinyl-only","title":"Munir Nadir - Mental Map [VINYL ONLY]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_back.jpg?v=1770375361'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_A1.mp3?v=1770375362',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_A2.mp3?v=1770375363',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_B1.mp3?v=1770375363',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_B2.mp3?v=1770375364'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\n\u003cp\u003eArtist: Munir Nadir\u003cbr\u003eDate: 20\/02\/2026\u003cbr\u003eFormat: 12\", Vinyl\u003cbr\u003eLabel: Odd One Tape\u003cbr\u003eSKU: Oddot04\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53287539704135,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ODDOT04_front.jpg?v=1770375362"},{"product_id":"roman-khropko-among-the-machines","title":"Roman Khropko - Among The Machines","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OBI03_art.png?v=1772431694'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Roman_Khropko_-_Glimpse_CUT.mp3?v=1772431752',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Roman_Khropko_-_Piece_Of_Truth_CUT.mp3?v=1772431752',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Roman_Khropko_-_Fractum_CUT.mp3?v=1772431751',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Roman_Khropko_-_Among_The_Machines_CUT.mp3?v=1772431751'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eArtist: Roman Khropko\u003cbr\u003eRelease Name: Among The Machines\u003cbr\u003eLabel: OBI Trackz\u003cbr\u003eCAT nr: OBI03\u003cbr\u003eReleasedate: 15 March 2026\u003cbr\u003eStyle: Minimal, Techno, Electro\u003c\/p\u003e\n\u003cp\u003eOBI03: Roman Khropko – Among The Machines\u003c\/p\u003e\n\u003cp\u003eRoman Khropko delivers four cuts balancing precision club mechanics with flashes of emotion. The record moves between stripped minimal techno and warmer electro, designed to unfold gradually.\u003cbr\u003eThe A side opens with Glimpse, a straight-forward roller driven by tight drums and a suspenseful build. Piece of Truth follows with a funkier swing, blending elastic basslines with subtle tech house inflections that keep things in motion.\u003cbr\u003eOn the B side, Fractum settles into a hypnotic minimal tech mood, laying steady groundwork for an extended club stretch. The closing track, Among The Machines, shifts into emotional electro territory, carrying melodic tension that leaves a melancholic aftertaste.\u003cbr\u003eA concise and functional toolset for the dancefloor. This is one to stay in your bag for a long time.\u003cbr\u003e\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53432317411655,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OBI03_art.png?v=1772431694"},{"product_id":"v-a-cartulis-music-15th-anniversary-compilation-crtl-sp01-2-12","title":"V.A - Cartulis Music 15th Anniversary Compilation\u2028\/ CRTL-SP01.2\u2028- 12\"","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2A.png?v=1772516225'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Le_Trotts_-_Thrilling_Bell.mp3?v=1772516342',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Vass_-_Alpha_Attack.mp3?v=1772516342',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Radioactive_Man_-_Be_All_And_End_All.mp3?v=1772516342',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Gwenan_Walrus_-_Snow_Diesel.mp3?v=1772516341'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eArtist: Various Artists\u003cbr\u003eTitle: Cartulis Music 15th Anniversary Compilation\u003cbr\u003eLabel: Cartulis Music\u003cbr\u003eCat No: CRTL-SP01.2\u003cbr\u003eCountry: UK\u003cbr\u003eFormat: 12” Vinyl\u003c\/p\u003e\n\u003cp\u003eA1. Le Trotts – Thrilling Bell – 06:54\u003cbr\u003eA2. Vass – Alpha Attack – 06:04\u003cbr\u003eB1. Radioactive Man – Be All And End All – 06:46\u003cbr\u003eB2. Gwenan \u0026amp; Walrus – Snow Diesel – 05:47\u003c\/p\u003e\n\u003cp\u003eRecord 2 of the Cartulis Music 15th Anniversary compilation, marking fifteen years of independent activity across club culture, events, and releases.\u003cbr\u003eCartulis 15th Anniversary Compilation — 15 years of rhythm, risk, and reverie. Still dancing, always forward.\u003cbr\u003e\u003cbr\u003eMastered by Alberto Pretto\u003cbr\u003e\u003cbr\u003eArtwork by Samantha Millows\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53443193733447,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2A.png?v=1772516225"},{"product_id":"andy-luff-herra-picnic-013","title":"Andy Luff, Herra - Picnic 013","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Picnic-013-Artwork-_B.png?v=1772608298'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1.-Andy-Luff-_-Herra-Life_s-Way-_Snippet.mp3?v=1772608294',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1.-Andy-Luff-_-Herra-The-Equinox-_Snippet.mp3?v=1772608296',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2.-Andy-Luff-_-Herra-You-Must-Evacuate-_Snippet.mp3?v=1772608295'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eAndy Luff \u0026amp; Herra return to the picnic imprint 10 releases after their first offering.\u003c\/p\u003e\n\u003cp\u003eAndy Luff, Herra: Picnic 013\u003cbr\u003ePicnic Records (PICNIC013)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eHouse, Electro, Progressive\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53450723819847,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Picnic-013-Artwork-_A.png?v=1772608298"},{"product_id":"the-don-3-of-them-1","title":"The Don - 3 of Them","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/THEDON04-Mockup.png?v=1775929942'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A-2min.mp3?v=1775929940',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1-2min.mp3?v=1775929940',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2-2min.mp3?v=1775929941'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eArtist: The Don\u003cbr\u003eTitle: 3 of Them\u003cbr\u003eLabel: The Don\u003cbr\u003eCat No: THEDON04\u003cbr\u003eCountry: UK\u003cbr\u003eFormat: 12” Vinyl\u003cbr\u003eGenre: Techno, Tech House, Electro\u003c\/p\u003e\n\u003cp\u003eAfter some time, The Don returns to the series for number 4, with 3 previously unreleased tracks all recorded between the 90’s and early 2000’s. Remastered from the original CD and ready to spin many years later.\u003c\/p\u003e\n\u003cp\u003eLimited to 300 copies.\u003c\/p\u003e\n\u003cp\u003eRemastered \u0026amp; cut with Marco at Analogcut.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53687881269575,"sku":null,"price":15.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/THEDON04-Mockup.png?v=1775929942"},{"product_id":"reptant-ballet-robotique","title":"Reptant – Ballet Robotique","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'PASTE_COVER_URL_HERE'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_Minutes_A1_OYSTER75.mp3?v=1775931692',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_Minutes_B1_OYSTER75.mp3?v=1775931692',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_Minutes_B2_OYSTER75.mp3?v=1775931692'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\nArtists: Reptant\nLabel: Kalahari Oyster Cult\nCatalog Number: OYSTER75\nFormat: 12\"\nRelease Date: 01.05.2026\nGenre: Electro\n\nRelease 75. Reptant’s third. The reptilian overlord surfaces only once every 25 – right on the jubilee, without fail.\n\nCombining menace and kitsch the way only the Rotterdam greats do so effortlessly, he comes in smooth af on the opening cut. Mainframe-tapping machine funk, almost sounding like the Antipodean lovechild of Kraftwerk and Egyptian Lover.\n\nFrom there, laced with spite and insectoid detail. Noirish cybernetics delivered with genuine vigour, all across a triple-pronged strike of electro excellence. Properly aerodynamic.\nNot a tribute to a classic period – rather, a continuation of what the genre’s forebears built. A tried and tested formula that never loses bite, truly heralding Reptant as a standard bearer for electro in the modern era.\n\nThe cold-blooded one, right on schedule.","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53687923016007,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Oyster75_Mockup_A.png?v=1775931671"},{"product_id":"general-electrix-3","title":"General Electrix - 3","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SOFYI-03_O.jpg?v=1775931651'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1_Thru_Shifter.mp3?v=1775931659',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_System_3.mp3?v=1775931659',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3_Leap.mp3?v=1775931659',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4_Phase_3.mp3?v=1775931659'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\nMore G.D.M... General Electrix-Secret Order synergy continues with the third EP '3'. Consisting of four night-drives for selected purposes.","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53687956635975,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SOFYI-03_O.jpg?v=1775931651"},{"product_id":"roman-khropko-modern-conversation","title":"Roman Khropko - Modern Conversation","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-04-11_om_20.36.35.png?v=1775932614'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1-Such_Activity.mp3?v=1775932642',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2-The_Final_Argument_Dark_Mix.mp3?v=1775932642',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3-Upgrade_Remind_Me_In_8_Hours.mp3?v=1775932642',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4-Forgetting_The_Time.mp3?v=1775932641'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\nWicked Bass (WB032)\n1x Vinyl 12\"\nRelease date: 27 mrt 2026, Ukraine\n\nRoman Khropko’s latest release leans into a restrained, late-night tension, balancing tightly coiled energy with hypnotic atmosphere and head- down groove. A subtle yet confident statement by the Ukrainian producer rooted in control rather than excess.","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53687978426695,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-04-11_om_20.36.35.png?v=1775932614"},{"product_id":"pridi-nesreh001","title":"Pridi - NESREH001","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/brainfront2.jpg?v=1776106211'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1_Disembarkation.mp3?v=1776106219',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_Hollow_Whispers.mp3?v=1776106219',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3_Globetrotter.mp3?v=1776106219',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4_Liminal.mp3?v=1776106219'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eLabel: Nesreh\u003cbr\u003eCatalogue: NESREH001\u003cbr\u003eFormat: 12inch\u003cbr\u003eRelease Date: WK 18, 27 Apr 2026\u003cbr\u003eStock: Pre-order\u003c\/p\u003e\n\u003cp\u003eThe Hague meets Warsaw for Nesreh's inaugural release. Four deep and muddy cuts from the trenches, for the late (or early) hours. Mastered by Isabel Schroer at Olo Mastering.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53698766930247,"sku":null,"price":15.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/brainfront2.jpg?v=1776106211"},{"product_id":"b-ai-blue-or-red","title":"B.ai - Blue Or Red","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/VOSTRA008_FACE_B_Mockup.jpg?v=1776248872'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1-Act5_SNIPPET.mp3?v=1776248388',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_-_Glance_back_SNIPPET.mp3?v=1776248388',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1-Blue_or_Red_ft._Diego_Santana_SNIPPET.mp3?v=1776248388',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2-Danse_ft._David_Agrella_SNIPPET.mp3?v=1776248388'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eLabel: Cosa Vostra – VOSTRA008\u003cbr\u003eFormat: Vinyl, 12\", EP\u003cbr\u003eCountry: France\u003cbr\u003eReleased: 8 May 2025\u003cbr\u003eGenre: Electronic\u003cbr\u003eStyle: Electro, Acid, Techno\u003c\/p\u003e\n\u003cp\u003eThe talented Chinese artist B.AI lands on Cosa Vostra with her \"Blue Or Red\" EP! After following her work for some time, we’re excited to finally welcome her to the label. This EP brings together four tracks that mix electro and techno with subtle acid touches and a beautiful emphasis on melody. The release also features two collaborations with Diego Santana \u0026amp; David Agrella. Blue Or Red... Which path will you take ?\u003c\/p\u003e\n\u003cp\u003ereleased May 9, 2025\u003c\/p\u003e\n\u003cp\u003eMastered by Justin Drake\u003cbr\u003eManufactured by KPM\u003cbr\u003eDistributed by KMA60\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53706120266055,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/VOSTRA008_FACE_A_Mockup_1.jpg?v=1776248394"},{"product_id":"cignol-guidance-release-vinyl-only","title":"Cignol - Guidance Release [VINYL ONLY]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009.jpg?v=1776512572'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009_A1._Cignol_-_Guidance_Release.mp3?v=1776512577',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009_A2._Cignol_-_Galactic_Neighborhood.mp3?v=1776512577',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009_B1._Cignol_-_Near_Earth_Objects.mp3?v=1776512577',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009_B2._Cignol_-_Modularity.mp3?v=1776512577'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eArtist: Cignol\u003cbr\u003eTitle: Guidance Release \u003cbr\u003eLabel: Distant Worlds\u003cbr\u003eCat No: DWT009\u003cbr\u003eFormat: 12” Vinyl Only\u003c\/p\u003e\n\u003cp\u003eTracklist: \u003cbr\u003eA1. Guidance Release\u003cbr\u003eA2. Galactic Neigborhood\u003cbr\u003eB1. Near Earth Objects\u003cbr\u003eB2. Modularity\u003c\/p\u003e\n\u003cp\u003eThe stars align as Dublin’s Cignol graces Distant Worlds with a heavyweight transmission of rich acidic electro.  Cosmic hardware voyages are the order of the day: wallshaking mechanical bassweight complimented perfectly by beautiful, intricate melodies. \u003c\/p\u003e\n\u003cp\u003eEach track paints a beautiful picture of interstellar wonder perfectly aligned with what we have come to expect from the Distant Worlds stable. The galaxy’s dancefloors should seriously be considering some structural reinforcement as this reléase is sure to cause considerable damage.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53732660543815,"sku":null,"price":16.49,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/DWT009.jpg?v=1776512572"},{"product_id":"davide-leone-edp005","title":"Davide Leone - EDP005","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_6d9420fc-d29a-48c6-b1cb-118a76910107.jpg?v=1778013860'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1201939a.mp3?v=1778013880',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1201939b.mp3?v=1778013887',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1201939c.mp3?v=1778013892',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1201939d.mp3?v=1778013897'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003etitle: EDP005\u003cbr\u003elabel: eau de parfum\u003cbr\u003eartist: Davide Leone\u003cbr\u003ecatalog_number: EDP005\u003cbr\u003eformat: excl Vinyl\u003c\/p\u003e\n\u003cp\u003edescription\u003cbr\u003eRaw techno grooves meet sharp electro rhythms, colored by subtle Italo-disco undertones. Analog basslines, crisp drum machines and retro-futuristic synth work built for late-night dancefloors. Dark, hypnotic and strictly club-ready.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53857490141511,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_6d9420fc-d29a-48c6-b1cb-118a76910107.jpg?v=1778013860"},{"product_id":"innershades-heritage-volume-2","title":"Innershades - Heritage Volume 2","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ALT023_DIGITAL_CORRECTED_1.jpg?v=1778240552'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1_Mind_State.mp3?v=1778240662',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2_System_Breakdown.mp3?v=1778240667',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3_Fuse_Memory.mp3?v=1778240673',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4_Rhythm_Composer.mp3?v=1778240678'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eLabel: Altered Circuits\u003cbr\u003eCatalogue: ALT023\u003cbr\u003eEAN Code: No EAN code\u003cbr\u003eFormat: 12 inch\u003c\/p\u003e\n\u003cp\u003eThree years after the release of Volume 1, Innershades returns to home turf with a second entry in his Heritage series. The New Beat territory that its predecessor tackled serves as the starting point for the A-side of Volume 2 as well. The glistening arpeggios and choir patches on \"Mind State\", alongside the unyielding kicks, alarm-like synth lines and plodding tempo of \"System Breakdown,\" reaffirm how the genre's hallmarks smoothly align with the artist's own inclinations. The B-side draws from the broad spectrum of styles that emerged a bit later, in the beginning of the nineties, when it seemed the dance floor would move unimpeded between and bridge genres, its boundaries often not as firmly established. \"Fuse Memory\" nudges the pace forward, driven by the 909 and a staple hypnotic lead. When the drums come to a halt, a 303 emerges to flesh out the break. \"Rhythm Composer\" continues in a similar early techno vein, but pulls the track into outer space via its formant-heavy leads and Detroit-tinged sci-fi sweeps. On ALT023 Innershades appears in fine fettle, providing another batch of up-front club tracks that approach history as motion rather than memory, translating the past into forward momentum.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53879991075143,"sku":null,"price":21.5,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/ALT023_DIGITAL_CORRECTED_1.jpg?v=1778240552"},{"product_id":"rydeen-gauvain-yamoc-roman-kropko-ghost-codes","title":"RYDEEN \/ GAUVAIN \/ YAMOC \/ ROMAN KROPKO - Ghost Codes","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/GLSPV002_B_Side.png?v=1778437502'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1._Rydeen_-_Ui_Me_VNLMST.mp3?v=1778437523',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2._Gauvain_-_latent_smoke_4_VNLMST.mp3?v=1778437528',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1._Yamoc_-_Trancegate_VNLMST.mp3?v=1778437535',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2._Roman_-_Ti_Si_VNLMST.mp3?v=1778437540'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eFormat: 12\"\u003cbr\u003eCat: GLSPV 002\u003cbr\u003eReleased: 13 Apr 26\u003cbr\u003eGenre: Techno\u003c\/p\u003e\n\u003cp\u003eGlispy Records follow their debut with a second various-artist drop, keeping proceedings practical and floor-fired. Rydeen's 'Ui Me' opens on a dub siren song turned deep ocean-trench dive, low synth brasses breathing like the gills of a gudgeon; Gauvain's 'Latent Smoke' sits even deeper, as snappier drums and chuting echo effects stoke up a strange stir of science-fiction friction. Our flip side choice has to be Roman Kropko's 'Ti+Si', with a dark, dappled rhythm with an intricacy difficult to match, though it still brings its share of gruffness.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":53889908277575,"sku":null,"price":15.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/GLSPV002_A_Side.png?v=1778437502"},{"product_id":"kuyateh-farewell-ep","title":"Kuyateh - Farewell EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/back_315c142f-ae42-4c87-9b67-60c733a3445c.jpg?v=1781100227'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1207889a.mp3?v=1781100540',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1207889b.mp3?v=1781100545',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1207889c.mp3?v=1781100550',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1207889d.mp3?v=1781100555'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eTitle: Farewell EP\u003cbr\u003eLabel: Pressure Traxx\u003cbr\u003eArtist: Kuyateh\u003cbr\u003eCatalog number: PTX033\u003cbr\u003eFormat: excl Vinyl\u003c\/p\u003e\n\u003cp\u003eAfter his Instruction EP on Silver Series in 2023, Kuyateh makes his debut on Pressure Traxx with some of his finest work to date.\u003cbr\u003e \u003cbr\u003eA farewell to Julien, who left far too early.\u003cbr\u003e \u003cbr\u003eThis one is for you...\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54126300037447,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_4404329e-4b03-49db-a140-20ffebeff1d1.jpg?v=1781100227"},{"product_id":"ulo-s-visitors-of-the-low-end","title":"Ulo S. - Visitors of the Low End","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-06-17_om_19.24.38.png?v=1781717108'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1-Visitors_From_The_Low_End.mp3?v=1781717086',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2-Can_You_Taste_The_Bass.mp3?v=1781717091',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3-Eight_Oh_Eight_Stay_Up_Late.mp3?v=1781717095'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eDelirious_Records (DeLiRious_003)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eRelease date: 15 jul 2026, Ukraine\u003c\/p\u003e\n\u003cp\u003eWhere are we? Entrapped in the sonic labyrinths built by one of the key figures of Melbourne (Naarm)’s underground scene - Reptant. Across this three- tracker, he reveals a more tech-house-driven side under his Ulo S. alias, delivering 808-powered workouts woven with alien low-end mutations and hallucinatory atmospheres. Splitting time between his hometown of Naarm and a relentless touring schedule, Reptant’s reputation now precedes him worldwide as one of the most in-demand live acts. We were lucky to catch him at exactly the right moment - just as he returned home from tour, reunited with a newly acquired RE-808. A faithful replica of an instrument that’s been circulating for about 45 years, the 808 continues to prove it still has vast unexplored territory, especially in the hands of such a visionary producer. We are very proud to welcome Lucas \/ Reptant \/ Ulo S. to Delirious Records for the label’s third release.\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54181961826631,"sku":null,"price":16.99,"currency_code":"EUR","in_stock":false}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-06-17_om_19.24.23.png?v=1781717109"},{"product_id":"jovak-07-20-am","title":"Jovak - 07:20 am","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OG02_A_Back_cover.jpg?v=1782406337'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Jovak_-_Caught_Out.mp3?v=1782406414',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Jovak_-_Mod_In_Deb.mp3?v=1782406421',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Jovak_-_07_20_am.mp3?v=1782406427',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Jovak_-_07_20_am_Chris_Ferreira_remix.mp3?v=1782406433'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eArtist: Jovak\u003cbr\u003eTitle: 07:20 am\u003cbr\u003eLabel: ov guidance\u003cbr\u003eCat No: OG02\u003cbr\u003eFormat: 12” Vinyl\u003cbr\u003eRelease date: Late June 2026\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eTracklist: \u003cbr\u003eA1 Jovak - Caught Out                                           \u003cbr\u003eA2 Jovak - Mod In Deb\u003cbr\u003eB1 Jovak - 07:20 am\u003cbr\u003eB2 Jovak - 07:20 am (Chris Ferreira remix)\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eShort introtext\u003c\/p\u003e\n\u003cp\u003eov guidance 02 brings works from Jovak, a Manchester-based producer whose tracks emerge from the space between night and day. Chris Ferreira, a Brussels-based electronic music artist, delivers a B-side remix, crafted (not) far from his bed.\u003c\/p\u003e\n\u003cp\u003eThe origins of this EP trace back to October 2025, when Ben Kamal was invited to play at Scuttle: Jovak’s own party in Manchester. As the night dissolved into morning, a small circle drifted back to Jovak’s place. Records kept turning until dawn, the room hovering somewhere between exhaustion and elation.\u003c\/p\u003e\n\u003cp\u003eAfter the weekend, Jovak found himself alone in the studio, at 07:20 on Monday: a rare moment unlike any before. Fragments of what had been heard — basslines, textures, half-remembered transitions — still circulating in his mind. What followed emerged from that in-between state; a timestamp became a title.\u003c\/p\u003e\n\u003cp\u003eOn the A-side: 'Caught Out' is a theme for stomping, tireless feet. Hi-hats swerve overhead like surveillance cameras. Tension mounts as synths and basslines roll over each other. Distant thunder is bitcrushed into static on the horizon. \u003c\/p\u003e\n\u003cp\u003e‘Mod In Deb’ dresses itself layer by layer. Hi-hats flutter, a driving bassline locks in, a jacking rhythm takes hold. A pulsating, hypnotic synth and airy pads turn this track into a timeless thing that only deepens with each listen.\u003c\/p\u003e\n\u003cp\u003eIn '07:20 am' on B1, glistening hi-hats ricochet off the walls. A primal bassline awakens, stretching out slowly. Acidic drips and ripples warble through space. Halfway through, a saw-like synth line cuts through it all. Chris Ferreira dismantles and rebuilds the original, dipping it in spectral warmth. Rhythms layer and scatter like windswept leaves.\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54231282581831,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/OG02_A_Front_cover.jpg?v=1782406337"},{"product_id":"booh-arts-ep","title":"BOOH – Arts EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FACE_A.jpg?v=1783098207'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PREVIEW_1-A1._BOOH_-_Robotical_Ashes_M18_4824pre.mp3?v=1783098857',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PREVIEW_2-BOOEP01_A2_BOOH_-_Heavy_Tears_DDA_24bit_44kHz_MASTER.mp3?v=1783098863',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PREVIEW_3-BOOEP01_B1_BOOH_-_Rust_DDA_24bit_44kHz_MASTER.mp3?v=1783098870',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/PREVIEW_4-BOOEP01_B2_BOOH_-_Souls_Of_The_Evening_DDA_24bit_44kHz_MASTER.mp3?v=1783098874'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eFor the label’s new series (BOOEP), and it’s the founder BOOH who opens the dance. Precise, minimalist grooves, crushing bass, robotic vocals and a dark atmosphere form the signature of this EP, which erases the boundaries between techno and tech‑house.\u003c\/p\u003e\n\u003cp\u003eWritten Produced \u0026amp; mix by BOOH\u003cbr\u003emastering By DDA\u003cbr\u003eArtwork by Antoine Provost\u003cbr\u003eDistributed by One Eye Witness\u003c\/p\u003e\n\u003cp\u003eArtist: BOOH\u003cbr\u003eTitle: BOOH\u003cbr\u003eLabel: BOOOoo! Records\u003cbr\u003eCatalog Number: BOOEP01\u003cbr\u003eFormat: 12\"\u003cbr\u003eRelease Date: 08.06.2026\u003cbr\u003eGenre: Tech House, Techno\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54285002834247,"sku":null,"price":17.49,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/FACE_B.jpg?v=1783098210"},{"product_id":"kebab-traume-mecha-funk","title":"Kebab Traume - Mecha Funk","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-07-03_om_19.29.02.png?v=1783099756'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1-Shift.mp3?v=1783099761',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2-517.mp3?v=1783099768',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3-Mecha_Funk.mp3?v=1783099773',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4-Dungeon_Tune.mp3?v=1783099779'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eOverground presents Mecha Funk, a new EP by Vitalii Androv aka Kebab Traume. A deep and hypnotic journey that unfolds through groovy rhythms and shadowy atmosphere.\u003c\/p\u003e\n\u003cp\u003eOverground Recordings (OVG007)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eRelease date: 21 jun 2026, Germany\u003cbr\u003eOverground Recordings (OVG007)\u003c\/p\u003e\n\u003cp\u003e1x Vinyl 12\"\u003cbr\u003eRelease date: 21 jun 2026, GermanyLimited pressing 150\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54285042942279,"sku":null,"price":17.49,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-07-03_om_19.28.52.png?v=1783099758"},{"product_id":"yansima-catchplay-ep","title":"Yansima - Catchplay EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-07-12_om_11.30.02.png?v=1783848638'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1-Basskickball.mp3?v=1783848519',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/2-Catchplay.mp3?v=1783848525',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/3-Once_Danca.mp3?v=1783848530',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/4-Stylish_Steps.mp3?v=1783848534'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eKalmar Records is a Berlin-based imprint that presents its debut vinyl-only release, featuring the talented artist from Ukraine, Yansima. This jam reveals his full potential through four versatile grooves. This release is strictly limited to 300 copies.\u003c\/p\u003e\n\u003cp\u003eKalmar (KLMR001)\u003cbr\u003e1x Vinyl 12\"\u003cbr\u003eRelease date: 10 aug 2026, Ukraine\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54330119651655,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Scherm_afbeelding_2026-07-12_om_11.30.02.png?v=1783848638"},{"product_id":"eli-zem-kiss-my-music","title":"Eli Zem - Kiss My Music","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'PASTE_COVER_URL_HERE'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1234705a.mp3?v=1783871625',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1234705b.mp3?v=1783871631',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1234705c.mp3?v=1783871642',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1234705d.mp3?v=1783871636'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eBorn from the idea of capturing a musical fragment from Eli Zem’s latest live set and transforming it into a four-track journey, Kiss My Music creates a fluid sonic passage designed to make people dance while immersing them in a unique experience.\u003c\/p\u003e\n\u003cp\u003eBlending hypnotic grooves, raw energy, and refined textures, the EP reflects the distinctive spirit of the Disordine School movement and its vision of underground electronic music.\u003c\/p\u003e\n\u003cp\u003etitle: Kiss My Music\u003cbr\u003elabel: Cavilar\u003cbr\u003eartist: Eli Zem\u003cbr\u003ecatalog_number: CAV001\u003cbr\u003eformat: excl Vinyl\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54330285195591,"sku":null,"price":18.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_6d972e6c-e659-4d62-b76e-4183626a830a.jpg?v=1783871595"},{"product_id":"jovak-version-2","title":"Jovak - Version 2","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_436db740-2a63-45c5-a4e3-3d9d75066232.jpg?v=1783973688'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1205927a.mp3?v=1783973725',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1205927b.mp3?v=1783973732',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1205927c.mp3?v=1783973741',\n'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1205927d.mp3?v=1783973737'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cp\u003eManchester based Jovak, co-runner of Scuttle \u0026amp; resident of Headspin takes reigns of Real Interactions' sub label Psychedelic Renaissance's first release and his first vinyl release. \u003cbr\u003eA 4 track EP spanning from head down electric infused techno on the A side, primed for peak party time to a B side featuring minimal techno \u0026amp; tech house sequel tracks. All containing drops of acid to deep dive into, rolling baseline, melodic synths \u0026amp; vibrating acidic squelch.\u003c\/p\u003e\n\u003cp\u003etitle: Version 2\u003cbr\u003elabel: Psychedelic Renaissance\u003cbr\u003eartist: Jovak\u003cbr\u003ecatalog_number: PSYREN001\u003cbr\u003eformat: excl Vinyl\u003cbr\u003e\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54337031274823,"sku":null,"price":18.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_436db740-2a63-45c5-a4e3-3d9d75066232.jpg?v=1783973688"},{"product_id":"innuendo-cults-of-baghdad-dual-consciousness","title":"Innuendo \u0026 Cults Of Baghdad - Dual Consciousness","description":"\n\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A_fb08ef6c-360f-4fa7-95d2-baa7df2ed4d2.png?v=1783975678'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Innuendo_-_XTC.mp3?v=1783975926',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_Innuendo_-_Alarm.mp3?v=1783975932',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Innuendo_-_Spoks_Fantasy.mp3?v=1783975946',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/C1_Cults_of_Baghdad_-_Spiral_of_the_Mind.mp3?v=1783975985',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Innuendo_-_Whales.mp3?v=1783975941',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/C2_Cults_of_Baghdad_-_Geister_der_Vergangenheit.mp3?v=1783975980'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\u003cp\u003eCartulis Music returns with CRTL018, a double-record release shaped by Manuel Siegrist. Dual Consciousness brings together two distinct voices operating at diﬀerent ends of the same corridor: Innuendo and Cults Of Baghdad. The release is composed of two separate records, a 12” by Innuendo and a 10” by Cults Of Baghdad, each exploring its own sonic language through diﬀerent alter egos.\u003c\/p\u003e\n\u003cp\u003eThe Innuendo 12” delivers four cuts moving between rolling club pressure and dreamlike psychedelia. “XTC” sets the tone with hypnotic sequences, rolling basslines and machine-driven propulsion, while “Whales” explores a more emotional and trance-inducing territory, connecting proto-techno textures with immersive late-nightatmospheres. \u003c\/p\u003e\n\u003cp\u003eAt the same time, tracks like “Alarme” and “Spock’s Fantasy” introduce a looser and more house-oriented feeling, balancing tension with playful melodies and psychedelic movement.\u003cbr\u003e\u003cbr\u003eThe Cults Of Baghdad 10” dives into a world of shadowy synth work, carrying a strong 80s flavour infused with punk attitude and new wave aesthetics. “Spiral Of The Mind”, written, produced and voiced by the man himself, unfolds through immersive rhythms and melancholic atmospheres with a distinctly cinematic touch. Closing track “Geister der Vergangenheit” continues this descent into haunted territory, channeling ghostly melodies and cold-wave energy suspended somewhere between memory and prophecy.\u003c\/p\u003e\n\u003cp\u003eRecorded using a combination of classic hardware machines and improvised studio processes, Dual Consciousness reflects a shared fascination with frequencies as ritual, repetition as hypnosis and dance music as psychological storytelling.\u003cbr\u003eCRTL018 continues Cartulis Music’s ongoing exploration of underground electronic music, records aimed as much at solitary listening as they are at the dance floor.\u003c\/p\u003e\n\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cstrong\u003eArtist: Innuendo \u0026amp; Cults Of Baghdad\u003c\/strong\u003e\u003cbr\u003eTitle: Dual Consciousness\u003cbr\u003eLabel: Cartulis Music\u003cbr\u003eCat No: CRTL018\u003cbr\u003eCountry: UK\u003cbr\u003eFormat: 12” \u0026amp; 10” Vinyl\u003cbr\u003eGenre: New Wave, New Beat, House\u003cbr\u003eInnuendo – 12”\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eCredits\u003c\/strong\u003e\u003cbr\u003eWritten and recorded by Innuendo\u003cbr\u003eMixed by Nicolas Balmer and Manuel Siegrist\u003cbr\u003eText by Manuel Siegrist\u003cbr\u003eVideo and photos by Seraphin Maeder\u003cbr\u003eMastering by Keith Tenniswood\u003cbr\u003eCover art by Gerardo Trotti\u003cbr\u003eGraphics by Activity Vision\u003cbr\u003eDistributed by Outside In\u003cbr\u003eCreative Director Unai Trotti\u003c\/p\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54337507983687,"sku":null,"price":33.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A_fb08ef6c-360f-4fa7-95d2-baa7df2ed4d2.png?v=1783975678"},{"product_id":"elia-nafzger-music-makes-me-high-ep","title":"Elia Nafzger - Music Makes Me High EP","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_97a27c75-4dcd-4e25-bda0-3b3db102bdfa.jpg?v=1785156506'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1218671a.mp3?v=1785156539',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1218671b.mp3?v=1785156547',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1218671c.mp3?v=1785156553',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1218671d.mp3?v=1785156558'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cdiv\u003e\u003cspan\u003eAfter a few years of silence, Underplay (Playedby sub-label) is back with its fourth release, welcoming Elia Nafzger and his Music Makes Me High EP.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eA rising talent with a strong identity as both DJ and producer, Elia’s music has been regularly played by key figures such as Rhadoo and Praslea. Also part of the Sunrise Agency roster, he has already appeared at Sunwaves, Guesthouse and Supermarket Zurich.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eArtist: Elia Nafzger\u003cbr\u003eLabel: Underplay\u003cbr\u003eCatalog: underplay04\u003cbr\u003eDate: 01\/06\/2026\u003cbr\u003eFormat:12\", Vinyl\u003cbr\u003eTags: Tech, Vinyl Only\u003c\/span\u003e\u003c\/div\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54437745656135,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/back_46dff17d-fb50-44d2-9919-43b1b209fa1f.jpg?v=1785156506"},{"product_id":"various-chapter-georgia","title":"Various - Chapter Georgia","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/back_9ccea21e-3111-4c11-a806-7c6bdda9bf88.jpg?v=1785160933'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1228867a.mp3?v=1785161442',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1228867b.mp3?v=1785161448',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1228867c.mp3?v=1785161458',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/1228867d.mp3?v=1785161453'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cdiv\u003e\u003cspan\u003eArtists: Hatsvali, DJ Astrobee, Rydeen \u0026amp; Toko K\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eTitle: Chapter Georgia\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eLabel: Fushin Records\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eCatalogue: FR001\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eEAN code: Geen EAN-code gevonden\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eFormat: 12\" Vinyl, 33 RPM\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eRelease Date: WK 32, 07 Aug 2026\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eGenre: Minimal, Tech House, Progressive House, Electro, Techno\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eType: Vinyl Only \/ Various Artists Compilation\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003ePressing: EU Original\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e“Chapter Georgia” is a various artists compilation showcasing the diversity of Georgia’s electronic underground.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eRather than following a single stylistic direction, the release was conceived as a platform for individual expression. Each artist brings their own sound, vision and energy, creating a collection of distinct tracks that reflect the richness and variety of the scene.\u003c\/span\u003e\u003c\/div\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54438866551111,"sku":null,"price":17.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/front_41ae7583-c123-4f5b-9515-bcdb43f19ddc.jpg?v=1785160934"},{"product_id":"hypno-disc-robot-wars","title":"Hypno Disc – Robot Wars","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Front_Sleeve.png?v=1785161910'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A1_Robot_Wars.mp3?v=1785163060',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/A2_REF_BOT.mp3?v=1785163066',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B1_Firestorm.mp3?v=1785163074',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/B2_Matilda.mp3?v=1785163080'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cdiv\u003e\u003cspan\u003eHara Discs is proud to present the first EP from Sheffield-based DJ Harry Shackleton, co-owner of Grub Records and one half of DJ duo Wow \u0026amp; Flutter. This release draws influence from their longstanding residency at underground electro party Control., melding together sounds which have made this one of the North of England’s best kept secrets for the past 7 years. In an extremely long-winded and uncertain move, he has finally donned his rather fetching production hat and completely self generated the alias Hypno Disc with which he aims to unleash some music that is 100% OK.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eThe EP and alias are a homage to the late 90s and early 00s TV show Robot Wars. The title track combines the carnage of Craig Charles with something a bit UK and tribal. The remaining tracks bear the names of robots which took part in the wars. These are written from the perspective of the robots and as such are internal monologues of what each robot was thinking. The concept comes from an early fascination with this show and how it made the artist feel as someone growing up in the UK around 2000.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eWe hope you enjoy this release. Complaints will be tolerated.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eCEASE!!!\u003c\/span\u003e\u003c\/div\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54439881703751,"sku":null,"price":20.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/Front_Sleeve.png?v=1785161910"},{"product_id":"das-firmament-malware-bizarre","title":"Das Firmament - Malware Bizarre [vinyl only, limited release]","description":"\u003c!-- ======= ORBIT WAX - TRACKLIST TEMPLATE (paste \u0026 go) ======= --\u003e\n\u003cstyle\u003e\n  \/* === Tracklist met achtergrond-art, lichte overlay \u0026 custom progress === *\/\n  .tracklist{--text:#e5e7eb;--muted:#cbd5e1;--accent:#cbd5e1}\n  .tracklist.bg-art{position:relative;border-radius:14px;overflow:hidden;margin:10px 0}\n  .tracklist.bg-art::before,\n  .tracklist.bg-art::after{\n    content:\"\";position:absolute;inset:0;z-index:0;pointer-events:none; \/* laat klikken door *\/\n  }\n  .tracklist .inner{position:relative;z-index:1;padding:16px}\n\n  .tracklist-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--text)}\n  .tracklist-title{font-weight:700;font-size:1.05rem}\n  .tracklist-count{color:var(--muted);font-size:.95rem;margin-left:.5rem;font-weight:500}\n  .tracklist-btn{border:1px solid var(--accent);background:rgba(255,255,255,.06);color:var(--text);padding:6px 10px;border-radius:8px;cursor:pointer}\n  .tracklist-btn[disabled]{opacity:.6;cursor:not-allowed}\n\n  .tracklist-list{list-style:none;margin:0;padding:0;border-radius:10px;overflow:hidden}\n  .tracklist-item{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;color:var(--text);background:rgba(15,23,42,.28);border-bottom:1px solid rgba(203,213,225,.08)}\n  .tracklist-item:nth-child(even){background:rgba(15,23,42,.22)}\n  .tracklist-item:hover{background:rgba(203,213,225,.12)}\n  .tracklist-item .state{width:22px;text-align:center;opacity:.9}\n  .tracklist-item.active{outline:1px solid rgba(203,213,225,.4); background:rgba(203,213,225,.18)}\n\n  \/* Voortgangsbalk *\/\n  .playerbar{display:flex;align-items:center;gap:10px;margin-top:10px;color:var(--muted);font-size:.9rem}\n  .progress{position:relative;height:6px;flex:1;background:rgba(203,213,225,.25);border-radius:999px;cursor:pointer}\n  .progress-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:999px;background:rgba(203,213,225,.9)}\n  .progress-thumb{position:absolute;top:50%;transform:translate(-50%,-50%);width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25)}\n  .time{white-space:nowrap;min-width:80px;text-align:right}\n\n  .toast{position:absolute;right:12px;bottom:12px;background:rgba(0,0,0,.6);color:#fff;padding:6px 10px;border-radius:8px;font-size:.85rem}\n  .sr-only{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}\n\n  @media (prefers-color-scheme: light){\n    .tracklist{--text:#0f172a;--muted:#334155;--accent:#94a3b8}\n    .tracklist-btn{background:rgba(255,255,255,.7)}\n    .tracklist-item{background:rgba(255,255,255,.55);border-bottom:1px solid rgba(51,65,85,.12)}\n    .tracklist-item:nth-child(even){background:rgba(255,255,255,.48)}\n    .tracklist-item.active{outline:1px solid rgba(51,65,85,.28);background:rgba(255,255,255,.72)}\n    .progress{background:rgba(51,65,85,.15)}\n    .progress-fill{background:rgba(51,65,85,.8)}\n    .progress-thumb{background:#0f172a}\n  }\n\u003c\/style\u003e\n\n\u003c!-- Container --\u003e\n\u003cdiv class=\"tracklist bg-art\" id=\"tracklist-ORBITWAX\"\u003e\n  \u003cdiv class=\"inner\"\u003e\n    \u003cdiv class=\"tracklist-header\"\u003e\n      \u003cdiv class=\"tracklist-title\"\u003eTracklist \u003cspan class=\"tracklist-count\"\u003e(–)\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003cbutton class=\"tracklist-btn\" type=\"button\" data-action=\"play-all\"\u003e▶ Play All\u003c\/button\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Hier komt de lijst automatisch in --\u003e\n    \u003cul class=\"tracklist-list\" role=\"listbox\" aria-label=\"Audio previews\"\u003e\u003c\/ul\u003e\n\n    \u003c!-- Gedeelde audio player --\u003e\n    \u003caudio id=\"player-ORBITWAX\" preload=\"metadata\" crossorigin=\"anonymous\"\u003e\u003c\/audio\u003e\n\n    \u003c!-- Voortgangsbalk --\u003e\n    \u003cdiv class=\"playerbar\"\u003e\n      \u003cdiv class=\"progress\" id=\"progress-ORBITWAX\" role=\"slider\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" tabindex=\"0\"\u003e\n        \u003cdiv class=\"progress-fill\"\u003e\u003c\/div\u003e\n        \u003cdiv class=\"progress-thumb\" style=\"left:0%\"\u003e\u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"time\"\u003e\n\u003cspan class=\"cur\"\u003e0:00\u003c\/span\u003e \/ \u003cspan class=\"dur\"\u003e–:–\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cspan class=\"sr-only\" aria-live=\"polite\" id=\"ann-ORBITWAX\"\u003e\u003c\/span\u003e\n    \u003cdiv class=\"toast\" style=\"display:none\" id=\"toast-ORBITWAX\"\u003eCouldn’t start audio. Tap again.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* ======= CONFIG: vul alleen dit blok in ======= *\/\nconst COVER_URL   = 'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_PROMO_BACK.jpg?v=1785173651'; \/\/ bv. https:\/\/cdn.shopify.com\/...\/cover.jpg\n\n\/\/ Optie A (snel): alleen audio-URLS plakken in volgorde (A1, A2, B1, B2, C1, ...)\n\/\/ Titels worden automatisch A1, A2, B1, B2, ...\nconst TRACK_URLS = [\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_Snippets_A1-Relatives__Afterlife-Mix__1.mp3?v=1785174220',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_Snippets_A2-Hysteria_1.mp3?v=1785174227',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_Snippets_B1-Elk_Cloner_1.mp3?v=1785174237',\n  'https:\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_Snippets_B2-Proteus_1.mp3?v=1785174232'\n];\n\n\/\/ Optie B (optioneel): eigen titels opgeven. Als je dit invult, wordt dit gebruikt\n\/\/ i.p.v. de auto-labels. Voorbeeld:\n\/\/ const TRACK_TITLES = ['A1. Give Me A Second','A2. Paratoxical','B1. Sniper','B2. Flying Adder'];\nconst TRACK_TITLES = null;\n\/* ======= EINDE CONFIG ======= *\/\n\n(function(){\n  const root = document.getElementById('tracklist-ORBITWAX');\n  if(!root) return;\n\n  \/\/ Achtergrond instellen + subtiele lichte overlay\n  root.classList.add('bg-art');\n  const styleEl = document.createElement('style');\n  styleEl.textContent = `\n    #${root.id}.bg-art::before{background:url(${CSS.escape(COVER_URL)}) center\/cover no-repeat;\n      filter:grayscale(.05) contrast(1.05) saturate(1.05); transform:scale(1.02)}\n    #${root.id}.bg-art::after{background:linear-gradient(180deg, rgba(9,12,16,.40), rgba(9,12,16,.25));backdrop-filter:blur(.2px)}\n  `;\n  document.head.appendChild(styleEl);\n\n  \/\/ Helpers\n  const itemsUL = root.querySelector('.tracklist-list');\n  const btnPlayAll = root.querySelector('[data-action=\"play-all\"]');\n  const countEl = root.querySelector('.tracklist-count');\n  const player = root.querySelector('#player-ORBITWAX');\n  const announcer = root.querySelector('#ann-ORBITWAX');\n  const toast = root.querySelector('#toast-ORBITWAX');\n\n  const bar = root.querySelector('#progress-ORBITWAX');\n  const fill = bar.querySelector('.progress-fill');\n  const thumb = bar.querySelector('.progress-thumb');\n  const curEl = root.querySelector('.time .cur');\n  const durEl = root.querySelector('.time .dur');\n\n  \/\/ labels A1, A2, B1, B2, C1, ...\n  const side = i =\u003e 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(i\/2)];\n  const num  = i =\u003e (i%2)+1;\n  const autoLabel = i =\u003e `${side(i)}${num(i)}`;\n\n  \/\/ Bouw de lijst\n  const items = TRACK_URLS.filter(Boolean).map((url, i) =\u003e {\n    const li = document.createElement('li');\n    li.className = 'tracklist-item';\n    li.tabIndex = 0;\n    li.dataset.src = url.trim();\n    const title = (TRACK_TITLES \u0026\u0026 TRACK_TITLES[i]) ? TRACK_TITLES[i] : `${autoLabel(i)}`;\n    li.innerHTML = `\u003cspan class=\"state\"\u003e▶\u003c\/span\u003e\u003cspan\u003e\u003cstrong\u003e${title}\u003c\/strong\u003e\u003c\/span\u003e`;\n    itemsUL.appendChild(li);\n    return li;\n  });\n\n  countEl.textContent = `(${items.length} ${items.length===1?'track':'tracks'})`;\n  if(items.length === 0){ itemsUL.innerHTML = '\u003cli class=\"tracklist-item\"\u003eNo previews yet.\u003c\/li\u003e'; return; }\n\n  \/\/ Audio control\n  let current = -1, playingAll = false, dragging = false;\n\n  function fmt(t){ if(!isFinite(t)) return '–:–'; const m = Math.floor(t\/60), s = Math.floor(t%60); return m+':' + (s\u003c10?'0'+s:s); }\n  function setActive(index){\n    items.forEach((el,i)=\u003e{ el.classList.toggle('active', i===index); el.querySelector('.state').textContent = (i===index \u0026\u0026 !player.paused) ? '⏸' : '▶'; });\n  }\n  function showToast(msg){ toast.textContent = msg; toast.style.display='block'; setTimeout(()=\u003etoast.style.display='none', 2200); }\n\n  function loadAndPlay(src, index){\n    player.pause();\n    player.removeAttribute('src');\n    player.src = src;\n    player.load();\n    const tryPlay = ()=\u003e player.play().then(()=\u003e{\n      setActive(index);\n      announcer.textContent = 'Playing ' + items[index].innerText.trim();\n    }).catch(()=\u003e showToast('Couldn’t start audio. Tap again.'));\n    if (player.readyState \u003e= 2) tryPlay();\n    else {\n      const onReady = ()=\u003e{ player.removeEventListener('canplay', onReady); tryPlay(); };\n      player.addEventListener('canplay', onReady);\n    }\n  }\n\n  function playIndex(index){\n    if(index\u003c0 || index\u003e=items.length) return;\n    const src = items[index].dataset.src;\n    if(!src) return;\n    if(index === current \u0026\u0026 !player.paused){ player.pause(); setActive(index); return; }\n    current = index;\n    loadAndPlay(src, index);\n  }\n\n  function updateProgress(){\n    const pct = player.duration ? (player.currentTime \/ player.duration) * 100 : 0;\n    fill.style.width = pct + '%'; thumb.style.left = pct + '%';\n    bar.setAttribute('aria-valuenow', Math.round(pct));\n    curEl.textContent = fmt(player.currentTime); durEl.textContent = fmt(player.duration);\n  }\n  function seekToClientX(x){\n    const r = bar.getBoundingClientRect(); let pct = (x - r.left)\/r.width; pct = Math.max(0,Math.min(1,pct));\n    if(player.duration){ player.currentTime = pct * player.duration; updateProgress(); }\n  }\n\n  \/\/ Events\n  items.forEach((el,i)=\u003e{\n    el.addEventListener('click', ()=\u003e playIndex(i));\n    el.addEventListener('keydown', e=\u003e{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); playIndex(i); }});\n  });\n\n  btnPlayAll.addEventListener('click', ()=\u003e{ playingAll=true; btnPlayAll.disabled=true; playIndex(0); });\n\n  player.addEventListener('loadedmetadata', updateProgress);\n  player.addEventListener('timeupdate', updateProgress);\n  player.addEventListener('play', ()=\u003e setActive(current));\n  player.addEventListener('pause', ()=\u003e setActive(current));\n  player.addEventListener('ended', ()=\u003e{\n    if(playingAll \u0026\u0026 current \u003c items.length-1){ playIndex(current+1); }\n    else { playingAll=false; btnPlayAll.disabled=false; setActive(current); }\n  });\n\n  \/\/ Progressbar interactie\n  bar.addEventListener('mousedown', e=\u003e{ dragging=true; seekToClientX(e.clientX); });\n  window.addEventListener('mousemove', e=\u003e{ if(dragging) seekToClientX(e.clientX); });\n  window.addEventListener('mouseup', ()=\u003e dragging=false);\n  bar.addEventListener('keydown', e=\u003e{\n    if(!player.duration) return;\n    if(e.key==='ArrowRight'){ player.currentTime = Math.min(player.duration, player.currentTime+5); updateProgress(); }\n    if(e.key==='ArrowLeft'){  player.currentTime = Math.max(0, player.currentTime-5); updateProgress(); }\n  });\n})();\n\u003c\/script\u003e\n\u003c!-- ======= \/ORBIT WAX - TRACKLIST TEMPLATE ======= --\u003e\n\n\u003cdiv\u003e\u003cspan\u003eThe programm with a personality, \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eIt will get on all your discs. \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eIt will infiltrate your brains.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eYes it's (malware) bizzarre! \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e     \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eIt will stick to you like glue \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eand it will modify reality, \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eto send in the bizzarre.\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003e\u003cbr\u003e\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eArtist: Das Firmamen      \u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eTitle:  Malware Bizarre\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eLabel: Spirito del Tempo\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eCat. Number: SDT002\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eFormat: 12\" EP\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eGenre: Techno\/Trance\/New Beat\u003c\/span\u003e\u003c\/div\u003e\n\u003cdiv\u003e\u003cspan\u003eRelease Date: 01.09.2026\u003c\/span\u003e\u003c\/div\u003e","brand":"Orbit Wax","offers":[{"title":"Default Title","offer_id":54442156425543,"sku":null,"price":23.99,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0921\/7638\/4327\/files\/SDT002_PROMO_FRONT.jpg?v=1785173652"}],"url":"https:\/\/orbitwax.com\/collections\/techno-electro.oembed?page=2","provider":"Orbit Wax","version":"1.0","type":"link"}