dishui 0.0.49 → 0.0.50

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.
Files changed (52) hide show
  1. package/dist/components/pro/Flow/Flow.js +419 -407
  2. package/dist/components/pro/Flow/Flow.js.map +1 -1
  3. package/dist/components/pro/Flow/archify/build.d.ts +74 -0
  4. package/dist/components/pro/Flow/archify/build.js +103 -0
  5. package/dist/components/pro/Flow/archify/build.js.map +1 -0
  6. package/dist/components/pro/Flow/archify/convert.d.ts +14 -0
  7. package/dist/components/pro/Flow/archify/convert.js +534 -0
  8. package/dist/components/pro/Flow/archify/convert.js.map +1 -0
  9. package/dist/components/pro/Flow/archify/index.d.ts +12 -0
  10. package/dist/components/pro/Flow/archify/palette.d.ts +64 -0
  11. package/dist/components/pro/Flow/archify/palette.js +112 -0
  12. package/dist/components/pro/Flow/archify/palette.js.map +1 -0
  13. package/dist/components/pro/Flow/archify/presets.d.ts +26 -0
  14. package/dist/components/pro/Flow/archify/presets.js +43 -0
  15. package/dist/components/pro/Flow/archify/presets.js.map +1 -0
  16. package/dist/components/pro/Flow/archify/spec.d.ts +283 -0
  17. package/dist/components/pro/Flow/archify/spec.js +10 -0
  18. package/dist/components/pro/Flow/archify/spec.js.map +1 -0
  19. package/dist/components/pro/Flow/constants.js +14 -0
  20. package/dist/components/pro/Flow/constants.js.map +1 -1
  21. package/dist/components/pro/Flow/hooks/useClipboard.d.ts +5 -0
  22. package/dist/components/pro/Flow/hooks/useClipboard.js +129 -73
  23. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  24. package/dist/components/pro/Flow/hooks/useFlowImportExport.d.ts +1 -0
  25. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +108 -93
  26. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  27. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.d.ts +1 -0
  28. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +7 -7
  29. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  30. package/dist/components/pro/Flow/index.d.ts +2 -0
  31. package/dist/components/pro/Flow/nodes/DataNodeView.d.ts +4 -1
  32. package/dist/components/pro/Flow/nodes/DataNodeView.js +127 -115
  33. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  34. package/dist/components/pro/Flow/nodes/MediaContent.js +72 -67
  35. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  36. package/dist/components/pro/Flow/nodes/NodeRenderer.d.ts +5 -0
  37. package/dist/components/pro/Flow/nodes/NodeRenderer.js +216 -115
  38. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  39. package/dist/components/pro/Flow/panels/FlowToolbar.js +208 -169
  40. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  41. package/dist/components/pro/Flow/panels/InspectorPanel.js +602 -369
  42. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  43. package/dist/components/pro/Flow/panels/ShapePalette.js +50 -39
  44. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  45. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +1 -0
  46. package/dist/components/pro/Flow/panels/toolbarIcons.js +36 -8
  47. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  48. package/dist/components/pro/Flow/types.d.ts +30 -0
  49. package/dist/components/pro/Flow/types.js.map +1 -1
  50. package/dist/dishui.css +1 -1
  51. package/dist/flow.js +73 -56
  52. package/package.json +18 -17
@@ -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 { 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
+ {"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';\nimport {\n ARCHIFY_COMPONENT_ORDER,\n ARCHIFY_COMPONENT_LABELS,\n COMPONENT_STYLES,\n archifyStylePatch,\n} from '../archify';\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 {node.type !== 'shapeSvg' && node.type !== 'mediaNode' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Pos</Label>\n <Select\n options={[\n { value: 'center', label: 'center' },\n { value: 'top', label: 'top' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.textPlacement ?? ((isGroup || node.type === 'animAnchor') ? 'top' : 'center')}\n onChange={(v) => onUpdateData(node.id, 'textPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetX', Number(e.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetY', Number(e.target.value) || 0)}\n />\n </div>\n </>\n )}\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 <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Palette (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n {node.type !== 'mediaNode' && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Card (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Subtitle</Label>\n <Input\n size=\"xs\"\n value={node.data.sublabel ?? ''}\n placeholder=\"secondary line\"\n onChange={(e) => onUpdateData(node.id, 'sublabel', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Sub Color</Label>\n <ThemeColorField\n value={node.data.sublabelColor ?? '#94a3b8'}\n kind=\"text\"\n customFallback=\"#94a3b8\"\n onChange={(v) => onUpdateData(node.id, 'sublabelColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag</Label>\n <Input\n size=\"xs\"\n value={node.data.tag ?? ''}\n placeholder=\"corner pill\"\n onChange={(e) => onUpdateData(node.id, 'tag', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Color</Label>\n <ThemeColorField\n value={node.data.tagColor ?? node.data.stroke}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => onUpdateData(node.id, 'tagColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Pos</Label>\n <Select\n options={[\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.tagPlacement ?? 'top-right'}\n onChange={(v) => onUpdateData(node.id, 'tagPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\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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"}