dishui 0.0.46 → 0.0.48

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 (115) hide show
  1. package/dist/chart.js +35 -33
  2. package/dist/components/Chart/index.d.ts +1 -1
  3. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +1 -2
  4. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  5. package/dist/components/pro/CodeEditor/themes.js +0 -25
  6. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  7. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  8. package/dist/components/pro/DataTable/pivotExtension.d.ts +6 -0
  9. package/dist/components/pro/DataTable/pivotExtension.js +31 -30
  10. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  11. package/dist/components/pro/Flow/Flow.js +500 -459
  12. package/dist/components/pro/Flow/Flow.js.map +1 -1
  13. package/dist/components/pro/Flow/FlowCanvas.js +526 -524
  14. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  15. package/dist/components/pro/Flow/canvas/GridRenderer.d.ts +3 -0
  16. package/dist/components/pro/Flow/canvas/GridRenderer.js +28 -23
  17. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  18. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +18 -17
  19. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  20. package/dist/components/pro/Flow/canvas/PixiApp.d.ts +24 -0
  21. package/dist/components/pro/Flow/canvas/PixiApp.js +60 -15
  22. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  23. package/dist/components/pro/Flow/constants.js +7 -7
  24. package/dist/components/pro/Flow/constants.js.map +1 -1
  25. package/dist/components/pro/Flow/context/FlowAIContext.d.ts +15 -0
  26. package/dist/components/pro/Flow/context/FlowAIContext.js +32 -0
  27. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -0
  28. package/dist/components/pro/Flow/context/FlowUIContext.d.ts +4 -1
  29. package/dist/components/pro/Flow/context/FlowUIContext.js +58 -55
  30. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  31. package/dist/components/pro/Flow/edges/EdgeRenderer.js +22 -21
  32. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  33. package/dist/components/pro/Flow/hooks/useFlowImportExport.d.ts +6 -0
  34. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +146 -89
  35. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  36. package/dist/components/pro/Flow/hooks/useLayoutActions.d.ts +2 -0
  37. package/dist/components/pro/Flow/hooks/useLayoutActions.js +94 -65
  38. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  39. package/dist/components/pro/Flow/hooks/usePdfExport.d.ts +10 -0
  40. package/dist/components/pro/Flow/hooks/usePdfExport.js +60 -0
  41. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -0
  42. package/dist/components/pro/Flow/hooks/usePixiApp.d.ts +6 -1
  43. package/dist/components/pro/Flow/hooks/usePixiApp.js +49 -30
  44. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  45. package/dist/components/pro/Flow/index.d.ts +5 -2
  46. package/dist/components/pro/Flow/lines/FreehandTool.js +21 -20
  47. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  48. package/dist/components/pro/Flow/lines/GeometricLineTool.js +22 -18
  49. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  50. package/dist/components/pro/Flow/lines/LineRenderer.js +19 -18
  51. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  52. package/dist/components/pro/Flow/nodes/DataNodeView.d.ts +7 -0
  53. package/dist/components/pro/Flow/nodes/DataNodeView.js +217 -0
  54. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -0
  55. package/dist/components/pro/Flow/nodes/MediaContent.js +149 -120
  56. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  57. package/dist/components/pro/Flow/nodes/MediaOverlay.js +22 -17
  58. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  59. package/dist/components/pro/Flow/nodes/NodeRenderer.js +77 -76
  60. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  61. package/dist/components/pro/Flow/nodes/aiClient.d.ts +22 -0
  62. package/dist/components/pro/Flow/nodes/aiClient.js +107 -54
  63. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  64. package/dist/components/pro/Flow/nodes/dataUtils.d.ts +52 -0
  65. package/dist/components/pro/Flow/nodes/dataUtils.js +270 -0
  66. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -0
  67. package/dist/components/pro/Flow/nodes/svgIcons.js +59 -27
  68. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  69. package/dist/components/pro/Flow/panels/AIPanel.d.ts +2 -0
  70. package/dist/components/pro/Flow/panels/AIPanel.js +498 -0
  71. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -0
  72. package/dist/components/pro/Flow/panels/DataInspectorSection.d.ts +11 -0
  73. package/dist/components/pro/Flow/panels/DataInspectorSection.js +436 -0
  74. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -0
  75. package/dist/components/pro/Flow/panels/ExpandableTextarea.d.ts +16 -0
  76. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +65 -0
  77. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -0
  78. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +51 -39
  79. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  80. package/dist/components/pro/Flow/panels/FlowToolbar.d.ts +5 -1
  81. package/dist/components/pro/Flow/panels/FlowToolbar.js +310 -233
  82. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  83. package/dist/components/pro/Flow/panels/InspectorPanel.js +358 -363
  84. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  85. package/dist/components/pro/Flow/panels/OutlinePanel.js +63 -62
  86. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  87. package/dist/components/pro/Flow/panels/ProjectTitle.d.ts +8 -0
  88. package/dist/components/pro/Flow/panels/ProjectTitle.js +49 -0
  89. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -0
  90. package/dist/components/pro/Flow/panels/ShapePalette.js +128 -115
  91. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  92. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +13 -0
  93. package/dist/components/pro/Flow/panels/toolbarIcons.js +241 -87
  94. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  95. package/dist/components/pro/Flow/types.d.ts +77 -1
  96. package/dist/components/pro/Flow/types.js.map +1 -1
  97. package/dist/components/pro/Flow/utils/pdfExport.d.ts +20 -0
  98. package/dist/components/pro/Flow/utils/pdfExport.js +95 -0
  99. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -0
  100. package/dist/components/pro/Flow/utils/themeColor.d.ts +86 -0
  101. package/dist/components/pro/Flow/utils/themeColor.js +190 -0
  102. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -0
  103. package/dist/contexts/AppContext.d.ts +1 -1
  104. package/dist/contexts/AppContext.js +28 -29
  105. package/dist/contexts/AppContext.js.map +1 -1
  106. package/dist/dishui.css +1 -1
  107. package/dist/favicon.svg +10 -0
  108. package/dist/flow.js +59 -51
  109. package/dist/index-nostyled.d.ts +1 -1
  110. package/dist/index.d.ts +1 -1
  111. package/dist/styles/themeStyles.js +6 -11
  112. package/dist/styles/themeStyles.js.map +1 -1
  113. package/dist/utils/themes.js +3 -23
  114. package/dist/utils/themes.js.map +1 -1
  115. package/package.json +17 -18
