dishui 0.0.62 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Badge/index.js +12 -9
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js +43 -40
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.d.ts +11 -0
- package/dist/components/Card/index.js +62 -37
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js +32 -30
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/EmptyState/index.d.ts +4 -1
- package/dist/components/EmptyState/index.js +3 -3
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/Input/index.js +30 -30
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js +41 -40
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/List/index.js +47 -32
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js +61 -57
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +49 -49
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Modal/index.d.ts +7 -3
- package/dist/components/Modal/index.js +77 -65
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +58 -0
- package/dist/components/Page/index.js +74 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/Select/index.js +0 -3
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/StatCard/index.d.ts +3 -1
- package/dist/components/StatCard/index.js +39 -11
- package/dist/components/StatCard/index.js.map +1 -1
- package/dist/components/Table/index.js +103 -85
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +19 -5
- package/dist/components/Tabs/index.js +32 -13
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js +59 -59
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js +49 -48
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js +42 -42
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js +35 -32
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js +37 -37
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js +496 -494
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +916 -917
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js +1 -3
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +79 -79
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useTableColumns.js +7 -8
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +227 -221
- package/dist/layouts/MainLayout.js +22 -22
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js +94 -73
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/utils/i18n.js +10 -10
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/routerBuilder.js +17 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowToolbar.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowToolbar.tsx"],"sourcesContent":["import React, { useRef, useCallback } from 'react';\nimport Button from '../../../Button';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport ProjectTitle from './ProjectTitle';\nimport { useFlowImportExport, downloadDataURL, safeFileBaseName } from '../hooks/useFlowImportExport';\nimport { useLayoutActions } from '../hooks/useLayoutActions';\nimport { archifyStylePatch, inferComponentType, ARCHIFY_ARROW, variantEdgeStyle } from '../archify';\n\nimport {\n IconBack,\n IconUndo,\n IconRedo,\n IconGroup,\n IconGeoGroup,\n IconUngroup,\n IconAlign,\n IconZoomIn,\n IconZoomOut,\n IconFitView,\n IconAutoFocus,\n IconShapes,\n IconInspector,\n IconOutline,\n IconJson,\n IconAI,\n IconGrid,\n IconMagnet,\n IconMiniMap,\n IconImport,\n IconExportJson,\n IconExportPng,\n IconExportPdf,\n IconExportMarkdown,\n IconLayer,\n IconPublish,\n IconAnchorVisible,\n IconPresent,\n IconArchify,\n} from './toolbarIcons';\n\n/** Compact zoom / view controls floated over the bottom-left of the canvas. */\nexport function FlowZoomControls() {\n const { viewport, setViewport, autoFocus, setAutoFocus } = useFlowUI();\n const zoomPercent = Math.round(viewport.zoom * 100);\n\n const handleZoomIn = () => {\n setViewport({ ...viewport, zoom: Math.min(4, viewport.zoom * 1.2) });\n };\n const handleZoomOut = () => {\n setViewport({ ...viewport, zoom: Math.max(0.1, viewport.zoom / 1.2) });\n };\n const handleFitView = () => {\n setViewport({ x: 0, y: 0, zoom: 1 });\n };\n\n return (\n <div className=\"flow-zoom-controls\">\n <ToolButton tip=\"缩小\" onClick={handleZoomOut}>\n <IconZoomOut />\n </ToolButton>\n <span className=\"flow-zoom-info\">{zoomPercent}%</span>\n <ToolButton tip=\"放大\" onClick={handleZoomIn}>\n <IconZoomIn />\n </ToolButton>\n <ToolButton tip=\"适应视图\" onClick={handleFitView}>\n <IconFitView />\n </ToolButton>\n <ToolButton\n tip={autoFocus ? '关闭 Auto Focus' : '开启 Auto Focus'}\n active={autoFocus}\n onClick={() => setAutoFocus(!autoFocus)}\n >\n <IconAutoFocus />\n </ToolButton>\n </div>\n );\n}\n\n\n/** A toolbar button with an accessible, hover-revealed tooltip below it. */\ninterface ToolButtonProps {\n tip: string;\n shortcut?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction ToolButton({ tip, shortcut, onClick, active, disabled, children }: ToolButtonProps) {\n const label = shortcut ? `${tip} (${shortcut})` : tip;\n return (\n <span className=\"flow-tip\">\n <Button\n size=\"xs\"\n variant={active ? 'primary' : 'ghost'}\n onClick={onClick}\n disabled={disabled}\n square\n >\n <span aria-label={label} style={{ display: 'inline-flex' }}>{children}</span>\n </Button>\n <span className=\"flow-tip-label\" role=\"tooltip\">{label}</span>\n </span>\n );\n}\n\nexport interface FlowToolbarProps {\n onBack?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onGroup?: () => void;\n onGeoGroup?: () => void;\n onUngroup?: () => void;\n onExportPNG?: () => void | Promise<void>;\n /** Export anchors as a PDF slideshow from the built-in toolbar. */\n onExportPDF?: () => void | Promise<void>;\n onPublish?: () => void;\n /** Small-screen (container-width) layout: the title gets its own row and\n * button groups wrap below instead of sliding under the absolute title. */\n compact?: boolean;\n}\n\nexport default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish, compact }: FlowToolbarProps) {\n const {\n showGrid, setShowGrid,\n showPalette, setShowPalette,\n showInspector, setShowInspector,\n showOutline, setShowOutline,\n showJson, setShowJson,\n showAI, setShowAI,\n showMiniMap, setShowMiniMap,\n showAnchors, setShowAnchors,\n presentation, setPresentation,\n placementSnap, setPlacementSnap,\n } = useFlowUI();\n const { doc, selection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { exportJSON, importJSON, exportMarkdown } = useFlowImportExport();\n const { align, distribute, changeZIndex } = useLayoutActions();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const selTotalCount = selection.nodeIds.size + selection.lineIds.size;\n const hasGroupSelected = selection.nodeIds.size > 0 && currentCanvas.nodes.some(\n n => selection.nodeIds.has(n.id) && (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup),\n );\n const hasAnchors = Object.values(doc.canvases).some(canvas =>\n canvas.nodes.some(node => node.type === 'animAnchor'),\n );\n\n\n const handleExportJSON = useCallback(() => {\n const json = exportJSON();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.json`);\n URL.revokeObjectURL(url);\n }, [exportJSON, doc.title]);\n\n const handleExportMarkdown = useCallback(() => {\n const md = exportMarkdown();\n const blob = new Blob([md], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.md`);\n URL.revokeObjectURL(url);\n }, [exportMarkdown, doc.title]);\n\n const handleImportJSON = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n /**\n * Recolor the current canvas to the unified Archify style: every plain shape\n * node adopts its inferred semantic card colors, and every edge is restyled\n * by its arrow color. Content, geometry, and any sub-labels/tags are kept.\n */\n const handleApplyArchifyStyle = useCallback(() => {\n setDoc((prev) => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodes = canvas.nodes.map((n) => {\n if (n.type === 'animAnchor' || n.type === 'shapeSvg') return n;\n if (n.data.isGroup || n.type === 'flowGroup' || n.type === 'geometryGroup') return n;\n // Media nodes (including data charts) adopt the semantic card colors; the\n // chart's primary series color follows the node `color` at render time.\n return { ...n, data: { ...n.data, ...archifyStylePatch(inferComponentType(n.data)) } };\n });\n const edges = canvas.edges.map((e) => {\n const isEmphasis = e.data.strokeColor && e.data.strokeColor !== ARCHIFY_ARROW;\n const style = variantEdgeStyle(isEmphasis ? 'emphasis' : 'default');\n return {\n ...e,\n data: {\n ...e.data,\n strokeColor: e.data.strokeColor && e.data.strokeColor.startsWith('theme:')\n ? style.color\n : (e.data.strokeColor ?? style.color),\n },\n };\n });\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes, edges } },\n };\n });\n }, [setDoc, currentCanvasId]);\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') importJSON(reader.result);\n };\n reader.readAsText(file);\n e.target.value = '';\n }, [importJSON]);\n\n return (\n <div className={`flow-toolbar${compact ? ' flow-toolbar--compact' : ''}`}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n\n {/* Editable project title, anchored to the toolbar's left edge. */}\n <ProjectTitle />\n\n {onBack && (\n <>\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"返回列表\" onClick={onBack}>\n <IconBack />\n </ToolButton>\n </div>\n <div className=\"flow-toolbar-divider\" />\n </>\n )}\n\n {/* 历史:撤销 / 重做 */}\n {(onUndo || onRedo) && (\n <div className=\"flow-toolbar-group\">\n {onUndo && (\n <ToolButton tip=\"撤销\" shortcut=\"Ctrl+Z\" onClick={onUndo} disabled={!canUndo}>\n <IconUndo />\n </ToolButton>\n )}\n {onRedo && (\n <ToolButton tip=\"重做\" shortcut=\"Ctrl+Shift+Z\" onClick={onRedo} disabled={!canRedo}>\n <IconRedo />\n </ToolButton>\n )}\n </div>\n )}\n\n {/* 排列:对齐 / 平分 */}\n {selection.nodeIds.size >= 2 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"居左\" onClick={() => align('left')}><IconAlign kind=\"left\" /></ToolButton>\n <ToolButton tip=\"水平居中\" onClick={() => align('center-h')}><IconAlign kind=\"center-h\" /></ToolButton>\n <ToolButton tip=\"居右\" onClick={() => align('right')}><IconAlign kind=\"right\" /></ToolButton>\n <ToolButton tip=\"居上\" onClick={() => align('top')}><IconAlign kind=\"top\" /></ToolButton>\n <ToolButton tip=\"垂直居中\" onClick={() => align('center-v')}><IconAlign kind=\"center-v\" /></ToolButton>\n <ToolButton tip=\"居下\" onClick={() => align('bottom')}><IconAlign kind=\"bottom\" /></ToolButton>\n <ToolButton tip=\"水平平分\" onClick={() => distribute('horizontal')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-h\" />\n </ToolButton>\n <ToolButton tip=\"垂直平分\" onClick={() => distribute('vertical')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-v\" />\n </ToolButton>\n </div>\n </>\n )}\n\n {/* 图层:置顶 / 上移 / 下移 / 置底 */}\n {selTotalCount >= 1 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"置于顶层\" onClick={() => changeZIndex('front')}><IconLayer kind=\"front\" /></ToolButton>\n <ToolButton tip=\"上移一层\" onClick={() => changeZIndex('up')}><IconLayer kind=\"up\" /></ToolButton>\n <ToolButton tip=\"下移一层\" onClick={() => changeZIndex('down')}><IconLayer kind=\"down\" /></ToolButton>\n <ToolButton tip=\"置于底层\" onClick={() => changeZIndex('back')}><IconLayer kind=\"back\" /></ToolButton>\n </div>\n </>\n )}\n\n {/* 组合:成组 / 几何分组 / 取消成组 */}\n {(onGroup || onGeoGroup || onUngroup) && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n {onGroup && (\n <ToolButton tip=\"成组\" shortcut=\"⌘G\" onClick={onGroup} disabled={selTotalCount < 2}>\n <IconGroup />\n </ToolButton>\n )}\n {onGeoGroup && (\n <ToolButton tip=\"几何分组\" shortcut=\"⌘⌥G\" onClick={onGeoGroup} disabled={selTotalCount < 2}>\n <IconGeoGroup />\n </ToolButton>\n )}\n {onUngroup && (\n <ToolButton tip=\"取消成组\" shortcut=\"⌘⇧G\" onClick={onUngroup} disabled={!hasGroupSelected}>\n <IconUngroup />\n </ToolButton>\n )}\n </div>\n </>\n )}\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 视图:网格 / 缩略图 / Anchor / 动画预览 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"网格\" active={showGrid} onClick={() => setShowGrid(!showGrid)}>\n <IconGrid />\n </ToolButton>\n <ToolButton\n tip={placementSnap ? '放置吸附网格:开(盖章自动贴近网格)' : '放置吸附网格:关(自由放置)'}\n active={placementSnap}\n onClick={() => setPlacementSnap(!placementSnap)}\n >\n <IconMagnet />\n </ToolButton>\n <ToolButton tip=\"缩略图\" active={showMiniMap} onClick={() => setShowMiniMap(!showMiniMap)}>\n <IconMiniMap />\n </ToolButton>\n <ToolButton\n tip={showAnchors ? '隐藏所有 Anchor 对象' : '显示所有 Anchor 对象'}\n active={showAnchors}\n disabled={!hasAnchors}\n onClick={() => {\n if (hasAnchors) setShowAnchors(!showAnchors);\n }}\n >\n <IconAnchorVisible visible={showAnchors} />\n </ToolButton>\n <ToolButton\n tip=\"动画预览\"\n active={presentation !== null}\n onClick={() => setPresentation(presentation ? null : { current: 0, showAnchor: false })}\n >\n <IconPresent />\n </ToolButton>\n <ToolButton\n tip=\"应用 Archify 风格(当前画布)\"\n onClick={handleApplyArchifyStyle}\n >\n <IconArchify />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 面板:形状 / 属性 / 大纲 / JSON */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"形状面板\" active={showPalette} onClick={() => setShowPalette(!showPalette)}>\n <IconShapes />\n </ToolButton>\n <ToolButton tip=\"属性面板\" active={showInspector} onClick={() => setShowInspector(!showInspector)}>\n <IconInspector />\n </ToolButton>\n <ToolButton tip=\"大纲\" active={showOutline} onClick={() => setShowOutline(!showOutline)}>\n <IconOutline />\n </ToolButton>\n <ToolButton tip=\"JSON\" active={showJson} onClick={() => setShowJson(!showJson)}>\n <IconJson />\n </ToolButton>\n <ToolButton tip=\"AI 助手\" active={showAI} onClick={() => setShowAI(!showAI)}>\n <IconAI />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 文件:导入 / 导出 / 发布 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"导入 JSON\" onClick={handleImportJSON}>\n <IconImport />\n </ToolButton>\n <ToolButton tip=\"导出 JSON\" onClick={handleExportJSON}>\n <IconExportJson />\n </ToolButton>\n <ToolButton tip=\"导出 Markdown\" onClick={handleExportMarkdown}>\n <IconExportMarkdown />\n </ToolButton>\n {onExportPNG && (\n <ToolButton tip=\"导出 PNG\" onClick={() => void onExportPNG()}>\n <IconExportPng />\n </ToolButton>\n )}\n {onExportPDF && hasAnchors && (\n <ToolButton tip=\"导出 PDF(按锦点顺序)\" onClick={() => void onExportPDF()}>\n <IconExportPdf />\n </ToolButton>\n )}\n {onPublish && (\n <ToolButton tip=\"发布与共享\" onClick={onPublish}>\n <IconPublish />\n </ToolButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FlowToolbar.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/FlowToolbar.tsx"],"sourcesContent":["import React, { useRef, useCallback } from 'react';\nimport Button from '../../../Button';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport ProjectTitle from './ProjectTitle';\nimport { useFlowImportExport, downloadDataURL, safeFileBaseName } from '../hooks/useFlowImportExport';\nimport { useLayoutActions } from '../hooks/useLayoutActions';\nimport { archifyStylePatch, inferComponentType, ARCHIFY_ARROW, variantEdgeStyle } from '../archify';\n\nimport {\n IconBack,\n IconUndo,\n IconRedo,\n IconGroup,\n IconGeoGroup,\n IconUngroup,\n IconAlign,\n IconZoomIn,\n IconZoomOut,\n IconFitView,\n IconAutoFocus,\n IconShapes,\n IconInspector,\n IconOutline,\n IconJson,\n IconAI,\n IconGrid,\n IconMagnet,\n IconMiniMap,\n IconImport,\n IconExportJson,\n IconExportPng,\n IconExportPdf,\n IconExportMarkdown,\n IconLayer,\n IconPublish,\n IconAnchorVisible,\n IconPresent,\n IconArchify,\n} from './toolbarIcons';\n\n/** Compact zoom / view controls floated over the bottom-left of the canvas. */\nexport function FlowZoomControls() {\n const { viewport, setViewport, autoFocus, setAutoFocus } = useFlowUI();\n const zoomPercent = Math.round(viewport.zoom * 100);\n\n const handleZoomIn = () => {\n setViewport({ ...viewport, zoom: Math.min(4, viewport.zoom * 1.2) });\n };\n const handleZoomOut = () => {\n setViewport({ ...viewport, zoom: Math.max(0.1, viewport.zoom / 1.2) });\n };\n const handleFitView = () => {\n setViewport({ x: 0, y: 0, zoom: 1 });\n };\n\n return (\n <div className=\"flow-zoom-controls\">\n <ToolButton tip=\"缩小\" onClick={handleZoomOut}>\n <IconZoomOut />\n </ToolButton>\n <span className=\"flow-zoom-info\">{zoomPercent}%</span>\n <ToolButton tip=\"放大\" onClick={handleZoomIn}>\n <IconZoomIn />\n </ToolButton>\n <ToolButton tip=\"适应视图\" onClick={handleFitView}>\n <IconFitView />\n </ToolButton>\n <ToolButton\n tip={autoFocus ? '关闭 Auto Focus' : '开启 Auto Focus'}\n active={autoFocus}\n onClick={() => setAutoFocus(!autoFocus)}\n >\n <IconAutoFocus />\n </ToolButton>\n </div>\n );\n}\n\n\n/** A toolbar button with an accessible, hover-revealed tooltip below it. */\ninterface ToolButtonProps {\n tip: string;\n shortcut?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction ToolButton({ tip, shortcut, onClick, active, disabled, children }: ToolButtonProps) {\n const label = shortcut ? `${tip} (${shortcut})` : tip;\n return (\n <span className=\"flow-tip\">\n <Button\n size=\"xs\"\n variant={active ? 'primary' : 'ghost'}\n onClick={onClick}\n disabled={disabled}\n square\n >\n <span aria-label={label} style={{ display: 'inline-flex' }}>{children}</span>\n </Button>\n <span className=\"flow-tip-label\" role=\"tooltip\">{label}</span>\n </span>\n );\n}\n\nexport interface FlowToolbarProps {\n onBack?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onGroup?: () => void;\n onGeoGroup?: () => void;\n onUngroup?: () => void;\n onExportPNG?: () => void | Promise<void>;\n /** Export anchors as a PDF slideshow from the built-in toolbar. */\n onExportPDF?: () => void | Promise<void>;\n onPublish?: () => void;\n /** Small-screen (container-width) layout: the title gets its own row and\n * button groups wrap below instead of sliding under the absolute title. */\n compact?: boolean;\n}\n\nexport default function FlowToolbar({ onBack, onUndo, onRedo, canUndo, canRedo, onGroup, onGeoGroup, onUngroup, onExportPNG, onExportPDF, onPublish, compact }: FlowToolbarProps) {\n const {\n showGrid, setShowGrid,\n showPalette, setShowPalette,\n showInspector, setShowInspector,\n showOutline, setShowOutline,\n showJson, setShowJson,\n showAI, setShowAI,\n showMiniMap, setShowMiniMap,\n showAnchors, setShowAnchors,\n presentation, setPresentation,\n placementSnap, setPlacementSnap,\n } = useFlowUI();\n const { doc, selection, currentCanvas, setDoc, currentCanvasId } = useFlowContext();\n const { exportJSON, importJSON, exportMarkdown } = useFlowImportExport();\n const { align, distribute, changeZIndex } = useLayoutActions();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const selTotalCount = selection.nodeIds.size + selection.lineIds.size;\n const hasGroupSelected = selection.nodeIds.size > 0 && currentCanvas.nodes.some(\n n => selection.nodeIds.has(n.id) && (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup),\n );\n const hasAnchors = Object.values(doc.canvases).some(canvas =>\n canvas.nodes.some(node => node.type === 'animAnchor'),\n );\n\n\n const handleExportJSON = useCallback(() => {\n const json = exportJSON();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.json`);\n URL.revokeObjectURL(url);\n }, [exportJSON, doc.title]);\n\n const handleExportMarkdown = useCallback(() => {\n const md = exportMarkdown();\n const blob = new Blob([md], { type: 'text/markdown' });\n const url = URL.createObjectURL(blob);\n downloadDataURL(url, `${safeFileBaseName(doc.title)}.md`);\n URL.revokeObjectURL(url);\n }, [exportMarkdown, doc.title]);\n\n const handleImportJSON = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n /**\n * Recolor the current canvas to the unified Archify style: every plain shape\n * node adopts its inferred semantic card colors, and every edge is restyled\n * by its arrow color. Content, geometry, and any sub-labels/tags are kept.\n */\n const handleApplyArchifyStyle = useCallback(() => {\n setDoc((prev) => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const nodes = canvas.nodes.map((n) => {\n if (n.type === 'animAnchor' || n.type === 'shapeSvg') return n;\n if (n.data.isGroup || n.type === 'flowGroup' || n.type === 'geometryGroup') return n;\n // Media nodes (including data charts) adopt the semantic card colors; the\n // chart's primary series color follows the node `color` at render time.\n return { ...n, data: { ...n.data, ...archifyStylePatch(inferComponentType(n.data)) } };\n });\n const edges = canvas.edges.map((e) => {\n const isEmphasis = e.data.strokeColor && e.data.strokeColor !== ARCHIFY_ARROW;\n const style = variantEdgeStyle(isEmphasis ? 'emphasis' : 'default');\n return {\n ...e,\n data: {\n ...e.data,\n strokeColor: e.data.strokeColor && e.data.strokeColor.startsWith('theme:')\n ? style.color\n : (e.data.strokeColor ?? style.color),\n },\n };\n });\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes, edges } },\n };\n });\n }, [setDoc, currentCanvasId]);\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === 'string') importJSON(reader.result);\n };\n reader.readAsText(file);\n e.target.value = '';\n }, [importJSON]);\n\n return (\n <div className={`flow-toolbar${compact ? ' flow-toolbar--compact' : ''}`}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n\n {/* Editable project title, anchored to the toolbar's left edge. Hidden\n in compact mode: the host app's header already shows the name, and\n the narrow toolbar needs the row for buttons. */}\n {!compact && <ProjectTitle />}\n\n {onBack && (\n <>\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"返回列表\" onClick={onBack}>\n <IconBack />\n </ToolButton>\n </div>\n <div className=\"flow-toolbar-divider\" />\n </>\n )}\n\n {/* 历史:撤销 / 重做 */}\n {(onUndo || onRedo) && (\n <div className=\"flow-toolbar-group\">\n {onUndo && (\n <ToolButton tip=\"撤销\" shortcut=\"Ctrl+Z\" onClick={onUndo} disabled={!canUndo}>\n <IconUndo />\n </ToolButton>\n )}\n {onRedo && (\n <ToolButton tip=\"重做\" shortcut=\"Ctrl+Shift+Z\" onClick={onRedo} disabled={!canRedo}>\n <IconRedo />\n </ToolButton>\n )}\n </div>\n )}\n\n {/* 排列:对齐 / 平分 */}\n {selection.nodeIds.size >= 2 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"居左\" onClick={() => align('left')}><IconAlign kind=\"left\" /></ToolButton>\n <ToolButton tip=\"水平居中\" onClick={() => align('center-h')}><IconAlign kind=\"center-h\" /></ToolButton>\n <ToolButton tip=\"居右\" onClick={() => align('right')}><IconAlign kind=\"right\" /></ToolButton>\n <ToolButton tip=\"居上\" onClick={() => align('top')}><IconAlign kind=\"top\" /></ToolButton>\n <ToolButton tip=\"垂直居中\" onClick={() => align('center-v')}><IconAlign kind=\"center-v\" /></ToolButton>\n <ToolButton tip=\"居下\" onClick={() => align('bottom')}><IconAlign kind=\"bottom\" /></ToolButton>\n <ToolButton tip=\"水平平分\" onClick={() => distribute('horizontal')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-h\" />\n </ToolButton>\n <ToolButton tip=\"垂直平分\" onClick={() => distribute('vertical')} disabled={selection.nodeIds.size < 3}>\n <IconAlign kind=\"distribute-v\" />\n </ToolButton>\n </div>\n </>\n )}\n\n {/* 图层:置顶 / 上移 / 下移 / 置底 */}\n {selTotalCount >= 1 && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"置于顶层\" onClick={() => changeZIndex('front')}><IconLayer kind=\"front\" /></ToolButton>\n <ToolButton tip=\"上移一层\" onClick={() => changeZIndex('up')}><IconLayer kind=\"up\" /></ToolButton>\n <ToolButton tip=\"下移一层\" onClick={() => changeZIndex('down')}><IconLayer kind=\"down\" /></ToolButton>\n <ToolButton tip=\"置于底层\" onClick={() => changeZIndex('back')}><IconLayer kind=\"back\" /></ToolButton>\n </div>\n </>\n )}\n\n {/* 组合:成组 / 几何分组 / 取消成组 */}\n {(onGroup || onGeoGroup || onUngroup) && (\n <>\n <div className=\"flow-toolbar-divider\" />\n <div className=\"flow-toolbar-group\">\n {onGroup && (\n <ToolButton tip=\"成组\" shortcut=\"⌘G\" onClick={onGroup} disabled={selTotalCount < 2}>\n <IconGroup />\n </ToolButton>\n )}\n {onGeoGroup && (\n <ToolButton tip=\"几何分组\" shortcut=\"⌘⌥G\" onClick={onGeoGroup} disabled={selTotalCount < 2}>\n <IconGeoGroup />\n </ToolButton>\n )}\n {onUngroup && (\n <ToolButton tip=\"取消成组\" shortcut=\"⌘⇧G\" onClick={onUngroup} disabled={!hasGroupSelected}>\n <IconUngroup />\n </ToolButton>\n )}\n </div>\n </>\n )}\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 视图:网格 / 缩略图 / Anchor / 动画预览 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"网格\" active={showGrid} onClick={() => setShowGrid(!showGrid)}>\n <IconGrid />\n </ToolButton>\n <ToolButton\n tip={placementSnap ? '放置吸附网格:开(盖章自动贴近网格)' : '放置吸附网格:关(自由放置)'}\n active={placementSnap}\n onClick={() => setPlacementSnap(!placementSnap)}\n >\n <IconMagnet />\n </ToolButton>\n <ToolButton tip=\"缩略图\" active={showMiniMap} onClick={() => setShowMiniMap(!showMiniMap)}>\n <IconMiniMap />\n </ToolButton>\n <ToolButton\n tip={showAnchors ? '隐藏所有 Anchor 对象' : '显示所有 Anchor 对象'}\n active={showAnchors}\n disabled={!hasAnchors}\n onClick={() => {\n if (hasAnchors) setShowAnchors(!showAnchors);\n }}\n >\n <IconAnchorVisible visible={showAnchors} />\n </ToolButton>\n <ToolButton\n tip=\"动画预览\"\n active={presentation !== null}\n onClick={() => setPresentation(presentation ? null : { current: 0, showAnchor: false })}\n >\n <IconPresent />\n </ToolButton>\n <ToolButton\n tip=\"应用 Archify 风格(当前画布)\"\n onClick={handleApplyArchifyStyle}\n >\n <IconArchify />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 面板:形状 / 属性 / 大纲 / JSON */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"形状面板\" active={showPalette} onClick={() => setShowPalette(!showPalette)}>\n <IconShapes />\n </ToolButton>\n <ToolButton tip=\"属性面板\" active={showInspector} onClick={() => setShowInspector(!showInspector)}>\n <IconInspector />\n </ToolButton>\n <ToolButton tip=\"大纲\" active={showOutline} onClick={() => setShowOutline(!showOutline)}>\n <IconOutline />\n </ToolButton>\n <ToolButton tip=\"JSON\" active={showJson} onClick={() => setShowJson(!showJson)}>\n <IconJson />\n </ToolButton>\n <ToolButton tip=\"AI 助手\" active={showAI} onClick={() => setShowAI(!showAI)}>\n <IconAI />\n </ToolButton>\n </div>\n\n <div className=\"flow-toolbar-divider\" />\n\n {/* 文件:导入 / 导出 / 发布 */}\n <div className=\"flow-toolbar-group\">\n <ToolButton tip=\"导入 JSON\" onClick={handleImportJSON}>\n <IconImport />\n </ToolButton>\n <ToolButton tip=\"导出 JSON\" onClick={handleExportJSON}>\n <IconExportJson />\n </ToolButton>\n <ToolButton tip=\"导出 Markdown\" onClick={handleExportMarkdown}>\n <IconExportMarkdown />\n </ToolButton>\n {onExportPNG && (\n <ToolButton tip=\"导出 PNG\" onClick={() => void onExportPNG()}>\n <IconExportPng />\n </ToolButton>\n )}\n {onExportPDF && hasAnchors && (\n <ToolButton tip=\"导出 PDF(按锦点顺序)\" onClick={() => void onExportPDF()}>\n <IconExportPdf />\n </ToolButton>\n )}\n {onPublish && (\n <ToolButton tip=\"发布与共享\" onClick={onPublish}>\n <IconPublish />\n </ToolButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -55,9 +55,9 @@ function Ue() {
|
|
|
55
55
|
}) : null;
|
|
56
56
|
}
|
|
57
57
|
function Ce() {
|
|
58
|
-
const { currentCanvas: l, selection: c, setSelection: a, setDoc: o, currentCanvasId: f } = ie(), m = A(() => l.nodes.filter((p) => c.nodeIds.has(p.id)), [l.nodes, c.nodeIds]), t = A(() => l.edges.filter((p) => c.edgeIds.has(p.id)), [l.edges, c.edgeIds]), r = A(() => l.lines.filter((p) => c.lineIds.has(p.id)), [l.lines, c.lineIds]), N = m.length > 0 || t.length > 0 || r.length > 0,
|
|
58
|
+
const { currentCanvas: l, selection: c, setSelection: a, setDoc: o, currentCanvasId: f } = ie(), m = A(() => l.nodes.filter((p) => c.nodeIds.has(p.id)), [l.nodes, c.nodeIds]), t = A(() => l.edges.filter((p) => c.edgeIds.has(p.id)), [l.edges, c.edgeIds]), r = A(() => l.lines.filter((p) => c.lineIds.has(p.id)), [l.lines, c.lineIds]), N = m.length > 0 || t.length > 0 || r.length > 0, v = m.length === 1 && (m[0].type === "flowGroup" || m[0].type === "geometryGroup" || m[0].data.isGroup), z = m.length + r.length, T = (p = "flowGroup") => {
|
|
59
59
|
if (z < 2) return;
|
|
60
|
-
const
|
|
60
|
+
const w = 20;
|
|
61
61
|
let h = 1 / 0, i = 1 / 0, d = -1 / 0, u = -1 / 0;
|
|
62
62
|
for (const S of m)
|
|
63
63
|
h = Math.min(h, S.position.x), i = Math.min(i, S.position.y), d = Math.max(d, S.position.x + S.width), u = Math.max(u, S.position.y + S.height);
|
|
@@ -67,11 +67,11 @@ function Ce() {
|
|
|
67
67
|
id: B,
|
|
68
68
|
type: p,
|
|
69
69
|
position: {
|
|
70
|
-
x: h -
|
|
71
|
-
y: i -
|
|
70
|
+
x: h - w,
|
|
71
|
+
y: i - w
|
|
72
72
|
},
|
|
73
|
-
width: d - h +
|
|
74
|
-
height: u - i +
|
|
73
|
+
width: d - h + 40,
|
|
74
|
+
height: u - i + 40,
|
|
75
75
|
data: {
|
|
76
76
|
...te,
|
|
77
77
|
label: M ? "Geo Group" : "Group",
|
|
@@ -107,10 +107,10 @@ function Ce() {
|
|
|
107
107
|
lineIds: /* @__PURE__ */ new Set()
|
|
108
108
|
});
|
|
109
109
|
}, Y = () => {
|
|
110
|
-
const p = /* @__PURE__ */ new Set(),
|
|
110
|
+
const p = /* @__PURE__ */ new Set(), w = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set();
|
|
111
111
|
for (const i of m) (i.type === "flowGroup" || i.type === "geometryGroup" || i.data.isGroup) && p.add(i.id);
|
|
112
112
|
if (p.size !== 0) {
|
|
113
|
-
for (const i of l.nodes) i.parentId && p.has(i.parentId) &&
|
|
113
|
+
for (const i of l.nodes) i.parentId && p.has(i.parentId) && w.add(i.id);
|
|
114
114
|
for (const i of l.lines) i.parentId && p.has(i.parentId) && h.add(i.id);
|
|
115
115
|
o((i) => {
|
|
116
116
|
const d = i.canvases[f];
|
|
@@ -120,7 +120,7 @@ function Ce() {
|
|
|
120
120
|
...i.canvases,
|
|
121
121
|
[f]: {
|
|
122
122
|
...d,
|
|
123
|
-
nodes: d.nodes.filter((u) => !p.has(u.id)).map((u) =>
|
|
123
|
+
nodes: d.nodes.filter((u) => !p.has(u.id)).map((u) => w.has(u.id) ? {
|
|
124
124
|
...u,
|
|
125
125
|
parentId: void 0
|
|
126
126
|
} : u),
|
|
@@ -132,18 +132,18 @@ function Ce() {
|
|
|
132
132
|
}
|
|
133
133
|
} : i;
|
|
134
134
|
}), a({
|
|
135
|
-
nodeIds:
|
|
135
|
+
nodeIds: w,
|
|
136
136
|
edgeIds: /* @__PURE__ */ new Set(),
|
|
137
137
|
lineIds: h
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
140
|
}, P = (p) => {
|
|
141
|
-
const
|
|
142
|
-
|
|
141
|
+
const w = c.nodeIds;
|
|
142
|
+
w.size !== 0 && o((h) => {
|
|
143
143
|
const i = h.canvases[f];
|
|
144
144
|
if (!i) return h;
|
|
145
145
|
const d = i.nodes.map((x) => x.zIndex ?? 0), u = d.length > 0 ? Math.max(...d) : 0, M = d.length > 0 ? Math.min(...d) : 0, B = i.nodes.map((x) => {
|
|
146
|
-
if (!
|
|
146
|
+
if (!w.has(x.id)) return x;
|
|
147
147
|
const F = x.zIndex ?? 0;
|
|
148
148
|
let C = F;
|
|
149
149
|
return p === "front" ? C = u + 1 : p === "back" ? C = M - 1 : p === "up" ? C = F + 1 : p === "down" && (C = F - 1), {
|
|
@@ -163,12 +163,12 @@ function Ce() {
|
|
|
163
163
|
};
|
|
164
164
|
});
|
|
165
165
|
}, L = (p) => {
|
|
166
|
-
const
|
|
167
|
-
|
|
166
|
+
const w = c.lineIds;
|
|
167
|
+
w.size !== 0 && o((h) => {
|
|
168
168
|
const i = h.canvases[f];
|
|
169
169
|
if (!i) return h;
|
|
170
170
|
const d = i.lines.map((x) => x.zIndex ?? 0), u = d.length > 0 ? Math.max(...d) : 0, M = d.length > 0 ? Math.min(...d) : 0, B = i.lines.map((x) => {
|
|
171
|
-
if (!
|
|
171
|
+
if (!w.has(x.id)) return x;
|
|
172
172
|
const F = x.zIndex ?? 0;
|
|
173
173
|
let C = F;
|
|
174
174
|
return p === "front" ? C = u + 1 : p === "back" ? C = M - 1 : p === "up" ? C = F + 1 : p === "down" && (C = F - 1), {
|
|
@@ -187,9 +187,9 @@ function Ce() {
|
|
|
187
187
|
}
|
|
188
188
|
};
|
|
189
189
|
});
|
|
190
|
-
}, k = (p,
|
|
191
|
-
X(p, { [
|
|
192
|
-
}, X = (p,
|
|
190
|
+
}, k = (p, w, h) => {
|
|
191
|
+
X(p, { [w]: h });
|
|
192
|
+
}, X = (p, w) => {
|
|
193
193
|
o((h) => {
|
|
194
194
|
const i = h.canvases[f];
|
|
195
195
|
return i ? {
|
|
@@ -202,14 +202,14 @@ function Ce() {
|
|
|
202
202
|
...d,
|
|
203
203
|
data: {
|
|
204
204
|
...d.data,
|
|
205
|
-
...
|
|
205
|
+
...w
|
|
206
206
|
}
|
|
207
207
|
} : d)
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
210
|
} : h;
|
|
211
211
|
});
|
|
212
|
-
}, q = (p,
|
|
212
|
+
}, q = (p, w, h) => {
|
|
213
213
|
o((i) => {
|
|
214
214
|
const d = i.canvases[f];
|
|
215
215
|
return d ? {
|
|
@@ -220,13 +220,13 @@ function Ce() {
|
|
|
220
220
|
...d,
|
|
221
221
|
nodes: d.nodes.map((u) => u.id === p ? {
|
|
222
222
|
...u,
|
|
223
|
-
[
|
|
223
|
+
[w]: h
|
|
224
224
|
} : u)
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
} : i;
|
|
228
228
|
});
|
|
229
|
-
}, Q = (p,
|
|
229
|
+
}, Q = (p, w, h) => {
|
|
230
230
|
o((i) => {
|
|
231
231
|
const d = i.canvases[f];
|
|
232
232
|
return d ? {
|
|
@@ -239,14 +239,14 @@ function Ce() {
|
|
|
239
239
|
...u,
|
|
240
240
|
data: {
|
|
241
241
|
...u.data,
|
|
242
|
-
[
|
|
242
|
+
[w]: h
|
|
243
243
|
}
|
|
244
244
|
} : u)
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
} : i;
|
|
248
248
|
});
|
|
249
|
-
}, D = (p,
|
|
249
|
+
}, D = (p, w) => {
|
|
250
250
|
o((h) => {
|
|
251
251
|
const i = h.canvases[f];
|
|
252
252
|
return i ? {
|
|
@@ -257,13 +257,13 @@ function Ce() {
|
|
|
257
257
|
...i,
|
|
258
258
|
nodes: i.nodes.map((d) => d.id === p ? {
|
|
259
259
|
...d,
|
|
260
|
-
type:
|
|
260
|
+
type: w
|
|
261
261
|
} : d)
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
264
|
} : h;
|
|
265
265
|
});
|
|
266
|
-
}, U = (p,
|
|
266
|
+
}, U = (p, w) => {
|
|
267
267
|
o((h) => {
|
|
268
268
|
const i = h.canvases[f];
|
|
269
269
|
return i ? {
|
|
@@ -274,13 +274,13 @@ function Ce() {
|
|
|
274
274
|
...i,
|
|
275
275
|
edges: i.edges.map((d) => d.id === p ? {
|
|
276
276
|
...d,
|
|
277
|
-
type:
|
|
277
|
+
type: w
|
|
278
278
|
} : d)
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
} : h;
|
|
282
282
|
});
|
|
283
|
-
}, ee = (p,
|
|
283
|
+
}, ee = (p, w, h) => {
|
|
284
284
|
o((i) => {
|
|
285
285
|
const d = i.canvases[f];
|
|
286
286
|
return d ? {
|
|
@@ -291,7 +291,7 @@ function Ce() {
|
|
|
291
291
|
...d,
|
|
292
292
|
lines: d.lines.map((u) => u.id === p ? {
|
|
293
293
|
...u,
|
|
294
|
-
[
|
|
294
|
+
[w]: h
|
|
295
295
|
} : u)
|
|
296
296
|
}
|
|
297
297
|
}
|
|
@@ -310,7 +310,7 @@ function Ce() {
|
|
|
310
310
|
}),
|
|
311
311
|
m.length === 1 && /* @__PURE__ */ e(Ie, {
|
|
312
312
|
node: m[0],
|
|
313
|
-
isGroup:
|
|
313
|
+
isGroup: v,
|
|
314
314
|
onUpdateData: k,
|
|
315
315
|
onUpdateDataBatch: X,
|
|
316
316
|
onUpdateDimension: q,
|
|
@@ -358,7 +358,7 @@ function Ce() {
|
|
|
358
358
|
})
|
|
359
359
|
]
|
|
360
360
|
}),
|
|
361
|
-
|
|
361
|
+
v && /* @__PURE__ */ s("div", {
|
|
362
362
|
className: "flow-inspector-section",
|
|
363
363
|
children: [
|
|
364
364
|
/* @__PURE__ */ e("div", {
|
|
@@ -493,7 +493,7 @@ function Ce() {
|
|
|
493
493
|
] });
|
|
494
494
|
}
|
|
495
495
|
function O({ value: l, onChange: c, kind: a, allowTransparent: o, customFallback: f = "#ffffff" }) {
|
|
496
|
-
const m = oe[a], t = ce(m) ?? "var(--color-base-content)", r = l ?? "", N = r.toLowerCase(),
|
|
496
|
+
const m = oe[a], t = ce(m) ?? "var(--color-base-content)", r = l ?? "", N = r.toLowerCase(), v = ne(r), z = r === "transparent", T = H.some((k) => k.value.toLowerCase() === N), Y = r === m, P = !!r && !v && !z && !T, L = P ? r : f;
|
|
497
497
|
return /* @__PURE__ */ s("div", {
|
|
498
498
|
className: "flow-color-field",
|
|
499
499
|
children: [
|
|
@@ -510,7 +510,7 @@ function O({ value: l, onChange: c, kind: a, allowTransparent: o, customFallback
|
|
|
510
510
|
type: "button",
|
|
511
511
|
title: k.label,
|
|
512
512
|
"aria-label": k.label,
|
|
513
|
-
className: `flow-color-swatch${!
|
|
513
|
+
className: `flow-color-swatch${!v && !z && N === k.value.toLowerCase() ? " is-active" : ""}`,
|
|
514
514
|
style: { background: k.value },
|
|
515
515
|
onClick: () => c(k.value)
|
|
516
516
|
}, k.value)),
|
|
@@ -536,8 +536,8 @@ function O({ value: l, onChange: c, kind: a, allowTransparent: o, customFallback
|
|
|
536
536
|
});
|
|
537
537
|
}
|
|
538
538
|
function Se(l) {
|
|
539
|
-
const c =
|
|
540
|
-
return
|
|
539
|
+
const c = $(l), a = re(c?.brandColor, "") || "#475569", o = ue(l, a);
|
|
540
|
+
return o ? `data:image/svg+xml;utf8,${encodeURIComponent(o)}` : "";
|
|
541
541
|
}
|
|
542
542
|
function ke({ node: l, onUpdateData: c }) {
|
|
543
543
|
const [a, o] = ze("lang"), f = A(() => we(a), [a]), m = l.data.titleIcon ?? "", t = l.data.titleIconSide ?? "left";
|
|
@@ -607,7 +607,7 @@ function ke({ node: l, onUpdateData: c }) {
|
|
|
607
607
|
marginBottom: 6
|
|
608
608
|
},
|
|
609
609
|
children: f.map((r) => {
|
|
610
|
-
const N = Se(r.id),
|
|
610
|
+
const N = Se(r.id), v = m === r.id;
|
|
611
611
|
return /* @__PURE__ */ e("button", {
|
|
612
612
|
type: "button",
|
|
613
613
|
title: r.label,
|
|
@@ -622,8 +622,8 @@ function ke({ node: l, onUpdateData: c }) {
|
|
|
622
622
|
borderRadius: 4,
|
|
623
623
|
cursor: "pointer",
|
|
624
624
|
padding: 0,
|
|
625
|
-
border:
|
|
626
|
-
background:
|
|
625
|
+
border: v ? "1.5px solid var(--color-primary)" : "1px solid transparent",
|
|
626
|
+
background: v ? "color-mix(in oklch, var(--color-primary) 12%, transparent)" : "transparent"
|
|
627
627
|
},
|
|
628
628
|
children: N && /* @__PURE__ */ e("img", {
|
|
629
629
|
src: N,
|
|
@@ -942,11 +942,11 @@ function Ie({ node: l, isGroup: c, onUpdateData: a, onUpdateDataBatch: o, onUpda
|
|
|
942
942
|
})]
|
|
943
943
|
}),
|
|
944
944
|
he.has(l.type) && (() => {
|
|
945
|
-
const t = l.data.borderSides ?? {}, r = (
|
|
945
|
+
const t = l.data.borderSides ?? {}, r = (v, z) => {
|
|
946
946
|
a(l.id, "borderSides", {
|
|
947
947
|
...l.data.borderSides ?? {},
|
|
948
|
-
[
|
|
949
|
-
...l.data.borderSides?.[
|
|
948
|
+
[v]: {
|
|
949
|
+
...l.data.borderSides?.[v] ?? {},
|
|
950
950
|
...z
|
|
951
951
|
}
|
|
952
952
|
});
|
|
@@ -986,8 +986,8 @@ function Ie({ node: l, isGroup: c, onUpdateData: a, onUpdateDataBatch: o, onUpda
|
|
|
986
986
|
})
|
|
987
987
|
})]
|
|
988
988
|
})]
|
|
989
|
-
}), de.map((
|
|
990
|
-
const z = t[
|
|
989
|
+
}), de.map((v) => {
|
|
990
|
+
const z = t[v];
|
|
991
991
|
return /* @__PURE__ */ s("div", {
|
|
992
992
|
style: {
|
|
993
993
|
display: "flex",
|
|
@@ -997,32 +997,32 @@ function Ie({ node: l, isGroup: c, onUpdateData: a, onUpdateDataBatch: o, onUpda
|
|
|
997
997
|
},
|
|
998
998
|
children: [
|
|
999
999
|
/* @__PURE__ */ e("span", {
|
|
1000
|
-
title: `独立设置${N[
|
|
1000
|
+
title: `独立设置${N[v]}边`,
|
|
1001
1001
|
style: {
|
|
1002
1002
|
fontSize: 10,
|
|
1003
1003
|
width: 40,
|
|
1004
1004
|
flexShrink: 0,
|
|
1005
1005
|
opacity: z ? 0.95 : 0.6
|
|
1006
1006
|
},
|
|
1007
|
-
children: N[
|
|
1007
|
+
children: N[v]
|
|
1008
1008
|
}),
|
|
1009
1009
|
/* @__PURE__ */ e("span", {
|
|
1010
|
-
title: `显示/隐藏 ${N[
|
|
1010
|
+
title: `显示/隐藏 ${N[v]} 边`,
|
|
1011
1011
|
style: { display: "inline-flex" },
|
|
1012
1012
|
children: /* @__PURE__ */ e(W, {
|
|
1013
1013
|
size: "sm",
|
|
1014
1014
|
checked: z?.visible ?? !0,
|
|
1015
|
-
onChange: (T) => r(
|
|
1015
|
+
onChange: (T) => r(v, { visible: T })
|
|
1016
1016
|
})
|
|
1017
1017
|
}),
|
|
1018
1018
|
/* @__PURE__ */ e(O, {
|
|
1019
1019
|
value: z?.color ?? l.data.stroke,
|
|
1020
1020
|
kind: "stroke",
|
|
1021
1021
|
customFallback: "#334155",
|
|
1022
|
-
onChange: (T) => r(
|
|
1022
|
+
onChange: (T) => r(v, { color: T })
|
|
1023
1023
|
}),
|
|
1024
1024
|
/* @__PURE__ */ e("span", {
|
|
1025
|
-
title: `${N[
|
|
1025
|
+
title: `${N[v]} 粗细`,
|
|
1026
1026
|
style: {
|
|
1027
1027
|
display: "inline-flex",
|
|
1028
1028
|
width: 52
|
|
@@ -1031,11 +1031,11 @@ function Ie({ node: l, isGroup: c, onUpdateData: a, onUpdateDataBatch: o, onUpda
|
|
|
1031
1031
|
size: "xs",
|
|
1032
1032
|
type: "number",
|
|
1033
1033
|
value: String(z?.width ?? l.data.strokeWidth),
|
|
1034
|
-
onChange: (T) => r(
|
|
1034
|
+
onChange: (T) => r(v, { width: Math.max(0, Number(T.target.value) || 0) })
|
|
1035
1035
|
})
|
|
1036
1036
|
})
|
|
1037
1037
|
]
|
|
1038
|
-
},
|
|
1038
|
+
}, v);
|
|
1039
1039
|
})] });
|
|
1040
1040
|
})(),
|
|
1041
1041
|
l.type === "shapeSvg" && /* @__PURE__ */ s(E, { children: [
|
|
@@ -1460,7 +1460,7 @@ function Te({ node: l, onUpdateData: c }) {
|
|
|
1460
1460
|
onChange: (t) => {
|
|
1461
1461
|
const r = t.target.files?.[0];
|
|
1462
1462
|
if (t.target.value = "", !r) return;
|
|
1463
|
-
if (r.size >
|
|
1463
|
+
if (r.size > 10485760) {
|
|
1464
1464
|
window.alert("本地模型不能超过 10 MiB,请改用模型链接。");
|
|
1465
1465
|
return;
|
|
1466
1466
|
}
|
|
@@ -1469,10 +1469,10 @@ function Te({ node: l, onUpdateData: c }) {
|
|
|
1469
1469
|
window.alert("仅支持 STL、OBJ 和 3MF 模型。");
|
|
1470
1470
|
return;
|
|
1471
1471
|
}
|
|
1472
|
-
const
|
|
1473
|
-
|
|
1474
|
-
typeof
|
|
1475
|
-
},
|
|
1472
|
+
const v = new FileReader();
|
|
1473
|
+
v.onload = () => {
|
|
1474
|
+
typeof v.result == "string" && (c(l.id, "modelFormat", N), c(l.id, "mediaContent", v.result));
|
|
1475
|
+
}, v.onerror = () => window.alert("读取本地模型失败。"), v.readAsDataURL(r);
|
|
1476
1476
|
}
|
|
1477
1477
|
}),
|
|
1478
1478
|
/* @__PURE__ */ e(g, {
|