import { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, Field, } from "../../primitives"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "../../primitives"; import { useRef, useState } from "react"; import type { GradientType } from "../control-types"; import { ControlFieldLabel } from "../../control-layout"; import { gradientTypeOptions, normalizeGradientAngle, } from "./gradient-control-utils"; function GradientTypeSelect({ onTypeChange, type, }: { onTypeChange: (nextType: GradientType) => void; type: GradientType; }): React.JSX.Element { const selectedOption = gradientTypeOptions.find((option) => option.value === type) ?? gradientTypeOptions[0]; return ( ); } export function GradientToolbar({ angle, name, onAngleChange, onTypeChange, type, }: { angle: number; name: string; onAngleChange: (nextAngle: number) => void; onTypeChange: (nextType: GradientType) => void; type: GradientType; }): React.JSX.Element { const [angleDraft, setAngleDraft] = useState(null); const angleBeforeEditRef = useRef(angle); const displayedAngle = angleDraft ?? String(angle); function handleAngleFocus(): void { angleBeforeEditRef.current = angle; setAngleDraft(String(angle)); } function handleAngleChange(event: React.ChangeEvent): void { setAngleDraft(event.target.value); } function handleAngleBlur(): void { const nextDraft = angleDraft?.trim() ?? ""; if (nextDraft === "" || !Number.isFinite(Number.parseFloat(nextDraft))) { onAngleChange(angleBeforeEditRef.current); setAngleDraft(null); return; } const nextAngle = normalizeGradientAngle(nextDraft); if (nextAngle !== angle) { onAngleChange(nextAngle); } setAngleDraft(null); } return (
{name}
Angle
{ if (event.key === "Enter") { event.preventDefault(); handleAngleBlur(); event.currentTarget.blur(); return; } if (event.key === "Escape") { event.preventDefault(); setAngleDraft(String(angle)); event.currentTarget.blur(); } }} type="text" value={displayedAngle} /> °
); }