@input-kit/slider 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Input Kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @input-kit/slider
2
+
3
+ Headless React slider primitives with single-value and range modes.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @input-kit/slider
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - Single-value and dual-thumb range sliders
14
+ - Keyboard support with arrow, page, home, and end keys
15
+ - Vertical and horizontal layouts
16
+ - Ticks, marks, tooltips, and formatted value text
17
+ - `onChange` and `onChangeEnd` callbacks
18
+
19
+ ## Usage
20
+
21
+ ```tsx
22
+ import { RangeSlider, Slider } from '@input-kit/slider';
23
+
24
+ function Example() {
25
+ return (
26
+ <>
27
+ <Slider defaultValue={32} min={0} max={100} aria-label="Volume" />
28
+ <RangeSlider defaultValue={[200, 700]} min={0} max={1000} minDistance={50} aria-label="Budget" />
29
+ </>
30
+ );
31
+ }
32
+ ```
33
+
34
+ ## Notes
35
+
36
+ - `RangeSlider` thumbs are keyboard accessible and respect `minDistance`.
37
+ - Use `formatValue` to control tooltip text and `aria-valuetext` output.
38
+ - Use `orientation="vertical"` for mixer, brightness, or thermostat controls.
39
+
40
+ ## License
41
+
42
+ MIT © Input Kit
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime');function Y(S,a,o){return Math.min(Math.max(S,a),o)}function I(S,a,o){let u=Math.round((S-o)/a);return o+u*a}function O(S,a,o){return (S-a)/(o-a)*100}function F(S,a,o,u,X,r){let i=S/a;r==="vertical"&&(i=1-i);let b=o+i*(u-o);return I(Y(b,o,u),X,o)}function te(S={}){let{min:a=0,max:o=100,step:u=1,defaultValue:X=a,value:r,onChange:i,onChangeEnd:b,orientation:v="horizontal",disabled:x=false}=S,[T,c]=react.useState(X),[w,C]=react.useState(false),k=react.useRef(null),A=react.useRef(null),g=r!==void 0?r:T,z=O(g,a,o),V=react.useCallback(e=>{let t=Y(I(e,u,a),a,o);r===void 0&&c(t),i?.(t);},[r,a,o,u,i]),R=react.useCallback((e,t)=>{if(x||!k.current)return;let n=k.current.getBoundingClientRect(),d=v==="horizontal"?e-n.left:t-n.top,y=v==="horizontal"?n.width:n.height,$=F(d,y,a,o,u,v);V($);},[x,a,o,u,v,V]),B=react.useCallback(e=>{x||(e.preventDefault(),C(true),R(e.clientX,e.clientY));},[x,R]),E=react.useCallback(e=>{if(x)return;C(true);let t=e.touches[0];R(t.clientX,t.clientY);},[x,R]),M=react.useCallback(e=>{if(x)return;let t=g,n=u*10;switch(e.key){case "ArrowRight":case "ArrowUp":e.preventDefault(),t=g+u;break;case "ArrowLeft":case "ArrowDown":e.preventDefault(),t=g-u;break;case "PageUp":e.preventDefault(),t=g+n;break;case "PageDown":e.preventDefault(),t=g-n;break;case "Home":e.preventDefault(),t=a;break;case "End":e.preventDefault(),t=o;break;default:return}V(t),b?.(Y(I(t,u,a),a,o));},[x,g,a,o,u,V,b]);return react.useEffect(()=>{if(!w)return;let e=d=>{R(d.clientX,d.clientY);},t=d=>{let y=d.touches[0];R(y.clientX,y.clientY);},n=()=>{C(false),b?.(g);};return document.addEventListener("mousemove",e),document.addEventListener("mouseup",n),document.addEventListener("touchmove",t),document.addEventListener("touchend",n),()=>{document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n),document.removeEventListener("touchmove",t),document.removeEventListener("touchend",n);}},[w,R,b,g]),{value:g,percentage:z,isDragging:w,trackRef:k,thumbRef:A,getTrackProps:()=>({ref:k,onMouseDown:B,onTouchStart:E}),getThumbProps:()=>({ref:A,role:"slider",tabIndex:x?-1:0,"aria-valuenow":g,"aria-valuemin":a,"aria-valuemax":o,"aria-orientation":v,onKeyDown:M})}}var le=react.forwardRef(function(a,o){let{value:u,defaultValue:X,min:r=0,max:i=100,step:b=1,onChange:v,onChangeEnd:x,disabled:T=false,orientation:c="horizontal",showTooltip:w=false,showTicks:C=false,tickCount:k=5,marks:A,formatValue:g=m=>m.toString(),className:z,style:V,trackClassName:R,thumbClassName:B,"aria-label":E,"aria-labelledby":M}=a,e=te({min:r,max:i,step:b,value:u,defaultValue:X,onChange:v,onChangeEnd:x,orientation:c,disabled:T}),t=c==="horizontal",n=t?{width:"100%",height:"8px"}:{width:"8px",height:"200px"},d=t?{width:`${e.percentage}%`,height:"100%"}:{width:"100%",height:`${e.percentage}%`,bottom:0},y=t?{left:`${e.percentage}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${e.percentage}%`,left:"50%",transform:"translate(-50%, 50%)"},$=C?Array.from({length:k},(m,H)=>H/(k-1)*100):[];return jsxRuntime.jsx("div",{ref:o,className:z,style:{position:"relative",display:"inline-flex",alignItems:"center",...V},children:jsxRuntime.jsxs("div",{...e.getTrackProps(),className:R,style:{position:"relative",background:"#e5e7eb",borderRadius:"4px",cursor:T?"not-allowed":"pointer",...n},children:[jsxRuntime.jsx("div",{style:{position:"absolute",background:T?"#9ca3af":"#3b82f6",borderRadius:"4px",...d}}),C&&$.map((m,H)=>jsxRuntime.jsx("div",{style:{position:"absolute",background:"#9ca3af",...t?{left:`${m}%`,top:"100%",width:"2px",height:"8px",marginTop:"4px",transform:"translateX(-50%)"}:{bottom:`${m}%`,left:"100%",width:"8px",height:"2px",marginLeft:"4px",transform:"translateY(50%)"}}},H)),A?.map((m,H)=>{let L=O(m.value,r,i);return jsxRuntime.jsx("div",{style:{position:"absolute",...t?{left:`${L}%`,top:"100%",marginTop:"12px",transform:"translateX(-50%)"}:{bottom:`${L}%`,left:"100%",marginLeft:"12px",transform:"translateY(50%)"},fontSize:"12px",color:"#6b7280"},children:m.label??m.value},H)}),jsxRuntime.jsx("div",{...e.getThumbProps(),"aria-label":E,"aria-labelledby":M,"aria-valuetext":g(e.value),className:B,style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:T?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:T?"not-allowed":"grab",outline:"none",boxShadow:e.isDragging?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",transition:"box-shadow 0.15s",...y},children:w&&e.isDragging&&jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px",whiteSpace:"nowrap"},children:g(e.value)})})]})})}),se=react.forwardRef(function(a,o){let{value:u,defaultValue:X=[25,75],min:r=0,max:i=100,step:b=1,minDistance:v=0,onChange:x,onChangeEnd:T,disabled:c=false,orientation:w="horizontal",showTooltip:C=false,formatValue:k=h=>h.toString(),className:A,style:g,"aria-label":z,"aria-labelledby":V}=a,[R,B]=react.useState(X),[E,M]=react.useState(null),e=react.useRef(null),t=u!==void 0?u:R,[n,d]=t,y=O(n,r,i),$=O(d,r,i),m=w==="horizontal",H=react.useCallback((h,f)=>{let p=Y(I(f,b,r),r,i),l=h===0?p:n,s=h===1?p:d;return s-l<v&&(h===0?l=Math.min(l,s-v):s=Math.max(s,l+v)),l>s&&([l,s]=[s,l]),[Y(l,r,i),Y(s,r,i)]},[d,n,i,r,v,b]),L=react.useCallback((h,f)=>{let p=H(h,f);return u===void 0&&B(p),x?.(p),p},[u,H,x]),_=react.useCallback((h,f)=>p=>{if(c)return;let l=f,s=b*10;switch(p.key){case "ArrowRight":case "ArrowUp":p.preventDefault(),l=f+b;break;case "ArrowLeft":case "ArrowDown":p.preventDefault(),l=f-b;break;case "PageUp":p.preventDefault(),l=f+s;break;case "PageDown":p.preventDefault(),l=f-s;break;case "Home":p.preventDefault(),l=h===0?r:n+v;break;case "End":p.preventDefault(),l=h===0?d-v:i;break;default:return}let N=L(h,l);T?.(N);},[c,d,n,i,r,v,T,b,L]),Q=react.useCallback(h=>{if(c||!e.current)return;let f=e.current.getBoundingClientRect(),p=m?h.clientX-f.left:h.clientY-f.top,l=m?f.width:f.height,s=F(p,l,r,i,b,w),N=Math.abs(s-n),K=Math.abs(s-d);N<K?(L(0,s),M(0)):(L(1,s),M(1));},[c,m,r,i,b,w,n,d,L]);return react.useEffect(()=>{if(E===null)return;let h=(s,N)=>{if(!e.current)return;let K=e.current.getBoundingClientRect(),W=m?s-K.left:N-K.top,Z=m?K.width:K.height,ee=F(W,Z,r,i,b,w);L(E,ee);},f=s=>h(s.clientX,s.clientY),p=s=>{let N=s.touches[0];h(N.clientX,N.clientY);},l=()=>{M(null),T?.(t);};return document.addEventListener("mousemove",f),document.addEventListener("mouseup",l),document.addEventListener("touchmove",p),document.addEventListener("touchend",l),()=>{document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",l),document.removeEventListener("touchmove",p),document.removeEventListener("touchend",l);}},[E,m,r,i,b,w,L,T,t]),jsxRuntime.jsx("div",{ref:o,className:A,style:{position:"relative",display:"inline-flex",alignItems:"center",...g},children:jsxRuntime.jsxs("div",{ref:e,onClick:Q,style:{position:"relative",background:"#e5e7eb",borderRadius:"4px",cursor:c?"not-allowed":"pointer",...m?{width:"100%",height:"8px"}:{width:"8px",height:"200px"}},children:[jsxRuntime.jsx("div",{style:{position:"absolute",background:c?"#9ca3af":"#3b82f6",borderRadius:"4px",...m?{left:`${y}%`,width:`${$-y}%`,height:"100%"}:{bottom:`${y}%`,height:`${$-y}%`,width:"100%"}}}),jsxRuntime.jsx("div",{role:"slider",tabIndex:c?-1:0,"aria-valuenow":n,"aria-valuemin":r,"aria-valuemax":d-v,"aria-valuetext":k(n),"aria-orientation":w,"aria-label":z?`${z} minimum`:"Minimum value","aria-labelledby":V,onMouseDown:()=>!c&&M(0),onTouchStart:()=>!c&&M(0),onKeyDown:_(0,n),style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:c?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:c?"not-allowed":"grab",outline:"none",boxShadow:E===0?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",zIndex:E===0?2:1,...m?{left:`${y}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${y}%`,left:"50%",transform:"translate(-50%, 50%)"}},children:C&&E===0&&jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px"},children:k(n)})}),jsxRuntime.jsx("div",{role:"slider",tabIndex:c?-1:0,"aria-valuenow":d,"aria-valuemin":n+v,"aria-valuemax":i,"aria-valuetext":k(d),"aria-orientation":w,"aria-label":z?`${z} maximum`:"Maximum value","aria-labelledby":V,onMouseDown:()=>!c&&M(1),onTouchStart:()=>!c&&M(1),onKeyDown:_(1,d),style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:c?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:c?"not-allowed":"grab",outline:"none",boxShadow:E===1?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",zIndex:E===1?2:1,...m?{left:`${$}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${$}%`,left:"50%",transform:"translate(-50%, 50%)"}},children:C&&E===1&&jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px"},children:k(d)})})]})})});exports.RangeSlider=se;exports.Slider=le;exports.useSlider=te;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx"],"names":["clamp","value","min","max","roundToStep","step","steps","getPercentage","getValueFromPosition","position","trackSize","orientation","percentage","rawValue","useSlider","options","defaultValue","controlledValue","onChange","onChangeEnd","disabled","internalValue","setInternalValue","useState","isDragging","setIsDragging","trackRef","useRef","thumbRef","updateValue","useCallback","newValue","clamped","handleMove","clientX","clientY","rect","size","handleMouseDown","handleTouchStart","touch","handleKeyDown","bigStep","useEffect","handleMouseMove","e","handleTouchMove","handleEnd","Slider","forwardRef","props","ref","showTooltip","showTicks","tickCount","marks","formatValue","v","className","style","trackClassName","thumbClassName","ariaLabel","ariaLabelledBy","slider","isHorizontal","trackStyle","fillStyle","thumbStyle","ticks","_","i","jsx","jsxs","tick","mark","markPercent","RangeSlider","minDistance","activeThumb","setActiveThumb","lowValue","highValue","lowPercent","highPercent","getConstrainedValues","thumbIndex","newLow","newHigh","newVal","handleThumbKeyDown","currentValue","nextValue","nextValues","handleTrackClick","clickValue","distToLow","distToHigh"],"mappings":"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","file":"index.cjs","sourcesContent":["// @input-kit/slider - Range slider component\n\nimport React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n forwardRef,\n MouseEvent,\n TouchEvent,\n KeyboardEvent,\n} from 'react';\n\n// Types\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n onChangeEnd?: (value: number) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n showTooltip?: boolean;\n showTicks?: boolean;\n tickCount?: number;\n marks?: { value: number; label?: string }[];\n formatValue?: (value: number) => string;\n className?: string;\n style?: React.CSSProperties;\n trackClassName?: string;\n thumbClassName?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport interface RangeSliderProps {\n value?: [number, number];\n defaultValue?: [number, number];\n min?: number;\n max?: number;\n step?: number;\n minDistance?: number;\n onChange?: (value: [number, number]) => void;\n onChangeEnd?: (value: [number, number]) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n showTooltip?: boolean;\n formatValue?: (value: number) => string;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport interface UseSliderOptions {\n min?: number;\n max?: number;\n step?: number;\n defaultValue?: number;\n value?: number;\n onChange?: (value: number) => void;\n onChangeEnd?: (value: number) => void;\n orientation?: 'horizontal' | 'vertical';\n disabled?: boolean;\n}\n\nexport interface UseSliderReturn {\n value: number;\n percentage: number;\n isDragging: boolean;\n trackRef: React.RefObject<HTMLDivElement>;\n thumbRef: React.RefObject<HTMLDivElement>;\n getTrackProps: () => {\n ref: React.RefObject<HTMLDivElement>;\n onMouseDown: (e: MouseEvent) => void;\n onTouchStart: (e: TouchEvent) => void;\n };\n getThumbProps: () => {\n ref: React.RefObject<HTMLDivElement>;\n role: string;\n tabIndex: number;\n 'aria-valuenow': number;\n 'aria-valuemin': number;\n 'aria-valuemax': number;\n 'aria-orientation': 'horizontal' | 'vertical';\n onKeyDown: (e: KeyboardEvent) => void;\n };\n}\n\n// Utility functions\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction roundToStep(value: number, step: number, min: number): number {\n const steps = Math.round((value - min) / step);\n return min + steps * step;\n}\n\nfunction getPercentage(value: number, min: number, max: number): number {\n return ((value - min) / (max - min)) * 100;\n}\n\nfunction getValueFromPosition(\n position: number,\n trackSize: number,\n min: number,\n max: number,\n step: number,\n orientation: 'horizontal' | 'vertical'\n): number {\n let percentage = position / trackSize;\n if (orientation === 'vertical') {\n percentage = 1 - percentage;\n }\n \n const rawValue = min + percentage * (max - min);\n return roundToStep(clamp(rawValue, min, max), step, min);\n}\n\n// Hook\nexport function useSlider(options: UseSliderOptions = {}): UseSliderReturn {\n const {\n min = 0,\n max = 100,\n step = 1,\n defaultValue = min,\n value: controlledValue,\n onChange,\n onChangeEnd,\n orientation = 'horizontal',\n disabled = false,\n } = options;\n \n const [internalValue, setInternalValue] = useState(defaultValue);\n const [isDragging, setIsDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n \n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const percentage = getPercentage(value, min, max);\n \n const updateValue = useCallback((newValue: number) => {\n const clamped = clamp(roundToStep(newValue, step, min), min, max);\n \n if (controlledValue === undefined) {\n setInternalValue(clamped);\n }\n onChange?.(clamped);\n }, [controlledValue, min, max, step, onChange]);\n \n const handleMove = useCallback((clientX: number, clientY: number) => {\n if (disabled || !trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = orientation === 'horizontal' \n ? clientX - rect.left \n : clientY - rect.top;\n const size = orientation === 'horizontal' ? rect.width : rect.height;\n \n const newValue = getValueFromPosition(position, size, min, max, step, orientation);\n updateValue(newValue);\n }, [disabled, min, max, step, orientation, updateValue]);\n \n const handleMouseDown = useCallback((e: MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n \n setIsDragging(true);\n handleMove(e.clientX, e.clientY);\n }, [disabled, handleMove]);\n \n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (disabled) return;\n \n setIsDragging(true);\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n }, [disabled, handleMove]);\n \n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (disabled) return;\n \n let newValue = value;\n const bigStep = step * 10;\n \n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault();\n newValue = value + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault();\n newValue = value - step;\n break;\n case 'PageUp':\n e.preventDefault();\n newValue = value + bigStep;\n break;\n case 'PageDown':\n e.preventDefault();\n newValue = value - bigStep;\n break;\n case 'Home':\n e.preventDefault();\n newValue = min;\n break;\n case 'End':\n e.preventDefault();\n newValue = max;\n break;\n default:\n return;\n }\n \n updateValue(newValue);\n onChangeEnd?.(clamp(roundToStep(newValue, step, min), min, max));\n }, [disabled, value, min, max, step, updateValue, onChangeEnd]);\n \n // Global mouse/touch events\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: globalThis.MouseEvent) => {\n handleMove(e.clientX, e.clientY);\n };\n \n const handleTouchMove = (e: globalThis.TouchEvent) => {\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n };\n \n const handleEnd = () => {\n setIsDragging(false);\n onChangeEnd?.(value);\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleEnd);\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleEnd);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleEnd);\n };\n }, [isDragging, handleMove, onChangeEnd, value]);\n \n return {\n value,\n percentage,\n isDragging,\n trackRef,\n thumbRef,\n getTrackProps: () => ({\n ref: trackRef,\n onMouseDown: handleMouseDown,\n onTouchStart: handleTouchStart,\n }),\n getThumbProps: () => ({\n ref: thumbRef,\n role: 'slider',\n tabIndex: disabled ? -1 : 0,\n 'aria-valuenow': value,\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-orientation': orientation,\n onKeyDown: handleKeyDown,\n }),\n };\n}\n\n// Slider Component\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n function Slider(props, ref) {\n const {\n value,\n defaultValue,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onChangeEnd,\n disabled = false,\n orientation = 'horizontal',\n showTooltip = false,\n showTicks = false,\n tickCount = 5,\n marks,\n formatValue = (v) => v.toString(),\n className,\n style,\n trackClassName,\n thumbClassName,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n } = props;\n \n const slider = useSlider({\n min,\n max,\n step,\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n orientation,\n disabled,\n });\n \n const isHorizontal = orientation === 'horizontal';\n const trackStyle: React.CSSProperties = isHorizontal\n ? { width: '100%', height: '8px' }\n : { width: '8px', height: '200px' };\n \n const fillStyle: React.CSSProperties = isHorizontal\n ? { width: `${slider.percentage}%`, height: '100%' }\n : { width: '100%', height: `${slider.percentage}%`, bottom: 0 };\n \n const thumbStyle: React.CSSProperties = isHorizontal\n ? { left: `${slider.percentage}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${slider.percentage}%`, left: '50%', transform: 'translate(-50%, 50%)' };\n \n const ticks = showTicks\n ? Array.from({ length: tickCount }, (_, i) => (i / (tickCount - 1)) * 100)\n : [];\n \n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n >\n {/* Track */}\n <div\n {...slider.getTrackProps()}\n className={trackClassName}\n style={{\n position: 'relative',\n background: '#e5e7eb',\n borderRadius: '4px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...trackStyle,\n }}\n >\n {/* Fill */}\n <div\n style={{\n position: 'absolute',\n background: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '4px',\n ...fillStyle,\n }}\n />\n \n {/* Ticks */}\n {showTicks && ticks.map((tick, i) => (\n <div\n key={i}\n style={{\n position: 'absolute',\n background: '#9ca3af',\n ...(isHorizontal\n ? { left: `${tick}%`, top: '100%', width: '2px', height: '8px', marginTop: '4px', transform: 'translateX(-50%)' }\n : { bottom: `${tick}%`, left: '100%', width: '8px', height: '2px', marginLeft: '4px', transform: 'translateY(50%)' }\n ),\n }}\n />\n ))}\n \n {/* Marks */}\n {marks?.map((mark, i) => {\n const markPercent = getPercentage(mark.value, min, max);\n return (\n <div\n key={i}\n style={{\n position: 'absolute',\n ...(isHorizontal\n ? { left: `${markPercent}%`, top: '100%', marginTop: '12px', transform: 'translateX(-50%)' }\n : { bottom: `${markPercent}%`, left: '100%', marginLeft: '12px', transform: 'translateY(50%)' }\n ),\n fontSize: '12px',\n color: '#6b7280',\n }}\n >\n {mark.label ?? mark.value}\n </div>\n );\n })}\n \n {/* Thumb */}\n <div\n {...slider.getThumbProps()}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuetext={formatValue(slider.value)}\n className={thumbClassName}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: slider.isDragging ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.15s',\n ...thumbStyle,\n }}\n >\n {/* Tooltip */}\n {showTooltip && slider.isDragging && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '8px',\n padding: '4px 8px',\n background: '#1f2937',\n color: 'white',\n borderRadius: '4px',\n fontSize: '12px',\n whiteSpace: 'nowrap',\n }}\n >\n {formatValue(slider.value)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\n// Range Slider Component\nexport const RangeSlider = forwardRef<HTMLDivElement, RangeSliderProps>(\n function RangeSlider(props, ref) {\n const {\n value: controlledValue,\n defaultValue = [25, 75],\n min = 0,\n max = 100,\n step = 1,\n minDistance = 0,\n onChange,\n onChangeEnd,\n disabled = false,\n orientation = 'horizontal',\n showTooltip = false,\n formatValue = (v) => v.toString(),\n className,\n style,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n } = props;\n \n const [internalValue, setInternalValue] = useState<[number, number]>(defaultValue);\n const [activeThumb, setActiveThumb] = useState<0 | 1 | null>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n \n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const [lowValue, highValue] = value;\n \n const lowPercent = getPercentage(lowValue, min, max);\n const highPercent = getPercentage(highValue, min, max);\n \n const isHorizontal = orientation === 'horizontal';\n\n const getConstrainedValues = useCallback((thumbIndex: 0 | 1, newValue: number): [number, number] => {\n const clamped = clamp(roundToStep(newValue, step, min), min, max);\n\n let newLow = thumbIndex === 0 ? clamped : lowValue;\n let newHigh = thumbIndex === 1 ? clamped : highValue;\n\n if (newHigh - newLow < minDistance) {\n if (thumbIndex === 0) {\n newLow = Math.min(newLow, newHigh - minDistance);\n } else {\n newHigh = Math.max(newHigh, newLow + minDistance);\n }\n }\n\n if (newLow > newHigh) {\n [newLow, newHigh] = [newHigh, newLow];\n }\n\n return [\n clamp(newLow, min, max),\n clamp(newHigh, min, max),\n ];\n }, [highValue, lowValue, max, min, minDistance, step]);\n \n const updateValue = useCallback((thumbIndex: 0 | 1, newValue: number) => {\n const newVal = getConstrainedValues(thumbIndex, newValue);\n \n if (controlledValue === undefined) {\n setInternalValue(newVal);\n }\n onChange?.(newVal);\n return newVal;\n }, [controlledValue, getConstrainedValues, onChange]);\n\n const handleThumbKeyDown = useCallback((thumbIndex: 0 | 1, currentValue: number) => (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n\n let nextValue = currentValue;\n const bigStep = step * 10;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault();\n nextValue = currentValue + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault();\n nextValue = currentValue - step;\n break;\n case 'PageUp':\n e.preventDefault();\n nextValue = currentValue + bigStep;\n break;\n case 'PageDown':\n e.preventDefault();\n nextValue = currentValue - bigStep;\n break;\n case 'Home':\n e.preventDefault();\n nextValue = thumbIndex === 0 ? min : lowValue + minDistance;\n break;\n case 'End':\n e.preventDefault();\n nextValue = thumbIndex === 0 ? highValue - minDistance : max;\n break;\n default:\n return;\n }\n\n const nextValues = updateValue(thumbIndex, nextValue);\n onChangeEnd?.(nextValues);\n }, [disabled, highValue, lowValue, max, min, minDistance, onChangeEnd, step, updateValue]);\n \n const handleTrackClick = useCallback((e: MouseEvent) => {\n if (disabled || !trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = isHorizontal ? e.clientX - rect.left : e.clientY - rect.top;\n const size = isHorizontal ? rect.width : rect.height;\n const clickValue = getValueFromPosition(position, size, min, max, step, orientation);\n \n // Determine which thumb to move\n const distToLow = Math.abs(clickValue - lowValue);\n const distToHigh = Math.abs(clickValue - highValue);\n \n if (distToLow < distToHigh) {\n updateValue(0, clickValue);\n setActiveThumb(0);\n } else {\n updateValue(1, clickValue);\n setActiveThumb(1);\n }\n }, [disabled, isHorizontal, min, max, step, orientation, lowValue, highValue, updateValue]);\n \n // Mouse/touch move handling\n useEffect(() => {\n if (activeThumb === null) return;\n \n const handleMove = (clientX: number, clientY: number) => {\n if (!trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = isHorizontal ? clientX - rect.left : clientY - rect.top;\n const size = isHorizontal ? rect.width : rect.height;\n const newValue = getValueFromPosition(position, size, min, max, step, orientation);\n \n updateValue(activeThumb, newValue);\n };\n \n const handleMouseMove = (e: globalThis.MouseEvent) => handleMove(e.clientX, e.clientY);\n const handleTouchMove = (e: globalThis.TouchEvent) => {\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n };\n \n const handleEnd = () => {\n setActiveThumb(null);\n onChangeEnd?.(value);\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleEnd);\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleEnd);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleEnd);\n };\n }, [activeThumb, isHorizontal, min, max, step, orientation, updateValue, onChangeEnd, value]);\n \n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n >\n <div\n ref={trackRef}\n onClick={handleTrackClick}\n style={{\n position: 'relative',\n background: '#e5e7eb',\n borderRadius: '4px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...(isHorizontal ? { width: '100%', height: '8px' } : { width: '8px', height: '200px' }),\n }}\n >\n {/* Range fill */}\n <div\n style={{\n position: 'absolute',\n background: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '4px',\n ...(isHorizontal\n ? { left: `${lowPercent}%`, width: `${highPercent - lowPercent}%`, height: '100%' }\n : { bottom: `${lowPercent}%`, height: `${highPercent - lowPercent}%`, width: '100%' }\n ),\n }}\n />\n \n {/* Low thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={lowValue}\n aria-valuemin={min}\n aria-valuemax={highValue - minDistance}\n aria-valuetext={formatValue(lowValue)}\n aria-orientation={orientation}\n aria-label={ariaLabel ? `${ariaLabel} minimum` : 'Minimum value'}\n aria-labelledby={ariaLabelledBy}\n onMouseDown={() => !disabled && setActiveThumb(0)}\n onTouchStart={() => !disabled && setActiveThumb(0)}\n onKeyDown={handleThumbKeyDown(0, lowValue)}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: activeThumb === 0 ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n zIndex: activeThumb === 0 ? 2 : 1,\n ...(isHorizontal\n ? { left: `${lowPercent}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${lowPercent}%`, left: '50%', transform: 'translate(-50%, 50%)' }\n ),\n }}\n >\n {showTooltip && activeThumb === 0 && (\n <div style={{ position: 'absolute', bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px', padding: '4px 8px', background: '#1f2937', color: 'white', borderRadius: '4px', fontSize: '12px' }}>\n {formatValue(lowValue)}\n </div>\n )}\n </div>\n \n {/* High thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={highValue}\n aria-valuemin={lowValue + minDistance}\n aria-valuemax={max}\n aria-valuetext={formatValue(highValue)}\n aria-orientation={orientation}\n aria-label={ariaLabel ? `${ariaLabel} maximum` : 'Maximum value'}\n aria-labelledby={ariaLabelledBy}\n onMouseDown={() => !disabled && setActiveThumb(1)}\n onTouchStart={() => !disabled && setActiveThumb(1)}\n onKeyDown={handleThumbKeyDown(1, highValue)}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: activeThumb === 1 ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n zIndex: activeThumb === 1 ? 2 : 1,\n ...(isHorizontal\n ? { left: `${highPercent}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${highPercent}%`, left: '50%', transform: 'translate(-50%, 50%)' }\n ),\n }}\n >\n {showTooltip && activeThumb === 1 && (\n <div style={{ position: 'absolute', bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px', padding: '4px 8px', background: '#1f2937', color: 'white', borderRadius: '4px', fontSize: '12px' }}>\n {formatValue(highValue)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n"]}
@@ -0,0 +1,83 @@
1
+ import React, { MouseEvent, TouchEvent, KeyboardEvent } from 'react';
2
+
3
+ interface SliderProps {
4
+ value?: number;
5
+ defaultValue?: number;
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ onChange?: (value: number) => void;
10
+ onChangeEnd?: (value: number) => void;
11
+ disabled?: boolean;
12
+ orientation?: 'horizontal' | 'vertical';
13
+ showTooltip?: boolean;
14
+ showTicks?: boolean;
15
+ tickCount?: number;
16
+ marks?: {
17
+ value: number;
18
+ label?: string;
19
+ }[];
20
+ formatValue?: (value: number) => string;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ trackClassName?: string;
24
+ thumbClassName?: string;
25
+ 'aria-label'?: string;
26
+ 'aria-labelledby'?: string;
27
+ }
28
+ interface RangeSliderProps {
29
+ value?: [number, number];
30
+ defaultValue?: [number, number];
31
+ min?: number;
32
+ max?: number;
33
+ step?: number;
34
+ minDistance?: number;
35
+ onChange?: (value: [number, number]) => void;
36
+ onChangeEnd?: (value: [number, number]) => void;
37
+ disabled?: boolean;
38
+ orientation?: 'horizontal' | 'vertical';
39
+ showTooltip?: boolean;
40
+ formatValue?: (value: number) => string;
41
+ className?: string;
42
+ style?: React.CSSProperties;
43
+ 'aria-label'?: string;
44
+ 'aria-labelledby'?: string;
45
+ }
46
+ interface UseSliderOptions {
47
+ min?: number;
48
+ max?: number;
49
+ step?: number;
50
+ defaultValue?: number;
51
+ value?: number;
52
+ onChange?: (value: number) => void;
53
+ onChangeEnd?: (value: number) => void;
54
+ orientation?: 'horizontal' | 'vertical';
55
+ disabled?: boolean;
56
+ }
57
+ interface UseSliderReturn {
58
+ value: number;
59
+ percentage: number;
60
+ isDragging: boolean;
61
+ trackRef: React.RefObject<HTMLDivElement>;
62
+ thumbRef: React.RefObject<HTMLDivElement>;
63
+ getTrackProps: () => {
64
+ ref: React.RefObject<HTMLDivElement>;
65
+ onMouseDown: (e: MouseEvent) => void;
66
+ onTouchStart: (e: TouchEvent) => void;
67
+ };
68
+ getThumbProps: () => {
69
+ ref: React.RefObject<HTMLDivElement>;
70
+ role: string;
71
+ tabIndex: number;
72
+ 'aria-valuenow': number;
73
+ 'aria-valuemin': number;
74
+ 'aria-valuemax': number;
75
+ 'aria-orientation': 'horizontal' | 'vertical';
76
+ onKeyDown: (e: KeyboardEvent) => void;
77
+ };
78
+ }
79
+ declare function useSlider(options?: UseSliderOptions): UseSliderReturn;
80
+ declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<HTMLDivElement>>;
81
+ declare const RangeSlider: React.ForwardRefExoticComponent<RangeSliderProps & React.RefAttributes<HTMLDivElement>>;
82
+
83
+ export { RangeSlider, type RangeSliderProps, Slider, type SliderProps, type UseSliderOptions, type UseSliderReturn, useSlider };
@@ -0,0 +1,83 @@
1
+ import React, { MouseEvent, TouchEvent, KeyboardEvent } from 'react';
2
+
3
+ interface SliderProps {
4
+ value?: number;
5
+ defaultValue?: number;
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ onChange?: (value: number) => void;
10
+ onChangeEnd?: (value: number) => void;
11
+ disabled?: boolean;
12
+ orientation?: 'horizontal' | 'vertical';
13
+ showTooltip?: boolean;
14
+ showTicks?: boolean;
15
+ tickCount?: number;
16
+ marks?: {
17
+ value: number;
18
+ label?: string;
19
+ }[];
20
+ formatValue?: (value: number) => string;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ trackClassName?: string;
24
+ thumbClassName?: string;
25
+ 'aria-label'?: string;
26
+ 'aria-labelledby'?: string;
27
+ }
28
+ interface RangeSliderProps {
29
+ value?: [number, number];
30
+ defaultValue?: [number, number];
31
+ min?: number;
32
+ max?: number;
33
+ step?: number;
34
+ minDistance?: number;
35
+ onChange?: (value: [number, number]) => void;
36
+ onChangeEnd?: (value: [number, number]) => void;
37
+ disabled?: boolean;
38
+ orientation?: 'horizontal' | 'vertical';
39
+ showTooltip?: boolean;
40
+ formatValue?: (value: number) => string;
41
+ className?: string;
42
+ style?: React.CSSProperties;
43
+ 'aria-label'?: string;
44
+ 'aria-labelledby'?: string;
45
+ }
46
+ interface UseSliderOptions {
47
+ min?: number;
48
+ max?: number;
49
+ step?: number;
50
+ defaultValue?: number;
51
+ value?: number;
52
+ onChange?: (value: number) => void;
53
+ onChangeEnd?: (value: number) => void;
54
+ orientation?: 'horizontal' | 'vertical';
55
+ disabled?: boolean;
56
+ }
57
+ interface UseSliderReturn {
58
+ value: number;
59
+ percentage: number;
60
+ isDragging: boolean;
61
+ trackRef: React.RefObject<HTMLDivElement>;
62
+ thumbRef: React.RefObject<HTMLDivElement>;
63
+ getTrackProps: () => {
64
+ ref: React.RefObject<HTMLDivElement>;
65
+ onMouseDown: (e: MouseEvent) => void;
66
+ onTouchStart: (e: TouchEvent) => void;
67
+ };
68
+ getThumbProps: () => {
69
+ ref: React.RefObject<HTMLDivElement>;
70
+ role: string;
71
+ tabIndex: number;
72
+ 'aria-valuenow': number;
73
+ 'aria-valuemin': number;
74
+ 'aria-valuemax': number;
75
+ 'aria-orientation': 'horizontal' | 'vertical';
76
+ onKeyDown: (e: KeyboardEvent) => void;
77
+ };
78
+ }
79
+ declare function useSlider(options?: UseSliderOptions): UseSliderReturn;
80
+ declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<HTMLDivElement>>;
81
+ declare const RangeSlider: React.ForwardRefExoticComponent<RangeSliderProps & React.RefAttributes<HTMLDivElement>>;
82
+
83
+ export { RangeSlider, type RangeSliderProps, Slider, type SliderProps, type UseSliderOptions, type UseSliderReturn, useSlider };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import {forwardRef,useState,useRef,useCallback,useEffect}from'react';import {jsx,jsxs}from'react/jsx-runtime';function Y(S,a,o){return Math.min(Math.max(S,a),o)}function I(S,a,o){let u=Math.round((S-o)/a);return o+u*a}function O(S,a,o){return (S-a)/(o-a)*100}function F(S,a,o,u,X,r){let i=S/a;r==="vertical"&&(i=1-i);let b=o+i*(u-o);return I(Y(b,o,u),X,o)}function te(S={}){let{min:a=0,max:o=100,step:u=1,defaultValue:X=a,value:r,onChange:i,onChangeEnd:b,orientation:v="horizontal",disabled:x=false}=S,[T,c]=useState(X),[w,C]=useState(false),k=useRef(null),A=useRef(null),g=r!==void 0?r:T,z=O(g,a,o),V=useCallback(e=>{let t=Y(I(e,u,a),a,o);r===void 0&&c(t),i?.(t);},[r,a,o,u,i]),R=useCallback((e,t)=>{if(x||!k.current)return;let n=k.current.getBoundingClientRect(),d=v==="horizontal"?e-n.left:t-n.top,y=v==="horizontal"?n.width:n.height,$=F(d,y,a,o,u,v);V($);},[x,a,o,u,v,V]),B=useCallback(e=>{x||(e.preventDefault(),C(true),R(e.clientX,e.clientY));},[x,R]),E=useCallback(e=>{if(x)return;C(true);let t=e.touches[0];R(t.clientX,t.clientY);},[x,R]),M=useCallback(e=>{if(x)return;let t=g,n=u*10;switch(e.key){case "ArrowRight":case "ArrowUp":e.preventDefault(),t=g+u;break;case "ArrowLeft":case "ArrowDown":e.preventDefault(),t=g-u;break;case "PageUp":e.preventDefault(),t=g+n;break;case "PageDown":e.preventDefault(),t=g-n;break;case "Home":e.preventDefault(),t=a;break;case "End":e.preventDefault(),t=o;break;default:return}V(t),b?.(Y(I(t,u,a),a,o));},[x,g,a,o,u,V,b]);return useEffect(()=>{if(!w)return;let e=d=>{R(d.clientX,d.clientY);},t=d=>{let y=d.touches[0];R(y.clientX,y.clientY);},n=()=>{C(false),b?.(g);};return document.addEventListener("mousemove",e),document.addEventListener("mouseup",n),document.addEventListener("touchmove",t),document.addEventListener("touchend",n),()=>{document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n),document.removeEventListener("touchmove",t),document.removeEventListener("touchend",n);}},[w,R,b,g]),{value:g,percentage:z,isDragging:w,trackRef:k,thumbRef:A,getTrackProps:()=>({ref:k,onMouseDown:B,onTouchStart:E}),getThumbProps:()=>({ref:A,role:"slider",tabIndex:x?-1:0,"aria-valuenow":g,"aria-valuemin":a,"aria-valuemax":o,"aria-orientation":v,onKeyDown:M})}}var le=forwardRef(function(a,o){let{value:u,defaultValue:X,min:r=0,max:i=100,step:b=1,onChange:v,onChangeEnd:x,disabled:T=false,orientation:c="horizontal",showTooltip:w=false,showTicks:C=false,tickCount:k=5,marks:A,formatValue:g=m=>m.toString(),className:z,style:V,trackClassName:R,thumbClassName:B,"aria-label":E,"aria-labelledby":M}=a,e=te({min:r,max:i,step:b,value:u,defaultValue:X,onChange:v,onChangeEnd:x,orientation:c,disabled:T}),t=c==="horizontal",n=t?{width:"100%",height:"8px"}:{width:"8px",height:"200px"},d=t?{width:`${e.percentage}%`,height:"100%"}:{width:"100%",height:`${e.percentage}%`,bottom:0},y=t?{left:`${e.percentage}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${e.percentage}%`,left:"50%",transform:"translate(-50%, 50%)"},$=C?Array.from({length:k},(m,H)=>H/(k-1)*100):[];return jsx("div",{ref:o,className:z,style:{position:"relative",display:"inline-flex",alignItems:"center",...V},children:jsxs("div",{...e.getTrackProps(),className:R,style:{position:"relative",background:"#e5e7eb",borderRadius:"4px",cursor:T?"not-allowed":"pointer",...n},children:[jsx("div",{style:{position:"absolute",background:T?"#9ca3af":"#3b82f6",borderRadius:"4px",...d}}),C&&$.map((m,H)=>jsx("div",{style:{position:"absolute",background:"#9ca3af",...t?{left:`${m}%`,top:"100%",width:"2px",height:"8px",marginTop:"4px",transform:"translateX(-50%)"}:{bottom:`${m}%`,left:"100%",width:"8px",height:"2px",marginLeft:"4px",transform:"translateY(50%)"}}},H)),A?.map((m,H)=>{let L=O(m.value,r,i);return jsx("div",{style:{position:"absolute",...t?{left:`${L}%`,top:"100%",marginTop:"12px",transform:"translateX(-50%)"}:{bottom:`${L}%`,left:"100%",marginLeft:"12px",transform:"translateY(50%)"},fontSize:"12px",color:"#6b7280"},children:m.label??m.value},H)}),jsx("div",{...e.getThumbProps(),"aria-label":E,"aria-labelledby":M,"aria-valuetext":g(e.value),className:B,style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:T?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:T?"not-allowed":"grab",outline:"none",boxShadow:e.isDragging?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",transition:"box-shadow 0.15s",...y},children:w&&e.isDragging&&jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px",whiteSpace:"nowrap"},children:g(e.value)})})]})})}),se=forwardRef(function(a,o){let{value:u,defaultValue:X=[25,75],min:r=0,max:i=100,step:b=1,minDistance:v=0,onChange:x,onChangeEnd:T,disabled:c=false,orientation:w="horizontal",showTooltip:C=false,formatValue:k=h=>h.toString(),className:A,style:g,"aria-label":z,"aria-labelledby":V}=a,[R,B]=useState(X),[E,M]=useState(null),e=useRef(null),t=u!==void 0?u:R,[n,d]=t,y=O(n,r,i),$=O(d,r,i),m=w==="horizontal",H=useCallback((h,f)=>{let p=Y(I(f,b,r),r,i),l=h===0?p:n,s=h===1?p:d;return s-l<v&&(h===0?l=Math.min(l,s-v):s=Math.max(s,l+v)),l>s&&([l,s]=[s,l]),[Y(l,r,i),Y(s,r,i)]},[d,n,i,r,v,b]),L=useCallback((h,f)=>{let p=H(h,f);return u===void 0&&B(p),x?.(p),p},[u,H,x]),_=useCallback((h,f)=>p=>{if(c)return;let l=f,s=b*10;switch(p.key){case "ArrowRight":case "ArrowUp":p.preventDefault(),l=f+b;break;case "ArrowLeft":case "ArrowDown":p.preventDefault(),l=f-b;break;case "PageUp":p.preventDefault(),l=f+s;break;case "PageDown":p.preventDefault(),l=f-s;break;case "Home":p.preventDefault(),l=h===0?r:n+v;break;case "End":p.preventDefault(),l=h===0?d-v:i;break;default:return}let N=L(h,l);T?.(N);},[c,d,n,i,r,v,T,b,L]),Q=useCallback(h=>{if(c||!e.current)return;let f=e.current.getBoundingClientRect(),p=m?h.clientX-f.left:h.clientY-f.top,l=m?f.width:f.height,s=F(p,l,r,i,b,w),N=Math.abs(s-n),K=Math.abs(s-d);N<K?(L(0,s),M(0)):(L(1,s),M(1));},[c,m,r,i,b,w,n,d,L]);return useEffect(()=>{if(E===null)return;let h=(s,N)=>{if(!e.current)return;let K=e.current.getBoundingClientRect(),W=m?s-K.left:N-K.top,Z=m?K.width:K.height,ee=F(W,Z,r,i,b,w);L(E,ee);},f=s=>h(s.clientX,s.clientY),p=s=>{let N=s.touches[0];h(N.clientX,N.clientY);},l=()=>{M(null),T?.(t);};return document.addEventListener("mousemove",f),document.addEventListener("mouseup",l),document.addEventListener("touchmove",p),document.addEventListener("touchend",l),()=>{document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",l),document.removeEventListener("touchmove",p),document.removeEventListener("touchend",l);}},[E,m,r,i,b,w,L,T,t]),jsx("div",{ref:o,className:A,style:{position:"relative",display:"inline-flex",alignItems:"center",...g},children:jsxs("div",{ref:e,onClick:Q,style:{position:"relative",background:"#e5e7eb",borderRadius:"4px",cursor:c?"not-allowed":"pointer",...m?{width:"100%",height:"8px"}:{width:"8px",height:"200px"}},children:[jsx("div",{style:{position:"absolute",background:c?"#9ca3af":"#3b82f6",borderRadius:"4px",...m?{left:`${y}%`,width:`${$-y}%`,height:"100%"}:{bottom:`${y}%`,height:`${$-y}%`,width:"100%"}}}),jsx("div",{role:"slider",tabIndex:c?-1:0,"aria-valuenow":n,"aria-valuemin":r,"aria-valuemax":d-v,"aria-valuetext":k(n),"aria-orientation":w,"aria-label":z?`${z} minimum`:"Minimum value","aria-labelledby":V,onMouseDown:()=>!c&&M(0),onTouchStart:()=>!c&&M(0),onKeyDown:_(0,n),style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:c?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:c?"not-allowed":"grab",outline:"none",boxShadow:E===0?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",zIndex:E===0?2:1,...m?{left:`${y}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${y}%`,left:"50%",transform:"translate(-50%, 50%)"}},children:C&&E===0&&jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px"},children:k(n)})}),jsx("div",{role:"slider",tabIndex:c?-1:0,"aria-valuenow":d,"aria-valuemin":n+v,"aria-valuemax":i,"aria-valuetext":k(d),"aria-orientation":w,"aria-label":z?`${z} maximum`:"Maximum value","aria-labelledby":V,onMouseDown:()=>!c&&M(1),onTouchStart:()=>!c&&M(1),onKeyDown:_(1,d),style:{position:"absolute",width:"20px",height:"20px",background:"white",border:"2px solid",borderColor:c?"#9ca3af":"#3b82f6",borderRadius:"50%",cursor:c?"not-allowed":"grab",outline:"none",boxShadow:E===1?"0 0 0 4px rgba(59, 130, 246, 0.2)":"0 2px 4px rgba(0,0,0,0.1)",zIndex:E===1?2:1,...m?{left:`${$}%`,top:"50%",transform:"translate(-50%, -50%)"}:{bottom:`${$}%`,left:"50%",transform:"translate(-50%, 50%)"}},children:C&&E===1&&jsx("div",{style:{position:"absolute",bottom:"100%",left:"50%",transform:"translateX(-50%)",marginBottom:"8px",padding:"4px 8px",background:"#1f2937",color:"white",borderRadius:"4px",fontSize:"12px"},children:k(d)})})]})})});export{se as RangeSlider,le as Slider,te as useSlider};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx"],"names":["clamp","value","min","max","roundToStep","step","steps","getPercentage","getValueFromPosition","position","trackSize","orientation","percentage","rawValue","useSlider","options","defaultValue","controlledValue","onChange","onChangeEnd","disabled","internalValue","setInternalValue","useState","isDragging","setIsDragging","trackRef","useRef","thumbRef","updateValue","useCallback","newValue","clamped","handleMove","clientX","clientY","rect","size","handleMouseDown","handleTouchStart","touch","handleKeyDown","bigStep","useEffect","handleMouseMove","e","handleTouchMove","handleEnd","Slider","forwardRef","props","ref","showTooltip","showTicks","tickCount","marks","formatValue","v","className","style","trackClassName","thumbClassName","ariaLabel","ariaLabelledBy","slider","isHorizontal","trackStyle","fillStyle","thumbStyle","ticks","_","i","jsx","jsxs","tick","mark","markPercent","RangeSlider","minDistance","activeThumb","setActiveThumb","lowValue","highValue","lowPercent","highPercent","getConstrainedValues","thumbIndex","newLow","newHigh","newVal","handleThumbKeyDown","currentValue","nextValue","nextValues","handleTrackClick","clickValue","distToLow","distToHigh"],"mappings":"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","file":"index.js","sourcesContent":["// @input-kit/slider - Range slider component\n\nimport React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n forwardRef,\n MouseEvent,\n TouchEvent,\n KeyboardEvent,\n} from 'react';\n\n// Types\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n onChangeEnd?: (value: number) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n showTooltip?: boolean;\n showTicks?: boolean;\n tickCount?: number;\n marks?: { value: number; label?: string }[];\n formatValue?: (value: number) => string;\n className?: string;\n style?: React.CSSProperties;\n trackClassName?: string;\n thumbClassName?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport interface RangeSliderProps {\n value?: [number, number];\n defaultValue?: [number, number];\n min?: number;\n max?: number;\n step?: number;\n minDistance?: number;\n onChange?: (value: [number, number]) => void;\n onChangeEnd?: (value: [number, number]) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n showTooltip?: boolean;\n formatValue?: (value: number) => string;\n className?: string;\n style?: React.CSSProperties;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\nexport interface UseSliderOptions {\n min?: number;\n max?: number;\n step?: number;\n defaultValue?: number;\n value?: number;\n onChange?: (value: number) => void;\n onChangeEnd?: (value: number) => void;\n orientation?: 'horizontal' | 'vertical';\n disabled?: boolean;\n}\n\nexport interface UseSliderReturn {\n value: number;\n percentage: number;\n isDragging: boolean;\n trackRef: React.RefObject<HTMLDivElement>;\n thumbRef: React.RefObject<HTMLDivElement>;\n getTrackProps: () => {\n ref: React.RefObject<HTMLDivElement>;\n onMouseDown: (e: MouseEvent) => void;\n onTouchStart: (e: TouchEvent) => void;\n };\n getThumbProps: () => {\n ref: React.RefObject<HTMLDivElement>;\n role: string;\n tabIndex: number;\n 'aria-valuenow': number;\n 'aria-valuemin': number;\n 'aria-valuemax': number;\n 'aria-orientation': 'horizontal' | 'vertical';\n onKeyDown: (e: KeyboardEvent) => void;\n };\n}\n\n// Utility functions\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction roundToStep(value: number, step: number, min: number): number {\n const steps = Math.round((value - min) / step);\n return min + steps * step;\n}\n\nfunction getPercentage(value: number, min: number, max: number): number {\n return ((value - min) / (max - min)) * 100;\n}\n\nfunction getValueFromPosition(\n position: number,\n trackSize: number,\n min: number,\n max: number,\n step: number,\n orientation: 'horizontal' | 'vertical'\n): number {\n let percentage = position / trackSize;\n if (orientation === 'vertical') {\n percentage = 1 - percentage;\n }\n \n const rawValue = min + percentage * (max - min);\n return roundToStep(clamp(rawValue, min, max), step, min);\n}\n\n// Hook\nexport function useSlider(options: UseSliderOptions = {}): UseSliderReturn {\n const {\n min = 0,\n max = 100,\n step = 1,\n defaultValue = min,\n value: controlledValue,\n onChange,\n onChangeEnd,\n orientation = 'horizontal',\n disabled = false,\n } = options;\n \n const [internalValue, setInternalValue] = useState(defaultValue);\n const [isDragging, setIsDragging] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n \n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const percentage = getPercentage(value, min, max);\n \n const updateValue = useCallback((newValue: number) => {\n const clamped = clamp(roundToStep(newValue, step, min), min, max);\n \n if (controlledValue === undefined) {\n setInternalValue(clamped);\n }\n onChange?.(clamped);\n }, [controlledValue, min, max, step, onChange]);\n \n const handleMove = useCallback((clientX: number, clientY: number) => {\n if (disabled || !trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = orientation === 'horizontal' \n ? clientX - rect.left \n : clientY - rect.top;\n const size = orientation === 'horizontal' ? rect.width : rect.height;\n \n const newValue = getValueFromPosition(position, size, min, max, step, orientation);\n updateValue(newValue);\n }, [disabled, min, max, step, orientation, updateValue]);\n \n const handleMouseDown = useCallback((e: MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n \n setIsDragging(true);\n handleMove(e.clientX, e.clientY);\n }, [disabled, handleMove]);\n \n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (disabled) return;\n \n setIsDragging(true);\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n }, [disabled, handleMove]);\n \n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (disabled) return;\n \n let newValue = value;\n const bigStep = step * 10;\n \n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault();\n newValue = value + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault();\n newValue = value - step;\n break;\n case 'PageUp':\n e.preventDefault();\n newValue = value + bigStep;\n break;\n case 'PageDown':\n e.preventDefault();\n newValue = value - bigStep;\n break;\n case 'Home':\n e.preventDefault();\n newValue = min;\n break;\n case 'End':\n e.preventDefault();\n newValue = max;\n break;\n default:\n return;\n }\n \n updateValue(newValue);\n onChangeEnd?.(clamp(roundToStep(newValue, step, min), min, max));\n }, [disabled, value, min, max, step, updateValue, onChangeEnd]);\n \n // Global mouse/touch events\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: globalThis.MouseEvent) => {\n handleMove(e.clientX, e.clientY);\n };\n \n const handleTouchMove = (e: globalThis.TouchEvent) => {\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n };\n \n const handleEnd = () => {\n setIsDragging(false);\n onChangeEnd?.(value);\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleEnd);\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleEnd);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleEnd);\n };\n }, [isDragging, handleMove, onChangeEnd, value]);\n \n return {\n value,\n percentage,\n isDragging,\n trackRef,\n thumbRef,\n getTrackProps: () => ({\n ref: trackRef,\n onMouseDown: handleMouseDown,\n onTouchStart: handleTouchStart,\n }),\n getThumbProps: () => ({\n ref: thumbRef,\n role: 'slider',\n tabIndex: disabled ? -1 : 0,\n 'aria-valuenow': value,\n 'aria-valuemin': min,\n 'aria-valuemax': max,\n 'aria-orientation': orientation,\n onKeyDown: handleKeyDown,\n }),\n };\n}\n\n// Slider Component\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n function Slider(props, ref) {\n const {\n value,\n defaultValue,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onChangeEnd,\n disabled = false,\n orientation = 'horizontal',\n showTooltip = false,\n showTicks = false,\n tickCount = 5,\n marks,\n formatValue = (v) => v.toString(),\n className,\n style,\n trackClassName,\n thumbClassName,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n } = props;\n \n const slider = useSlider({\n min,\n max,\n step,\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n orientation,\n disabled,\n });\n \n const isHorizontal = orientation === 'horizontal';\n const trackStyle: React.CSSProperties = isHorizontal\n ? { width: '100%', height: '8px' }\n : { width: '8px', height: '200px' };\n \n const fillStyle: React.CSSProperties = isHorizontal\n ? { width: `${slider.percentage}%`, height: '100%' }\n : { width: '100%', height: `${slider.percentage}%`, bottom: 0 };\n \n const thumbStyle: React.CSSProperties = isHorizontal\n ? { left: `${slider.percentage}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${slider.percentage}%`, left: '50%', transform: 'translate(-50%, 50%)' };\n \n const ticks = showTicks\n ? Array.from({ length: tickCount }, (_, i) => (i / (tickCount - 1)) * 100)\n : [];\n \n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n >\n {/* Track */}\n <div\n {...slider.getTrackProps()}\n className={trackClassName}\n style={{\n position: 'relative',\n background: '#e5e7eb',\n borderRadius: '4px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...trackStyle,\n }}\n >\n {/* Fill */}\n <div\n style={{\n position: 'absolute',\n background: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '4px',\n ...fillStyle,\n }}\n />\n \n {/* Ticks */}\n {showTicks && ticks.map((tick, i) => (\n <div\n key={i}\n style={{\n position: 'absolute',\n background: '#9ca3af',\n ...(isHorizontal\n ? { left: `${tick}%`, top: '100%', width: '2px', height: '8px', marginTop: '4px', transform: 'translateX(-50%)' }\n : { bottom: `${tick}%`, left: '100%', width: '8px', height: '2px', marginLeft: '4px', transform: 'translateY(50%)' }\n ),\n }}\n />\n ))}\n \n {/* Marks */}\n {marks?.map((mark, i) => {\n const markPercent = getPercentage(mark.value, min, max);\n return (\n <div\n key={i}\n style={{\n position: 'absolute',\n ...(isHorizontal\n ? { left: `${markPercent}%`, top: '100%', marginTop: '12px', transform: 'translateX(-50%)' }\n : { bottom: `${markPercent}%`, left: '100%', marginLeft: '12px', transform: 'translateY(50%)' }\n ),\n fontSize: '12px',\n color: '#6b7280',\n }}\n >\n {mark.label ?? mark.value}\n </div>\n );\n })}\n \n {/* Thumb */}\n <div\n {...slider.getThumbProps()}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-valuetext={formatValue(slider.value)}\n className={thumbClassName}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: slider.isDragging ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.15s',\n ...thumbStyle,\n }}\n >\n {/* Tooltip */}\n {showTooltip && slider.isDragging && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '8px',\n padding: '4px 8px',\n background: '#1f2937',\n color: 'white',\n borderRadius: '4px',\n fontSize: '12px',\n whiteSpace: 'nowrap',\n }}\n >\n {formatValue(slider.value)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\n// Range Slider Component\nexport const RangeSlider = forwardRef<HTMLDivElement, RangeSliderProps>(\n function RangeSlider(props, ref) {\n const {\n value: controlledValue,\n defaultValue = [25, 75],\n min = 0,\n max = 100,\n step = 1,\n minDistance = 0,\n onChange,\n onChangeEnd,\n disabled = false,\n orientation = 'horizontal',\n showTooltip = false,\n formatValue = (v) => v.toString(),\n className,\n style,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n } = props;\n \n const [internalValue, setInternalValue] = useState<[number, number]>(defaultValue);\n const [activeThumb, setActiveThumb] = useState<0 | 1 | null>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n \n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const [lowValue, highValue] = value;\n \n const lowPercent = getPercentage(lowValue, min, max);\n const highPercent = getPercentage(highValue, min, max);\n \n const isHorizontal = orientation === 'horizontal';\n\n const getConstrainedValues = useCallback((thumbIndex: 0 | 1, newValue: number): [number, number] => {\n const clamped = clamp(roundToStep(newValue, step, min), min, max);\n\n let newLow = thumbIndex === 0 ? clamped : lowValue;\n let newHigh = thumbIndex === 1 ? clamped : highValue;\n\n if (newHigh - newLow < minDistance) {\n if (thumbIndex === 0) {\n newLow = Math.min(newLow, newHigh - minDistance);\n } else {\n newHigh = Math.max(newHigh, newLow + minDistance);\n }\n }\n\n if (newLow > newHigh) {\n [newLow, newHigh] = [newHigh, newLow];\n }\n\n return [\n clamp(newLow, min, max),\n clamp(newHigh, min, max),\n ];\n }, [highValue, lowValue, max, min, minDistance, step]);\n \n const updateValue = useCallback((thumbIndex: 0 | 1, newValue: number) => {\n const newVal = getConstrainedValues(thumbIndex, newValue);\n \n if (controlledValue === undefined) {\n setInternalValue(newVal);\n }\n onChange?.(newVal);\n return newVal;\n }, [controlledValue, getConstrainedValues, onChange]);\n\n const handleThumbKeyDown = useCallback((thumbIndex: 0 | 1, currentValue: number) => (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n\n let nextValue = currentValue;\n const bigStep = step * 10;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault();\n nextValue = currentValue + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault();\n nextValue = currentValue - step;\n break;\n case 'PageUp':\n e.preventDefault();\n nextValue = currentValue + bigStep;\n break;\n case 'PageDown':\n e.preventDefault();\n nextValue = currentValue - bigStep;\n break;\n case 'Home':\n e.preventDefault();\n nextValue = thumbIndex === 0 ? min : lowValue + minDistance;\n break;\n case 'End':\n e.preventDefault();\n nextValue = thumbIndex === 0 ? highValue - minDistance : max;\n break;\n default:\n return;\n }\n\n const nextValues = updateValue(thumbIndex, nextValue);\n onChangeEnd?.(nextValues);\n }, [disabled, highValue, lowValue, max, min, minDistance, onChangeEnd, step, updateValue]);\n \n const handleTrackClick = useCallback((e: MouseEvent) => {\n if (disabled || !trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = isHorizontal ? e.clientX - rect.left : e.clientY - rect.top;\n const size = isHorizontal ? rect.width : rect.height;\n const clickValue = getValueFromPosition(position, size, min, max, step, orientation);\n \n // Determine which thumb to move\n const distToLow = Math.abs(clickValue - lowValue);\n const distToHigh = Math.abs(clickValue - highValue);\n \n if (distToLow < distToHigh) {\n updateValue(0, clickValue);\n setActiveThumb(0);\n } else {\n updateValue(1, clickValue);\n setActiveThumb(1);\n }\n }, [disabled, isHorizontal, min, max, step, orientation, lowValue, highValue, updateValue]);\n \n // Mouse/touch move handling\n useEffect(() => {\n if (activeThumb === null) return;\n \n const handleMove = (clientX: number, clientY: number) => {\n if (!trackRef.current) return;\n \n const rect = trackRef.current.getBoundingClientRect();\n const position = isHorizontal ? clientX - rect.left : clientY - rect.top;\n const size = isHorizontal ? rect.width : rect.height;\n const newValue = getValueFromPosition(position, size, min, max, step, orientation);\n \n updateValue(activeThumb, newValue);\n };\n \n const handleMouseMove = (e: globalThis.MouseEvent) => handleMove(e.clientX, e.clientY);\n const handleTouchMove = (e: globalThis.TouchEvent) => {\n const touch = e.touches[0];\n handleMove(touch.clientX, touch.clientY);\n };\n \n const handleEnd = () => {\n setActiveThumb(null);\n onChangeEnd?.(value);\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleEnd);\n document.addEventListener('touchmove', handleTouchMove);\n document.addEventListener('touchend', handleEnd);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleEnd);\n };\n }, [activeThumb, isHorizontal, min, max, step, orientation, updateValue, onChangeEnd, value]);\n \n return (\n <div\n ref={ref}\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n ...style,\n }}\n >\n <div\n ref={trackRef}\n onClick={handleTrackClick}\n style={{\n position: 'relative',\n background: '#e5e7eb',\n borderRadius: '4px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...(isHorizontal ? { width: '100%', height: '8px' } : { width: '8px', height: '200px' }),\n }}\n >\n {/* Range fill */}\n <div\n style={{\n position: 'absolute',\n background: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '4px',\n ...(isHorizontal\n ? { left: `${lowPercent}%`, width: `${highPercent - lowPercent}%`, height: '100%' }\n : { bottom: `${lowPercent}%`, height: `${highPercent - lowPercent}%`, width: '100%' }\n ),\n }}\n />\n \n {/* Low thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={lowValue}\n aria-valuemin={min}\n aria-valuemax={highValue - minDistance}\n aria-valuetext={formatValue(lowValue)}\n aria-orientation={orientation}\n aria-label={ariaLabel ? `${ariaLabel} minimum` : 'Minimum value'}\n aria-labelledby={ariaLabelledBy}\n onMouseDown={() => !disabled && setActiveThumb(0)}\n onTouchStart={() => !disabled && setActiveThumb(0)}\n onKeyDown={handleThumbKeyDown(0, lowValue)}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: activeThumb === 0 ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n zIndex: activeThumb === 0 ? 2 : 1,\n ...(isHorizontal\n ? { left: `${lowPercent}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${lowPercent}%`, left: '50%', transform: 'translate(-50%, 50%)' }\n ),\n }}\n >\n {showTooltip && activeThumb === 0 && (\n <div style={{ position: 'absolute', bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px', padding: '4px 8px', background: '#1f2937', color: 'white', borderRadius: '4px', fontSize: '12px' }}>\n {formatValue(lowValue)}\n </div>\n )}\n </div>\n \n {/* High thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={highValue}\n aria-valuemin={lowValue + minDistance}\n aria-valuemax={max}\n aria-valuetext={formatValue(highValue)}\n aria-orientation={orientation}\n aria-label={ariaLabel ? `${ariaLabel} maximum` : 'Maximum value'}\n aria-labelledby={ariaLabelledBy}\n onMouseDown={() => !disabled && setActiveThumb(1)}\n onTouchStart={() => !disabled && setActiveThumb(1)}\n onKeyDown={handleThumbKeyDown(1, highValue)}\n style={{\n position: 'absolute',\n width: '20px',\n height: '20px',\n background: 'white',\n border: '2px solid',\n borderColor: disabled ? '#9ca3af' : '#3b82f6',\n borderRadius: '50%',\n cursor: disabled ? 'not-allowed' : 'grab',\n outline: 'none',\n boxShadow: activeThumb === 1 ? '0 0 0 4px rgba(59, 130, 246, 0.2)' : '0 2px 4px rgba(0,0,0,0.1)',\n zIndex: activeThumb === 1 ? 2 : 1,\n ...(isHorizontal\n ? { left: `${highPercent}%`, top: '50%', transform: 'translate(-50%, -50%)' }\n : { bottom: `${highPercent}%`, left: '50%', transform: 'translate(-50%, 50%)' }\n ),\n }}\n >\n {showTooltip && activeThumb === 1 && (\n <div style={{ position: 'absolute', bottom: '100%', left: '50%', transform: 'translateX(-50%)', marginBottom: '8px', padding: '4px 8px', background: '#1f2937', color: 'white', borderRadius: '4px', fontSize: '12px' }}>\n {formatValue(highValue)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@input-kit/slider",
3
+ "version": "0.1.1",
4
+ "description": "Accessible React slider primitives with single and range thumbs",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "sideEffects": false,
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "typecheck": "tsc --noEmit",
28
+ "prepublishOnly": "npm run build"
29
+ },
30
+ "keywords": [
31
+ "react",
32
+ "input-kit",
33
+ "slider",
34
+ "typescript",
35
+ "headless"
36
+ ],
37
+ "author": "Harshit",
38
+ "license": "MIT",
39
+ "engines": {
40
+ "node": ">=18.0.0"
41
+ },
42
+ "peerDependencies": {
43
+ "react": "^18.0.0 || ^19.0.0",
44
+ "react-dom": "^18.0.0 || ^19.0.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/react": "^18.3.18",
48
+ "@types/react-dom": "^18.3.5",
49
+ "@testing-library/react": "^14.2.0",
50
+ "jsdom": "^26.0.0",
51
+ "react": "^18.3.1",
52
+ "react-dom": "^18.3.1",
53
+ "tsup": "^8.3.5",
54
+ "typescript": "^5.7.3",
55
+ "vitest": "^3.0.4"
56
+ }
57
+ }