import {useRef,type PointerEvent} from 'react'; import {Type,ImagePlus,FileText,Plus,Bold,Italic,Maximize,MoreHorizontal} from 'lucide-react'; import type {CanvasNode,TextStyle} from '../../lib/canvas-document'; import s from '../../styles/canvas-node.module.css'; type Props={node:CanvasNode;selected:boolean;editing:boolean;hand:boolean;onSelect:()=>void;onChooseReference:()=>void;onEdit:()=>void;onDrag:(e:PointerEvent)=>void;onResize:(e:PointerEvent)=>void;onChange:(text:string)=>void;onRename:(title:string)=>void;onStyle:(style:TextStyle)=>void;onReference:(e:PointerEvent|React.MouseEvent)=>void;onMenu:(e:React.MouseEvent)=>void;onUpload:()=>void;onUpscale:()=>void;onExpand:()=>void;onBeginEdit:()=>void}; export default function CanvasNodeView(p:Props){ const {node:n}=p;const gesture=useRef<{selected:boolean;x:number;y:number;moved:boolean}|null>(null); const icon=n.kind==='image'?:n.kind==='script'?:; const style={fontWeight:n.style?.bold?700:400,fontStyle:n.style?.italic?'italic':'normal',fontSize:n.style?.size||15,color:n.style?.color}; return
{gesture.current=null;if(p.hand||(p.editing&&n.kind==='text')||e.button!==0||(e.target as HTMLElement).closest('button,input,select'))return;gesture.current={selected:p.selected,x:e.clientX,y:e.clientY,moved:false};e.stopPropagation();p.onSelect();p.onDrag(e)}} onPointerMove={e=>{const g=gesture.current;if(g&&Math.hypot(e.clientX-g.x,e.clientY-g.y)>=4)g.moved=true}} onClick={e=>{if((e.target as HTMLElement).closest('button,input,select'))return;const g=gesture.current;if(!p.hand&&!p.editing&&g?.selected&&!g.moved)p.onEdit();gesture.current=null}} onKeyDown={e=>{if(e.target!==e.currentTarget)return;if(e.key==='Enter'){e.preventDefault();p.onEdit()}}} tabIndex={0} aria-label={n.title}>
{icon}p.onRename(e.target.value)} onPointerDown={e=>e.stopPropagation()}/>{p.selected&&}
{p.editing&&n.kind==='text'&&
e.stopPropagation()}>p.onStyle({...n.style,color:e.target.value})}/>
} {n.kind==='image'?
{n.image?{n.title}:
}{p.selected&&n.image&&}
:p.editing&&n.kind==='text'?