From 8378b851677b784216a162549665df71810cb8c9 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Sat, 28 Mar 2026 18:20:15 +0000 Subject: [PATCH] feat: better number inputs --- .../submit-form/mii-editor/number-inputs.tsx | 184 ++++++++---------- 1 file changed, 76 insertions(+), 108 deletions(-) diff --git a/src/components/submit-form/mii-editor/number-inputs.tsx b/src/components/submit-form/mii-editor/number-inputs.tsx index 18515dd..fc9f48a 100644 --- a/src/components/submit-form/mii-editor/number-inputs.tsx +++ b/src/components/submit-form/mii-editor/number-inputs.tsx @@ -1,3 +1,4 @@ +import { Icon } from "@iconify/react"; import { useState } from "react"; interface Props { @@ -5,120 +6,87 @@ interface Props { } export default function NumberInputs({ target }: Props) { - const [height, setHeight] = useState(0); - const [distance, setDistance] = useState(0); - const [rotation, setRotation] = useState(0); - const [size, setSize] = useState(0); - const [stretch, setStretch] = useState(0); + const [values, setValues] = useState>({ + height: 0, + distance: 0, + rotation: 0, + size: 0, + stretch: 0, + }); if (!target) return null; return (
- {target.height !== undefined && ( -
- - { - const value = Number(e.target.value); - setHeight(value); - target.height = value; - }} - className="pill input text-sm py-1! px-3! w-full" - /> -
- )} - - {target.distance !== undefined && ( -
- - { - const value = Number(e.target.value); - setDistance(value); - target.distance = value; - }} - className="pill input text-sm py-1! px-3! w-full" - /> -
- )} - - {target.rotation !== undefined && ( -
- - { - const value = Number(e.target.value); - setRotation(value); - target.rotation = value; - }} - className="pill input text-sm py-1! px-3! w-full" - /> -
- )} - - {target.size !== undefined && ( -
- - { - const value = Number(e.target.value); - setSize(value); - target.size = value; - }} - className="pill input text-sm py-1! px-3! w-full" - /> -
- )} - - {target.stretch !== undefined && ( -
- - { - const value = Number(e.target.value); - setStretch(value); - target.stretch = value; - }} - className="pill input text-sm py-1! px-3! w-full" - /> -
+ {["Height", "Distance", "Rotation", "Size", "Stretch"].map( + (label) => + target[label.toLowerCase()] !== undefined && ( + { + const field = label.toLowerCase(); + setValues((prev) => ({ ...prev, [field]: value })); + target[field] = value; + }} + /> + ), )}
); } + +interface NumberFieldProps { + label: string; + value: number; + onChange: (value: number) => void; +} + +function NumberField({ label, value, onChange }: NumberFieldProps) { + const MIN = -15; + const MAX = 15; + + const decrement = () => onChange(Math.max(MIN, value - 1)); + const increment = () => onChange(Math.min(MAX, value + 1)); + + return ( +
+ +
+ + { + const val = Math.min(MAX, Math.max(MIN, Number(e.target.value))); + onChange(val); + }} + className="w-full text-center bg-transparent outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" + /> + +
+
+ ); +}