+ {/* Position */}
+
+
+
+ {([0, 1, 2] as const).map((i) => (
+
+
+ {
+ const value = Number.parseFloat(e.target.value)
+ if (!Number.isNaN(value)) {
+ const pos = [...node.position] as [number, number, number]
+ pos[i] = value
+ handleUpdate({ position: pos })
+ }
+ }}
+ step="0.1"
+ type="number"
+ value={Math.round(node.position[i] * 100) / 100}
+ />
+
+ ))}
+
+
+
+ {/* Rotation Y */}
+
+
+
+ {
+ const degrees = Number.parseFloat(e.target.value)
+ if (!Number.isNaN(degrees)) {
+ const radians = (degrees * Math.PI) / 180
+ handleUpdate({
+ rotation: [node.rotation[0], radians, node.rotation[2]],
+ })
+ }
+ }}
+ step="1"
+ type="number"
+ value={Math.round((node.rotation[1] * 180) / Math.PI)}
+ />
+ °
+
+
+
+
+
+ {/* Scale */}
+
+
+ {
+ const value = Number.parseFloat(e.target.value)
+ if (!Number.isNaN(value) && value > 0) {
+ handleUpdate({ scale: value })
+ }
+ }}
+ step="0.1"
+ type="number"
+ value={Math.round(node.scale * 100) / 100}
+ />
+
+
+ {/* Opacity */}
+
+
+
+ {node.opacity}%
+
+
handleUpdate({ opacity: Number.parseInt(e.target.value, 10) })}
+ step="1"
+ type="range"
+ value={node.opacity}
+ />
+
+