Slider
figui/sliderFreeComponent
A slider component with color range and opacity variants
Live preview
live · rendered by the registry
Rendered by figui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://figui.dev/r/slider.jsonSource
1import { cn } from "@/lib/utils";2import { Slider as BaseSlider } from "@base-ui/react";3import React from "react";4import chroma from "chroma-js";56function Slider({ className, value, defaultValue, min, max, ...props }: BaseSlider.Root.Props) {7 const _values = React.useMemo(8 () =>9 Array.isArray(value)10 ? value11 : typeof value === "number"12 ? [value]13 : Array.isArray(defaultValue)14 ? defaultValue15 : typeof defaultValue === "number"16 ? [defaultValue]17 : [min ?? 0],18 [value, defaultValue, min],19 );2021 return (22 <BaseSlider.Root23 defaultValue={defaultValue}24 value={value}25 min={min}26 max={max}27 thumbAlignment="edge"28 {...props}29 >30 <BaseSlider.Control31 className={cn(32 "flex w-32 touch-none items-center rounded-full bg-grey-100 inset-ring inset-ring-grey-200 select-none dark:bg-grey-700 dark:inset-ring-grey-600",33 className,34 )}35 >36 <BaseSlider.Track className={cn("h-4 w-full select-none")}>37 <BaseSlider.Indicator38 className={cn("bg-blue-500 select-none", _values.length === 1 ? "rounded-l-full" : "")}39 />40 {Array.from({ length: _values.length }).map((_, index) => (41 <BaseSlider.Thumb42 key={index}43 className={cn(44 "size-4 rounded-full bg-white-1000 shadow-100 select-none before:hidden",45 )}46 >47 <span className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full border border-black-100 bg-blue-500" />48 </BaseSlider.Thumb>49 ))}50 </BaseSlider.Track>51 </BaseSlider.Control>52 </BaseSlider.Root>53 );54}5556interface ColorRangeSliderProps extends Omit<57 BaseSlider.Root.Props,58 "value" | "defaultValue" | "min" | "max" | "onValueChange" | "children"59> {60 value?: number;61 defaultValue?: number;62 min?: number;63 max?: number;64 step?: number;65 onValueChange?: (value: number, event: Event, activeThumbIndex: number) => void;66}6768function ColorRangeSlider({69 className,70 value,71 defaultValue = 0,72 min = 0,73 max = 360,74 step = 1,75 onValueChange,76 ...props77}: ColorRangeSliderProps) {78 const isControlled = value !== undefined;79 const [internalValue, setInternalValue] = React.useState<number>(defaultValue ?? 0);8081 React.useEffect(() => {82 if (!isControlled && defaultValue !== undefined) {83// … truncated
What it pulls in
npm packages
Files it writes
More from figui
All 12 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Buttonbutton | figui | Components | Free | no deps | |
| Checkboxcheckbox | figui | Components | Free | no deps | |
| Inputinput | figui | Components | Free | 2 deps · 6 files | |
| Menumenu | figui | Components | Free | 1 dep | |
| Radioradio | figui | Components | Free | no deps | |
| Segmented Controlsegmented-control | figui | Components | Free | 1 dep | |
| Selectselect | figui | Components | Free | no deps | |
| Separatorseparator | figui | Components | Free | no deps |
