Forms inputrange

Glass Slider

Translucent range slider with glow.

Preview

Usage

Copy the full block below to use this component with its imports.

astro
---
import { GlassSlider } from 'astro-component-kit';
---

<GlassSlider id="volume" label="Speaker Volume" min={0} max={100} value={75} />
--- import { GlassSlider } from 'astro-component-kit'; --- <GlassSlider id="volume" label="Speaker Volume" min={0} max={100} value={75} />

Manual Installation

If you are not using the npm package, create a new file src/components/lib/GlassSlider.astro and paste the following code:

astro
---
/**
 * GlassSlider — A translucent range slider with a glowing thumb and backdrop-blur track.
 * 
 * @param {string} label - Optional descriptive text title.
 * @param {string} id - HTML ID for the range input.
 * @param {string} name - HTML name binding.
 * @param {number} min - Minimum value. Default is 0.
 * @param {number} max - Maximum value. Default is 100.
 * @param {number} value - Initial starting value. Default is 50.
 * @param {number} step - Step increment. Default is 1.
 */
interface Props {
  label?: string;
  id: string;
  name?: string;
  min?: number;
  max?: number;
  value?: number;
  step?: number;
}

const { label, id, name, min = 0, max = 100, value = 50, step = 1 } = Astro.props;
---

<div class="slider-container">
  {label && <div class="slider-header"><label for={id}>{label}</label> <span data-slider-value>{value}</span></div>}
  <input 
    type="range" 
    class="glass-slider" 
    {id} 
    {name} 
    {min} 
    {max} 
    {step} 
    {value}
    data-slider-input
  />
</div>

<style>
  .slider-container { width: 100%; display: flex; flex-direction: column; gap: var(--sp-3, 0.75rem); }
  .slider-header { display: flex; justify-content: space-between; font-size: 0.85rem; font-weight: 600; color: var(--c-text-2, #94a3b8); padding: 0 0.5rem; }
  
  .glass-slider { 
    -webkit-appearance: none; 
    width: 100%; height: 8px; 
    background: var(--c-bg-elev, rgba(255,255,255,0.1)); 
    border-radius: var(--r-full, 10px); 
    outline: none; 
    backdrop-filter: blur(5px); 
    border: 1px solid var(--c-border, rgba(255,255,255,0.05));
    cursor: pointer;
  }
  
  /* Thumb Styling - Webkit */
  .glass-slider::-webkit-slider-thumb { 
    -webkit-appearance: none; 
    width: 22px; height: 22px; 
    border-radius: 50%; 
    background: var(--c-primary, #6366f1); 
    cursor: pointer; 
    border: 3px solid rgba(255,255,255,0.6); 
    box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4); 
    transition: transform 0.2s;
  }
  
  .glass-slider::-webkit-slider-thumb:hover { transform: scale(1.15); }
  
  /* Thumb Styling - Firefox */
  .glass-slider::-moz-range-thumb { 
    width: 18px; height: 18px; 
    border-radius: 50%; 
    background: var(--c-primary, #6366f1); 
    cursor: pointer; 
    border: 3px solid rgba(255,255,255,0.6); 
    box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4); 
  }
</style>

<script>
  document.querySelectorAll('[data-slider-input]').forEach(slider => {
    const display = slider.closest('.slider-container')?.querySelector('[data-slider-value]');
    slider.addEventListener('input', (e) => {
      if (display) display.textContent = (e.target as HTMLInputElement).value;
    });
  });
</script>
--- /** * GlassSlider — A translucent range slider with a glowing thumb and backdrop-blur track. * * @param {string} label - Optional descriptive text title. * @param {string} id - HTML ID for the range input. * @param {string} name - HTML name binding. * @param {number} min - Minimum value. Default is 0. * @param {number} max - Maximum value. Default is 100. * @param {number} value - Initial starting value. Default is 50. * @param {number} step - Step increment. Default is 1. */ interface Props { label?: string; id: string; name?: string; min?: number; max?: number; value?: number; step?: number; } const { label, id, name, min = 0, max = 100, value = 50, step = 1 } = Astro.props; --- <div class="slider-container"> {label && <div class="slider-header"><label for={id}>{label}</label> <span data-slider-value>{value}</span></div>} <input type="range" class="glass-slider" {id} {name} {min} {max} {step} {value} data-slider-input /> </div> <style> .slider-container { width: 100%; display: flex; flex-direction: column; gap: var(--sp-3, 0.75rem); } .slider-header { display: flex; justify-content: space-between; font-size: 0.85rem; font-weight: 600; color: var(--c-text-2, #94a3b8); padding: 0 0.5rem; } .glass-slider { -webkit-appearance: none; width: 100%; height: 8px; background: var(--c-bg-elev, rgba(255,255,255,0.1)); border-radius: var(--r-full, 10px); outline: none; backdrop-filter: blur(5px); border: 1px solid var(--c-border, rgba(255,255,255,0.05)); cursor: pointer; } /* Thumb Styling - Webkit */ .glass-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 22px; height: 22px; border-radius: 50%; background: var(--c-primary, #6366f1); cursor: pointer; border: 3px solid rgba(255,255,255,0.6); box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4); transition: transform 0.2s; } .glass-slider::-webkit-slider-thumb:hover { transform: scale(1.15); } /* Thumb Styling - Firefox */ .glass-slider::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: var(--c-primary, #6366f1); cursor: pointer; border: 3px solid rgba(255,255,255,0.6); box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4); } </style> <script> document.querySelectorAll('[data-slider-input]').forEach(slider => { const display = slider.closest('.slider-container')?.querySelector('[data-slider-value]'); slider.addEventListener('input', (e) => { if (display) display.textContent = (e.target as HTMLInputElement).value; }); }); </script>

Quick Info

Category
Forms
Filename
GlassSlider.astro
Dependencies
None — pure Astro + CSS
Tags
inputrange