'use client' import { type AnyNode, type RoofNode, 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' export function RoofPanel() { 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) // Get the first selected node if it's a roof const selectedId = selectedIds[0] const node = selectedId ? (nodes[selectedId as AnyNode['id']] as RoofNode | undefined) : undefined const handleUpdate = useCallback( (updates: Partial) => { if (!selectedId) return updateNode(selectedId as AnyNode['id'], updates) }, [selectedId, updateNode], ) const handleClose = useCallback(() => { setSelection({ selectedIds: [] }) }, [setSelection]) // Only show if exactly one roof is selected if (!node || node.type !== 'roof' || selectedIds.length !== 1) return null // Calculate total width for display const totalWidth = node.leftWidth + node.rightWidth return (
{/* Header */}

{node.name || 'Gable Roof'}

{/* Content */}
{/* Length */}
{ const value = Number.parseFloat(e.target.value) if (!Number.isNaN(value) && value > 0) { handleUpdate({ length: value }) } }} step="0.5" type="number" value={Math.round(node.length * 100) / 100} /> m
{/* Height */}
{ const value = Number.parseFloat(e.target.value) if (!Number.isNaN(value) && value > 0) { handleUpdate({ height: value }) } }} step="0.1" type="number" value={Math.round(node.height * 100) / 100} /> m
{/* Slope Widths */}
Total: {totalWidth.toFixed(1)}m
{ const value = Number.parseFloat(e.target.value) if (!Number.isNaN(value) && value > 0) { handleUpdate({ leftWidth: value }) } }} step="0.1" type="number" value={Math.round(node.leftWidth * 100) / 100} /> m
{ const value = Number.parseFloat(e.target.value) if (!Number.isNaN(value) && value > 0) { handleUpdate({ rightWidth: value }) } }} step="0.1" type="number" value={Math.round(node.rightWidth * 100) / 100} /> m
{/* Rotation */}
{ const degrees = Number.parseFloat(e.target.value) if (!Number.isNaN(degrees)) { const radians = (degrees * Math.PI) / 180 handleUpdate({ rotation: radians }) } }} step="1" type="number" value={Math.round((node.rotation * 180) / Math.PI)} /> °
{/* 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.5" type="number" value={Math.round(node.position[i] * 100) / 100} />
))}
) }