apps/eclipse/content/design-system/components/slider.mdx
import { Slider } from "@prisma/eclipse";
Basic Slider
import { Slider } from "@prisma/eclipse";
export function BasicSlider() {
return <Slider defaultValue={[50]} max={100} step={1} />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[50]} max={100} step={1} /> </div>Controlled Slider
import { Slider } from "@prisma/eclipse";
import { useState } from "react";
export function ControlledSlider() {
const [value, setValue] = useState([25]);
return (
<div>
<Slider value={value} onValueChange={setValue} max={100} step={1} />
<p>Value: {value[0]}</p>
</div>
);
}
Range Slider
Use multiple values to create a range selector:
import { Slider } from "@prisma/eclipse";
export function RangeSlider() {
return <Slider defaultValue={[25, 75]} max={100} step={1} />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[25, 75]} max={100} step={1} /> </div>Custom Step Size
import { Slider } from "@prisma/eclipse";
export function SteppedSlider() {
return <Slider defaultValue={[50]} max={100} step={10} />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[50]} max={100} step={10} /> </div>With Min and Max Values
import { Slider } from "@prisma/eclipse";
export function CustomRangeSlider() {
return <Slider defaultValue={[0]} min={-50} max={50} step={5} />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[0]} min={-50} max={50} step={5} /> </div>Disabled State
import { Slider } from "@prisma/eclipse";
export function DisabledSlider() {
return <Slider defaultValue={[50]} max={100} step={1} disabled />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[50]} max={100} step={1} disabled /> </div>Error State
Show an error state with the isErrored prop:
import { Slider } from "@prisma/eclipse";
export function ErrorSlider() {
return <Slider defaultValue={[50]} max={100} step={1} isErrored />;
}
Live Example:
<div className="w-full max-w-md my-6"> <Slider defaultValue={[50]} max={100} step={1} isErrored /> </div>With Labels
import { Slider } from "@prisma/eclipse";
import { useState } from "react";
export function LabeledSlider() {
const [value, setValue] = useState([50]);
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<label htmlFor="volume">Volume</label>
<span className="text-sm text-muted-foreground">{value[0]}%</span>
</div>
<Slider
id="volume"
value={value}
onValueChange={setValue}
max={100}
step={1}
/>
</div>
);
}
defaultValue - The initial value(s) when uncontrolled (number[], optional)value - The controlled value(s) (number[], optional)onValueChange - Callback when value changes ((value: number[]) => void, optional)min - Minimum value (number, default: 0)max - Maximum value (number, default: 100)step - Step increment (number, default: 1)disabled - Whether the slider is disabled (boolean, default: false)isErrored - Whether the slider is in an error state (boolean, default: false)orientation - Slider orientation: "horizontal" or "vertical" (default: "horizontal")className - Additional CSS classes (optional)Volume Control
<Slider defaultValue={[70]} max={100} step={1} aria-label="Volume" />
Price Range Filter
<Slider defaultValue={[0, 1000]} min={0} max={5000} step={50} aria-label="Price range" />
Opacity Adjustment
<Slider defaultValue={[100]} max={100} step={1} aria-label="Opacity" />
Zoom Level
<Slider defaultValue={[100]} min={50} max={200} step={10} aria-label="Zoom level" />
Rating Selection
<Slider defaultValue={[3]} min={1} max={5} step={1} aria-label="Rating" />
aria-label or associated labels for screen reader context| Key | Action |
|---|---|
← / ↓ | Decrease value by step |
→ / ↑ | Increase value by step |
Home | Jump to minimum value |
End | Jump to maximum value |
Page Up | Increase by larger step |
Page Down | Decrease by larger step |
Complete example with state management and value display:
import { Slider } from "@prisma/eclipse";
import { useState } from "react";
export function SettingsPanel() {
const [volume, setVolume] = useState([75]);
const [brightness, setBrightness] = useState([50]);
const [priceRange, setPriceRange] = useState([0, 1000]);
return (
<div className="space-y-6 w-full max-w-md">
<div className="space-y-2">
<div className="flex justify-between">
<label>Volume</label>
<span className="text-sm text-muted-foreground">{volume[0]}%</span>
</div>
<Slider value={volume} onValueChange={setVolume} max={100} />
</div>
<div className="space-y-2">
<div className="flex justify-between">
<label>Brightness</label>
<span className="text-sm text-muted-foreground">{brightness[0]}%</span>
</div>
<Slider value={brightness} onValueChange={setBrightness} max={100} />
</div>
<div className="space-y-2">
<div className="flex justify-between">
<label>Price Range</label>
<span className="text-sm text-muted-foreground">
${priceRange[0]} - ${priceRange[1]}
</span>
</div>
<Slider
value={priceRange}
onValueChange={setPriceRange}
min={0}
max={5000}
step={50}
/>
</div>
</div>
);
}