'use client' import { type AnyNode, type GuideNode, type ScanNode, useScene } from '@pascal-app/core' import { Box, Image, X } from 'lucide-react' import { useCallback } from 'react' import useEditor from '@/store/use-editor' type ReferenceNode = ScanNode | GuideNode export function ReferencePanel() { const selectedReferenceId = useEditor((s) => s.selectedReferenceId) const setSelectedReferenceId = useEditor((s) => s.setSelectedReferenceId) const nodes = useScene((s) => s.nodes) const updateNode = useScene((s) => s.updateNode) const node = selectedReferenceId ? (nodes[selectedReferenceId as AnyNode['id']] as ReferenceNode | undefined) : undefined const handleUpdate = useCallback( (updates: Partial) => { if (!selectedReferenceId) return updateNode(selectedReferenceId as AnyNode['id'], updates) }, [selectedReferenceId, updateNode], ) const handleClose = useCallback(() => { setSelectedReferenceId(null) }, [setSelectedReferenceId]) if (!node || (node.type !== 'scan' && node.type !== 'guide')) return null const isScan = node.type === 'scan' return (
{/* Header */}
{isScan ? ( ) : ( )}

{node.name || (isScan ? '3D Scan' : 'Guide Image')}

{/* Content */}
{/* 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} />
) }