'use client' import { type AnyNode, type AnyNodeId, type WallNode, useScene } from '@pascal-app/core' import { useViewer } from '@pascal-app/viewer' import { X } from 'lucide-react' import Image from 'next/image' import { useCallback } from 'react' import { NumberInput } from '@/components/ui/primitives/number-input' export function WallPanel() { const selectedIds = useViewer((s) => s.selection.selectedIds) const setSelection = useViewer((s) => s.setSelection) const nodes = useScene((s) => s.nodes) const updateNode = useScene((s) => s.updateNode) const selectedId = selectedIds[0] const node = selectedId ? (nodes[selectedId as AnyNode['id']] as WallNode | undefined) : undefined const handleUpdate = useCallback( (updates: Partial) => { if (!selectedId) return updateNode(selectedId as AnyNode['id'], updates) useScene.getState().dirtyNodes.add(selectedId as AnyNodeId) }, [selectedId, updateNode], ) const handleClose = useCallback(() => { setSelection({ selectedIds: [] }) }, [setSelection]) if (!node || node.type !== 'wall' || selectedIds.length !== 1) return null const dx = node.end[0] - node.start[0] const dz = node.end[1] - node.start[1] const length = Math.sqrt(dx * dx + dz * dz) const height = node.height ?? 2.5 const thickness = node.thickness ?? 0.1 return (
{/* Header */}

{node.name || "Wall"}

{/* Content */}
{/* Dimensions */}
handleUpdate({ height: Math.max(0.1, v) })} min={0.1} precision={2} step={0.1} className="flex-1" /> m
handleUpdate({ thickness: Math.max(0.05, v) })} min={0.05} precision={3} step={0.01} className="flex-1" /> m
{/* Info */}
Length: {length.toFixed(2)} m
) }