"use client"; import type { EffectParamDefinition, NumberEffectParamDefinition } from "@/types/effects"; import { clamp } from "@/utils/math"; import { SectionField } from "./section"; import { Slider } from "@/components/ui/slider"; import { NumberField } from "@/components/ui/number-field"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { usePropertyDraft } from "./hooks/use-property-draft"; export function EffectParamField({ param, value, onPreview, onCommit, }: { param: EffectParamDefinition; value: number | string | boolean; onPreview: (value: number | string | boolean) => void; onCommit: () => void; }) { return ( ); } function EffectParamInput({ param, value, onPreview, onCommit, }: { param: EffectParamDefinition; value: number | string | boolean; onPreview: (value: number | string | boolean) => void; onCommit: () => void; }) { if (param.type === "number") { return ( ); } if (param.type === "boolean") { return ( { onPreview(checked); onCommit(); }} /> ); } if (param.type === "select") { return ( ); } if (param.type === "color") { return ( onPreview(event.target.value)} onBlur={onCommit} /> ); } return null; } function NumberParamField({ param, value, onPreview, onCommit, }: { param: NumberEffectParamDefinition; value: number; onPreview: (value: number) => void; onCommit: () => void; }) { const { min, max, step } = param; const draft = usePropertyDraft({ displayValue: String(value), parse: (input) => { const parsed = parseFloat(input); if (Number.isNaN(parsed)) return null; return clamp({ value: parsed, min, max }); }, onPreview, onCommit, }); return (
onPreview(newValue)} onValueCommit={onCommit} />
); }