Open demo

CSS code

HTML
<div><span class="lbl">Volume with a mute button</span><div class="card">
<div class="md">
  <div class="md-head"><label for="md-volume">Volume</label><output for="md-volume">70%</output></div>
  <div class="md-row">
    <button type="button" class="md-mute" aria-label="Mute" aria-pressed="false" aria-controls="md-volume">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="md-on" d="M15.5 8.5a5 5 0 0 1 0 7"/><path class="md-off" d="m16 9 6 6m0-6-6 6"/></svg>
    </button>
    <input type="range" id="md-volume" min="0" max="100" value="70" data-suffix="%">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/><path d="M18.5 5.5a9 9 0 0 1 0 13"/></svg>
  </div>
</div></div></div>

<div><span class="lbl">Brightness with sun icons</span><div class="card">
<div class="md warm">
  <div class="md-head"><label for="md-bright">Screen brightness</label><output for="md-bright">55%</output></div>
  <div class="md-row">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="3.5"/><path d="M12 5v1m0 12v1m7-7h-1M6 12H5m12-5-.7.7M7.7 16.3 7 17m10 0-.7-.7M7.7 7.7 7 7"/></svg>
    <input type="range" id="md-bright" min="0" max="100" value="55" data-suffix="%">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4.5"/><path d="M12 2v2.5m0 15V22m10-10h-2.5M4.5 12H2m17.1-7.1-1.8 1.8M6.7 17.3l-1.8 1.8m14.2 0-1.8-1.8M6.7 6.7 4.9 4.9"/></svg>
  </div>
</div></div></div>

<div><span class="lbl">Control-centre pills</span><div class="card">
<div class="md-stack">
<div class="md pill">
  <label for="md-media" class="md-title">Media volume</label>
  <div class="md-pill">
    <input type="range" id="md-media" min="0" max="100" value="62" data-suffix="%">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/></svg>
    <output for="md-media">62%</output>
  </div>
</div>
<div class="md pill">
  <label for="md-display" class="md-title">Display brightness</label>
  <div class="md-pill">
    <input type="range" id="md-display" min="0" max="100" value="38" data-suffix="%">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 3v1.5m0 15V21m9-9h-1.5M4.5 12H3m15.4-6.4-1 1M6.6 17.4l-1 1m12.8 0-1-1M6.6 6.6l-1-1"/></svg>
    <output for="md-display">38%</output>
  </div>
</div>
</div></div></div>

<div><span class="lbl">Colour temperature</span><div class="card">
<div class="md temp">
  <div class="md-head"><label for="md-kelvin">Night light warmth</label><output for="md-kelvin">4,200 K</output></div>
  <input type="range" id="md-kelvin" min="2700" max="6500" step="100" value="4200" data-suffix=" K">
  <div class="md-scale" aria-hidden="true"><span>Warm</span><span>Cool</span></div>
</div></div></div>
CSS
/* Volume and brightness sliders: a real <input type="range"> with SVG icons beside or inside it.
   --p (0 to 1) is set by the script below and drives the filled part of the track. */
.md{--md-accent:#0369a1;--md-track:#8391a7;--md-thumb:18px;--md-h:6px;--p:0;display:grid;gap:12px}
.md-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px}
.md-head label{font-size:.95rem;font-weight:600;color:#1e293b}
.md-head output{font-size:.95rem;font-weight:700;color:var(--md-accent);font-variant-numeric:tabular-nums}
.md-row{display:flex;align-items:center;gap:12px}
.md-icon{flex:none;width:22px;height:22px;color:#475569}
.md input[type="range"]{-webkit-appearance:none;appearance:none;display:block;flex:1;min-width:0;width:100%;height:var(--md-thumb);margin:0;background:none;cursor:pointer}
.md input[type="range"]:focus-visible{outline:none}
.md input[type="range"]::-webkit-slider-runnable-track{height:var(--md-h);border-radius:999px;
  background:linear-gradient(to right,var(--md-accent) 0 calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)),var(--md-track) 0)}
.md input[type="range"]::-moz-range-track{height:var(--md-h);border-radius:999px;
  background:linear-gradient(to right,var(--md-accent) 0 calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)),var(--md-track) 0)}