@@ -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 : '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: 'oklch(var(--bc) / 0.5)', 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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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ /**
3
+ * Editable project title shown in the top-left. Renders as plain-looking text
4
+ * (a borderless input) and only becomes editable on double-click, committing on
5
+ * blur or Enter and reverting on Escape. The title is stored on the document
6
+ * and used as the base filename for all exports.
7
+ */
8
+ export default function ProjectTitle(): React.JSX.Element;
@@ -0,0 +1,49 @@
1
+ import { useFlowContext as m } from "../context/FlowContext.js";
2
+ import { useEffect as r, useRef as v, useState as f } from "react";
3
+ import { jsx as a } from "react/jsx-runtime";
4
+ var D = "未命名流程图";
5
+ function h() {
6
+ const { doc: l, setDoc: u } = m(), [e, o] = f(!1), [n, i] = f(l.title ?? ""), c = v(null);
7
+ r(() => {
8
+ e || i(l.title ?? "");
9
+ }, [l.title, e]), r(() => {
10
+ if (e) {
11
+ const t = c.current;
12
+ t?.focus(), t?.select();
13
+ }
14
+ }, [e]);
15
+ const s = () => {
16
+ const t = n.trim();
17
+ o(!1), u((d) => ({
18
+ ...d,
19
+ title: t || void 0
20
+ }));
21
+ }, p = () => {
22
+ i(l.title ?? ""), o(!1);
23
+ };
24
+ return /* @__PURE__ */ a("div", {
25
+ className: "flow-project-title",
26
+ title: "双击编辑标题",
27
+ children: /* @__PURE__ */ a("input", {
28
+ ref: c,
29
+ className: `flow-project-title-input${e ? " flow-project-title-input--editing" : ""}`,
30
+ value: e ? n : l.title ?? "",
31
+ placeholder: D,
32
+ readOnly: !e,
33
+ onDoubleClick: () => o(!0),
34
+ onChange: (t) => i(t.target.value),
35
+ onBlur: () => {
36
+ e && s();
37
+ },
38
+ onKeyDown: (t) => {
39
+ t.key === "Enter" ? (t.preventDefault(), s()) : t.key === "Escape" && (t.preventDefault(), p());
40
+ },
41
+ spellCheck: !1
42
+ })
43
+ });
44
+ }
45
+ export {
46
+ h as default
47
+ };
48
+
49
+ //# sourceMappingURL=ProjectTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectTitle.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ProjectTitle.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\n\nconst DEFAULT_TITLE = '未命名流程图';\n\n/**\n * Editable project title shown in the top-left. Renders as plain-looking text\n * (a borderless input) and only becomes editable on double-click, committing on\n * blur or Enter and reverting on Escape. The title is stored on the document\n * and used as the base filename for all exports.\n */\nexport default function ProjectTitle() {\n const { doc, setDoc } = useFlowContext();\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(doc.title ?? '');\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Keep the draft in sync when the document title changes externally\n // (import / undo / new document) while not actively editing.\n useEffect(() => {\n if (!editing) setDraft(doc.title ?? '');\n }, [doc.title, editing]);\n\n useEffect(() => {\n if (editing) {\n const el = inputRef.current;\n el?.focus();\n el?.select();\n }\n }, [editing]);\n\n const commit = () => {\n const next = draft.trim();\n setEditing(false);\n setDoc((prev) => ({ ...prev, title: next || undefined }));\n };\n\n const cancel = () => {\n setDraft(doc.title ?? '');\n setEditing(false);\n };\n\n return (\n <div className=\"flow-project-title\" title=\"双击编辑标题\">\n <input\n ref={inputRef}\n className={`flow-project-title-input${editing ? ' flow-project-title-input--editing' : ''}`}\n value={editing ? draft : (doc.title ?? '')}\n placeholder={DEFAULT_TITLE}\n readOnly={!editing}\n onDoubleClick={() => setEditing(true)}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => { if (editing) commit(); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); commit(); }\n else if (e.key === 'Escape') { e.preventDefault(); cancel(); }\n }}\n spellCheck={false}\n />\n </div>\n );\n}\n"],"mappings":";;;AAGA,IAAM,IAAgB;AAQtB,SAAwB,IAAe;AACrC,QAAM,EAAE,KAAA,GAAK,QAAA,EAAA,IAAW,EAAe,GACjC,CAAC,GAAS,CAAA,IAAc,EAAS,EAAK,GACtC,CAAC,GAAO,CAAA,IAAY,EAAS,EAAI,SAAS,EAAE,GAC5C,IAAW,EAAyB,IAAI;AAI9C,EAAA,EAAA,MAAgB;AACd,IAAK,KAAS,EAAS,EAAI,SAAS,EAAE;AAAA,EACxC,GAAG,CAAC,EAAI,OAAO,CAAO,CAAC,GAEvB,EAAA,MAAgB;AACd,QAAI,GAAS;AACX,YAAM,IAAK,EAAS;AACpB,MAAA,GAAI,MAAM,GACV,GAAI,OAAO;AAAA,IACb;AAAA,EACF,GAAG,CAAC,CAAO,CAAC;AAEZ,QAAM,IAAA,MAAe;AACnB,UAAM,IAAO,EAAM,KAAK;AACxB,IAAA,EAAW,EAAK,GAChB,EAAA,CAAQ,OAAU;AAAA,MAAE,GAAG;AAAA,MAAM,OAAO,KAAQ;AAAA,IAAU,EAAE;AAAA,EAC1D,GAEM,IAAA,MAAe;AACnB,IAAA,EAAS,EAAI,SAAS,EAAE,GACxB,EAAW,EAAK;AAAA,EAClB;AAEA,SACE,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAU;AAAA,IAAqB,OAAM;AAAA,cACxC,gBAAA,EAAC,SAAD;AAAA,MACE,KAAK;AAAA,MACL,WAAW,2BAA2B,IAAU,uCAAuC,EAAA;AAAA,MACvF,OAAO,IAAU,IAAS,EAAI,SAAS;AAAA,MACvC,aAAa;AAAA,MACb,UAAU,CAAC;AAAA,MACX,eAAA,MAAqB,EAAW,EAAI;AAAA,MACpC,UAAA,CAAW,MAAM,EAAS,EAAE,OAAO,KAAK;AAAA,MACxC,QAAA,MAAc;AAAE,QAAI,KAAS,EAAO;AAAA,MAAG;AAAA,MACvC,WAAA,CAAY,MAAM;AAChB,QAAI,EAAE,QAAQ,WAAW,EAAE,eAAe,GAAG,EAAO,KAC3C,EAAE,QAAQ,aAAY,EAAE,eAAe,GAAG,EAAO;AAAA,MAC5D;AAAA,MACA,YAAY;AAAA,IACb,CAAA;AAAA,EACE,CAAA;AAET"}
@@ -1,11 +1,13 @@
1
1
  import { PALETTE_ITEMS as $ } from "../constants.js";
