Slider
avenra/liquid-sliderFreeComponent
A liquid glass slider.
Install it
npx shadcn@latest add https://docs.avenra.online/r/liquid-slider.jsonSource
1'use client';23import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';4import {5 createLiquidSlider,6 LiquidSliderHandle,7 LiquidSliderEventMap,8 LiquidSliderOptions,9} from '@avenra/liquid-glass';1011export interface LiquidSliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {12 min: number;13 max: number;14 value: number;15 options?: LiquidSliderOptions;16 events?: {17 [K in keyof LiquidSliderEventMap]?: (payload: LiquidSliderEventMap[K]) => void;18 };19}2021export const LiquidSlider = forwardRef<HTMLDivElement, LiquidSliderProps>(22 ({ min, max, value, options, events, ...props }, ref) => {23 const containerRef = useRef<HTMLDivElement>(null);24 const handleRef = useRef<LiquidSliderHandle | null>(null);2526 useImperativeHandle(ref, () => containerRef.current as HTMLDivElement);2728 useEffect(() => {29 if (!containerRef.current) return;3031 if (containerRef.current.children.length > 0) return; // already initialized3233 handleRef.current = createLiquidSlider(containerRef.current, {34 min,35 max,36 value,37 blur: 0,38 ...options,39 });4041 return () => {42 handleRef.current?.destroy();43 handleRef.current = null;44 };45 }, []);4647 useEffect(() => {48 if (!handleRef.current) return;4950 handleRef.current.value = value;51 }, [value]);5253 useEffect(() => {54 if (!handleRef.current) return;5556 handleRef.current.value = Math.min(Math.max(value, min), max);57 }, [min, max]);5859 useEffect(() => {60 if (!handleRef.current || !events) return;6162 const handle = handleRef.current;6364 for (const key in events) {65 const event = key as keyof LiquidSliderEventMap;66 const handler = events[event];6768 if (handler) {69 handle.on(event, handler as (payload: LiquidSliderEventMap[typeof event]) => void);70 }71 }7273 return () => {74 if (!handleRef.current || !events) return;7576 const handle = handleRef.current;7778 for (const key in events) {79 const event = key as keyof LiquidSliderEventMap;80 const handler = events[event];8182 if (handler) {83 handle.off(event, handler as (payload: LiquidSliderEventMap[typeof event]) => void);84 }85 }86 };87 }, [events]);8889 return <div ref={containerRef} {...props} />;90 },91);9293LiquidSlider.displayName = 'LiquidSlider';
