Audio
tier 2 — classes
A player around the native <audio> element, a waveform for a voice message or
a call recording, and a track list. The element's own controls stay native; the library adds the
title, the meta line, the transcript and the row a recording sits in. Pictures that move are
Video.
A player
The same .media-player as a video, with no picture: the
.media-player-body is the whole of it, a .file-icon
or a cover leading, and the <audio controls> inside
.media-player-text, under the title, at the text column's width and the
control height. A call recording carries its .media-transcript, speaker by
speaker. The demo has no source; the app's goes on the element.
<div class="media-player" style="max-width:560px">
<div class="media-player-body">
<span class="file-icon file-icon--media"><i class="ri-phone-line"></i></span>
<span class="media-player-text">
<strong class="media-player-title">Call with the carrier about the week 38 returns</strong>
<span class="file-meta"><span>6:14</span><time datetime="2026-09-14T10:02">Today, 10:02</time><span>Alex Fischer</span></span>
<audio controls preload="none" aria-label="Call with the carrier about the week 38 returns"></audio>
</span>
<span class="media-player-actions">
<a class="btn btn-ghost btn-icon btn-sm" href="#" download aria-label="Download the recording, 5.9 MB"><i class="ri-download-2-line"></i></a>
</span>
</div>
<details class="media-transcript" open>
<summary>Transcript</summary>
<ol>
<li><button class="media-transcript-time" type="button" aria-label="Play from 0:04">0:04</button><span><strong>Alex Fischer:</strong> I have fourteen returns from Friday with no delivery note attached.</span></li>
<li aria-current="true"><button class="media-transcript-time" type="button" aria-label="Play from 0:21">0:21</button><span><strong>Carrier:</strong> They were scanned at the depot, so the notes should be on the portal by noon.</span></li>
<li><button class="media-transcript-time" type="button" aria-label="Play from 0:37">0:37</button><span><strong>Alex Fischer:</strong> Then I will hold the credit notes until they are.</span></li>
</ol>
</details>
</div>
A waveform
.audio-wave is a recording as a picture of itself: the play button, the
.audio-wave-bars with each bar's height in --h and the ones already
heard as .audio-wave-heard, and the .audio-wave-time. The
<audio> is the app's and hidden, and the play button's name says the
length. It is the voice message in a chat, and here a voicemail in a
.list.
Voicemail
- PN Priya Nair 0:07 / 0:19
- TF Tomás Ferreira 0:42
<div class="card" style="max-width:520px">
<div class="card-head"><h3>Voicemail</h3></div>
<ul class="list">
<li>
<div class="list-row">
<span class="avatar avatar--viz-2">PN</span>
<span class="list-main">
<span class="list-title">Priya Nair</span>
<span class="audio-wave">
<button class="btn btn-sm btn-primary btn-icon" type="button" aria-label="Play the voicemail from Priya Nair, 19 seconds"><i class="ri-play-fill"></i></button>
<span class="audio-wave-bars" aria-hidden="true">
<i class="audio-wave-heard" style="--h:35%"></i><i class="audio-wave-heard" style="--h:60%"></i><i class="audio-wave-heard" style="--h:85%"></i><i class="audio-wave-heard" style="--h:50%"></i><i class="audio-wave-heard" style="--h:30%"></i><i class="audio-wave-heard" style="--h:70%"></i><i class="audio-wave-heard" style="--h:95%"></i><i class="audio-wave-heard" style="--h:55%"></i>
<i style="--h:65%"></i><i style="--h:80%"></i><i style="--h:45%"></i><i style="--h:25%"></i><i style="--h:60%"></i><i style="--h:90%"></i><i style="--h:50%"></i><i style="--h:35%"></i><i style="--h:70%"></i><i style="--h:40%"></i><i style="--h:55%"></i><i style="--h:30%"></i>
</span>
<span class="audio-wave-time">0:07 / 0:19</span>
</span>
</span>
<span class="list-meta"><time datetime="2026-09-14T09:12">09:12</time></span>
</div>
</li>
<li>
<div class="list-row">
<span class="avatar avatar--viz-4">TF</span>
<span class="list-main">
<span class="list-title">Tomás Ferreira</span>
<span class="audio-wave">
<button class="btn btn-sm btn-icon" type="button" aria-label="Play the voicemail from Tomás Ferreira, 42 seconds"><i class="ri-play-fill"></i></button>
<span class="audio-wave-bars" aria-hidden="true">
<i style="--h:40%"></i><i style="--h:55%"></i><i style="--h:75%"></i><i style="--h:35%"></i><i style="--h:60%"></i><i style="--h:90%"></i><i style="--h:45%"></i><i style="--h:30%"></i><i style="--h:65%"></i><i style="--h:50%"></i><i style="--h:80%"></i><i style="--h:40%"></i><i style="--h:25%"></i><i style="--h:55%"></i><i style="--h:70%"></i><i style="--h:35%"></i><i style="--h:60%"></i><i style="--h:45%"></i><i style="--h:30%"></i><i style="--h:50%"></i>
</span>
<span class="audio-wave-time">0:42</span>
</span>
</span>
<span class="list-meta"><time datetime="2026-09-13T17:40">Yesterday</time></span>
</div>
</li>
</ul>
</div>
A track list
A playlist is an ordered .list: each row a button that plays
it, the length as the .list-meta, and the one playing marked
aria-current="true". .media-track-num is a fixed-width number
column, so one to twelve line up, and in the playing row it holds an equalizer glyph named
“Playing”, in the brand.
Onboarding — the warehouse
4 parts<div class="card" style="max-width:480px">
<div class="card-head"><h3>Onboarding — the warehouse</h3><span class="badge">4 parts</span></div>
<ol class="list" aria-label="Parts">
<li>
<button class="list-row" type="button">
<span class="media-track-num">1</span>
<span class="list-main">
<span class="list-title">Welcome, and where everything is</span>
<span class="list-sub">Priya Nair</span>
</span>
<span class="list-meta"><span class="text-nums">3:20</span></span>
</button>
</li>
<li>
<button class="list-row" type="button" aria-current="true">
<span class="media-track-num"><i class="ri-equalizer-line" role="img" aria-label="Playing"></i></span>
<span class="list-main">
<span class="list-title">Receiving at the dock</span>
<span class="list-sub">Alex Fischer</span>
</span>
<span class="list-meta"><span class="text-nums">8:05</span></span>
</button>
</li>
<li>
<button class="list-row" type="button">
<span class="media-track-num">3</span>
<span class="list-main">
<span class="list-title">Picking, packing and the label printer</span>
<span class="list-sub">Tomás Ferreira</span>
</span>
<span class="list-meta"><span class="text-nums">11:42</span></span>
</button>
</li>
<li>
<button class="list-row" type="button">
<span class="media-track-num">4</span>
<span class="list-main">
<span class="list-title">When something arrives damaged</span>
<span class="list-sub">Alex Fischer</span>
</span>
<span class="list-meta"><span class="text-nums">5:57</span></span>
</button>
</li>
</ol>
</div>