HTML
Copy
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5f4f66] uppercase">Native sliders with accent-color</span>
<div class="group grid gap-3.5 rounded-[20px] bg-white px-5 py-[18px] text-[#1f1235] shadow-[0_1px_2px_rgba(31,18,53,.06),0_12px_30px_rgba(190,24,93,.1)]" data-mx role="group" aria-label="Night Bus to Nowhere by Orla Finch">
<audio src="../audio/track-3.mp3" preload="metadata"></audio>
<div class="flex items-center gap-4">
<button type="button" class="grid size-11 flex-none cursor-pointer place-items-center rounded-full bg-mx-accent text-white hover:bg-[color-mix(in_oklab,var(--color-mx-accent),#000_15%)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent" data-play="Night Bus to Nowhere" aria-label="Play Night Bus to Nowhere"><svg class="block size-5 group-data-playing:hidden" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M8 5.5v13a1 1 0 0 0 1.5.86l10.5-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5z"/></svg><svg class="hidden size-5 group-data-playing:block" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><rect x="6.5" y="5" width="4" height="14" rx="1.2"/><rect x="13.5" y="5" width="4" height="14" rx="1.2"/></svg></button>
<div class="min-w-0 flex-1"><p class="truncate text-[.98rem] font-bold">Night Bus to Nowhere</p><p class="mt-0.5 truncate text-[.84rem] text-mx-muted">Orla Finch</p></div>
</div>
<div class="flex items-center gap-2">
<span class="min-w-[2.3em] text-[.78rem] text-mx-muted tabular-nums" data-cur>0:00</span>
<input type="range" class="min-w-0 flex-1 cursor-pointer accent-mx-accent focus-visible:rounded focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-mx-accent" data-seek min="0" max="30" step="any" value="0" aria-label="Seek Night Bus to Nowhere" aria-valuetext="0:00 of 0:30">
<span class="min-w-[2.3em] text-[.78rem] text-mx-muted tabular-nums" data-dur>0:30</span>
<button type="button" class="group/m grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent" data-mute aria-label="Mute" aria-pressed="false"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="group-aria-pressed/m:hidden" d="M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13"/><path class="hidden group-aria-pressed/m:inline" d="m16 9 6 6m0-6-6 6"/></svg></button>
<input type="range" class="w-[110px] flex-none cursor-pointer accent-mx-accent focus-visible:rounded focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-mx-accent max-[480px]:hidden" data-vol min="0" max="1" step="0.05" value="0.8" aria-label="Volume" aria-valuetext="80%">
</div>
</div></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5f4f66] uppercase">Container query · 260px wide</span>
<div class="@container max-w-[260px]">
<div class="group grid grid-cols-[44px_minmax(0,1fr)_auto] items-center gap-x-3 gap-y-2.5 rounded-[20px] bg-white px-3.5 py-3 text-[#1f1235] shadow-[0_1px_2px_rgba(31,18,53,.06),0_12px_30px_rgba(190,24,93,.1)] [grid-template-areas:'art_meta_ctrls'_'seek_seek_seek'] [--p:0] [--v:1] @min-[360px]:grid-cols-[64px_minmax(0,1fr)_auto] @min-[360px]:px-[18px] @min-[360px]:py-3.5 @min-[560px]:grid-cols-[148px_minmax(0,1fr)_auto] @min-[560px]:gap-x-5 @min-[560px]:gap-y-3 @min-[560px]:p-[18px] @min-[560px]:[grid-template-areas:'art_meta_meta'_'art_seek_seek'_'art_ctrls_vol']" data-mx role="group" aria-label="Copper Sky by Milo & the Tidelines">
<audio src="../audio/track-4.mp3" preload="metadata"></audio>
<div class="aspect-square w-full rounded-[10px] [grid-area:art] [background:radial-gradient(circle_at_50%_100%,#fff7ed_0_24%,#fdba74_24%_27%,transparent_27.5%),linear-gradient(180deg,#7c2d12_0_22%,#9a3412_22%_40%,#c2410c_40%_56%,#ea580c_56%_70%,#f59e0b_70%_84%,#fcd34d_84%)] @min-[360px]:rounded-xl @min-[560px]:rounded-2xl" aria-hidden="true"></div>
<div class="min-w-0 [grid-area:meta]"><p class="truncate text-[.98rem] font-bold @min-[560px]:text-[1.2rem] @min-[560px]:font-extrabold">Copper Sky</p><p class="mt-0.5 truncate text-[.84rem] text-mx-muted">Milo & the Tidelines</p></div>
<div class="flex items-center gap-1.5 [grid-area:ctrls] @min-[560px]:gap-2.5">
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="-15" aria-label="Back 15 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 12a8.5 8.5 0 1 0 2.6-6.1"/><path d="M3.5 4v4.5H8"/><text x="12.6" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">15</text></svg></button>
<button type="button" class="grid size-11 flex-none cursor-pointer place-items-center rounded-full bg-mx-accent text-white hover:bg-[color-mix(in_oklab,var(--color-mx-accent),#000_15%)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent @min-[560px]:size-[52px]" data-play="Copper Sky" aria-label="Play Copper Sky"><svg class="block size-5 group-data-playing:hidden" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M8 5.5v13a1 1 0 0 0 1.5.86l10.5-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5z"/></svg><svg class="hidden size-5 group-data-playing:block" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><rect x="6.5" y="5" width="4" height="14" rx="1.2"/><rect x="13.5" y="5" width="4" height="14" rx="1.2"/></svg></button>
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="30" aria-label="Forward 30 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 1 1-2.6-6.1"/><path d="M20.5 4v4.5H16"/><text x="11.4" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">30</text></svg></button>
</div>
<div class="flex items-center gap-2.5 [grid-area:seek]"><span class="hidden min-w-[2.3em] text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-cur>0:00</span><input type="range" class="flex-1 block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--p)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-seek min="0" max="29" step="any" value="0" aria-label="Seek Copper Sky" aria-valuetext="0:00 of 0:29"><span class="hidden min-w-[2.3em] text-right text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-dur>0:29</span></div>
<div class="hidden items-center gap-1.5 [grid-area:vol] @min-[560px]:flex"><button type="button" class="group/m grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent" data-mute aria-label="Mute" aria-pressed="false"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="group-aria-pressed/m:hidden" d="M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13"/><path class="hidden group-aria-pressed/m:inline" d="m16 9 6 6m0-6-6 6"/></svg></button><input type="range" class="w-24 flex-none block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--v)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-vol min="0" max="1" step="0.05" value="0.8" aria-label="Volume" aria-valuetext="80%"></div>
</div></div></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5f4f66] uppercase">Container query · 420px wide</span>
<div class="@container max-w-[420px]">
<div class="group grid grid-cols-[44px_minmax(0,1fr)_auto] items-center gap-x-3 gap-y-2.5 rounded-[20px] bg-white px-3.5 py-3 text-[#1f1235] shadow-[0_1px_2px_rgba(31,18,53,.06),0_12px_30px_rgba(190,24,93,.1)] [grid-template-areas:'art_meta_ctrls'_'seek_seek_seek'] [--p:0] [--v:1] @min-[360px]:grid-cols-[64px_minmax(0,1fr)_auto] @min-[360px]:px-[18px] @min-[360px]:py-3.5 @min-[560px]:grid-cols-[148px_minmax(0,1fr)_auto] @min-[560px]:gap-x-5 @min-[560px]:gap-y-3 @min-[560px]:p-[18px] @min-[560px]:[grid-template-areas:'art_meta_meta'_'art_seek_seek'_'art_ctrls_vol']" data-mx role="group" aria-label="Paper Kites by The Lumen Choir">
<audio src="../audio/track-2.mp3" preload="metadata"></audio>
<div class="aspect-square w-full rounded-[10px] [grid-area:art] [background:linear-gradient(to_bottom_right,transparent_50%,#fde047_50%)_37.5%_26.67%/20%_25%_no-repeat,linear-gradient(to_bottom_left,transparent_50%,#f97316_50%)_62.5%_26.67%/20%_25%_no-repeat,linear-gradient(to_top_right,transparent_50%,#fb923c_50%)_37.5%_69.23%/20%_35%_no-repeat,linear-gradient(to_top_left,transparent_50%,#facc15_50%)_62.5%_69.23%/20%_35%_no-repeat,linear-gradient(to_bottom_right,transparent_calc(50%_-_1px),rgba(255,255,255,.85)_0_calc(50%_+_1px),transparent_0)_41.86%_100%/14%_20%_no-repeat,linear-gradient(160deg,#0ea5e9,#14b8a6_55%,#84cc16)] @min-[360px]:rounded-xl @min-[560px]:rounded-2xl" aria-hidden="true"></div>
<div class="min-w-0 [grid-area:meta]"><p class="truncate text-[.98rem] font-bold @min-[560px]:text-[1.2rem] @min-[560px]:font-extrabold">Paper Kites</p><p class="mt-0.5 truncate text-[.84rem] text-mx-muted">The Lumen Choir</p></div>
<div class="flex items-center gap-1.5 [grid-area:ctrls] @min-[560px]:gap-2.5">
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="-15" aria-label="Back 15 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 12a8.5 8.5 0 1 0 2.6-6.1"/><path d="M3.5 4v4.5H8"/><text x="12.6" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">15</text></svg></button>
<button type="button" class="grid size-11 flex-none cursor-pointer place-items-center rounded-full bg-mx-accent text-white hover:bg-[color-mix(in_oklab,var(--color-mx-accent),#000_15%)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent @min-[560px]:size-[52px]" data-play="Paper Kites" aria-label="Play Paper Kites"><svg class="block size-5 group-data-playing:hidden" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M8 5.5v13a1 1 0 0 0 1.5.86l10.5-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5z"/></svg><svg class="hidden size-5 group-data-playing:block" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><rect x="6.5" y="5" width="4" height="14" rx="1.2"/><rect x="13.5" y="5" width="4" height="14" rx="1.2"/></svg></button>
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="30" aria-label="Forward 30 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 1 1-2.6-6.1"/><path d="M20.5 4v4.5H16"/><text x="11.4" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">30</text></svg></button>
</div>
<div class="flex items-center gap-2.5 [grid-area:seek]"><span class="hidden min-w-[2.3em] text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-cur>0:00</span><input type="range" class="flex-1 block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--p)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-seek min="0" max="24" step="any" value="0" aria-label="Seek Paper Kites" aria-valuetext="0:00 of 0:24"><span class="hidden min-w-[2.3em] text-right text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-dur>0:24</span></div>
<div class="hidden items-center gap-1.5 [grid-area:vol] @min-[560px]:flex"><button type="button" class="group/m grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent" data-mute aria-label="Mute" aria-pressed="false"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="group-aria-pressed/m:hidden" d="M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13"/><path class="hidden group-aria-pressed/m:inline" d="m16 9 6 6m0-6-6 6"/></svg></button><input type="range" class="w-24 flex-none block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--v)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-vol min="0" max="1" step="0.05" value="0.8" aria-label="Volume" aria-valuetext="80%"></div>
</div></div></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5f4f66] uppercase">Container query · full width</span>
<div class="@container">
<div class="group grid grid-cols-[44px_minmax(0,1fr)_auto] items-center gap-x-3 gap-y-2.5 rounded-[20px] bg-white px-3.5 py-3 text-[#1f1235] shadow-[0_1px_2px_rgba(31,18,53,.06),0_12px_30px_rgba(190,24,93,.1)] [grid-template-areas:'art_meta_ctrls'_'seek_seek_seek'] [--p:0] [--v:1] @min-[360px]:grid-cols-[64px_minmax(0,1fr)_auto] @min-[360px]:px-[18px] @min-[360px]:py-3.5 @min-[560px]:grid-cols-[148px_minmax(0,1fr)_auto] @min-[560px]:gap-x-5 @min-[560px]:gap-y-3 @min-[560px]:p-[18px] @min-[560px]:[grid-template-areas:'art_meta_meta'_'art_seek_seek'_'art_ctrls_vol']" data-mx role="group" aria-label="Harbour Lights by Juniper Vale">
<audio src="../audio/track-1.mp3" preload="metadata"></audio>
<div class="aspect-square w-full rounded-[10px] [grid-area:art] [background:radial-gradient(circle_at_68%_40%,#fde68a_0_11%,transparent_11.5%),repeating-linear-gradient(180deg,transparent_0_6%,rgba(253,230,138,.3)_6%_7.5%)_bottom/100%_42%_no-repeat,linear-gradient(180deg,#fb923c,#e11d48_58%,#312e81_58%,#1e1b4b)] @min-[360px]:rounded-xl @min-[560px]:rounded-2xl" aria-hidden="true"></div>
<div class="min-w-0 [grid-area:meta]"><p class="truncate text-[.98rem] font-bold @min-[560px]:text-[1.2rem] @min-[560px]:font-extrabold">Harbour Lights</p><p class="mt-0.5 truncate text-[.84rem] text-mx-muted">Juniper Vale · Low Tide Radio</p></div>
<div class="flex items-center gap-1.5 [grid-area:ctrls] @min-[560px]:gap-2.5">
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="-15" aria-label="Back 15 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 12a8.5 8.5 0 1 0 2.6-6.1"/><path d="M3.5 4v4.5H8"/><text x="12.6" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">15</text></svg></button>
<button type="button" class="grid size-11 flex-none cursor-pointer place-items-center rounded-full bg-mx-accent text-white hover:bg-[color-mix(in_oklab,var(--color-mx-accent),#000_15%)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent @min-[560px]:size-[52px]" data-play="Harbour Lights" aria-label="Play Harbour Lights"><svg class="block size-5 group-data-playing:hidden" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M8 5.5v13a1 1 0 0 0 1.5.86l10.5-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5z"/></svg><svg class="hidden size-5 group-data-playing:block" viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><rect x="6.5" y="5" width="4" height="14" rx="1.2"/><rect x="13.5" y="5" width="4" height="14" rx="1.2"/></svg></button>
<button type="button" class="grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent hidden @min-[560px]:grid" data-skip="30" aria-label="Forward 30 seconds"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12a8.5 8.5 0 1 1-2.6-6.1"/><path d="M20.5 4v4.5H16"/><text x="11.4" y="15.4" fill="currentColor" stroke="none" font-size="7" font-weight="700" text-anchor="middle" font-family="system-ui,sans-serif">30</text></svg></button>
</div>
<div class="flex items-center gap-2.5 [grid-area:seek]"><span class="hidden min-w-[2.3em] text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-cur>0:00</span><input type="range" class="flex-1 block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--p)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-seek min="0" max="24" step="any" value="0" aria-label="Seek Harbour Lights" aria-valuetext="0:00 of 0:24"><span class="hidden min-w-[2.3em] text-right text-[.78rem] text-mx-muted tabular-nums @min-[360px]:block" data-dur>0:24</span></div>
<div class="hidden items-center gap-1.5 [grid-area:vol] @min-[560px]:flex"><button type="button" class="group/m grid size-[38px] flex-none cursor-pointer place-items-center rounded-full text-mx-muted hover:bg-[color-mix(in_oklab,var(--color-mx-accent)_10%,#fff)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mx-accent" data-mute aria-label="Mute" aria-pressed="false"><svg class="block size-6" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="group-aria-pressed/m:hidden" d="M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13"/><path class="hidden group-aria-pressed/m:inline" d="m16 9 6 6m0-6-6 6"/></svg></button><input type="range" class="w-24 flex-none block h-4 min-w-0 cursor-pointer appearance-none bg-transparent [--f:var(--v)] focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-mx-accent)_0_calc(8px_+_(100%_-_16px)_*_var(--f)),var(--color-mx-track)_0)] [&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-mx-track [&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-mx-accent [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-[3px] [&::-webkit-slider-thumb]:border-solid [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:bg-mx-accent [&::-webkit-slider-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-[3px] [&::-moz-range-thumb]:border-solid [&::-moz-range-thumb]:border-white [&::-moz-range-thumb]:bg-mx-accent [&::-moz-range-thumb]:shadow-[0_1px_4px_rgba(31,18,53,.35)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_2px_#fff,0_0_0_4px_var(--color-mx-accent)]" data-vol min="0" max="1" step="0.05" value="0.8" aria-label="Volume" aria-valuetext="80%"></div>
</div></div></div>
JavaScript
Copy
// Each [data-mx] wraps one <audio>. The script wires play, seek, skip, mute and volume, and writes --p and --v
// (0 to 1) for the WebKit track fill. Layout changes come from CSS container queries, not from the script.
(() => {
const fmt = s => { s = Math.floor(s || 0); return Math.floor(s / 60) + ':' + String(s % 60).padStart(2, '0'); };
document.querySelectorAll('[data-mx]').forEach(root => {
const $ = s => root.querySelector(s);
const audio = $('audio'), play = $('[data-play]'), seek = $('[data-seek]'), cur = $('[data-cur]'), dur = $('[data-dur]');
const vol = $('[data-vol]'), mute = $('[data-mute]'), name = play.dataset.play;
let raf = 0;
const length = () => audio.duration || +seek.max;
const sync = () => {
const t = audio.currentTime, d = length(), text = fmt(t) + ' of ' + fmt(d);
seek.value = t;
root.style.setProperty('--p', d ? t / d : 0);
if (cur) cur.textContent = fmt(t);
if (seek.getAttribute('aria-valuetext') !== text) seek.setAttribute('aria-valuetext', text);
};
const tick = () => { sync(); raf = requestAnimationFrame(tick); };
const meta = () => { seek.max = audio.duration; if (dur) dur.textContent = fmt(audio.duration); sync(); };
const sound = () => {
const v = audio.muted ? 0 : audio.volume;
root.style.setProperty('--v', v);
if (vol) { vol.value = v; vol.setAttribute('aria-valuetext', Math.round(v * 100) + '%'); }
if (mute) mute.setAttribute('aria-pressed', String(v === 0));
};
play.addEventListener('click', () => {
if (!audio.paused) return audio.pause();
document.querySelectorAll('audio').forEach(a => { if (a !== audio) a.pause(); });
audio.play().catch(() => {});
});
audio.addEventListener('play', () => { root.setAttribute('data-playing', ''); play.setAttribute('aria-label', 'Pause ' + name); tick(); });
audio.addEventListener('pause', () => { root.removeAttribute('data-playing'); play.setAttribute('aria-label', 'Play ' + name); cancelAnimationFrame(raf); sync(); });
audio.addEventListener('loadedmetadata', meta);
audio.addEventListener('volumechange', sound);
if (audio.readyState > 0) meta();
seek.addEventListener('input', () => { audio.currentTime = seek.value; sync(); });
// Arrow keys jump 5 seconds; Home and End work natively.
seek.addEventListener('keydown', e => {
const step = { ArrowLeft: -5, ArrowDown: -5, ArrowRight: 5, ArrowUp: 5 }[e.key];
if (!step) return;
e.preventDefault();
audio.currentTime = Math.min(Math.max(audio.currentTime + step, 0), length());
sync();
});
root.querySelectorAll('[data-skip]').forEach(b => b.addEventListener('click', () => {
audio.currentTime = Math.min(Math.max(audio.currentTime + +b.dataset.skip, 0), length());
sync();
}));
if (vol) {
audio.volume = vol.value;
vol.addEventListener('input', () => { audio.volume = vol.value; audio.muted = false; });
}
if (mute) mute.addEventListener('click', () => {
if (audio.muted || audio.volume === 0) { audio.muted = false; if (audio.volume === 0) audio.volume = 0.6; }
else audio.muted = true;
});
sound();
});
})();