Skip to content

Commit c9592cb

Browse files
committed
feat: add slider component
1 parent ea1d907 commit c9592cb

File tree

4 files changed

+125
-1
lines changed

4 files changed

+125
-1
lines changed

site/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@radix-ui/react-dialog": "^1.1.6",
1414
"@radix-ui/react-label": "^2.1.2",
1515
"@radix-ui/react-select": "^2.1.6",
16+
"@radix-ui/react-slider": "^1.2.3",
1617
"@radix-ui/react-switch": "^1.1.3",
1718
"@tailwindcss/vite": "^4.0.9",
1819
"class-variance-authority": "^0.7.1",

site/pnpm-lock.yaml

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/DynamicForm.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import { useUsers } from './hooks/useUsers';
1515
import { useDirectories } from './hooks/useDirectories';
1616
import { useDebouncedFunction } from './hooks/debounce';
1717
import { CollapsibleSummary } from "./components/CollapsibleSummary/CollapsibleSummary";
18-
import ReactJson from 'react-json-view'
18+
import { Slider } from "./components/ui/slider";
19+
import ReactJson from 'react-json-view';
1920

2021
export function DynamicForm() {
2122
const serverAddress = "localhost:8100";
@@ -231,6 +232,32 @@ export function DynamicForm() {
231232
{renderDiagnostics(param.diagnostics)}
232233
</div>
233234
)
235+
case "slider":
236+
return (
237+
<div key={param.name} className="flex flex-col gap-2 items-center">
238+
<div className="flex items-center justify-between gap-2">
239+
<label>
240+
{param.display_name || param.name}
241+
{param.icon && <img src={param.icon} alt="" style={{ marginLeft: 6 }} />}
242+
</label>
243+
<output className="text-sm font-medium tabular-nums">{param.value}</output>
244+
</div>
245+
{param.description && <div className="text-sm">{param.description}</div>}
246+
<Controller
247+
name={param.name}
248+
control={methods.control}
249+
render={({ field }) => (
250+
<div className="w-[300px]">
251+
<Slider defaultValue={field.value ? [Number(field.value)] : [0]} max={param.validations[0].validation_max || undefined} min={param.validations[0].validation_min || undefined} step={1}
252+
onValueChange={(value) => {
253+
console.log("value", value[0].toString());
254+
field.onChange(value[0].toString());
255+
}}/>
256+
</div>
257+
)}
258+
/>
259+
</div>
260+
)
234261
}
235262
}
236263

site/src/components/ui/slider.tsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import * as React from "react"
2+
import * as SliderPrimitive from "@radix-ui/react-slider"
3+
4+
import { cn } from "../../utils/cn"
5+
6+
function Slider({
7+
className,
8+
defaultValue,
9+
value,
10+
min = 0,
11+
max = 100,
12+
...props
13+
}: React.ComponentProps<typeof SliderPrimitive.Root>) {
14+
const _values = React.useMemo(
15+
() =>
16+
Array.isArray(value)
17+
? value
18+
: Array.isArray(defaultValue)
19+
? defaultValue
20+
: [min, max],
21+
[value, defaultValue, min, max]
22+
)
23+
24+
return (
25+
<SliderPrimitive.Root
26+
data-slot="slider"
27+
defaultValue={defaultValue}
28+
value={value}
29+
min={min}
30+
max={max}
31+
className={cn(
32+
"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col",
33+
className
34+
)}
35+
{...props}
36+
>
37+
<SliderPrimitive.Track
38+
data-slot="slider-track"
39+
className={cn(
40+
"bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5"
41+
)}
42+
>
43+
<SliderPrimitive.Range
44+
data-slot="slider-range"
45+
className={cn(
46+
"bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
47+
)}
48+
/>
49+
</SliderPrimitive.Track>
50+
{Array.from({ length: _values.length }, (_, index) => (
51+
<SliderPrimitive.Thumb
52+
data-slot="slider-thumb"
53+
key={index}
54+
className="border-primary bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50"
55+
/>
56+
))}
57+
</SliderPrimitive.Root>
58+
)
59+
}
60+
61+
export { Slider }

0 commit comments

Comments
 (0)