"use client"; import { CanvasImage } from "./canvas-image"; import { managedImageSource } from "@/lib/canvas-v2"; import { useContext, useRef } from "react"; import { Handle, Position, useViewport, type NodeProps } from "@xyflow/react"; import { FileText, Image as ImageIcon, Type } from "lucide-react"; import { elementCapabilities } from "@/lib/canvas-elements"; import { nodeDirections, type CanvasNode } from "@/lib/canvas"; import { NodeTitle } from "./node-title"; import { CanvasTextEditor } from "./canvas-text-editor"; import styles from "./canvas.module.css"; import { TransformableNode, NodeEditing } from "./transformable-node"; export { NodeEditing } from "./transformable-node"; const positions = { top: Position.Top, right: Position.Right, bottom: Position.Bottom, left: Position.Left }; const labels = { top: "上方", right: "右侧", bottom: "下方", left: "左侧" }; export function MaterialNode(props: NodeProps) { const { id, data, selected } = props; const editing = useContext(NodeEditing); const { zoom } = useViewport(); const preview = (props.width || 260) * zoom * (typeof window === "undefined" ? 1 : window.devicePixelRatio || 1) <= 1024; const pointerStart = useRef({ x: 0, y: 0 }); const Icon = data.kind === "image" ? ImageIcon : data.kind === "script" ? FileText : Type; return (
{data.kind === "image" ? : ( )} {nodeDirections.map((direction) => { pointerStart.current = { x: event.clientX, y: event.clientY }; }} onClick={(event) => { event.stopPropagation(); if (selected && elementCapabilities(data.kind).branchable && Math.hypot(event.clientX - pointerStart.current.x, event.clientY - pointerStart.current.y) < 5) editing.branch(id, direction, { x: event.clientX, y: event.clientY }); }} onKeyDown={(event) => { if (selected && (event.key === "Enter" || event.key === " ")) { event.preventDefault(); event.stopPropagation(); const rect = event.currentTarget.getBoundingClientRect(); editing.branch(id, direction, { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }); } }}> )}
); }