.md input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;box-sizing:border-box;
  width:var(--md-thumb);height:var(--md-thumb);margin-top:calc((var(--md-h) - var(--md-thumb)) / 2);
  border:2px solid var(--md-accent);border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(15,23,42,.25)}
.md input[type="range"]::-moz-range-thumb{box-sizing:border-box;width:var(--md-thumb);height:var(--md-thumb);
  border:2px solid var(--md-accent);border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(15,23,42,.25)}
.md input[type="range"]:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px var(--md-accent)}
.md input[type="range"]:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px var(--md-accent)}
/* mute button: swaps the sound waves for a cross when pressed */
.md-mute{flex:none;display:grid;place-items:center;width:36px;height:36px;border:0;border-radius:10px;background:#eef2f7;color:#334155;cursor:pointer}
.md-mute:hover{background:#e2e8f0}
.md-mute:focus-visible{outline:2px solid var(--md-accent);outline-offset:2px}
.md-mute svg{width:22px;height:22px}
.md-mute .md-off,.md-mute[aria-pressed="true"] .md-on{display:none}
.md-mute[aria-pressed="true"] .md-off{display:inline}
.md-mute[aria-pressed="true"]{background:#fee2e2;color:#b91c1c}
/* warm brightness: amber fill */
.md.warm{--md-accent:#d97706}
.md.warm .md-head output{color:#b45309}
.md.warm input[type="range"]::-webkit-slider-runnable-track{background:
  linear-gradient(to right,#fbbf24,#ea580c) 0 0 / calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)) 100% no-repeat,var(--md-track)}
.md.warm input[type="range"]::-moz-range-track{background:
  linear-gradient(to right,#fbbf24,#ea580c) 0 0 / calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)) 100% no-repeat,var(--md-track)}
/* control-centre pill: a 48px track, a slim handle, icon and value drawn inside */
.md.pill{--md-thumb:14px;--md-h:48px;--md-track:#334155}
.md-stack{display:grid;gap:22px}
.md-title{font-size:.95rem;font-weight:600;color:#1e293b}
.md-pill{position:relative}
.md.pill input[type="range"]{height:48px;border-radius:16px}
.md.pill input[type="range"]::-webkit-slider-runnable-track{border-radius:16px}
.md.pill input[type="range"]::-moz-range-track{border-radius:16px}
.md.pill input[type="range"]::-webkit-slider-thumb{width:14px;height:48px;margin-top:0;border:0;border-radius:0;box-shadow:none;
  background:linear-gradient(#fff,#fff) center / 4px 22px no-repeat}
.md.pill input[type="range"]::-moz-range-thumb{width:14px;height:48px;border:0;border-radius:0;box-shadow:none;
  background:linear-gradient(#fff,#fff) center / 4px 22px no-repeat}
.md.pill input[type="range"]:focus-visible{outline:2px solid var(--md-accent);outline-offset:3px}
.md.pill input[type="range"]:focus-visible::-webkit-slider-thumb{box-shadow:none}
.md.pill input[type="range"]:focus-visible::-moz-range-thumb{box-shadow:none}
.md-pill svg{position:absolute;left:16px;top:50%;width:22px;height:22px;transform:translateY(-50%);color:#fff;pointer-events:none}
.md-pill output{position:absolute;right:18px;top:50%;transform:translateY(-50%);color:#fff;font-size:.9rem;font-weight:700;
  font-variant-numeric:tabular-nums;pointer-events:none}
/* colour temperature: the track itself is the scale */
.md.temp{--md-thumb:24px;--md-h:10px}
.md.temp .md-head output{color:#1e293b}
.md.temp input[type="range"]::-webkit-slider-runnable-track{box-shadow:inset 0 0 0 1px rgba(15,23,42,.45);
  background:linear-gradient(to right,#f97316,#fcd34d 30%,#fef9c3 50%,#dbeafe 70%,#60a5fa)}
.md.temp input[type="range"]::-moz-range-track{box-shadow:inset 0 0 0 1px rgba(15,23,42,.45);
  background:linear-gradient(to right,#f97316,#fcd34d 30%,#fef9c3 50%,#dbeafe 70%,#60a5fa)}
.md.temp input[type="range"]::-webkit-slider-thumb{border:3px solid #1e293b;background:#fff}
.md.temp input[type="range"]::-moz-range-thumb{border:3px solid #1e293b;background:#fff}
.md.temp input[type="range"]:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px #1e293b}
.md.temp input[type="range"]:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px #1e293b}
.md-scale{display:flex;justify-content:space-between;font-size:.8rem;color:#475569}
JavaScript
// Keeps each slider's filled track (--p) and its <output> in step with the value.
document.querySelectorAll('.md input[type="range"]').forEach(function (range) {
  var field = range.closest('.md');
  var out = field.querySelector('output');
  function sync() {
    var text = (range.dataset.prefix || '') + Number(range.value).toLocaleString('en-US') + (range.dataset.suffix || '');
    field.style.setProperty('--p', (range.value - range.min) / (range.max - range.min));
    if (out) out.textContent = text;
    range.setAttribute('aria-valuetext', text);
  }
  range.addEventListener('input', sync);
  sync();
});
// Mute button: remembers the last volume, drops the slider to 0 and restores it on the second press.
document.querySelectorAll('.md-mute').forEach(function (btn) {
  var range = document.getElementById(btn.getAttribute('aria-controls')), last = range.value;
  btn.addEventListener('click', function () {
    if (+range.value > 0) { last = range.value; range.value = 0; } else { range.value = +last > 0 ? last : 50; }
    range.dispatchEvent(new Event('input'));
  });
  range.addEventListener('input', function () { btn.setAttribute('aria-pressed', String(+range.value === 0)); });
});

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Volume with a mute button</span><div class="card demo-card"><div class="card-body p-4">
<div class="md">
  <div class="d-flex justify-content-between align-items-baseline gap-3"><label class="form-label fw-semibold mb-0" for="md-volume">Volume</label><output class="md-value fw-bold" for="md-volume">70%</output></div>
  <div class="d-flex align-items-center gap-3">
    <button type="button" class="btn md-mute" aria-label="Mute" aria-pressed="false" aria-controls="md-volume">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="md-on" d="M15.5 8.5a5 5 0 0 1 0 7"/><path class="md-off" d="m16 9 6 6m0-6-6 6"/></svg>
    </button>
    <input type="range" class="form-range" id="md-volume" min="0" max="100" value="70" data-suffix="%">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/><path d="M18.5 5.5a9 9 0 0 1 0 13"/></svg>
  </div>
</div></div></div></div>

<div><span class="lbl">Brightness with sun icons</span><div class="card demo-card"><div class="card-body p-4">
<div class="md warm">
  <div class="d-flex justify-content-between align-items-baseline gap-3"><label class="form-label fw-semibold mb-0" for="md-bright">Screen brightness</label><output class="md-value fw-bold" for="md-bright">55%</output></div>
  <div class="d-flex align-items-center gap-3">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="3.5"/><path d="M12 5v1m0 12v1m7-7h-1M6 12H5m12-5-.7.7M7.7 16.3 7 17m10 0-.7-.7M7.7 7.7 7 7"/></svg>
    <input type="range" class="form-range" id="md-bright" min="0" max="100" value="55" data-suffix="%">
    <svg class="md-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4.5"/><path d="M12 2v2.5m0 15V22m10-10h-2.5M4.5 12H2m17.1-7.1-1.8 1.8M6.7 17.3l-1.8 1.8m14.2 0-1.8-1.8M6.7 6.7 4.9 4.9"/></svg>
  </div>
</div></div></div></div>

<div><span class="lbl">Control-centre pills</span><div class="card demo-card"><div class="card-body p-4">
<div class="d-grid gap-4">
<div class="md pill">
  <label for="md-media" class="form-label fw-semibold mb-0">Media volume</label>
  <div class="md-pill">
    <input type="range" class="form-range" id="md-media" min="0" max="100" value="62" data-suffix="%">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/></svg>
    <output for="md-media">62%</output>
  </div>
</div>
<div class="md pill">
  <label for="md-display" class="form-label fw-semibold mb-0">Display brightness</label>
  <div class="md-pill">
    <input type="range" class="form-range" id="md-display" min="0" max="100" value="38" data-suffix="%">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 3v1.5m0 15V21m9-9h-1.5M4.5 12H3m15.4-6.4-1 1M6.6 17.4l-1 1m12.8 0-1-1M6.6 6.6l-1-1"/></svg>
    <output for="md-display">38%</output>
  </div>
</div>
</div></div></div></div>

<div><span class="lbl">Colour temperature</span><div class="card demo-card"><div class="card-body p-4">
<div class="md temp">
  <div class="d-flex justify-content-between align-items-baseline gap-3"><label class="form-label fw-semibold mb-0" for="md-kelvin">Night light warmth</label><output class="md-value fw-bold" for="md-kelvin">4,200 K</output></div>
  <input type="range" class="form-range" id="md-kelvin" min="2700" max="6500" step="100" value="4200" data-suffix=" K">
  <div class="md-scale d-flex justify-content-between" aria-hidden="true"><span>Warm</span><span>Cool</span></div>
</div></div></div></div>
CSS
/* Volume and brightness sliders: Bootstrap .form-range with SVG icons beside or inside it.
   --p (0 to 1) is set by the script below and drives the filled part of the track. */
.md{--md-accent:#0369a1;--md-track:#8391a7;--md-thumb:18px;--md-h:6px;--p:0;display:grid;gap:12px}
.md .form-label{font-size:.95rem;color:#1e293b}
.md .md-value{font-size:.95rem;font-weight:700;color:var(--md-accent);font-variant-numeric:tabular-nums}
.md-icon{flex:none;width:22px;height:22px;color:#475569}
.md .form-range{flex:1;min-width:0;height:var(--md-thumb)}
.md .form-range::-webkit-slider-runnable-track{height:var(--md-h);border-radius:999px;
  background:linear-gradient(to right,var(--md-accent) 0 calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)),var(--md-track) 0)}
.md .form-range::-moz-range-track{height:var(--md-h);border-radius:999px;
  background:linear-gradient(to right,var(--md-accent) 0 calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)),var(--md-track) 0)}
.md .form-range::-webkit-slider-thumb{box-sizing:border-box;
  width:var(--md-thumb);height:var(--md-thumb);margin-top:calc((var(--md-h) - var(--md-thumb)) / 2);
  border:2px solid var(--md-accent);border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(15,23,42,.25)}
.md .form-range::-moz-range-thumb{box-sizing:border-box;width:var(--md-thumb);height:var(--md-thumb);
  border:2px solid var(--md-accent);border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(15,23,42,.25)}
.md .form-range:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px var(--md-accent)}
.md .form-range:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px var(--md-accent)}
/* mute button: swaps the sound waves for a cross when pressed */
.md-mute{--bs-btn-padding-x:0;--bs-btn-padding-y:0;--bs-btn-border-width:0;--bs-btn-border-radius:10px;--bs-btn-bg:#eef2f7;--bs-btn-color:#334155;
  --bs-btn-hover-bg:#e2e8f0;--bs-btn-hover-color:#334155;--bs-btn-active-bg:#e2e8f0;--bs-btn-active-color:#334155;
  flex:none;display:grid;place-items:center;width:36px;height:36px}
.md-mute:focus-visible{outline:2px solid var(--md-accent);outline-offset:2px;box-shadow:none}
.md-mute svg{width:22px;height:22px}
.md-mute .md-off,.md-mute[aria-pressed="true"] .md-on{display:none}
.md-mute[aria-pressed="true"] .md-off{display:inline}
.md-mute[aria-pressed="true"]{--bs-btn-bg:#fee2e2;--bs-btn-color:#b91c1c;--bs-btn-hover-bg:#fecaca;--bs-btn-hover-color:#b91c1c}
/* warm brightness: amber fill */
.md.warm{--md-accent:#d97706}
.md.warm .md-value{color:#b45309}
.md.warm .form-range::-webkit-slider-runnable-track{background:
  linear-gradient(to right,#fbbf24,#ea580c) 0 0 / calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)) 100% no-repeat,var(--md-track)}
.md.warm .form-range::-moz-range-track{background:
  linear-gradient(to right,#fbbf24,#ea580c) 0 0 / calc(var(--md-thumb) / 2 + (100% - var(--md-thumb)) * var(--p)) 100% no-repeat,var(--md-track)}
/* control-centre pill: a 48px track, a slim handle, icon and value drawn inside */
.md.pill{--md-thumb:14px;--md-h:48px;--md-track:#334155}
.md-pill{position:relative}
.md.pill .form-range{height:48px;border-radius:16px}
.md.pill .form-range::-webkit-slider-runnable-track{border-radius:16px}
.md.pill .form-range::-moz-range-track{border-radius:16px}
.md.pill .form-range::-webkit-slider-thumb{width:14px;height:48px;margin-top:0;border:0;border-radius:0;box-shadow:none;
  background:linear-gradient(#fff,#fff) center / 4px 22px no-repeat}
.md.pill .form-range::-moz-range-thumb{width:14px;height:48px;border:0;border-radius:0;box-shadow:none;
  background:linear-gradient(#fff,#fff) center / 4px 22px no-repeat}
.md.pill .form-range:focus-visible{outline:2px solid var(--md-accent);outline-offset:3px}
.md.pill .form-range:focus-visible::-webkit-slider-thumb{box-shadow:none}
.md.pill .form-range:focus-visible::-moz-range-thumb{box-shadow:none}
.md-pill svg{position:absolute;left:16px;top:50%;width:22px;height:22px;transform:translateY(-50%);color:#fff;pointer-events:none}
.md-pill output{position:absolute;right:18px;top:50%;transform:translateY(-50%);color:#fff;font-size:.9rem;font-weight:700;
  font-variant-numeric:tabular-nums;pointer-events:none}
/* colour temperature: the track itself is the scale */
.md.temp{--md-thumb:24px;--md-h:10px}
.md.temp .md-value{color:#1e293b}
.md.temp .form-range::-webkit-slider-runnable-track{box-shadow:inset 0 0 0 1px rgba(15,23,42,.45);
  background:linear-gradient(to right,#f97316,#fcd34d 30%,#fef9c3 50%,#dbeafe 70%,#60a5fa)}
.md.temp .form-range::-moz-range-track{box-shadow:inset 0 0 0 1px rgba(15,23,42,.45);
  background:linear-gradient(to right,#f97316,#fcd34d 30%,#fef9c3 50%,#dbeafe 70%,#60a5fa)}
.md.temp .form-range::-webkit-slider-thumb{border:3px solid #1e293b;background:#fff}
.md.temp .form-range::-moz-range-thumb{border:3px solid #1e293b;background:#fff}
.md.temp .form-range:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px #1e293b}
.md.temp .form-range:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px #fff,0 0 0 5px #1e293b}
.md-scale{font-size:.8rem;color:#475569}
JavaScript
// Keeps each slider's filled track (--p) and its <output> in step with the value.
document.querySelectorAll('.md .form-range').forEach(function (range) {
  var field = range.closest('.md');
  var out = field.querySelector('output');
  function sync() {
    var text = (range.dataset.prefix || '') + Number(range.value).toLocaleString('en-US') + (range.dataset.suffix || '');
    field.style.setProperty('--p', (range.value - range.min) / (range.max - range.min));
    if (out) out.textContent = text;
    range.setAttribute('aria-valuetext', text);
  }
  range.addEventListener('input', sync);
  sync();
});
// Mute button: remembers the last volume, drops the slider to 0 and restores it on the second press.
document.querySelectorAll('.md-mute').forEach(function (btn) {
  var range = document.getElementById(btn.getAttribute('aria-controls')), last = range.value;
  btn.addEventListener('click', function () {
    if (+range.value > 0) { last = range.value; range.value = 0; } else { range.value = +last > 0 ? last : 50; }
    range.dispatchEvent(new Event('input'));
  });
  range.addEventListener('input', function () { btn.setAttribute('aria-pressed', String(+range.value === 0)); });
});

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#56657a] uppercase">Volume with a mute button</span><div class="rounded-2xl border border-[#e0e6ee] bg-white px-6 pt-[22px] pb-6 shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<div class="md grid gap-3 [--p:0]">
  <div class="flex items-baseline justify-between gap-3"><label for="md-volume" class="text-[.95rem] font-semibold">Volume</label><output for="md-volume" class="text-[.95rem] font-bold text-md-accent tabular-nums">70%</output></div>
  <div class="flex items-center gap-3">
    <button type="button" class="md-mute group grid size-9 flex-none cursor-pointer place-items-center rounded-[10px] bg-[#eef2f7] text-[#334155] hover:bg-[#e2e8f0] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-md-accent aria-pressed:bg-[#fee2e2] aria-pressed:text-[#b91c1c]" aria-label="Mute" aria-pressed="false" aria-controls="md-volume">
      <svg class="size-[22px]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path class="group-aria-pressed:hidden" d="M15.5 8.5a5 5 0 0 1 0 7"/><path class="hidden group-aria-pressed:inline" d="m16 9 6 6m0-6-6 6"/></svg>
    </button>
    <input type="range" id="md-volume" min="0" max="100" value="70" data-suffix="%" class="block h-[18px] w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none min-w-0 flex-1 [&::-webkit-slider-runnable-track]:h-[6px] [&::-webkit-slider-runnable-track]:rounded-full [&::-moz-range-track]:h-[6px] [&::-moz-range-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(9px_+_(100%_-_18px)_*_var(--p)),var(--color-md-track)_0)] [&::-moz-range-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(9px_+_(100%_-_18px)_*_var(--p)),var(--color-md-track)_0)] [&::-webkit-slider-thumb]:-mt-[6px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-[18px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-md-accent [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-[18px] [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-md-accent [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_var(--color-md-accent)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_var(--color-md-accent)]">
    <svg class="size-[22px] flex-none text-[#475569]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/><path d="M18.5 5.5a9 9 0 0 1 0 13"/></svg>
  </div>
</div></div></div>

<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#56657a] uppercase">Brightness with sun icons</span><div class="rounded-2xl border border-[#e0e6ee] bg-white px-6 pt-[22px] pb-6 shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<div class="md grid gap-3 [--p:0]">
  <div class="flex items-baseline justify-between gap-3"><label for="md-bright" class="text-[.95rem] font-semibold">Screen brightness</label><output for="md-bright" class="text-[.95rem] font-bold text-[#b45309] tabular-nums">55%</output></div>
  <div class="flex items-center gap-3">
    <svg class="size-[22px] flex-none text-[#475569]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="3.5"/><path d="M12 5v1m0 12v1m7-7h-1M6 12H5m12-5-.7.7M7.7 16.3 7 17m10 0-.7-.7M7.7 7.7 7 7"/></svg>
    <input type="range" id="md-bright" min="0" max="100" value="55" data-suffix="%" class="block h-[18px] w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none min-w-0 flex-1 [&::-webkit-slider-runnable-track]:h-[6px] [&::-webkit-slider-runnable-track]:rounded-full [&::-moz-range-track]:h-[6px] [&::-moz-range-track]:rounded-full [&::-webkit-slider-runnable-track]:[background:linear-gradient(to_right,#fbbf24,#ea580c)_0_0/calc(9px_+_(100%_-_18px)_*_var(--p))_100%_no-repeat,var(--color-md-track)] [&::-moz-range-track]:[background:linear-gradient(to_right,#fbbf24,#ea580c)_0_0/calc(9px_+_(100%_-_18px)_*_var(--p))_100%_no-repeat,var(--color-md-track)] [&::-webkit-slider-thumb]:-mt-[6px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-[18px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-md-warm [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-[18px] [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-md-warm [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_var(--color-md-warm)] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_var(--color-md-warm)]">
    <svg class="size-[22px] flex-none text-[#475569]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4.5"/><path d="M12 2v2.5m0 15V22m10-10h-2.5M4.5 12H2m17.1-7.1-1.8 1.8M6.7 17.3l-1.8 1.8m14.2 0-1.8-1.8M6.7 6.7 4.9 4.9"/></svg>
  </div>
</div></div></div>

<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#56657a] uppercase">Control-centre pills</span><div class="rounded-2xl border border-[#e0e6ee] bg-white px-6 pt-[22px] pb-6 shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<div class="grid gap-[22px]">
<div class="md grid gap-3 [--p:0]">
  <label for="md-media" class="text-[.95rem] font-semibold">Media volume</label>
  <div class="relative">
    <input type="range" id="md-media" min="0" max="100" value="62" data-suffix="%" class="block h-12 w-full cursor-pointer appearance-none rounded-2xl bg-transparent focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-md-accent [&::-webkit-slider-runnable-track]:h-12 [&::-webkit-slider-runnable-track]:rounded-2xl [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(7px_+_(100%_-_14px)_*_var(--p)),var(--color-md-pill)_0)] [&::-moz-range-track]:h-12 [&::-moz-range-track]:rounded-2xl [&::-moz-range-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(7px_+_(100%_-_14px)_*_var(--p)),var(--color-md-pill)_0)] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-12 [&::-webkit-slider-thumb]:w-3.5 [&::-webkit-slider-thumb]:border-0 [&::-webkit-slider-thumb]:rounded-none [&::-webkit-slider-thumb]:[background:linear-gradient(#fff,#fff)_center/4px_22px_no-repeat] [&::-moz-range-thumb]:h-12 [&::-moz-range-thumb]:w-3.5 [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:rounded-none [&::-moz-range-thumb]:[background:linear-gradient(#fff,#fff)_center/4px_22px_no-repeat]">
    <svg class="pointer-events-none absolute top-1/2 left-4 size-[22px] -translate-y-1/2 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M11 5 6 9H3v6h3l5 4z"/><path d="M15.5 8.5a5 5 0 0 1 0 7"/></svg>
    <output for="md-media" class="pointer-events-none absolute top-1/2 right-[18px] -translate-y-1/2 text-[.9rem] font-bold text-white tabular-nums">62%</output>
  </div>
</div>
<div class="md grid gap-3 [--p:0]">
  <label for="md-display" class="text-[.95rem] font-semibold">Display brightness</label>
  <div class="relative">
    <input type="range" id="md-display" min="0" max="100" value="38" data-suffix="%" class="block h-12 w-full cursor-pointer appearance-none rounded-2xl bg-transparent focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-md-accent [&::-webkit-slider-runnable-track]:h-12 [&::-webkit-slider-runnable-track]:rounded-2xl [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(7px_+_(100%_-_14px)_*_var(--p)),var(--color-md-pill)_0)] [&::-moz-range-track]:h-12 [&::-moz-range-track]:rounded-2xl [&::-moz-range-track]:bg-[linear-gradient(to_right,var(--color-md-accent)_0_calc(7px_+_(100%_-_14px)_*_var(--p)),var(--color-md-pill)_0)] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-12 [&::-webkit-slider-thumb]:w-3.5 [&::-webkit-slider-thumb]:border-0 [&::-webkit-slider-thumb]:rounded-none [&::-webkit-slider-thumb]:[background:linear-gradient(#fff,#fff)_center/4px_22px_no-repeat] [&::-moz-range-thumb]:h-12 [&::-moz-range-thumb]:w-3.5 [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:rounded-none [&::-moz-range-thumb]:[background:linear-gradient(#fff,#fff)_center/4px_22px_no-repeat]">
    <svg class="pointer-events-none absolute top-1/2 left-4 size-[22px] -translate-y-1/2 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 3v1.5m0 15V21m9-9h-1.5M4.5 12H3m15.4-6.4-1 1M6.6 17.4l-1 1m12.8 0-1-1M6.6 6.6l-1-1"/></svg>
    <output for="md-display" class="pointer-events-none absolute top-1/2 right-[18px] -translate-y-1/2 text-[.9rem] font-bold text-white tabular-nums">38%</output>
  </div>
</div>
</div></div></div>

<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#56657a] uppercase">Colour temperature</span><div class="rounded-2xl border border-[#e0e6ee] bg-white px-6 pt-[22px] pb-6 shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<div class="md grid gap-3 [--p:0]">
  <div class="flex items-baseline justify-between gap-3"><label for="md-kelvin" class="text-[.95rem] font-semibold">Night light warmth</label><output for="md-kelvin" class="text-[.95rem] font-bold text-[#1e293b] tabular-nums">4,200 K</output></div>
  <input type="range" id="md-kelvin" min="2700" max="6500" step="100" value="4200" data-suffix=" K" class="block h-[24px] w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none [&::-webkit-slider-runnable-track]:h-[10px] [&::-webkit-slider-runnable-track]:rounded-full [&::-moz-range-track]:h-[10px] [&::-moz-range-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-[linear-gradient(to_right,#f97316,#fcd34d_30%,#fef9c3_50%,#dbeafe_70%,#60a5fa)] [&::-webkit-slider-runnable-track]:shadow-[inset_0_0_0_1px_rgba(15,23,42,.45)] [&::-moz-range-track]:bg-[linear-gradient(to_right,#f97316,#fcd34d_30%,#fef9c3_50%,#dbeafe_70%,#60a5fa)] [&::-moz-range-track]:shadow-[inset_0_0_0_1px_rgba(15,23,42,.45)] [&::-webkit-slider-thumb]:-mt-[7px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:box-border [&::-webkit-slider-thumb]:size-[24px] [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-3 [&::-webkit-slider-thumb]:border-[#1e293b] [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] [&::-moz-range-thumb]:box-border [&::-moz-range-thumb]:size-[24px] [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-3 [&::-moz-range-thumb]:border-[#1e293b] [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:shadow-[0_1px_3px_rgba(15,23,42,.25)] focus-visible:[&::-webkit-slider-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_#1e293b] focus-visible:[&::-moz-range-thumb]:shadow-[0_0_0_3px_#fff,0_0_0_5px_#1e293b]">
  <div class="flex justify-between text-[.8rem] text-[#475569]" aria-hidden="true"><span>Warm</span><span>Cool</span></div>
</div></div></div>
CSS
@theme {
  --color-md-accent: #0369a1;
  --color-md-warm: #d97706;
  --color-md-track: #8391a7;
  --color-md-pill: #334155;
}
JavaScript
// Keeps each slider's filled track (--p) and its <output> in step with the value.
document.querySelectorAll('.md input[type="range"]').forEach(function (range) {
  var field = range.closest('.md');
  var out = field.querySelector('output');
  function sync() {
    var text = (range.dataset.prefix || '') + Number(range.value).toLocaleString('en-US') + (range.dataset.suffix || '');
    field.style.setProperty('--p', (range.value - range.min) / (range.max - range.min));
    if (out) out.textContent = text;
    range.setAttribute('aria-valuetext', text);
  }
  range.addEventListener('input', sync);
  sync();
});
// Mute button: remembers the last volume, drops the slider to 0 and restores it on the second press.
document.querySelectorAll('.md-mute').forEach(function (btn) {
  var range = document.getElementById(btn.getAttribute('aria-controls')), last = range.value;
  btn.addEventListener('click', function () {
    if (+range.value > 0) { last = range.value; range.value = 0; } else { range.value = +last > 0 ? last : 50; }
    range.dispatchEvent(new Event('input'));
  });
  range.addEventListener('input', function () { btn.setAttribute('aria-pressed', String(+range.value === 0)); });
});

About this set

Sliders for media players, smart home panels and system settings, each with inline SVG icons. Volume with a mute button places a speaker button on the left of the track and a loud speaker icon on the right; pressing the button remembers the level, drops the slider to zero and brings the level back on the next press. Brightness with sun icons uses a small and a large sun and an amber to orange gradient fill. Control-centre pills are 48 pixel tall tracks in the style of phone quick settings, with the icon and the percentage drawn inside and a slim white handle where the fill ends. Colour temperature has no fill at all: the track is the scale itself, from warm orange to cool blue, with a dark-ringed thumb. All of them are real range inputs, and the icons, percentages and handle are layered with CSS so the whole pill stays one draggable control. A short script updates the fill, the readouts and aria-valuetext, and a few more lines run the mute button.

What’s included

  • Mute button that restores the previous volume
  • Sun icons and a gradient fill for brightness
  • Control-centre pills with icon and value inside the track
  • Colour temperature track that is its own scale
  • Decorative icons hidden from assistive technology

Accessibility

Every slider has a visible label. The mute button is a real button named Mute with aria-pressed, which turns true whenever the volume sits at zero, and aria-controls pointing at the slider. Icons are aria-hidden. Focus shows a ring on the thumb, or an outline around the whole pill where the handle is too slim to carry one.

Customise it

On .md change --md-accent, --md-track, --md-thumb and --md-h; .warm, .pill and .temp override them for their variants (plain CSS and Bootstrap). In Tailwind edit the --color-md-* theme colours; the brightness gradient and temperature stops sit in the track background utilities.