dishui 0.0.47 → 0.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +1 -2
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js +0 -25
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/types.d.ts +1 -1
- package/dist/components/pro/Flow/Flow.js +500 -483
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +526 -524
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.d.ts +3 -0
- package/dist/components/pro/Flow/canvas/GridRenderer.js +28 -23
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +18 -17
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.d.ts +2 -0
- package/dist/components/pro/Flow/canvas/PixiApp.js +14 -11
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/constants.js +7 -7
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.d.ts +15 -0
- package/dist/components/pro/Flow/context/FlowAIContext.js +32 -0
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -0
- package/dist/components/pro/Flow/context/FlowUIContext.d.ts +4 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js +58 -55
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +22 -21
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js +32 -32
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.d.ts +6 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js +49 -30
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/index.d.ts +2 -0
- package/dist/components/pro/Flow/lines/FreehandTool.js +21 -20
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js +22 -18
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +19 -18
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js +143 -124
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js +22 -17
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +77 -76
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.d.ts +22 -0
- package/dist/components/pro/Flow/nodes/aiClient.js +107 -54
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js +6 -6
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.d.ts +2 -0
- package/dist/components/pro/Flow/panels/AIPanel.js +498 -0
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -0
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js +51 -39
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +91 -85
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +372 -332
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js +28 -27
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js +107 -104
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +1 -0
- package/dist/components/pro/Flow/panels/toolbarIcons.js +25 -20
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.d.ts +13 -0
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.d.ts +87 -0
- package/dist/components/pro/Flow/utils/themeColor.js +212 -0
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -0
- package/dist/contexts/AppContext.d.ts +1 -1
- package/dist/contexts/AppContext.js +28 -29
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/favicon.svg +10 -0
- package/dist/flow.js +56 -51
- package/dist/styles/themeStyles.js +6 -11
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/themes.js +3 -23
- package/dist/utils/themes.js.map +1 -1
- package/package.json +17 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InspectorPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/InspectorPanel.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport Checkbox from '../../../Checkbox';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { EDGE_LINE_STYLE_OPTIONS, EDGE_MARKER_OPTIONS, BORDER_STYLE_OPTIONS, EDGE_TYPE_OPTIONS, DEFAULT_NODE_DATA } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { getAllSvgIcons, getSvgIcon } from '../nodes/svgIcons';\nimport { FLOW_NODE_TYPES, type FlowNode, type FlowEdge, type FlowLine, type FlowShapeType } from '../types';\nimport { DataInspectorSection } from './DataInspectorSection';\nimport { ExpandableTextarea } from './ExpandableTextarea';\n\n/**\n * Standalone panel (legacy). Prefer using InspectorPanelContent inside a FlowPanelGroup.\n */\nexport default function InspectorPanel() {\n const { showInspector } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 240);\n\n if (!showInspector) return null;\n\n return (\n <div className=\"flow-inspector\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 8, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Inspector\n </div>\n <div className=\"flow-inspector-content\">\n <InspectorPanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function InspectorPanelContent() {\n const { currentCanvas, selection, setSelection, setDoc, currentCanvasId } = useFlowContext();\n\n const selectedNodes = useMemo(\n () => currentCanvas.nodes.filter(n => selection.nodeIds.has(n.id)),\n [currentCanvas.nodes, selection.nodeIds],\n );\n const selectedEdges = useMemo(\n () => currentCanvas.edges.filter(e => selection.edgeIds.has(e.id)),\n [currentCanvas.edges, selection.edgeIds],\n );\n const selectedLines = useMemo(\n () => currentCanvas.lines.filter(l => selection.lineIds.has(l.id)),\n [currentCanvas.lines, selection.lineIds],\n );\n\n const hasSelection = selectedNodes.length > 0 || selectedEdges.length > 0 || selectedLines.length > 0;\n const singleIsGroup = selectedNodes.length === 1 && (selectedNodes[0].type === 'flowGroup' || selectedNodes[0].type === 'geometryGroup' || selectedNodes[0].data.isGroup);\n\n const totalSelected = selectedNodes.length + selectedLines.length;\n\n const handleGroup = (type: 'flowGroup' | 'geometryGroup' = 'flowGroup') => {\n if (totalSelected < 2) return;\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of selectedNodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of selectedLines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n const nIds = selection.nodeIds;\n const lIds = selection.lineIds;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n };\n\n const handleUngroup = () => {\n const groupIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const n of selectedNodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) groupIds.add(n.id);\n }\n if (groupIds.size === 0) return;\n for (const n of currentCanvas.nodes) {\n if (n.parentId && groupIds.has(n.parentId)) childNodeIds.add(n.id);\n }\n for (const l of currentCanvas.lines) {\n if (l.parentId && groupIds.has(l.parentId)) childLineIds.add(l.id);\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n };\n\n const changeNodeZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const nodes = canvas.nodes.map(n => {\n if (!ids.has(n.id)) return n;\n const z = n.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...n, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes } } };\n });\n };\n\n const changeLineZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.lineIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.lines.map(l => l.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const lines = canvas.lines.map(l => {\n if (!ids.has(l.id)) return l;\n const z = l.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...l, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, lines } } };\n });\n };\n\n const updateNodeData = (nodeId: string, key: string, value: any) => {\n updateNodeDataBatch(nodeId, { [key]: value });\n };\n\n const updateNodeDataBatch = (nodeId: string, values: Record<string, any>) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, data: { ...n.data, ...values } } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeDimension = (nodeId: string, key: 'width' | 'height', value: number) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, [key]: value } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateEdgeData = (edgeId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, data: { ...e.data, [key]: value } } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeType = (nodeId: string, type: FlowShapeType) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === nodeId ? { ...node, type } : node),\n },\n },\n };\n });\n };\n\n const updateEdgeType = (edgeId: string, type: string) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, type: type as any } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateLineData = (lineId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n lines: canvas.lines.map(l =>\n l.id === lineId ? { ...l, [key]: value } : l,\n ),\n },\n },\n };\n });\n };\n\n return (\n <>\n {!hasSelection && (\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 40%, transparent)', textAlign: 'center', padding: '20px 0' }}>\n Select an element to inspect\n </div>\n )}\n\n {selectedNodes.length === 1 && (\n <NodeInspector\n node={selectedNodes[0]}\n isGroup={singleIsGroup}\n onUpdateData={updateNodeData}\n onUpdateDataBatch={updateNodeDataBatch}\n onUpdateDimension={updateNodeDimension}\n onUpdateType={updateNodeType}\n />\n )}\n {totalSelected > 1 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Selection</div>\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', marginBottom: 8 }}>\n {selectedNodes.length > 0 && `${selectedNodes.length} node${selectedNodes.length > 1 ? 's' : ''}`}\n {selectedNodes.length > 0 && selectedLines.length > 0 && ', '}\n {selectedLines.length > 0 && `${selectedLines.length} line${selectedLines.length > 1 ? 's' : ''}`}\n {' selected'}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, width: '100%' }}>\n <Button size=\"xs\" onClick={() => handleGroup('flowGroup')} block>\n Group (⌘G)\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => handleGroup('geometryGroup')} block>\n Geo Group (⌘⌥G)\n </Button>\n </div>\n </div>\n )}\n {singleIsGroup && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">\n {selectedNodes[0].type === 'geometryGroup' ? 'Geometry Group' : 'Group'}\n </div>\n <div style={{ fontSize: 11, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginBottom: 6 }}>\n {selectedNodes[0].type === 'geometryGroup'\n ? 'Auto-binds spatially contained nodes'\n : 'Explicit membership via add/remove'}\n </div>\n <Button size=\"xs\" variant=\"ghost\" onClick={handleUngroup} block>\n Ungroup (⌘⇧G)\n </Button>\n </div>\n )}\n\n {selectedNodes.length > 0 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('front')}>\n <span title=\"Bring to Front (⌘⇧↑)\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('up')}>\n <span title=\"Bring Forward (⌘↑)\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('down')}>\n <span title=\"Send Backward (⌘↓)\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('back')}>\n <span title=\"Send to Back (⌘⇧↓)\">⤓</span>\n </Button>\n </div>\n </div>\n )}\n\n {selectedEdges.length === 1 && (\n <EdgeInspector\n edge={selectedEdges[0]}\n onUpdateData={updateEdgeData}\n onUpdateType={updateEdgeType}\n />\n )}\n\n {selectedLines.length === 1 && (\n <>\n <LineInspector\n line={selectedLines[0]}\n onUpdateData={updateLineData}\n />\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('front')}>\n <span title=\"Bring to Front\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('up')}>\n <span title=\"Bring Forward\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('down')}>\n <span title=\"Send Backward\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('back')}>\n <span title=\"Send to Back\">⤓</span>\n </Button>\n </div>\n </div>\n </>\n )}\n </>\n );\n}\n\nfunction NodeInspector({\n node,\n isGroup,\n onUpdateData,\n onUpdateDataBatch,\n onUpdateDimension,\n onUpdateType,\n}: {\n node: FlowNode;\n isGroup?: boolean;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateDataBatch: (id: string, values: Record<string, any>) => void;\n onUpdateDimension: (id: string, key: 'width' | 'height', value: number) => void;\n onUpdateType: (id: string, type: FlowShapeType) => void;\n}) {\n return (\n <>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Node</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={node.data.label}\n onChange={(e) => onUpdateData(node.id, 'label', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={FLOW_NODE_TYPES.map(type => ({ value: type, label: type }))}\n value={node.type}\n onChange={(value) => onUpdateType(node.id, value as FlowShapeType)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Size</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">W</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.width * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'width', Number(e.target.value) || node.width)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">H</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.height * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'height', Number(e.target.value) || node.height)}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Style</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Fill</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={node.data.fill === 'transparent' ? '#ffffff' : node.data.fill}\n onChange={(e) => onUpdateData(node.id, 'fill', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Stroke</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={node.data.stroke === 'transparent' ? '#000000' : node.data.stroke}\n onChange={(e) => onUpdateData(node.id, 'stroke', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.fontSize)}\n onChange={(e) => onUpdateData(node.id, 'fontSize', Number(e.target.value) || 14)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={node.data.color}\n onChange={(e) => onUpdateData(node.id, 'color', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font Color</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={node.data.labelColor ?? node.data.color}\n onChange={(e) => onUpdateData(node.id, 'labelColor', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Border</Label>\n <Select\n options={[{ value: 'none', label: 'none' }, ...BORDER_STYLE_OPTIONS.map(s => ({ value: s, label: s }))]}\n value={node.data.borderStyle ?? (isGroup ? (node.type === 'geometryGroup' ? 'dashed' : 'dotted') : 'solid')}\n onChange={(v) => onUpdateData(node.id, 'borderStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n {node.type === 'shapeSvg' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <Select\n options={getAllSvgIcons().map(icon => ({ value: icon.id, label: icon.label }))}\n value={node.data.svgId ?? ''}\n placeholder=\"选择图标\"\n onChange={(value) => {\n const icon = getSvgIcon(String(value));\n onUpdateDataBatch(node.id, {\n svgId: value,\n ...(icon?.brandColor ? { color: icon.brandColor } : {}),\n ...(!node.data.label || node.data.label === 'Text' ? { label: icon?.label ?? String(value) } : {}),\n });\n }}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Box</Label>\n <Checkbox\n size=\"sm\"\n checked={node.data.iconBox ?? false}\n onChange={(v) => onUpdateData(node.id, 'iconBox', v)}\n label=\"显示边框\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Select\n options={[\n { value: 'top', label: 'top' },\n { value: 'middle', label: 'middle' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={node.data.labelPlacement === ('above' as any)\n ? 'top'\n : node.data.labelPlacement === ('center' as any)\n ? 'middle'\n : node.data.labelPlacement === ('below' as any)\n ? 'bottom'\n : (node.data.labelPlacement ?? 'bottom')}\n onChange={(v) => onUpdateData(node.id, 'labelPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetX', Number(event.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetY', Number(event.target.value) || 0)}\n />\n </div>\n </>\n )}\n\n </div>\n {node.type === 'mediaNode' && (\n <MediaInspectorSection node={node} onUpdateData={onUpdateData} />\n )}\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Transform</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Rotate</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.rotation ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'rotation', Number(e.target.value) || 0)}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>°</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Flip</Label>\n <Button\n size=\"xs\"\n variant={node.data.flipX ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipX', !node.data.flipX)}\n square\n >\n <span title=\"Flip Horizontal\">↔</span>\n </Button>\n <Button\n size=\"xs\"\n variant={node.data.flipY ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipY', !node.data.flipY)}\n square\n >\n <span title=\"Flip Vertical\">↕</span>\n </Button>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Quick</Label>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) + 90) % 360)}>\n +90°\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) - 90 + 360) % 360)}>\n −90°\n </Button>\n </div>\n </div>\n </>\n );\n}\n\nfunction MediaInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const kind = node.data.mediaKind ?? 'markdown';\n const ai = node.data.aiConfig;\n const modelFileInputRef = useRef<HTMLInputElement>(null);\n\n const updateAI = (key: string, value: any) => {\n onUpdateData(node.id, 'aiConfig', {\n gateway: '', protocol: 'openai', model: '',\n ...ai,\n [key]: value,\n });\n };\n\n const contentLabels: Record<string, string> = {\n markdown: 'Markdown 源码',\n html: 'HTML 源码',\n mermaid: 'Mermaid 图表',\n math: 'LaTeX 公式',\n };\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Media · {kind}</div>\n {kind === 'data' ? (\n <DataInspectorSection node={node} onUpdateData={onUpdateData} />\n ) : kind === 'model3d' ? (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">格式</Label>\n <Select\n options={[\n { value: 'stl', label: 'STL' },\n { value: 'obj', label: 'OBJ' },\n { value: '3mf', label: '3MF' },\n ]}\n value={node.data.modelFormat ?? 'stl'}\n onChange={value => onUpdateData(node.id, 'modelFormat', value)}\n />\n </div>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/model.stl\"\n onChange={event => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">本地模型</Label>\n <input\n ref={modelFileInputRef}\n type=\"file\"\n accept=\".stl,.obj,.3mf,model/stl,model/obj,model/3mf,application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"\n hidden\n onChange={event => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (!file) return;\n if (file.size > 10 * 1024 * 1024) {\n window.alert('本地模型不能超过 10 MiB,请改用模型链接。');\n return;\n }\n const extension = file.name.split('.').pop()?.toLowerCase();\n if (extension !== 'stl' && extension !== 'obj' && extension !== '3mf') {\n window.alert('仅支持 STL、OBJ 和 3MF 模型。');\n return;\n }\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n onUpdateData(node.id, 'modelFormat', extension);\n onUpdateData(node.id, 'mediaContent', reader.result);\n };\n reader.onerror = () => window.alert('读取本地模型失败。');\n reader.readAsDataURL(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => modelFileInputRef.current?.click()}>\n 选择文件\n </Button>\n {node.data.mediaContent?.startsWith('data:') && (\n <span className=\"flow-inspector-file-status\">已嵌入</span>\n )}\n </div>\n <div className=\"flow-inspector-help\">支持 STL、OBJ、3MF;本地文件将以 Base64 嵌入文档,最大 10 MiB。选中节点后可在内部拖拽旋转、滚轮缩放。</div>\n </>\n ) : kind === 'image' ? (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">图片链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/image.png\"\n onChange={(event) => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-help\">支持 HTTP(S) 链接;选中图片节点后可直接粘贴图片并保存为 Base64。</div>\n </>\n ) : kind !== 'ai' ? (\n <ExpandableTextarea\n label={contentLabels[kind] ?? '内容'}\n value={node.data.mediaContent ?? ''}\n onChange={(value) => onUpdateData(node.id, 'mediaContent', value)}\n rows={8}\n />\n ) : (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={[\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic 兼容' },\n ]}\n value={ai?.protocol ?? 'openai'}\n onChange={(v) => updateAI('protocol', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={ai?.gateway ?? ''}\n placeholder=\"https://api.openai.com/v1/chat/completions\"\n onChange={(e) => updateAI('gateway', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={ai?.model ?? ''}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateAI('model', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={ai?.apiKey ?? ''}\n placeholder=\"sk-...\"\n onChange={(e) => updateAI('apiKey', e.target.value)}\n />\n </div>\n <ExpandableTextarea\n label=\"System Prompt\"\n value={ai?.systemPrompt ?? ''}\n onChange={(value) => updateAI('systemPrompt', value)}\n rows={3}\n />\n <div style={{ fontSize: 10, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginTop: 4 }}>\n 密钥会随文档 JSON 一同导出,请谨慎分享。\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction EdgeInspector({\n edge,\n onUpdateData,\n onUpdateType,\n}: {\n edge: FlowEdge;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateType: (id: string, type: string) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Edge</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={EDGE_TYPE_OPTIONS.map(t => ({ value: t, label: t }))}\n value={edge.type}\n onChange={(v) => onUpdateType(edge.id, v as string)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={edge.data.strokeColor ?? '#374151'}\n onChange={(e) => onUpdateData(edge.id, 'strokeColor', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(edge.data.strokeWidth ?? 2)}\n onChange={(e) => onUpdateData(edge.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Animation</Label>\n <Checkbox\n size=\"sm\"\n checked={edge.data.animated ?? false}\n onChange={(value) => onUpdateData(edge.id, 'animated', value)}\n label=\"预览时播放\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Line</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={edge.data.lineStyle ?? 'solid'}\n onChange={(v) => onUpdateData(edge.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Start</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerStart ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerStart', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">End</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerEnd ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerEnd', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={edge.data.labelText ?? ''}\n onChange={(e) => onUpdateData(edge.id, 'labelText', e.target.value)}\n placeholder=\"Edge label\"\n />\n </div>\n </div>\n );\n}\n\nfunction LineInspector({\n line,\n onUpdateData,\n}: {\n line: FlowLine;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Line</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <span style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)' }}>{line.type}</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <Input\n type=\"color\"\n size=\"xs\"\n value={line.strokeColor}\n onChange={(e) => onUpdateData(line.id, 'strokeColor', e.target.value)}\n className=\"flow-inspector-color flow-inspector-compact\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(line.strokeWidth)}\n onChange={(e) => onUpdateData(line.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Style</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={line.lineStyle}\n onChange={(v) => onUpdateData(line.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InspectorPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/InspectorPanel.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport Checkbox from '../../../Checkbox';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { EDGE_LINE_STYLE_OPTIONS, EDGE_MARKER_OPTIONS, BORDER_STYLE_OPTIONS, EDGE_TYPE_OPTIONS, DEFAULT_NODE_DATA } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { getAllSvgIcons, getSvgIcon } from '../nodes/svgIcons';\nimport { FLOW_NODE_TYPES, type FlowNode, type FlowEdge, type FlowLine, type FlowShapeType } from '../types';\nimport { THEME_SYNC_TOKEN, COMMON_COLORS, isThemeToken, themeTokenCssVar, type ThemeColorFieldKind } from '../utils/themeColor';\nimport { DataInspectorSection } from './DataInspectorSection';\nimport { ExpandableTextarea } from './ExpandableTextarea';\n\n/**\n * Standalone panel (legacy). Prefer using InspectorPanelContent inside a FlowPanelGroup.\n */\nexport default function InspectorPanel() {\n const { showInspector } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 240);\n\n if (!showInspector) return null;\n\n return (\n <div className=\"flow-inspector\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 8, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Inspector\n </div>\n <div className=\"flow-inspector-content\">\n <InspectorPanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function InspectorPanelContent() {\n const { currentCanvas, selection, setSelection, setDoc, currentCanvasId } = useFlowContext();\n\n const selectedNodes = useMemo(\n () => currentCanvas.nodes.filter(n => selection.nodeIds.has(n.id)),\n [currentCanvas.nodes, selection.nodeIds],\n );\n const selectedEdges = useMemo(\n () => currentCanvas.edges.filter(e => selection.edgeIds.has(e.id)),\n [currentCanvas.edges, selection.edgeIds],\n );\n const selectedLines = useMemo(\n () => currentCanvas.lines.filter(l => selection.lineIds.has(l.id)),\n [currentCanvas.lines, selection.lineIds],\n );\n\n const hasSelection = selectedNodes.length > 0 || selectedEdges.length > 0 || selectedLines.length > 0;\n const singleIsGroup = selectedNodes.length === 1 && (selectedNodes[0].type === 'flowGroup' || selectedNodes[0].type === 'geometryGroup' || selectedNodes[0].data.isGroup);\n\n const totalSelected = selectedNodes.length + selectedLines.length;\n\n const handleGroup = (type: 'flowGroup' | 'geometryGroup' = 'flowGroup') => {\n if (totalSelected < 2) return;\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of selectedNodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of selectedLines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n const nIds = selection.nodeIds;\n const lIds = selection.lineIds;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n };\n\n const handleUngroup = () => {\n const groupIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const n of selectedNodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) groupIds.add(n.id);\n }\n if (groupIds.size === 0) return;\n for (const n of currentCanvas.nodes) {\n if (n.parentId && groupIds.has(n.parentId)) childNodeIds.add(n.id);\n }\n for (const l of currentCanvas.lines) {\n if (l.parentId && groupIds.has(l.parentId)) childLineIds.add(l.id);\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n };\n\n const changeNodeZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const nodes = canvas.nodes.map(n => {\n if (!ids.has(n.id)) return n;\n const z = n.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...n, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes } } };\n });\n };\n\n const changeLineZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.lineIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.lines.map(l => l.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const lines = canvas.lines.map(l => {\n if (!ids.has(l.id)) return l;\n const z = l.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...l, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, lines } } };\n });\n };\n\n const updateNodeData = (nodeId: string, key: string, value: any) => {\n updateNodeDataBatch(nodeId, { [key]: value });\n };\n\n const updateNodeDataBatch = (nodeId: string, values: Record<string, any>) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, data: { ...n.data, ...values } } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeDimension = (nodeId: string, key: 'width' | 'height', value: number) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, [key]: value } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateEdgeData = (edgeId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, data: { ...e.data, [key]: value } } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeType = (nodeId: string, type: FlowShapeType) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === nodeId ? { ...node, type } : node),\n },\n },\n };\n });\n };\n\n const updateEdgeType = (edgeId: string, type: string) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, type: type as any } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateLineData = (lineId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n lines: canvas.lines.map(l =>\n l.id === lineId ? { ...l, [key]: value } : l,\n ),\n },\n },\n };\n });\n };\n\n return (\n <>\n {!hasSelection && (\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 40%, transparent)', textAlign: 'center', padding: '20px 0' }}>\n Select an element to inspect\n </div>\n )}\n\n {selectedNodes.length === 1 && (\n <NodeInspector\n node={selectedNodes[0]}\n isGroup={singleIsGroup}\n onUpdateData={updateNodeData}\n onUpdateDataBatch={updateNodeDataBatch}\n onUpdateDimension={updateNodeDimension}\n onUpdateType={updateNodeType}\n />\n )}\n {totalSelected > 1 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Selection</div>\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', marginBottom: 8 }}>\n {selectedNodes.length > 0 && `${selectedNodes.length} node${selectedNodes.length > 1 ? 's' : ''}`}\n {selectedNodes.length > 0 && selectedLines.length > 0 && ', '}\n {selectedLines.length > 0 && `${selectedLines.length} line${selectedLines.length > 1 ? 's' : ''}`}\n {' selected'}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, width: '100%' }}>\n <Button size=\"xs\" onClick={() => handleGroup('flowGroup')} block>\n Group (⌘G)\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => handleGroup('geometryGroup')} block>\n Geo Group (⌘⌥G)\n </Button>\n </div>\n </div>\n )}\n {singleIsGroup && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">\n {selectedNodes[0].type === 'geometryGroup' ? 'Geometry Group' : 'Group'}\n </div>\n <div style={{ fontSize: 11, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginBottom: 6 }}>\n {selectedNodes[0].type === 'geometryGroup'\n ? 'Auto-binds spatially contained nodes'\n : 'Explicit membership via add/remove'}\n </div>\n <Button size=\"xs\" variant=\"ghost\" onClick={handleUngroup} block>\n Ungroup (⌘⇧G)\n </Button>\n </div>\n )}\n\n {selectedNodes.length > 0 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('front')}>\n <span title=\"Bring to Front (⌘⇧↑)\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('up')}>\n <span title=\"Bring Forward (⌘↑)\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('down')}>\n <span title=\"Send Backward (⌘↓)\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('back')}>\n <span title=\"Send to Back (⌘⇧↓)\">⤓</span>\n </Button>\n </div>\n </div>\n )}\n\n {selectedEdges.length === 1 && (\n <EdgeInspector\n edge={selectedEdges[0]}\n onUpdateData={updateEdgeData}\n onUpdateType={updateEdgeType}\n />\n )}\n\n {selectedLines.length === 1 && (\n <>\n <LineInspector\n line={selectedLines[0]}\n onUpdateData={updateLineData}\n />\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('front')}>\n <span title=\"Bring to Front\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('up')}>\n <span title=\"Bring Forward\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('down')}>\n <span title=\"Send Backward\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('back')}>\n <span title=\"Send to Back\">⤓</span>\n </Button>\n </div>\n </div>\n </>\n )}\n </>\n );\n}\n\n/**\n * A color field for Flow node/edge styling. Layout (left → right):\n * 1. Theme-sync swatch — follows the active theme (per-field role), the\n * default choice for new shapes.\n * 2. Common colors — 黑白赤橙黄绿青蓝紫粉.\n * 3. Custom picker — arbitrary color from the OS color dialog.\n * (Optional) Transparent — for fill/stroke.\n * Every swatch shows a descriptive tooltip on hover.\n */\nfunction ThemeColorField({\n value,\n onChange,\n kind,\n allowTransparent,\n customFallback = '#ffffff',\n}: {\n value: string | undefined;\n onChange: (value: string) => void;\n kind: ThemeColorFieldKind;\n allowTransparent?: boolean;\n customFallback?: string;\n}) {\n const syncToken = THEME_SYNC_TOKEN[kind];\n const syncCssVar = themeTokenCssVar(syncToken) ?? 'var(--color-base-content)';\n\n const rawValue = value ?? '';\n const lowerValue = rawValue.toLowerCase();\n const valueIsToken = isThemeToken(rawValue);\n const isTransparent = rawValue === 'transparent';\n const isCommon = COMMON_COLORS.some((c) => c.value.toLowerCase() === lowerValue);\n const isSync = rawValue === syncToken;\n const isCustom = !!rawValue && !valueIsToken && !isTransparent && !isCommon;\n const pickerValue = isCustom ? rawValue : customFallback;\n\n return (\n <div className=\"flow-color-field\">\n {/* 1. 主题同步色 */}\n <button\n type=\"button\"\n title=\"跟随主题切换\"\n aria-label=\"跟随主题切换\"\n className={`flow-color-swatch flow-color-swatch--sync${isSync ? ' is-active' : ''}`}\n style={{ background: syncCssVar }}\n onClick={() => onChange(syncToken)}\n />\n\n <span className=\"flow-color-divider\" />\n\n {/* 2. 常用颜色 */}\n {COMMON_COLORS.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n title={c.label}\n aria-label={c.label}\n className={`flow-color-swatch${!valueIsToken && !isTransparent && lowerValue === c.value.toLowerCase() ? ' is-active' : ''}`}\n style={{ background: c.value }}\n onClick={() => onChange(c.value)}\n />\n ))}\n\n <span className=\"flow-color-divider\" />\n\n {/* 3. 自定义取色 */}\n <label\n className={`flow-color-swatch flow-color-swatch--custom${isCustom ? ' is-active' : ''}`}\n title=\"自定义颜色\"\n style={isCustom ? { background: rawValue } : undefined}\n >\n <input\n type=\"color\"\n value={pickerValue}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n\n {/* 可选:透明 */}\n {allowTransparent && (\n <button\n type=\"button\"\n title=\"透明\"\n aria-label=\"透明\"\n className={`flow-color-swatch flow-color-swatch--transparent${isTransparent ? ' is-active' : ''}`}\n onClick={() => onChange('transparent')}\n />\n )}\n </div>\n );\n}\n\nfunction NodeInspector({\n node,\n isGroup,\n onUpdateData,\n onUpdateDataBatch,\n onUpdateDimension,\n onUpdateType,\n}: {\n node: FlowNode;\n isGroup?: boolean;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateDataBatch: (id: string, values: Record<string, any>) => void;\n onUpdateDimension: (id: string, key: 'width' | 'height', value: number) => void;\n onUpdateType: (id: string, type: FlowShapeType) => void;\n}) {\n return (\n <>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Node</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={node.data.label}\n onChange={(e) => onUpdateData(node.id, 'label', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={FLOW_NODE_TYPES.map(type => ({ value: type, label: type }))}\n value={node.type}\n onChange={(value) => onUpdateType(node.id, value as FlowShapeType)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Size</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">W</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.width * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'width', Number(e.target.value) || node.width)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">H</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.height * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'height', Number(e.target.value) || node.height)}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Style</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Fill</Label>\n <ThemeColorField\n value={node.data.fill}\n kind=\"fill\"\n allowTransparent\n customFallback=\"#ffffff\"\n onChange={(v) => onUpdateData(node.id, 'fill', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Stroke</Label>\n <ThemeColorField\n value={node.data.stroke}\n kind=\"stroke\"\n allowTransparent\n customFallback=\"#000000\"\n onChange={(v) => onUpdateData(node.id, 'stroke', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.fontSize)}\n onChange={(e) => onUpdateData(node.id, 'fontSize', Number(e.target.value) || 14)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'color', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font Color</Label>\n <ThemeColorField\n value={node.data.labelColor ?? node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'labelColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Border</Label>\n <Select\n options={[{ value: 'none', label: 'none' }, ...BORDER_STYLE_OPTIONS.map(s => ({ value: s, label: s }))]}\n value={node.data.borderStyle ?? (isGroup ? (node.type === 'geometryGroup' ? 'dashed' : 'dotted') : 'solid')}\n onChange={(v) => onUpdateData(node.id, 'borderStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n {node.type === 'shapeSvg' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <Select\n options={getAllSvgIcons().map(icon => ({ value: icon.id, label: icon.label }))}\n value={node.data.svgId ?? ''}\n placeholder=\"选择图标\"\n onChange={(value) => {\n const icon = getSvgIcon(String(value));\n onUpdateDataBatch(node.id, {\n svgId: value,\n ...(icon?.brandColor ? { color: icon.brandColor } : {}),\n ...(!node.data.label || node.data.label === 'Text' ? { label: icon?.label ?? String(value) } : {}),\n });\n }}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Box</Label>\n <Checkbox\n size=\"sm\"\n checked={node.data.iconBox ?? false}\n onChange={(v) => onUpdateData(node.id, 'iconBox', v)}\n label=\"显示边框\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Select\n options={[\n { value: 'top', label: 'top' },\n { value: 'middle', label: 'middle' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={node.data.labelPlacement === ('above' as any)\n ? 'top'\n : node.data.labelPlacement === ('center' as any)\n ? 'middle'\n : node.data.labelPlacement === ('below' as any)\n ? 'bottom'\n : (node.data.labelPlacement ?? 'bottom')}\n onChange={(v) => onUpdateData(node.id, 'labelPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetX', Number(event.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetY', Number(event.target.value) || 0)}\n />\n </div>\n </>\n )}\n\n </div>\n {node.type === 'mediaNode' && (\n <MediaInspectorSection node={node} onUpdateData={onUpdateData} />\n )}\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Transform</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Rotate</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.rotation ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'rotation', Number(e.target.value) || 0)}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>°</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Flip</Label>\n <Button\n size=\"xs\"\n variant={node.data.flipX ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipX', !node.data.flipX)}\n square\n >\n <span title=\"Flip Horizontal\">↔</span>\n </Button>\n <Button\n size=\"xs\"\n variant={node.data.flipY ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipY', !node.data.flipY)}\n square\n >\n <span title=\"Flip Vertical\">↕</span>\n </Button>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Quick</Label>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) + 90) % 360)}>\n +90°\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) - 90 + 360) % 360)}>\n −90°\n </Button>\n </div>\n </div>\n </>\n );\n}\n\nfunction MediaInspectorSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const kind = node.data.mediaKind ?? 'markdown';\n const ai = node.data.aiConfig;\n const modelFileInputRef = useRef<HTMLInputElement>(null);\n\n const updateAI = (key: string, value: any) => {\n onUpdateData(node.id, 'aiConfig', {\n gateway: '', protocol: 'openai', model: '',\n ...ai,\n [key]: value,\n });\n };\n\n const contentLabels: Record<string, string> = {\n markdown: 'Markdown 源码',\n html: 'HTML 源码',\n mermaid: 'Mermaid 图表',\n math: 'LaTeX 公式',\n };\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Media · {kind}</div>\n {kind === 'data' ? (\n <DataInspectorSection node={node} onUpdateData={onUpdateData} />\n ) : kind === 'model3d' ? (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">格式</Label>\n <Select\n options={[\n { value: 'stl', label: 'STL' },\n { value: 'obj', label: 'OBJ' },\n { value: '3mf', label: '3MF' },\n ]}\n value={node.data.modelFormat ?? 'stl'}\n onChange={value => onUpdateData(node.id, 'modelFormat', value)}\n />\n </div>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/model.stl\"\n onChange={event => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">本地模型</Label>\n <input\n ref={modelFileInputRef}\n type=\"file\"\n accept=\".stl,.obj,.3mf,model/stl,model/obj,model/3mf,application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"\n hidden\n onChange={event => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (!file) return;\n if (file.size > 10 * 1024 * 1024) {\n window.alert('本地模型不能超过 10 MiB,请改用模型链接。');\n return;\n }\n const extension = file.name.split('.').pop()?.toLowerCase();\n if (extension !== 'stl' && extension !== 'obj' && extension !== '3mf') {\n window.alert('仅支持 STL、OBJ 和 3MF 模型。');\n return;\n }\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n onUpdateData(node.id, 'modelFormat', extension);\n onUpdateData(node.id, 'mediaContent', reader.result);\n };\n reader.onerror = () => window.alert('读取本地模型失败。');\n reader.readAsDataURL(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => modelFileInputRef.current?.click()}>\n 选择文件\n </Button>\n {node.data.mediaContent?.startsWith('data:') && (\n <span className=\"flow-inspector-file-status\">已嵌入</span>\n )}\n </div>\n <div className=\"flow-inspector-help\">支持 STL、OBJ、3MF;本地文件将以 Base64 嵌入文档,最大 10 MiB。选中节点后可在内部拖拽旋转、滚轮缩放。</div>\n </>\n ) : kind === 'image' ? (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">图片链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/image.png\"\n onChange={(event) => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-help\">支持 HTTP(S) 链接;选中图片节点后可直接粘贴图片并保存为 Base64。</div>\n </>\n ) : kind !== 'ai' ? (\n <ExpandableTextarea\n label={contentLabels[kind] ?? '内容'}\n value={node.data.mediaContent ?? ''}\n onChange={(value) => onUpdateData(node.id, 'mediaContent', value)}\n rows={8}\n />\n ) : (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={[\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic 兼容' },\n ]}\n value={ai?.protocol ?? 'openai'}\n onChange={(v) => updateAI('protocol', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={ai?.gateway ?? ''}\n placeholder=\"https://api.openai.com/v1/chat/completions\"\n onChange={(e) => updateAI('gateway', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={ai?.model ?? ''}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateAI('model', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={ai?.apiKey ?? ''}\n placeholder=\"sk-...\"\n onChange={(e) => updateAI('apiKey', e.target.value)}\n />\n </div>\n <ExpandableTextarea\n label=\"System Prompt\"\n value={ai?.systemPrompt ?? ''}\n onChange={(value) => updateAI('systemPrompt', value)}\n rows={3}\n />\n <div style={{ fontSize: 10, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginTop: 4 }}>\n 密钥会随文档 JSON 一同导出,请谨慎分享。\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction EdgeInspector({\n edge,\n onUpdateData,\n onUpdateType,\n}: {\n edge: FlowEdge;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateType: (id: string, type: string) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Edge</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={EDGE_TYPE_OPTIONS.map(t => ({ value: t, label: t }))}\n value={edge.type}\n onChange={(v) => onUpdateType(edge.id, v as string)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={edge.data.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(edge.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(edge.data.strokeWidth ?? 2)}\n onChange={(e) => onUpdateData(edge.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Animation</Label>\n <Checkbox\n size=\"sm\"\n checked={edge.data.animated ?? false}\n onChange={(value) => onUpdateData(edge.id, 'animated', value)}\n label=\"预览时播放\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Line</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={edge.data.lineStyle ?? 'solid'}\n onChange={(v) => onUpdateData(edge.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Start</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerStart ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerStart', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">End</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerEnd ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerEnd', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={edge.data.labelText ?? ''}\n onChange={(e) => onUpdateData(edge.id, 'labelText', e.target.value)}\n placeholder=\"Edge label\"\n />\n </div>\n </div>\n );\n}\n\nfunction LineInspector({\n line,\n onUpdateData,\n}: {\n line: FlowLine;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Line</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <span style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)' }}>{line.type}</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={line.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(line.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(line.strokeWidth)}\n onChange={(e) => onUpdateData(line.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Style</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={line.lineStyle}\n onChange={(v) => onUpdateData(line.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import z from "../../../Tree/Tree.js";
|
|
2
2
|
import { useFlowContext as L } from "../context/FlowContext.js";
|
|
3
|
-
import { useFlowUI as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
import { useFlowUI as k } from "../context/FlowUIContext.js";
|
|
4
|
+
import { resolveThemeColor as $ } from "../utils/themeColor.js";
|
|
5
|
+
import { buildSvgMarkup as O } from "../nodes/svgIcons.js";
|
|
6
|
+
import { useDraggablePanel as K } from "../hooks/useDraggablePanel.js";
|
|
7
|
+
import { useResizablePanel as P } from "../hooks/useResizablePanel.js";
|
|
8
|
+
import { PaletteThumbnail as E } from "./ShapePalette.js";
|
|
9
|
+
import { useCallback as T, useEffect as G, useMemo as M, useRef as R } from "react";
|
|
10
|
+
import { jsx as u, jsxs as A } from "react/jsx-runtime";
|
|
11
|
+
var D = "⧉";
|
|
12
|
+
function W({ node: n }) {
|
|
12
13
|
if (n.data.childCanvasId) return /* @__PURE__ */ u("span", {
|
|
13
14
|
style: { fontSize: 15 },
|
|
14
|
-
children:
|
|
15
|
+
children: D
|
|
15
16
|
});
|
|
16
17
|
if (n.type === "shapeSvg" && n.data.svgId) {
|
|
17
|
-
const h =
|
|
18
|
+
const h = O(n.data.svgId, $(n.data.color, "#475569") || "#475569");
|
|
18
19
|
return h ? /* @__PURE__ */ u("img", {
|
|
19
20
|
src: `data:image/svg+xml;utf8,${encodeURIComponent(h)}`,
|
|
20
21
|
width: 24,
|
|
@@ -34,7 +35,7 @@ function D({ node: n }) {
|
|
|
34
35
|
fontWeight: 700
|
|
35
36
|
},
|
|
36
37
|
children: n.data.mediaKind === "markdown" ? "M↓" : n.data.mediaKind === "html" ? "</>" : n.data.mediaKind === "mermaid" ? "⎇" : n.data.mediaKind === "math" ? "√x" : n.data.mediaKind === "image" ? "IMG" : n.data.mediaKind === "model3d" ? "3D" : n.data.mediaKind === "data" ? "⊞" : "AI"
|
|
37
|
-
}) : /* @__PURE__ */ u(
|
|
38
|
+
}) : /* @__PURE__ */ u(E, { type: n.type });
|
|
38
39
|
}
|
|
39
40
|
function _(n, h, s) {
|
|
40
41
|
const g = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Set(), b = /* @__PURE__ */ new Set();
|
|
@@ -65,7 +66,7 @@ function _(n, h, s) {
|
|
|
65
66
|
label: `${e.type} line`,
|
|
66
67
|
icon: "〰"
|
|
67
68
|
}), x = (e) => {
|
|
68
|
-
const c = !!e.data.childCanvasId, r = /* @__PURE__ */ u(
|
|
69
|
+
const c = !!e.data.childCanvasId, r = /* @__PURE__ */ u(W, { node: e }), i = g.get(e.id), l = f.get(e.id), t = {
|
|
69
70
|
id: e.id,
|
|
70
71
|
label: e.data.label || e.type,
|
|
71
72
|
icon: r,
|
|
@@ -74,7 +75,7 @@ function _(n, h, s) {
|
|
|
74
75
|
if (i && i.length > 0 && o.push(...i.map(x)), l && l.length > 0 && o.push(...l.map(C)), c) {
|
|
75
76
|
const d = s.canvases[e.data.childCanvasId];
|
|
76
77
|
if (d) {
|
|
77
|
-
const a =
|
|
78
|
+
const a = X(d, s, e.data.childCanvasId);
|
|
78
79
|
a.length > 0 && o.push(...a);
|
|
79
80
|
}
|
|
80
81
|
}
|
|
@@ -85,16 +86,16 @@ function _(n, h, s) {
|
|
|
85
86
|
assignedLineIds: b
|
|
86
87
|
};
|
|
87
88
|
}
|
|
88
|
-
function
|
|
89
|
+
function X(n, h, s) {
|
|
89
90
|
return n.nodes.length === 0 && n.edges.length === 0 && n.lines.length === 0 ? [{
|
|
90
91
|
id: `_empty_${s}`,
|
|
91
92
|
label: "(empty sub-canvas)",
|
|
92
93
|
icon: "○"
|
|
93
94
|
}] : _(n.nodes, n.lines, h).nodeTree;
|
|
94
95
|
}
|
|
95
|
-
function
|
|
96
|
-
const { showOutline: n } =
|
|
97
|
-
return n ? /* @__PURE__ */
|
|
96
|
+
function te() {
|
|
97
|
+
const { showOutline: n } = k(), { panelStyle: h, handleProps: s } = K(), { panelWidth: g, resizeHandleProps: f } = P("left", 180);
|
|
98
|
+
return n ? /* @__PURE__ */ A("div", {
|
|
98
99
|
className: "flow-palette",
|
|
99
100
|
"data-flow-panel": !0,
|
|
100
101
|
style: {
|
|
@@ -126,13 +127,13 @@ function Z() {
|
|
|
126
127
|
}),
|
|
127
128
|
/* @__PURE__ */ u("div", {
|
|
128
129
|
className: "flow-palette-content",
|
|
129
|
-
children: /* @__PURE__ */ u(
|
|
130
|
+
children: /* @__PURE__ */ u(Y, {})
|
|
130
131
|
})
|
|
131
132
|
]
|
|
132
133
|
}) : null;
|
|
133
134
|
}
|
|
134
|
-
function
|
|
135
|
-
const { focusOnRect: n } =
|
|
135
|
+
function Y() {
|
|
136
|
+
const { focusOnRect: n } = k(), { doc: h, currentCanvas: s, currentCanvasId: g, selection: f, setSelection: y, pushCanvas: b } = L(), v = M(() => {
|
|
136
137
|
const { nodeTree: r, assignedLineIds: i } = _(s.nodes, s.lines, h), l = s.edges.map((a) => {
|
|
137
138
|
const p = s.nodes.find((N) => N.id === a.source), I = s.nodes.find((N) => N.id === a.target), w = p?.data.label || a.source, S = I?.data.label || a.target;
|
|
138
139
|
return {
|
|
@@ -185,7 +186,7 @@ function X() {
|
|
|
185
186
|
s.nodes,
|
|
186
187
|
s.lines,
|
|
187
188
|
m
|
|
188
|
-
]), x =
|
|
189
|
+
]), x = T((r) => {
|
|
189
190
|
const i = String(r.id);
|
|
190
191
|
if (i.startsWith("_")) return;
|
|
191
192
|
const l = s.nodes.find((d) => d.id === i), t = s.edges.find((d) => d.id === i), o = s.lines.find((d) => d.id === i);
|
|
@@ -210,13 +211,13 @@ function X() {
|
|
|
210
211
|
s,
|
|
211
212
|
y,
|
|
212
213
|
n
|
|
213
|
-
]), e =
|
|
214
|
+
]), e = T((r) => {
|
|
214
215
|
const i = String(r.id);
|
|
215
216
|
if (i.startsWith("_")) return;
|
|
216
217
|
const l = s.nodes.find((t) => t.id === i);
|
|
217
218
|
l?.data.childCanvasId && b(l.data.childCanvasId);
|
|
218
|
-
}, [s.nodes, b]), c =
|
|
219
|
-
return
|
|
219
|
+
}, [s.nodes, b]), c = R(null);
|
|
220
|
+
return G(() => {
|
|
220
221
|
if (!m || !c.current) return;
|
|
221
222
|
const r = setTimeout(() => {
|
|
222
223
|
const i = c.current?.querySelector(`[data-node-id="${m}"]`);
|
|
@@ -243,8 +244,8 @@ function X() {
|
|
|
243
244
|
});
|
|
244
245
|
}
|
|
245
246
|
export {
|
|
246
|
-
|
|
247
|
-
|
|
247
|
+
Y as OutlinePanelContent,
|
|
248
|
+
te as default
|
|
248
249
|
};
|
|
249
250
|
|
|
250
251
|
//# sourceMappingURL=OutlinePanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutlinePanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/OutlinePanel.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useRef, useEffect } from 'react';\nimport { Tree, type TreeNode } from '../../../Tree';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PaletteThumbnail } from './ShapePalette';\nimport { buildSvgMarkup } from '../nodes/svgIcons';\nimport type { FlowNode, FlowLine, FlowDocument, FlowCanvasData } from '../types';\n\nconst SUB_CANVAS_ICON = '⧉';\n\nfunction OutlineNodeIcon({ node }: { node: FlowNode }) {\n if (node.data.childCanvasId) return <span style={{ fontSize: 15 }}>{SUB_CANVAS_ICON}</span>;\n if (node.type === 'shapeSvg' && node.data.svgId) {\n const markup = buildSvgMarkup(node.data.svgId, node.data.color || '#475569');\n return markup ? (\n <img\n src={`data:image/svg+xml;utf8,${encodeURIComponent(markup)}`}\n width={24}\n height={20}\n alt=\"\"\n style={{ display: 'block', objectFit: 'contain' }}\n />\n ) : null;\n }\n if (node.type === 'mediaNode') {\n const text = node.data.mediaKind === 'markdown' ? 'M↓'\n : node.data.mediaKind === 'html' ? '</>'\n : node.data.mediaKind === 'mermaid' ? '⎇'\n : node.data.mediaKind === 'math' ? '√x'\n : node.data.mediaKind === 'image' ? 'IMG'\n : node.data.mediaKind === 'model3d' ? '3D'\n : node.data.mediaKind === 'data' ? '⊞'\n : 'AI';\n return <span style={{ width: 24, textAlign: 'center', fontSize: 10, fontWeight: 700 }}>{text}</span>;\n }\n return <PaletteThumbnail type={node.type} />;\n}\n\nfunction buildNodeTree(nodes: FlowNode[], lines: FlowLine[], doc: FlowDocument): { nodeTree: TreeNode[]; assignedLineIds: Set<string> } {\n const childNodesOf = new Map<string, FlowNode[]>();\n const childLinesOf = new Map<string, FlowLine[]>();\n const assignedNodes = new Set<string>();\n const assignedLineIds = new Set<string>();\n\n for (const n of nodes) {\n if (n.parentId) {\n const list = childNodesOf.get(n.parentId) ?? [];\n list.push(n);\n childNodesOf.set(n.parentId, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (l.parentId) {\n const list = childLinesOf.get(l.parentId) ?? [];\n list.push(l);\n childLinesOf.set(l.parentId, list);\n assignedLineIds.add(l.id);\n }\n }\n\n // Spatial containment only for geometryGroup\n const geoGroups = nodes.filter(n => n.type === 'geometryGroup');\n for (const g of geoGroups) {\n const gx = g.position.x, gy = g.position.y;\n const gw = g.width, gh = g.height;\n for (const n of nodes) {\n if (n.id === g.id || assignedNodes.has(n.id)) continue;\n if (n.position.x >= gx && n.position.y >= gy\n && n.position.x + n.width <= gx + gw\n && n.position.y + n.height <= gy + gh) {\n const list = childNodesOf.get(g.id) ?? [];\n list.push(n);\n childNodesOf.set(g.id, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (assignedLineIds.has(l.id)) continue;\n if (l.points.length > 0 && l.points.every(p =>\n p.x >= gx && p.x <= gx + gw && p.y >= gy && p.y <= gy + gh\n )) {\n const list = childLinesOf.get(g.id) ?? [];\n list.push(l);\n childLinesOf.set(g.id, list);\n assignedLineIds.add(l.id);\n }\n }\n }\n\n const roots = nodes.filter(n => !assignedNodes.has(n.id));\n\n const lineToTree = (l: FlowLine): TreeNode => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n });\n\n const toTreeNode = (n: FlowNode): TreeNode => {\n const hasSubCanvas = !!n.data.childCanvasId;\n const icon = <OutlineNodeIcon node={n} />;\n const kidNodes = childNodesOf.get(n.id);\n const kidLines = childLinesOf.get(n.id);\n const item: TreeNode = {\n id: n.id,\n label: n.data.label || n.type,\n icon,\n meta: hasSubCanvas ? { childCanvasId: n.data.childCanvasId } : undefined,\n };\n\n const children: TreeNode[] = [];\n if (kidNodes && kidNodes.length > 0) {\n children.push(...kidNodes.map(toTreeNode));\n }\n if (kidLines && kidLines.length > 0) {\n children.push(...kidLines.map(lineToTree));\n }\n if (hasSubCanvas) {\n const subCanvas = doc.canvases[n.data.childCanvasId!];\n if (subCanvas) {\n const subTree = buildCanvasSubtree(subCanvas, doc, n.data.childCanvasId!);\n if (subTree.length > 0) {\n children.push(...subTree);\n }\n }\n }\n if (children.length > 0) {\n item.children = children;\n }\n return item;\n };\n\n return { nodeTree: roots.map(toTreeNode), assignedLineIds };\n}\n\nfunction buildCanvasSubtree(canvas: FlowCanvasData, doc: FlowDocument, canvasId: string): TreeNode[] {\n if (canvas.nodes.length === 0 && canvas.edges.length === 0 && canvas.lines.length === 0) {\n return [{ id: `_empty_${canvasId}`, label: '(empty sub-canvas)', icon: '○' }];\n }\n return buildNodeTree(canvas.nodes, canvas.lines, doc).nodeTree;\n}\n\n/**\n * Standalone panel (legacy). Prefer using OutlinePanelContent inside a FlowPanelGroup.\n */\nexport default function OutlinePanel() {\n const { showOutline } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 180);\n\n if (!showOutline) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...(panelStyle ?? { top: 56, left: 'auto', right: 248 + 16 }), width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Outline\n </div>\n <div className=\"flow-palette-content\">\n <OutlinePanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function OutlinePanelContent() {\n const { focusOnRect } = useFlowUI();\n const { doc, currentCanvas, currentCanvasId, selection, setSelection, pushCanvas } = useFlowContext();\n\n const treeData = useMemo<TreeNode[]>(() => {\n const { nodeTree, assignedLineIds } = buildNodeTree(currentCanvas.nodes, currentCanvas.lines, doc);\n const edgeItems: TreeNode[] = currentCanvas.edges.map(e => {\n const sn = currentCanvas.nodes.find(n => n.id === e.source);\n const tn = currentCanvas.nodes.find(n => n.id === e.target);\n const srcLabel = sn?.data.label || e.source;\n const tgtLabel = tn?.data.label || e.target;\n return { id: e.id, label: `${srcLabel} → ${tgtLabel}`, icon: '→' };\n });\n const unassignedLines = currentCanvas.lines.filter(l => !assignedLineIds.has(l.id));\n const lineItems: TreeNode[] = unassignedLines.map(l => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n }));\n\n const tree: TreeNode[] = [];\n if (nodeTree.length > 0) tree.push({ id: '_nodes', label: `Nodes (${currentCanvas.nodes.length})`, children: nodeTree });\n if (edgeItems.length > 0) tree.push({ id: '_edges', label: `Edges (${edgeItems.length})`, children: edgeItems });\n if (lineItems.length > 0) tree.push({ id: '_lines', label: `Lines (${unassignedLines.length})`, children: lineItems });\n return tree;\n }, [currentCanvas, doc]);\n\n const activeId = useMemo(() => {\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return undefined;\n }, [selection]);\n\n const defaultExpanded = useMemo(() => {\n const ids: (string | number)[] = ['_nodes', '_edges', '_lines'];\n for (const n of currentCanvas.nodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) ids.push(n.id);\n if (n.data.childCanvasId) ids.push(n.id);\n }\n if (activeId) {\n const node = currentCanvas.nodes.find(n => n.id === activeId);\n if (node?.parentId) {\n let pid: string | undefined = node.parentId;\n while (pid) {\n ids.push(pid);\n const parent = currentCanvas.nodes.find(n => n.id === pid);\n pid = parent?.parentId;\n }\n }\n const line = currentCanvas.lines.find(l => l.id === activeId);\n if (line?.parentId) ids.push(line.parentId);\n }\n return ids;\n }, [currentCanvas.nodes, currentCanvas.lines, activeId]);\n\n const handleNodeClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n const flowEdge = currentCanvas.edges.find(e => e.id === id);\n const flowLine = currentCanvas.lines.find(l => l.id === id);\n\n setSelection({\n nodeIds: flowNode ? new Set([id]) : new Set(),\n edgeIds: flowEdge ? new Set([id]) : new Set(),\n lineIds: flowLine ? new Set([id]) : new Set(),\n });\n\n if (flowNode) {\n focusOnRect(flowNode.position.x, flowNode.position.y, flowNode.width, flowNode.height);\n } else if (flowEdge) {\n const sn = currentCanvas.nodes.find(n => n.id === flowEdge.source);\n const tn = currentCanvas.nodes.find(n => n.id === flowEdge.target);\n if (sn && tn) {\n const minX = Math.min(sn.position.x, tn.position.x);\n const minY = Math.min(sn.position.y, tn.position.y);\n const maxX = Math.max(sn.position.x + sn.width, tn.position.x + tn.width);\n const maxY = Math.max(sn.position.y + sn.height, tn.position.y + tn.height);\n focusOnRect(minX, minY, maxX - minX, maxY - minY);\n }\n } else if (flowLine && flowLine.points.length > 0) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of flowLine.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n focusOnRect(minX - 20, minY - 20, maxX - minX + 40, maxY - minY + 40);\n }\n }, [currentCanvas, setSelection, focusOnRect]);\n\n const handleNodeDoubleClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n if (flowNode?.data.childCanvasId) {\n pushCanvas(flowNode.data.childCanvasId);\n }\n }, [currentCanvas.nodes, pushCanvas]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!activeId || !containerRef.current) return;\n const timer = setTimeout(() => {\n const el = containerRef.current?.querySelector(`[data-node-id=\"${activeId}\"]`);\n if (el) el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, 60);\n return () => clearTimeout(timer);\n }, [activeId]);\n\n return (\n <div ref={containerRef}>\n <Tree\n data={treeData}\n onNodeClick={handleNodeClick}\n onNodeDoubleClick={handleNodeDoubleClick}\n activeNodeId={activeId}\n defaultExpandedIds={defaultExpanded}\n showSearch={false}\n showExpandAll={false}\n showIcon\n showLine\n indent={16}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OutlinePanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/OutlinePanel.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useRef, useEffect } from 'react';\nimport { Tree, type TreeNode } from '../../../Tree';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PaletteThumbnail } from './ShapePalette';\nimport { buildSvgMarkup } from '../nodes/svgIcons';\nimport { resolveThemeColor } from '../utils/themeColor';\nimport type { FlowNode, FlowLine, FlowDocument, FlowCanvasData } from '../types';\n\nconst SUB_CANVAS_ICON = '⧉';\n\nfunction OutlineNodeIcon({ node }: { node: FlowNode }) {\n if (node.data.childCanvasId) return <span style={{ fontSize: 15 }}>{SUB_CANVAS_ICON}</span>;\n if (node.type === 'shapeSvg' && node.data.svgId) {\n const markup = buildSvgMarkup(node.data.svgId, resolveThemeColor(node.data.color, '#475569') || '#475569');\n return markup ? (\n <img\n src={`data:image/svg+xml;utf8,${encodeURIComponent(markup)}`}\n width={24}\n height={20}\n alt=\"\"\n style={{ display: 'block', objectFit: 'contain' }}\n />\n ) : null;\n }\n if (node.type === 'mediaNode') {\n const text = node.data.mediaKind === 'markdown' ? 'M↓'\n : node.data.mediaKind === 'html' ? '</>'\n : node.data.mediaKind === 'mermaid' ? '⎇'\n : node.data.mediaKind === 'math' ? '√x'\n : node.data.mediaKind === 'image' ? 'IMG'\n : node.data.mediaKind === 'model3d' ? '3D'\n : node.data.mediaKind === 'data' ? '⊞'\n : 'AI';\n return <span style={{ width: 24, textAlign: 'center', fontSize: 10, fontWeight: 700 }}>{text}</span>;\n }\n return <PaletteThumbnail type={node.type} />;\n}\n\nfunction buildNodeTree(nodes: FlowNode[], lines: FlowLine[], doc: FlowDocument): { nodeTree: TreeNode[]; assignedLineIds: Set<string> } {\n const childNodesOf = new Map<string, FlowNode[]>();\n const childLinesOf = new Map<string, FlowLine[]>();\n const assignedNodes = new Set<string>();\n const assignedLineIds = new Set<string>();\n\n for (const n of nodes) {\n if (n.parentId) {\n const list = childNodesOf.get(n.parentId) ?? [];\n list.push(n);\n childNodesOf.set(n.parentId, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (l.parentId) {\n const list = childLinesOf.get(l.parentId) ?? [];\n list.push(l);\n childLinesOf.set(l.parentId, list);\n assignedLineIds.add(l.id);\n }\n }\n\n // Spatial containment only for geometryGroup\n const geoGroups = nodes.filter(n => n.type === 'geometryGroup');\n for (const g of geoGroups) {\n const gx = g.position.x, gy = g.position.y;\n const gw = g.width, gh = g.height;\n for (const n of nodes) {\n if (n.id === g.id || assignedNodes.has(n.id)) continue;\n if (n.position.x >= gx && n.position.y >= gy\n && n.position.x + n.width <= gx + gw\n && n.position.y + n.height <= gy + gh) {\n const list = childNodesOf.get(g.id) ?? [];\n list.push(n);\n childNodesOf.set(g.id, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (assignedLineIds.has(l.id)) continue;\n if (l.points.length > 0 && l.points.every(p =>\n p.x >= gx && p.x <= gx + gw && p.y >= gy && p.y <= gy + gh\n )) {\n const list = childLinesOf.get(g.id) ?? [];\n list.push(l);\n childLinesOf.set(g.id, list);\n assignedLineIds.add(l.id);\n }\n }\n }\n\n const roots = nodes.filter(n => !assignedNodes.has(n.id));\n\n const lineToTree = (l: FlowLine): TreeNode => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n });\n\n const toTreeNode = (n: FlowNode): TreeNode => {\n const hasSubCanvas = !!n.data.childCanvasId;\n const icon = <OutlineNodeIcon node={n} />;\n const kidNodes = childNodesOf.get(n.id);\n const kidLines = childLinesOf.get(n.id);\n const item: TreeNode = {\n id: n.id,\n label: n.data.label || n.type,\n icon,\n meta: hasSubCanvas ? { childCanvasId: n.data.childCanvasId } : undefined,\n };\n\n const children: TreeNode[] = [];\n if (kidNodes && kidNodes.length > 0) {\n children.push(...kidNodes.map(toTreeNode));\n }\n if (kidLines && kidLines.length > 0) {\n children.push(...kidLines.map(lineToTree));\n }\n if (hasSubCanvas) {\n const subCanvas = doc.canvases[n.data.childCanvasId!];\n if (subCanvas) {\n const subTree = buildCanvasSubtree(subCanvas, doc, n.data.childCanvasId!);\n if (subTree.length > 0) {\n children.push(...subTree);\n }\n }\n }\n if (children.length > 0) {\n item.children = children;\n }\n return item;\n };\n\n return { nodeTree: roots.map(toTreeNode), assignedLineIds };\n}\n\nfunction buildCanvasSubtree(canvas: FlowCanvasData, doc: FlowDocument, canvasId: string): TreeNode[] {\n if (canvas.nodes.length === 0 && canvas.edges.length === 0 && canvas.lines.length === 0) {\n return [{ id: `_empty_${canvasId}`, label: '(empty sub-canvas)', icon: '○' }];\n }\n return buildNodeTree(canvas.nodes, canvas.lines, doc).nodeTree;\n}\n\n/**\n * Standalone panel (legacy). Prefer using OutlinePanelContent inside a FlowPanelGroup.\n */\nexport default function OutlinePanel() {\n const { showOutline } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 180);\n\n if (!showOutline) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...(panelStyle ?? { top: 56, left: 'auto', right: 248 + 16 }), width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Outline\n </div>\n <div className=\"flow-palette-content\">\n <OutlinePanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function OutlinePanelContent() {\n const { focusOnRect } = useFlowUI();\n const { doc, currentCanvas, currentCanvasId, selection, setSelection, pushCanvas } = useFlowContext();\n\n const treeData = useMemo<TreeNode[]>(() => {\n const { nodeTree, assignedLineIds } = buildNodeTree(currentCanvas.nodes, currentCanvas.lines, doc);\n const edgeItems: TreeNode[] = currentCanvas.edges.map(e => {\n const sn = currentCanvas.nodes.find(n => n.id === e.source);\n const tn = currentCanvas.nodes.find(n => n.id === e.target);\n const srcLabel = sn?.data.label || e.source;\n const tgtLabel = tn?.data.label || e.target;\n return { id: e.id, label: `${srcLabel} → ${tgtLabel}`, icon: '→' };\n });\n const unassignedLines = currentCanvas.lines.filter(l => !assignedLineIds.has(l.id));\n const lineItems: TreeNode[] = unassignedLines.map(l => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n }));\n\n const tree: TreeNode[] = [];\n if (nodeTree.length > 0) tree.push({ id: '_nodes', label: `Nodes (${currentCanvas.nodes.length})`, children: nodeTree });\n if (edgeItems.length > 0) tree.push({ id: '_edges', label: `Edges (${edgeItems.length})`, children: edgeItems });\n if (lineItems.length > 0) tree.push({ id: '_lines', label: `Lines (${unassignedLines.length})`, children: lineItems });\n return tree;\n }, [currentCanvas, doc]);\n\n const activeId = useMemo(() => {\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return undefined;\n }, [selection]);\n\n const defaultExpanded = useMemo(() => {\n const ids: (string | number)[] = ['_nodes', '_edges', '_lines'];\n for (const n of currentCanvas.nodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) ids.push(n.id);\n if (n.data.childCanvasId) ids.push(n.id);\n }\n if (activeId) {\n const node = currentCanvas.nodes.find(n => n.id === activeId);\n if (node?.parentId) {\n let pid: string | undefined = node.parentId;\n while (pid) {\n ids.push(pid);\n const parent = currentCanvas.nodes.find(n => n.id === pid);\n pid = parent?.parentId;\n }\n }\n const line = currentCanvas.lines.find(l => l.id === activeId);\n if (line?.parentId) ids.push(line.parentId);\n }\n return ids;\n }, [currentCanvas.nodes, currentCanvas.lines, activeId]);\n\n const handleNodeClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n const flowEdge = currentCanvas.edges.find(e => e.id === id);\n const flowLine = currentCanvas.lines.find(l => l.id === id);\n\n setSelection({\n nodeIds: flowNode ? new Set([id]) : new Set(),\n edgeIds: flowEdge ? new Set([id]) : new Set(),\n lineIds: flowLine ? new Set([id]) : new Set(),\n });\n\n if (flowNode) {\n focusOnRect(flowNode.position.x, flowNode.position.y, flowNode.width, flowNode.height);\n } else if (flowEdge) {\n const sn = currentCanvas.nodes.find(n => n.id === flowEdge.source);\n const tn = currentCanvas.nodes.find(n => n.id === flowEdge.target);\n if (sn && tn) {\n const minX = Math.min(sn.position.x, tn.position.x);\n const minY = Math.min(sn.position.y, tn.position.y);\n const maxX = Math.max(sn.position.x + sn.width, tn.position.x + tn.width);\n const maxY = Math.max(sn.position.y + sn.height, tn.position.y + tn.height);\n focusOnRect(minX, minY, maxX - minX, maxY - minY);\n }\n } else if (flowLine && flowLine.points.length > 0) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of flowLine.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n focusOnRect(minX - 20, minY - 20, maxX - minX + 40, maxY - minY + 40);\n }\n }, [currentCanvas, setSelection, focusOnRect]);\n\n const handleNodeDoubleClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n if (flowNode?.data.childCanvasId) {\n pushCanvas(flowNode.data.childCanvasId);\n }\n }, [currentCanvas.nodes, pushCanvas]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!activeId || !containerRef.current) return;\n const timer = setTimeout(() => {\n const el = containerRef.current?.querySelector(`[data-node-id=\"${activeId}\"]`);\n if (el) el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, 60);\n return () => clearTimeout(timer);\n }, [activeId]);\n\n return (\n <div ref={containerRef}>\n <Tree\n data={treeData}\n onNodeClick={handleNodeClick}\n onNodeDoubleClick={handleNodeDoubleClick}\n activeNodeId={activeId}\n defaultExpandedIds={defaultExpanded}\n showSearch={false}\n showExpandAll={false}\n showIcon\n showLine\n indent={16}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|