2
- import { useFlowUI as k } from "../context/FlowUIContext.js";
3
- import { SVG_ICON_CATEGORIES as x, buildSvgMarkup as b, getSvgIconsByCategory as M } from "../nodes/svgIcons.js";
4
- import { useDraggablePanel as v } from "../hooks/useDraggablePanel.js";
5
- import { useResizablePanel as S } from "../hooks/useResizablePanel.js";
6
- import { useCallback as u, useState as P } from "react";
7
- import { Fragment as g, jsx as e, jsxs as d } from "react/jsx-runtime";
8
- var W = [
2
+ import { useFlowUI as y } from "../context/FlowUIContext.js";
3
+ import { resolveThemeColor as b } from "../utils/themeColor.js";
4
+ import { SVG_ICON_CATEGORIES as v, buildSvgMarkup as M, getSvgIcon as x, getSvgIconsByCategory as S } from "../nodes/svgIcons.js";
5
+ import { useDraggablePanel as C } from "../hooks/useDraggablePanel.js";
6
+ import { useResizablePanel as P } from "../hooks/useResizablePanel.js";
7
+ import { makeStarterDataConfig as W } from "../nodes/dataUtils.js";
8
+ import { useCallback as u, useState as I } from "react";
9
+ import { Fragment as g, jsx as e, jsxs as c } from "react/jsx-runtime";
10
+ var T = [
9
11
  {
10
12
  mode: "freehand",
11
13
  label: "Freehand"
@@ -23,13 +25,13 @@ var W = [
23
25
  label: "Arrow"
24
26
  }
25
27
  ];
26
- function F() {
27
- const { showPalette: l } = k(), { panelStyle: a, handleProps: i } = v(), { panelWidth: t, resizeHandleProps: o } = S("right", 180);
28
- return l ? /* @__PURE__ */ d("div", {
28
+ function V() {
29
+ const { showPalette: l } = y(), { panelStyle: r, handleProps: a } = C(), { panelWidth: t, resizeHandleProps: o } = P("right", 180);
30
+ return l ? /* @__PURE__ */ c("div", {
29
31
  className: "flow-palette",
30
32
  "data-flow-panel": !0,
31
33
  style: {
32
- ...a,
34
+ ...r,
33
35
  width: t
34
36
  },
35
37
  children: [
@@ -39,12 +41,12 @@ function F() {
39
41
  }),
40
42
  /* @__PURE__ */ e("div", {
41
43
  className: "flow-panel-drag-handle",
42
- ...i,
44
+ ...a,
43
45
  style: {
44
46
  fontSize: 11,
45
47
  fontWeight: 600,
46
48
  marginBottom: 6,
47
- color: "oklch(var(--bc) / 0.5)",
49
+ color: "color-mix(in oklch, var(--color-base-content) 50%, transparent)",
48
50
  textTransform: "uppercase",
49
51
  letterSpacing: "0.05em",
50
52
  cursor: "grab"
@@ -53,45 +55,45 @@ function F() {
53
55
  }),
54
56
  /* @__PURE__ */ e("div", {
55
57
  className: "flow-palette-content",
56
- children: /* @__PURE__ */ e(I, {})
58
+ children: /* @__PURE__ */ e(N, {})
57
59
  })
58
60
  ]
59
61
  }) : null;
60
62
  }
61
- function I() {
62
- const { toolMode: l, setToolMode: a, setPendingPlacement: i, pendingPlacement: t } = k(), o = u((n, h, p, r) => {
63
- t?.type === n ? i(null) : (i({
63
+ function N() {
64
+ const { toolMode: l, setToolMode: r, setPendingPlacement: a, pendingPlacement: t } = y(), o = u((n, s, p, h) => {
65
+ t?.type === n ? a(null) : (a({
64
66
  type: n,
65
- width: h,
67
+ width: s,
66
68
  height: p,
67
- data: { ...r }
68
- }), a("select"));
69
+ data: { ...h }
70
+ }), r("select"));
69
71
  }, [
70
- i,
71
72
  a,
73
+ r,
72
74
  t
73
75
  ]);
74
- return /* @__PURE__ */ d(g, { children: [
76
+ return /* @__PURE__ */ c(g, { children: [
75
77
  /* @__PURE__ */ e("div", {
76
78
  className: "flow-palette-grid",
77
- children: $.map((n) => /* @__PURE__ */ d("div", {
79
+ children: $.map((n) => /* @__PURE__ */ c("div", {
78
80
  className: `flow-palette-item${t?.type === n.type ? " flow-palette-item--active" : ""}`,
79
81
  onClick: () => o(n.type, n.width, n.height, n.data),
80
- children: [/* @__PURE__ */ e(A, { type: n.type }), /* @__PURE__ */ e("span", {
82
+ children: [/* @__PURE__ */ e(D, { type: n.type }), /* @__PURE__ */ e("span", {
81
83
  className: "flow-palette-item-label",
82
84
  children: n.data.label
83
85
  })]
84
86
  }, n.type))
85
87
  }),
86
- /* @__PURE__ */ e(T, { children: "Lines" }),
88
+ /* @__PURE__ */ e(z, { children: "Lines" }),
87
89
  /* @__PURE__ */ e("div", {
88
90
  className: "flow-palette-grid",
89
- children: W.map((n) => /* @__PURE__ */ d("div", {
91
+ children: T.map((n) => /* @__PURE__ */ c("div", {
90
92
  className: `flow-palette-item${l === n.mode ? " flow-palette-item--active" : ""}`,
91
93
  onClick: () => {
92
- i(null), a(l === n.mode ? "select" : n.mode);
94
+ a(null), r(l === n.mode ? "select" : n.mode);
93
95
  },
94
- children: [/* @__PURE__ */ e(L, { mode: n.mode }), /* @__PURE__ */ e("span", {
96
+ children: [/* @__PURE__ */ e(E, { mode: n.mode }), /* @__PURE__ */ e("span", {
95
97
  className: "flow-palette-item-label",
96
98
  children: n.label
97
99
  })]
@@ -99,76 +101,78 @@ function I() {
99
101
  })
100
102
  ] });
101
103
  }
102
- function G() {
103
- const { setPendingPlacement: l, setToolMode: a, pendingPlacement: i } = k(), [t, o] = P({ lang: !0 }), n = u((h, p) => {
104
- const r = i?.data.svgId;
105
- if (i?.type === "shapeSvg" && r === h) {
104
+ function Z() {
105
+ const { setPendingPlacement: l, setToolMode: r, pendingPlacement: a } = y(), [t, o] = I({ lang: !0 }), n = u((s, p) => {
106
+ const h = a?.data.svgId;
107
+ if (a?.type === "shapeSvg" && h === s) {
106
108
  l(null);
107
109
  return;
108
110
  }
111
+ const i = {
112
+ label: p,
113
+ fill: "transparent",
114
+ stroke: "theme:base-content",
115
+ strokeWidth: 1.5,
116
+ color: x(s)?.brandColor ?? "theme:base-content",
117
+ labelColor: "theme:base-content",
118
+ fontSize: 12,
119
+ svgId: s,
120
+ iconBox: !1,
121
+ labelPlacement: "bottom",
122
+ borderStyle: "none"
123
+ };
109
124
  l({
110
125
  type: "shapeSvg",
111
126
  width: 56,
112
127
  height: 56,
113
- data: {
114
- label: p,
115
- fill: "transparent",
116
- stroke: "#64748b",
117
- strokeWidth: 1.5,
118
- color: "#334155",
119
- fontSize: 12,
120
- svgId: h,
121
- iconBox: !1,
122
- labelPlacement: "bottom",
123
- borderStyle: "none"
124
- }
125
- }), a("select");
128
+ data: i
129
+ }), r("select");
126
130
  }, [
127
- i,
131
+ a,
128
132
  l,
129
- a
133
+ r
130
134
  ]);
131
- return /* @__PURE__ */ e(g, { children: x.map((h) => {
132
- const p = M(h.id), r = t[h.id];
133
- return /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("button", {
135
+ return /* @__PURE__ */ e(g, { children: v.map((s) => {
136
+ const p = S(s.id), h = t[s.id];
137
+ return /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ c("button", {
134
138
  type: "button",
135
139
  className: "flow-palette-section-toggle",
136
- onClick: () => o((s) => ({
137
- ...s,
138
- [h.id]: !s[h.id]
140
+ onClick: () => o((i) => ({
141
+ ...i,
142
+ [s.id]: !i[s.id]
139
143
  })),
140
144
  children: [/* @__PURE__ */ e("span", {
141
145
  style: {
142
- transform: r ? "rotate(90deg)" : "none",
146
+ transform: h ? "rotate(90deg)" : "none",
143
147
  transition: "transform .15s"
144
148
  },
145
149
  children: "▸"
146
- }), h.label]
147
- }), r && /* @__PURE__ */ e("div", {
150
+ }), s.label]
151
+ }), h && /* @__PURE__ */ e("div", {
148
152
  className: "flow-palette-grid",
149
- children: p.map((s) => /* @__PURE__ */ d("div", {
150
- className: `flow-palette-item${i?.type === "shapeSvg" && i.data.svgId === s.id ? " flow-palette-item--active" : ""}`,
151
- onClick: () => n(s.id, s.label),
152
- title: s.label,
153
- children: [/* @__PURE__ */ e(C, { id: s.id }), /* @__PURE__ */ e("span", {
153
+ children: p.map((i) => /* @__PURE__ */ c("div", {
154
+ className: `flow-palette-item${a?.type === "shapeSvg" && a.data.svgId === i.id ? " flow-palette-item--active" : ""}`,
155
+ onClick: () => n(i.id, i.label),
156
+ title: i.label,
157
+ children: [/* @__PURE__ */ e(A, { id: i.id }), /* @__PURE__ */ e("span", {
154
158
  className: "flow-palette-item-label",
155
- children: s.label
159
+ children: i.label
156
160
  })]
157
- }, s.id))
158
- })] }, h.id);
161
+ }, i.id))
162
+ })] }, s.id);
159
163
  }) });
160
164
  }
161
- function C({ id: l }) {
162
- const a = b(l, "#475569");
163
- return a ? /* @__PURE__ */ e("img", {
164
- src: `data:image/svg+xml;utf8,${encodeURIComponent(a)}`,
165
- width: 34,
166
- height: 26,
165
+ function A({ id: l }) {
166
+ const r = M(l, b(x(l)?.brandColor, "") || "#475569");
167
+ return r ? /* @__PURE__ */ e("img", {
168
+ src: `data:image/svg+xml;utf8,${encodeURIComponent(r)}`,
169
+ width: 20,
170
+ height: 16,
167
171
  alt: "",
168
172
  style: { objectFit: "contain" }
169
173
  }) : null;
170
174
  }
171
- var N = [
175
+ var L = [
172
176
  {
173
177
  kind: "markdown",
174
178
  label: "Markdown",
@@ -235,37 +239,46 @@ var N = [
235
239
  height: 340,
236
240
  content: "",
237
241
  icon: /* @__PURE__ */ e(m, { text: "AI" })
242
+ },
243
+ {
244
+ kind: "data",
245
+ label: "Data",
246
+ width: 420,
247
+ height: 300,
248
+ content: "",
249
+ icon: /* @__PURE__ */ e(m, { text: "⊞" })
238
250
  }
239
251
  ];
240
252
  function m({ text: l }) {
241
253
  return /* @__PURE__ */ e("div", {
242
254
  style: {
243
- width: 36,
244
- height: 28,
255
+ width: 20,
256
+ height: 16,
245
257
  display: "flex",
246
258
  alignItems: "center",
247
259
  justifyContent: "center",
248
- fontSize: 13,
260
+ fontSize: 9,
249
261
  fontWeight: 700,
250
- color: "oklch(var(--bc) / 0.6)",
251
- border: "1px solid oklch(var(--bc) / 0.2)",
252
- borderRadius: 4
262
+ color: "color-mix(in oklch, var(--color-base-content) 60%, transparent)",
263
+ border: "1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent)",
264
+ borderRadius: 3,
265
+ flexShrink: 0
253
266
  },
254
267
  children: l
255
268
  });
256
269
  }
257
- function O() {
258
- const { setPendingPlacement: l, setToolMode: a, pendingPlacement: i } = k(), t = u((o) => {
259
- if (i?.type === "mediaNode" && i.data.mediaKind === o.kind) {
270
+ function q() {
271
+ const { setPendingPlacement: l, setToolMode: r, pendingPlacement: a } = y(), t = u((o) => {
272
+ if (a?.type === "mediaNode" && a.data.mediaKind === o.kind) {
260
273
  l(null);
261
274
  return;
262
275
  }
263
276
  const n = {
264
277
  label: o.label,
265
- fill: "#ffffff",
266
- stroke: "#cbd5e1",
278
+ fill: "theme:base-100",
279
+ stroke: "theme:base-content",
267
280
  strokeWidth: 1.5,
268
- color: "#1f2937",
281
+ color: "theme:base-content",
269
282
  fontSize: 13,
270
283
  borderStyle: "solid",
271
284
  mediaKind: o.kind,
@@ -274,23 +287,23 @@ function O() {
274
287
  gateway: "",
275
288
  protocol: "openai",
276
289
  model: ""
277
- } } : o.kind === "model3d" ? { modelFormat: "stl" } : {}
290
+ } } : o.kind === "model3d" ? { modelFormat: "stl" } : o.kind === "data" ? { dataConfig: W() } : {}
278
291
  };
279
292
  l({
280
293
  type: "mediaNode",
281
294
  width: o.width,
282
295
  height: o.height,
283
296
  data: n
284
- }), a("select");
297
+ }), r("select");
285
298
  }, [
286
- i,
299
+ a,
287
300
  l,
288
- a
301
+ r
289
302
  ]);
290
303
  return /* @__PURE__ */ e("div", {
291
304
  className: "flow-palette-grid",
292
- children: N.map((o) => /* @__PURE__ */ d("div", {
293
- className: `flow-palette-item${i?.type === "mediaNode" && i.data.mediaKind === o.kind ? " flow-palette-item--active" : ""}`,
305
+ children: L.map((o) => /* @__PURE__ */ c("div", {
306
+ className: `flow-palette-item${a?.type === "mediaNode" && a.data.mediaKind === o.kind ? " flow-palette-item--active" : ""}`,
294
307
  onClick: () => t(o),
295
308
  title: o.label,
296
309
  children: [o.icon, /* @__PURE__ */ e("span", {
@@ -300,20 +313,20 @@ function O() {
300
313
  }, o.kind))
301
314
  });
302
315
  }
303
- function T({ children: l }) {
316
+ function z({ children: l }) {
304
317
  return /* @__PURE__ */ e("div", {
305
318
  style: {
306
319
  fontSize: 11,
307
320
  fontWeight: 600,
308
321
  margin: "10px 0 6px",
309
- color: "oklch(var(--bc) / 0.5)",
322
+ color: "color-mix(in oklch, var(--color-base-content) 50%, transparent)",
310
323
  textTransform: "uppercase",
311
324
  letterSpacing: "0.05em"
312
325
  },
313
326
  children: l
314
327
  });
315
328
  }
316
- function A({ type: l }) {
329
+ function D({ type: l }) {
317
330
  const t = "currentColor", n = {
318
331
  shapeRect: /* @__PURE__ */ e("rect", {
319
332
  x: "3",
@@ -375,11 +388,11 @@ function A({ type: l }) {
375
388
  strokeWidth: 1.5
376
389
  }),
377
390
  shapePentagon: (() => {
378
- const r = Math.min(18, 14) - 4;
391
+ const h = Math.min(18, 14) - 4;
379
392
  return /* @__PURE__ */ e("polygon", {
380
- points: Array.from({ length: 5 }, (s, y) => {
381
- const c = Math.PI * 2 * y / 5 - Math.PI / 2;
382
- return `${18 + r * Math.cos(c)},${14 + r * Math.sin(c)}`;
393
+ points: Array.from({ length: 5 }, (i, k) => {
394
+ const d = Math.PI * 2 * k / 5 - Math.PI / 2;
395
+ return `${18 + h * Math.cos(d)},${14 + h * Math.sin(d)}`;
383
396
  }).join(" "),
384
397
  fill: "none",
385
398
  stroke: t,
@@ -387,8 +400,8 @@ function A({ type: l }) {
387
400
  });
388
401
  })(),
389
402
  shapeHexagon: /* @__PURE__ */ e("polygon", {
390
- points: Array.from({ length: 6 }, (y, c) => {
391
- const w = Math.PI * 2 * c / 6 - Math.PI / 6;
403
+ points: Array.from({ length: 6 }, (k, d) => {
404
+ const w = Math.PI * 2 * d / 6 - Math.PI / 6;
392
405
  return `${18 + 14 * Math.cos(w)},${14 + 10 * Math.sin(w)}`;
393
406
  }).join(" "),
394
407
  fill: "none",
@@ -396,10 +409,10 @@ function A({ type: l }) {
396
409
  strokeWidth: 1.5
397
410
  }),
398
411
  shapeStar: (() => {
399
- const r = Math.min(18, 14) - 3, s = r * 0.4;
412
+ const h = Math.min(18, 14) - 3, i = h * 0.4;
400
413
  return /* @__PURE__ */ e("polygon", {
401
- points: Array.from({ length: 10 }, (y, c) => {
402
- const w = Math.PI * c / 5 - Math.PI / 2, f = c % 2 === 0 ? r : s;
414
+ points: Array.from({ length: 10 }, (k, d) => {
415
+ const w = Math.PI * d / 5 - Math.PI / 2, f = d % 2 === 0 ? h : i;
403
416
  return `${18 + f * Math.cos(w)},${14 + f * Math.sin(w)}`;
404
417
  }).join(" "),
405
418
  fill: "none",
@@ -408,10 +421,10 @@ function A({ type: l }) {
408
421
  });
409
422
  })(),
410
423
  shapeHexagram: (() => {
411
- const r = Math.min(18, 14) - 3, s = r * 0.55;
424
+ const h = Math.min(18, 14) - 3, i = h * 0.55;
412
425
  return /* @__PURE__ */ e("polygon", {
413
- points: Array.from({ length: 12 }, (y, c) => {
414
- const w = Math.PI * c / 6 - Math.PI / 2, f = c % 2 === 0 ? r : s;
426
+ points: Array.from({ length: 12 }, (k, d) => {
427
+ const w = Math.PI * d / 6 - Math.PI / 2, f = d % 2 === 0 ? h : i;
415
428
  return `${18 + f * Math.cos(w)},${14 + f * Math.sin(w)}`;
416
429
  }).join(" "),
417
430
  fill: "none",
@@ -440,7 +453,7 @@ function A({ type: l }) {
440
453
  fill: "currentColor",
441
454
  children: "Aa"
442
455
  }),
443
- animAnchor: /* @__PURE__ */ d(g, { children: [
456
+ animAnchor: /* @__PURE__ */ c(g, { children: [
444
457
  /* @__PURE__ */ e("rect", {
445
458
  x: "3",
446
459
  y: "4",
@@ -486,13 +499,13 @@ function A({ type: l }) {
486
499
  width: 36,
487
500
  height: 28,
488
501
  viewBox: "0 0 36 28",
489
- style: { color: "oklch(var(--bc) / 0.55)" },
502
+ style: { color: "color-mix(in oklch, var(--color-base-content) 55%, transparent)" },
490
503
  children: n[l] ?? n.shapeRect
491
504
  });
492
505
  }
493
- function L({ mode: l }) {
506
+ function E({ mode: l }) {
494
507
  const t = "currentColor", n = {
495
- connect: /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ e("line", {
508
+ connect: /* @__PURE__ */ c(g, { children: [/* @__PURE__ */ e("line", {
496
509
  x1: "6",
497
510
  y1: 22,
498
511
  x2: 30,
@@ -525,7 +538,7 @@ function L({ mode: l }) {
525
538
  strokeWidth: 1.5,
526
539
  strokeLinejoin: "round"
527
540
  }),
528
- arrow: /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ e("line", {
541
+ arrow: /* @__PURE__ */ c(g, { children: [/* @__PURE__ */ e("line", {
529
542
  x1: "6",
530
543
  y1: 22,
531
544
  x2: 30,
@@ -541,16 +554,16 @@ function L({ mode: l }) {
541
554
  width: 36,
542
555
  height: 28,
543
556
  viewBox: "0 0 36 28",
544
- style: { color: "oklch(var(--bc) / 0.55)" },
557
+ style: { color: "color-mix(in oklch, var(--color-base-content) 55%, transparent)" },
545
558
  children: n[l] ?? n.line
546
559
  });
547
560
  }
548
561
  export {
549
- O as MediaStampContent,
550
- A as PaletteThumbnail,
551
- I as ShapePaletteContent,
552
- G as SvgStampContent,
553
- F as default
562
+ q as MediaStampContent,
563
+ D as PaletteThumbnail,
564
+ N as ShapePaletteContent,
565
+ Z as SvgStampContent,
566
+ V as default
554
567
  };
555
568
 
556
569
  //# sourceMappingURL=ShapePalette.js.map