dishui 0.0.106 → 0.0.110
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/.release-verified.json +3 -2
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonMenu/index.js.map +1 -1
- package/dist/components/Card/Metric2.js.map +1 -1
- package/dist/components/Card/Ticket2.js.map +1 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.js.map +1 -1
- package/dist/components/Column/index.js.map +1 -1
- package/dist/components/ConfirmDialog/index.js.map +1 -1
- package/dist/components/DateTimeInput/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Demo/source.js.map +1 -1
- package/dist/components/Divider/index.js.map +1 -1
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Field/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/GroupButton/index.js.map +1 -1
- package/dist/components/GroupedTable/index.js.map +1 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/focusScope.js.map +1 -1
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.js.map +1 -1
- package/dist/components/NavigationList/index.js.map +1 -1
- package/dist/components/Page/Float2.js.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/Page/resize2.js.map +1 -1
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/PagePanel/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Resizable/ResizeGrip.js.map +1 -1
- package/dist/components/Resizable/index.js.map +1 -1
- package/dist/components/Resizable/useResize.js.map +1 -1
- package/dist/components/Row/index.js.map +1 -1
- package/dist/components/Section/index.js.map +1 -1
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Switch/index.js.map +1 -1
- package/dist/components/Tab/index.js.map +1 -1
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tabs/tabNavigation.js.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/ai/AgentChat/index.js.map +1 -1
- package/dist/components/ai/AgentRunCard/index.js.map +1 -1
- package/dist/components/ai/AgentScreen/index.js.map +1 -1
- package/dist/components/ai/ApprovalCard/index.js.map +1 -1
- package/dist/components/ai/CodeView/index.js.map +1 -1
- package/dist/components/ai/CommandSearch/index.js.map +1 -1
- package/dist/components/ai/ContextCards/index.js.map +1 -1
- package/dist/components/ai/DiffTable/index.js.map +1 -1
- package/dist/components/ai/FilterTable/index.js.map +1 -1
- package/dist/components/ai/FineTuneCard/index.js.map +1 -1
- package/dist/components/ai/InsightCards/index.js.map +1 -1
- package/dist/components/ai/IssueCard/index.js.map +1 -1
- package/dist/components/ai/LoadingState/index.js.map +1 -1
- package/dist/components/ai/PromptBar/index.js.map +1 -1
- package/dist/components/ai/RecommendationCard/index.js.map +1 -1
- package/dist/components/ai/RecordsTable/index.js.map +1 -1
- package/dist/components/ai/SelectionActions/index.js.map +1 -1
- package/dist/components/ai/StateFlow/index.js.map +1 -1
- package/dist/components/ai/StreamingText/index.js.map +1 -1
- package/dist/components/ai/TaskRows/index.js.map +1 -1
- package/dist/components/ai/Thinking/index.js.map +1 -1
- package/dist/components/ai/ToolChips/index.js.map +1 -1
- package/dist/components/ai/shared.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/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.js +165 -160
- package/dist/components/pro/Calendar/Calendar.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
- package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
- package/dist/components/pro/Calendar/utils.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
- 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.map +1 -1
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- 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.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/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.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.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- 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.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.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- 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/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- 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.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.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.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- 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.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
- package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
- package/dist/components/pro/Gantt/utils.js.map +1 -1
- package/dist/components/pro/Kanban/Kanban.js.map +1 -1
- package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
- package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
- package/dist/components/pro/Kanban/utils.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.d.ts +1 -0
- package/dist/components/pro/RichTextEditor/AIRewrite.js +109 -88
- 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 +133 -132
- 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/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.d.ts +2 -0
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Molly/animations.js +52 -0
- package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Molly/events.js +46 -0
- package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Molly/index.js +12 -0
- package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Molly/model.js +614 -0
- package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
- package/dist/components/pro/Sprite/Molly/rig.js +102 -0
- package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
- package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Ruby/events.js +46 -0
- package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Ruby/index.js +12 -0
- package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Ruby/model.js +605 -0
- package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
- package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
- package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
- package/dist/components/pro/Sprite/Sprite2.js +224 -0
- package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
- package/dist/components/pro/Sprite/actions.d.ts +3 -0
- package/dist/components/pro/Sprite/actions.js +16 -0
- package/dist/components/pro/Sprite/actions.js.map +1 -0
- package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
- package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
- package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
- package/dist/components/pro/Sprite/index.d.ts +4 -0
- package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
- package/dist/components/pro/Sprite/shared/animation.js +39 -0
- package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
- package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/events.js +21 -0
- package/dist/components/pro/Sprite/shared/events.js.map +1 -0
- package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/face.js +33 -0
- package/dist/components/pro/Sprite/shared/face.js.map +1 -0
- package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
- package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/gait.js +19 -0
- package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
- package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/geometry.js +59 -0
- package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
- package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
- package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/playback.js +74 -0
- package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
- package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/rig.js +48 -0
- package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
- package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
- package/dist/components/pro/Sprite/shared/scene.js +21 -0
- package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
- package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
- package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
- package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
- package/dist/components/pro/Sprite/types.d.ts +40 -0
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.js.map +1 -1
- package/dist/data-table.js +3 -3
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -115
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- 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.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/sprite.js +2 -0
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/flexLayout.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.js.map +1 -1
- package/dist/utils/selection.js +29 -20
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +15 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresentationMode.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/PresentationMode.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { getDocumentSlides, anchorFocusRect, canvasStackTo } from '../nodes/animAnchors';\n\n/**\n * PPT-style presentation mode.\n *\n * While active the editor is read-only (all panels/toolbars are hidden) and the\n * viewport animates between animation anchors (slides). Anchors across the whole\n * document — including nested sub-canvases — share a single sequence, ordered by\n * stable creation index. Navigating to a slide on another canvas drills into or\n * out of that canvas before focusing the slide.\n *\n * Keys: →/↓/Space/PageDown = next, ←/↑/Shift+Space/PageUp = previous, Esc = exit.\n */\nexport function PresentationMode() {\n const { doc, setDoc, currentCanvasId } = useFlowContext();\n const { presentation, setPresentation, focusOnRect } = useFlowUI();\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const slides = useMemo(() => getDocumentSlides(doc), [doc]);\n const count = slides.length;\n const active = presentation !== null;\n const current = presentation?.current ?? 0;\n const [transition, setTransition] = useState<'in' | 'out' | null>(null);\n\n const docRef = useRef(doc);\n docRef.current = doc;\n\n const exit = useCallback(() => {\n setPresentation(null);\n if (document.fullscreenElement) void document.exitFullscreen().catch(() => {});\n }, [setPresentation]);\n\n const enterFullscreen = useCallback(() => {\n const root = overlayRef.current?.closest('.flow-container') as HTMLElement | null;\n if (root && !document.fullscreenElement) {\n void root.requestFullscreen().catch(() => {});\n }\n }, []);\n\n const goTo = useCallback(\n (index: number) => {\n if (count === 0) return;\n const clamped = Math.max(0, Math.min(count - 1, index));\n setPresentation({\n current: clamped,\n showAnchor: presentation?.showAnchor ?? false,\n });\n const slide = slides[clamped];\n if (!slide) return;\n\n const d = docRef.current;\n const stack = canvasStackTo(d, slide.canvasId);\n\n // Decide drill direction by comparing with the current stack top.\n const onCurrentCanvas = slide.canvasId === currentCanvasId;\n if (!onCurrentCanvas && stack) {\n const deeper = stack.length > d.stack.length;\n setTransition(deeper ? 'in' : 'out');\n // Navigate the canvas stack to the slide's canvas.\n setDoc((prev) => ({ ...prev, stack }));\n // Clear the transition marker shortly after it starts.\n window.setTimeout(() => setTransition(null), 480);\n }\n\n const r = anchorFocusRect(slide.node);\n // Presentation uses the exact anchor frame with only a small screen-space\n // inset. The zoom is recomputed for every slide and viewport size.\n window.setTimeout(\n () => focusOnRect(r.x, r.y, r.w, r.h, { padding: 8, maxZoom: 4, duration: 350 }),\n onCurrentCanvas ? 0 : 30,\n );\n },\n [slides, count, presentation?.showAnchor, setPresentation, focusOnRect, currentCanvasId, setDoc],\n );\n\n // Entering: use the full display area and snap to the first slide. Refit once\n // fullscreen settles because the canvas dimensions change asynchronously.\n useEffect(() => {\n if (!active) return;\n enterFullscreen();\n if (count > 0) {\n goTo(current);\n const timer = window.setTimeout(() => goTo(current), 180);\n return () => window.clearTimeout(timer);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n\n\n // Keyboard navigation (capture phase so arrows work over the canvas).\n useEffect(() => {\n if (!active) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n exit();\n return;\n }\n const next = ['ArrowRight', 'ArrowDown', 'PageDown', ' '];\n const prev = ['ArrowLeft', 'ArrowUp', 'PageUp'];\n if (next.includes(e.key)) {\n e.preventDefault();\n if (e.key === ' ' && e.shiftKey) goTo(current - 1);\n else goTo(current + 1);\n } else if (prev.includes(e.key)) {\n e.preventDefault();\n goTo(current - 1);\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [active, current, goTo, exit]);\n\n if (!active) return null;\n\n const cls = transition ? `flow-presentation--${transition}` : '';\n return (\n <div ref={overlayRef} className={`flow-presentation ${cls}`} onClick={exit}>\n <div className=\"flow-presentation-slide-fx\" style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }} />\n {count === 0 ? (\n <div className=\"flow-presentation-empty\">画布中没有动画锚点,点击退出</div>\n ) : (\n <div className=\"flow-presentation-hud\" onClick={(e) => e.stopPropagation()}>\n <span className=\"flow-presentation-counter\">\n {current + 1} / {count}\n </span>\n <div className=\"flow-presentation-nav\">\n <button type=\"button\" onClick={() => goTo(current - 1)} disabled={current <= 0}>‹ 上一张</button>\n <button type=\"button\" onClick={() => goTo(current + 1)} disabled={current >= count - 1}>下一张 ›</button>\n <button\n type=\"button\"\n onClick={() => setPresentation({\n current,\n showAnchor: !(presentation?.showAnchor ?? false),\n })}\n >\n {presentation?.showAnchor ? '隐藏锚点' : '显示锚点'}\n </button>\n <button type=\"button\" className=\"flow-presentation-exit\" onClick={exit}>退出 Esc</button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"PresentationMode.js","names":["PresentationMode","useFlowContext","useFlowUI","overlayRef","useRef","slides","useMemo","getDocumentSlides","doc","count","active","presentation","current","transition","setTransition","useState","docRef","exit","useCallback","setPresentation","enterFullscreen","root","goTo","clamped","index","slide","d","stack","canvasStackTo","onCurrentCanvas","currentCanvasId","deeper","setDoc","prev","r","anchorFocusRect","focusOnRect","useEffect","timer","onKey","cls"],"sources":["../../../../../src/components/pro/Flow/panels/PresentationMode.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { getDocumentSlides, anchorFocusRect, canvasStackTo } from '../nodes/animAnchors';\n\n/**\n * PPT-style presentation mode.\n *\n * While active the editor is read-only (all panels/toolbars are hidden) and the\n * viewport animates between animation anchors (slides). Anchors across the whole\n * document — including nested sub-canvases — share a single sequence, ordered by\n * stable creation index. Navigating to a slide on another canvas drills into or\n * out of that canvas before focusing the slide.\n *\n * Keys: →/↓/Space/PageDown = next, ←/↑/Shift+Space/PageUp = previous, Esc = exit.\n */\nexport function PresentationMode() {\n const { doc, setDoc, currentCanvasId } = useFlowContext();\n const { presentation, setPresentation, focusOnRect } = useFlowUI();\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const slides = useMemo(() => getDocumentSlides(doc), [doc]);\n const count = slides.length;\n const active = presentation !== null;\n const current = presentation?.current ?? 0;\n const [transition, setTransition] = useState<'in' | 'out' | null>(null);\n\n const docRef = useRef(doc);\n docRef.current = doc;\n\n const exit = useCallback(() => {\n setPresentation(null);\n if (document.fullscreenElement) void document.exitFullscreen().catch(() => {});\n }, [setPresentation]);\n\n const enterFullscreen = useCallback(() => {\n const root = overlayRef.current?.closest('.flow-container') as HTMLElement | null;\n if (root && !document.fullscreenElement) {\n void root.requestFullscreen().catch(() => {});\n }\n }, []);\n\n const goTo = useCallback(\n (index: number) => {\n if (count === 0) return;\n const clamped = Math.max(0, Math.min(count - 1, index));\n setPresentation({\n current: clamped,\n showAnchor: presentation?.showAnchor ?? false,\n });\n const slide = slides[clamped];\n if (!slide) return;\n\n const d = docRef.current;\n const stack = canvasStackTo(d, slide.canvasId);\n\n // Decide drill direction by comparing with the current stack top.\n const onCurrentCanvas = slide.canvasId === currentCanvasId;\n if (!onCurrentCanvas && stack) {\n const deeper = stack.length > d.stack.length;\n setTransition(deeper ? 'in' : 'out');\n // Navigate the canvas stack to the slide's canvas.\n setDoc((prev) => ({ ...prev, stack }));\n // Clear the transition marker shortly after it starts.\n window.setTimeout(() => setTransition(null), 480);\n }\n\n const r = anchorFocusRect(slide.node);\n // Presentation uses the exact anchor frame with only a small screen-space\n // inset. The zoom is recomputed for every slide and viewport size.\n window.setTimeout(\n () => focusOnRect(r.x, r.y, r.w, r.h, { padding: 8, maxZoom: 4, duration: 350 }),\n onCurrentCanvas ? 0 : 30,\n );\n },\n [slides, count, presentation?.showAnchor, setPresentation, focusOnRect, currentCanvasId, setDoc],\n );\n\n // Entering: use the full display area and snap to the first slide. Refit once\n // fullscreen settles because the canvas dimensions change asynchronously.\n useEffect(() => {\n if (!active) return;\n enterFullscreen();\n if (count > 0) {\n goTo(current);\n const timer = window.setTimeout(() => goTo(current), 180);\n return () => window.clearTimeout(timer);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n\n\n // Keyboard navigation (capture phase so arrows work over the canvas).\n useEffect(() => {\n if (!active) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n exit();\n return;\n }\n const next = ['ArrowRight', 'ArrowDown', 'PageDown', ' '];\n const prev = ['ArrowLeft', 'ArrowUp', 'PageUp'];\n if (next.includes(e.key)) {\n e.preventDefault();\n if (e.key === ' ' && e.shiftKey) goTo(current - 1);\n else goTo(current + 1);\n } else if (prev.includes(e.key)) {\n e.preventDefault();\n goTo(current - 1);\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [active, current, goTo, exit]);\n\n if (!active) return null;\n\n const cls = transition ? `flow-presentation--${transition}` : '';\n return (\n <div ref={overlayRef} className={`flow-presentation ${cls}`} onClick={exit}>\n <div className=\"flow-presentation-slide-fx\" style={{ position: 'absolute', inset: 0, pointerEvents: 'none' }} />\n {count === 0 ? (\n <div className=\"flow-presentation-empty\">画布中没有动画锚点,点击退出</div>\n ) : (\n <div className=\"flow-presentation-hud\" onClick={(e) => e.stopPropagation()}>\n <span className=\"flow-presentation-counter\">\n {current + 1} / {count}\n </span>\n <div className=\"flow-presentation-nav\">\n <button type=\"button\" onClick={() => goTo(current - 1)} disabled={current <= 0}>‹ 上一张</button>\n <button type=\"button\" onClick={() => goTo(current + 1)} disabled={current >= count - 1}>下一张 ›</button>\n <button\n type=\"button\"\n onClick={() => setPresentation({\n current,\n showAnchor: !(presentation?.showAnchor ?? false),\n })}\n >\n {presentation?.showAnchor ? '隐藏锚点' : '显示锚点'}\n </button>\n <button type=\"button\" className=\"flow-presentation-exit\" onClick={exit}>退出 Esc</button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"ProjectTitle.js","names":["DEFAULT_TITLE","ProjectTitle","useFlowContext","editing","setEditing","useState","draft","setDraft","doc","inputRef","useRef","useEffect","el","commit","next","setDoc","prev","cancel"],"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,IAAMA,IAAgB;AAQtB,SAAwBC,IAAe;CACrC,IAAM,EAAE,QAAK,cAAWC,EAAe,GACjC,CAACC,GAASC,KAAcC,EAAS,EAAK,GACtC,CAACC,GAAOC,KAAYF,EAASG,EAAI,SAAS,EAAE,GAC5CC,IAAWC,EAAyB,IAAI;CAQ9C,AAJAC,QAAgB;EACd,AAAKR,KAASI,EAASC,EAAI,SAAS,EAAE;CACxC,GAAG,CAACA,EAAI,OAAOL,CAAO,CAAC,GAEvBQ,QAAgB;EACd,IAAIR,GAAS;GACX,IAAMS,IAAKH,EAAS;GAEpB,AADAG,GAAI,MAAM,GACVA,GAAI,OAAO;EACb;CACF,GAAG,CAACT,CAAO,CAAC;CAEZ,IAAMU,UAAe;EACnB,IAAMC,IAAOR,EAAM,KAAK;EAExB,AADAF,EAAW,EAAK,GAChBW,GAAQ,OAAU;GAAE,GAAGC;GAAM,OAAOF,KAAQ,KAAA;EAAU,EAAE;CAC1D,GAEMG,UAAe;EAEnB,AADAV,EAASC,EAAI,SAAS,EAAE,GACxBJ,EAAW,EAAK;CAClB;CAEA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAqB,OAAM;EACxC,UAAA,kBAAC,SAAD;GACE,KAAKK;GACL,WAAW,2BAA2BN,IAAU,uCAAuC;GACvF,OAAOA,IAAUG,IAASE,EAAI,SAAS;GACvC,aAAaR;GACb,UAAU,CAACG;GACX,qBAAqBC,EAAW,EAAI;GACpC,WAAW,MAAMG,EAAS,EAAE,OAAO,KAAK;GACxC,cAAc;IAAE,AAAIJ,KAASU,EAAO;GAAG;GACvC,YAAY,MAAM;IAChB,AAAI,EAAE,QAAQ,WAAW,EAAE,eAAe,GAAGA,EAAO,KAC3C,EAAE,QAAQ,aAAY,EAAE,eAAe,GAAGI,EAAO;GAC5D;GACA,YAAY;EACb,CAAA;CACE,CAAA;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShapePalette.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ShapePalette.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PALETTE_ITEMS } from '../constants';\nimport type { FlowShapeType, FlowNodeData, FlowToolMode } from '../types';\nimport { SVG_ICON_CATEGORIES, getSvgIconsByCategory, getSvgIcon, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport type { FlowMediaKind } from '../types';\nimport { makeStarterDataConfig } from '../nodes/dataUtils';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nconst LINE_TOOL_ITEMS: Array<{ mode: FlowToolMode; label: string }> = [\n { mode: 'freehand', label: 'Freehand' },\n { mode: 'line', label: 'Line' },\n { mode: 'polyline', label: 'Polyline' },\n { mode: 'arrow', label: 'Arrow' },\n];\n\n/**\n * Standalone panel (legacy). Prefer using ShapePaletteContent inside a FlowPanelGroup.\n */\nexport default function ShapePalette() {\n const { showPalette } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('right', 180);\n\n if (!showPalette) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--right\" {...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 Shapes\n </div>\n <div className=\"flow-palette-content\">\n <ShapePaletteContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function ShapePaletteContent() {\n const { toolMode, setToolMode, setPendingPlacement, pendingPlacement } = useFlowUI();\n\n const handleAddShape = useCallback(\n (type: FlowShapeType, width: number, height: number, data: FlowNodeData) => {\n if (pendingPlacement?.type === type) {\n setPendingPlacement(null);\n } else {\n setPendingPlacement({ type, width, height, data: { ...data } });\n setToolMode('select');\n }\n },\n [setPendingPlacement, setToolMode, pendingPlacement],\n );\n\n return (\n <>\n <div className=\"flow-palette-grid\">\n {PALETTE_ITEMS.map((item) => (\n <div\n key={item.type}\n className={`flow-palette-item${pendingPlacement?.type === item.type ? ' flow-palette-item--active' : ''}`}\n onClick={() => handleAddShape(item.type, item.width, item.height, item.data)}\n >\n <PaletteThumbnail type={item.type} />\n <span className=\"flow-palette-item-label\">{item.data.label}</span>\n </div>\n ))}\n </div>\n\n <SectionHeader>Lines</SectionHeader>\n <div className=\"flow-palette-grid\">\n {LINE_TOOL_ITEMS.map((item) => (\n <div\n key={item.mode}\n className={`flow-palette-item${toolMode === item.mode ? ' flow-palette-item--active' : ''}`}\n onClick={() => { setPendingPlacement(null); setToolMode(toolMode === item.mode ? 'select' : item.mode); }}\n >\n <LineToolThumbnail mode={item.mode} />\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n\n/** SVG icon stamps, grouped by category with a collapsible header per group. */\nexport function SvgStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n const [open, setOpen] = useState<Record<string, boolean>>({ lang: true });\n\n const stampIcon = useCallback((svgId: string, label: string) => {\n const activeId = pendingPlacement?.data.svgId;\n if (pendingPlacement?.type === 'shapeSvg' && activeId === svgId) {\n setPendingPlacement(null);\n return;\n }\n // Brand icons (e.g. language logos) keep their authentic brand color; generic\n // outline icons follow the theme font color so they stay visible on any theme.\n const iconDef = getSvgIcon(svgId);\n const iconColor = iconDef?.brandColor ?? 'theme:base-content';\n const data: FlowNodeData = {\n label,\n fill: 'transparent',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: iconColor,\n labelColor: 'theme:base-content',\n fontSize: 12,\n svgId,\n iconBox: false,\n labelPlacement: 'bottom',\n borderStyle: 'none',\n };\n setPendingPlacement({ type: 'shapeSvg', width: 56, height: 56, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <>\n {SVG_ICON_CATEGORIES.map((cat) => {\n const icons = getSvgIconsByCategory(cat.id as SvgIconCategory);\n const isOpen = open[cat.id];\n return (\n <div key={cat.id}>\n <button\n type=\"button\"\n className=\"flow-palette-section-toggle\"\n onClick={() => setOpen((o) => ({ ...o, [cat.id]: !o[cat.id] }))}\n >\n <span style={{ transform: isOpen ? 'rotate(90deg)' : 'none', transition: 'transform .15s' }}>▸</span>\n {cat.label}\n </button>\n {isOpen && (\n <div className=\"flow-palette-grid\">\n {icons.map((ic) => (\n <div\n key={ic.id}\n className={`flow-palette-item${pendingPlacement?.type === 'shapeSvg' && pendingPlacement.data.svgId === ic.id ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampIcon(ic.id, ic.label)}\n title={ic.label}\n >\n <SvgThumbnail id={ic.id} />\n <span className=\"flow-palette-item-label\">{ic.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/** Renders an SVG icon as an <img> (data URL) so it displays in the correct\n * SVG namespace, unlike dangerouslySetInnerHTML on an <svg> element. Brand icons\n * use their authentic brand color; generic outline icons fall back to a neutral\n * gray so the thumbnail matches how the icon looks once placed. */\nfunction SvgThumbnail({ id }: { id: string }) {\n const def = getSvgIcon(id);\n // brandColor may be a `theme:*` token (icons that follow the theme); resolve\n // it to a concrete color for the rasterized data URL.\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n if (!markup) return null;\n const url = `data:image/svg+xml;utf8,${encodeURIComponent(markup)}`;\n return <img src={url} width={20} height={16} alt=\"\" style={{ objectFit: 'contain' }} />;\n}\n\n/** Multimedia stamps: rich DOM-rendered nodes (markdown/html/mermaid/math/image/3D/AI). */\nconst MEDIA_ITEMS: Array<{\n kind: FlowMediaKind;\n label: string;\n width: number;\n height: number;\n content: string;\n icon: React.ReactNode;\n}> = [\n {\n kind: 'markdown', label: 'Markdown', width: 260, height: 180,\n content: '# 标题\\n\\n- 支持 **GFM**\\n- 支持 `代码`\\n\\n> 引用文本',\n icon: <MediaGlyph text={'M↓'} />,\n },\n {\n kind: 'html', label: 'HTML', width: 260, height: 180,\n content: '<div style=\"font-family:sans-serif;padding:12px\">\\n <h3>Hello</h3>\\n <p>可编辑的 HTML 片段</p>\\n</div>',\n icon: <MediaGlyph text={'</>'} />,\n },\n {\n kind: 'mermaid', label: 'Mermaid', width: 280, height: 200,\n content: 'graph TD\\n A[开始] --> B{判断}\\n B -->|是| C[处理]\\n B -->|否| D[结束]',\n icon: <MediaGlyph text={'⎇'} />,\n },\n {\n kind: 'math', label: 'Math', width: 240, height: 120,\n content: 'E = mc^2',\n icon: <MediaGlyph text={'√x'} />,\n },\n {\n kind: 'image', label: 'Image', width: 320, height: 220,\n content: '',\n icon: <MediaGlyph text={'IMG'} />,\n },\n {\n kind: 'model3d', label: '3D', width: 360, height: 280,\n content: '',\n icon: <MediaGlyph text={'3D'} />,\n },\n {\n kind: 'ai', label: 'AI', width: 300, height: 340,\n content: '',\n icon: <MediaGlyph text={'AI'} />,\n },\n {\n kind: 'data', label: 'Data', width: 420, height: 300,\n content: '',\n icon: <MediaGlyph text={'⊞'} />,\n },\n];\n\nfunction MediaGlyph({ text }: { text: string }) {\n return (\n <div\n style={{\n width: 20, height: 16, display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 9, fontWeight: 700, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)',\n border: '1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent)', borderRadius: 3, flexShrink: 0,\n }}\n >\n {text}\n </div>\n );\n}\n\nexport function MediaStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n\n const stampMedia = useCallback((item: (typeof MEDIA_ITEMS)[number]) => {\n if (pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind) {\n setPendingPlacement(null);\n return;\n }\n const data: FlowNodeData = {\n label: item.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: item.kind,\n mediaContent: item.content,\n ...(item.kind === 'ai'\n ? { aiConfig: { gateway: '', protocol: 'openai' as const, model: '' } }\n : item.kind === 'model3d'\n ? { modelFormat: 'stl' as const }\n : item.kind === 'data'\n ? { dataConfig: makeStarterDataConfig() }\n : {}),\n };\n setPendingPlacement({ type: 'mediaNode', width: item.width, height: item.height, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <div className=\"flow-palette-grid\">\n {MEDIA_ITEMS.map((item) => (\n <div\n key={item.kind}\n className={`flow-palette-item${pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampMedia(item)}\n title={item.label}\n >\n {item.icon}\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SectionHeader({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 11, fontWeight: 600, margin: '10px 0 6px', color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {children}\n </div>\n );\n}\n\nexport function PaletteThumbnail({ type }: { type: FlowShapeType }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const shapeMap: Record<string, React.ReactNode> = {\n shapeRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"1\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeRoundRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"5\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeEllipse: (\n <ellipse cx={w / 2} cy={h / 2} rx={w / 2 - 4} ry={h / 2 - 4} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDiamond: (\n <polygon points={`${w / 2},3 ${w - 4},${h / 2} ${w / 2},${h - 3} 4,${h / 2}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDocument: (\n <path d={`M4,4 L${w - 4},4 L${w - 4},${h - 8} C${w * 0.7},${h - 12} ${w * 0.3},${h - 2} 4,${h - 8} Z`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeParallelogram: (() => {\n const skew = (w - 8) * 0.2;\n return <polygon points={`${4 + skew},4 ${w - 4},4 ${w - 4 - skew},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeTriangle: (\n <polygon points={`${w / 2},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeTrapezoid: (() => {\n const inset = (w - 8) * 0.15;\n return <polygon points={`${4 + inset},4 ${w - 4 - inset},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapePentagon: (() => {\n const cx = w / 2, cy = h / 2, r = Math.min(cx, cy) - 4;\n const pts = Array.from({ length: 5 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 5 - Math.PI / 2;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagon: (() => {\n const cx = w / 2, cy = h / 2, rx = cx - 4, ry = cy - 4;\n const pts = Array.from({ length: 6 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 6 - Math.PI / 6;\n return `${cx + rx * Math.cos(a)},${cy + ry * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeStar: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.4;\n const pts = Array.from({ length: 10 }, (_, i) => {\n const a = (Math.PI * i) / 5 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagram: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.55;\n const pts = Array.from({ length: 12 }, (_, i) => {\n const a = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeRightTriangle: (\n <polygon points={`4,4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeCorner: (() => {\n const hf = Math.min(w - 8, h - 8) * 0.4;\n return <polygon points={`4,4 ${w - 4},4 ${w - 4},${4 + hf} ${4 + hf},${4 + hf} ${4 + hf},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n textLabel: (\n <text x={w / 2} y={h / 2 + 1} textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"10\" fill=\"currentColor\">Aa</text>\n ),\n animAnchor: (\n <>\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"2\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"4 3\" />\n <circle cx=\"8\" cy=\"9\" r=\"4\" fill=\"none\" stroke={s} strokeWidth={sw} />\n <text x=\"8\" y=\"10.5\" textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"7\" fill=\"currentColor\">1</text>\n </>\n ),\n geometryGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"6 3\" />\n ),\n flowGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 3\" />\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {shapeMap[type] ?? shapeMap.shapeRect}\n </svg>\n );\n}\n\nfunction LineToolThumbnail({ mode }: { mode: FlowToolMode }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const thumbMap: Record<string, React.ReactNode> = {\n connect: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 11},4 ${w - 9},9`} fill={s} />\n </>\n ),\n freehand: (\n <path d={`M6,${h - 8} C10,${h - 14} 14,10 ${w / 2},${h / 2} S${w - 10},6 ${w - 6},8`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinecap=\"round\" />\n ),\n line: (\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n ),\n polyline: (\n <polyline points={`6,${h - 6} 14,8 ${w / 2 + 2},${h - 10} ${w - 6},6`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinejoin=\"round\" />\n ),\n arrow: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 12},6 ${w - 8},12`} fill={s} />\n </>\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {thumbMap[mode] ?? thumbMap.line}\n </svg>\n );\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ShapePalette.js","names":["_Fragment","LINE_TOOL_ITEMS","ShapePalette","useFlowUI","useDraggablePanel","useResizablePanel","showPalette","panelStyle","panelWidth","resizeHandleProps","handleProps","ShapePaletteContent","handleAddShape","useCallback","pendingPlacement","type","setPendingPlacement","data","setToolMode","Fragment","PALETTE_ITEMS","item","PaletteThumbnail","SectionHeader","toolMode","LineToolThumbnail","SvgStampContent","open","setOpen","useState","stampIcon","activeId","svgId","getSvgIcon","SVG_ICON_CATEGORIES","icons","getSvgIconsByCategory","cat","isOpen","o","ic","SvgThumbnail","def","id","brand","resolveThemeColor","markup","buildSvgMarkup","url","MEDIA_ITEMS","MediaGlyph","text","MediaStampContent","stampMedia","makeStarterDataConfig","s","sw","shapeMap","pts","a","i","thumbMap","mode"],"sources":["../../../../../src/components/pro/Flow/panels/ShapePalette.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PALETTE_ITEMS } from '../constants';\nimport type { FlowShapeType, FlowNodeData, FlowToolMode } from '../types';\nimport { SVG_ICON_CATEGORIES, getSvgIconsByCategory, getSvgIcon, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport type { FlowMediaKind } from '../types';\nimport { makeStarterDataConfig } from '../nodes/dataUtils';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nconst LINE_TOOL_ITEMS: Array<{ mode: FlowToolMode; label: string }> = [\n { mode: 'freehand', label: 'Freehand' },\n { mode: 'line', label: 'Line' },\n { mode: 'polyline', label: 'Polyline' },\n { mode: 'arrow', label: 'Arrow' },\n];\n\n/**\n * Standalone panel (legacy). Prefer using ShapePaletteContent inside a FlowPanelGroup.\n */\nexport default function ShapePalette() {\n const { showPalette } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('right', 180);\n\n if (!showPalette) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--right\" {...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 Shapes\n </div>\n <div className=\"flow-palette-content\">\n <ShapePaletteContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function ShapePaletteContent() {\n const { toolMode, setToolMode, setPendingPlacement, pendingPlacement } = useFlowUI();\n\n const handleAddShape = useCallback(\n (type: FlowShapeType, width: number, height: number, data: FlowNodeData) => {\n if (pendingPlacement?.type === type) {\n setPendingPlacement(null);\n } else {\n setPendingPlacement({ type, width, height, data: { ...data } });\n setToolMode('select');\n }\n },\n [setPendingPlacement, setToolMode, pendingPlacement],\n );\n\n return (\n <>\n <div className=\"flow-palette-grid\">\n {PALETTE_ITEMS.map((item) => (\n <div\n key={item.type}\n className={`flow-palette-item${pendingPlacement?.type === item.type ? ' flow-palette-item--active' : ''}`}\n onClick={() => handleAddShape(item.type, item.width, item.height, item.data)}\n >\n <PaletteThumbnail type={item.type} />\n <span className=\"flow-palette-item-label\">{item.data.label}</span>\n </div>\n ))}\n </div>\n\n <SectionHeader>Lines</SectionHeader>\n <div className=\"flow-palette-grid\">\n {LINE_TOOL_ITEMS.map((item) => (\n <div\n key={item.mode}\n className={`flow-palette-item${toolMode === item.mode ? ' flow-palette-item--active' : ''}`}\n onClick={() => { setPendingPlacement(null); setToolMode(toolMode === item.mode ? 'select' : item.mode); }}\n >\n <LineToolThumbnail mode={item.mode} />\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n </>\n );\n}\n\n/** SVG icon stamps, grouped by category with a collapsible header per group. */\nexport function SvgStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n const [open, setOpen] = useState<Record<string, boolean>>({ lang: true });\n\n const stampIcon = useCallback((svgId: string, label: string) => {\n const activeId = pendingPlacement?.data.svgId;\n if (pendingPlacement?.type === 'shapeSvg' && activeId === svgId) {\n setPendingPlacement(null);\n return;\n }\n // Brand icons (e.g. language logos) keep their authentic brand color; generic\n // outline icons follow the theme font color so they stay visible on any theme.\n const iconDef = getSvgIcon(svgId);\n const iconColor = iconDef?.brandColor ?? 'theme:base-content';\n const data: FlowNodeData = {\n label,\n fill: 'transparent',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: iconColor,\n labelColor: 'theme:base-content',\n fontSize: 12,\n svgId,\n iconBox: false,\n labelPlacement: 'bottom',\n borderStyle: 'none',\n };\n setPendingPlacement({ type: 'shapeSvg', width: 56, height: 56, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <>\n {SVG_ICON_CATEGORIES.map((cat) => {\n const icons = getSvgIconsByCategory(cat.id as SvgIconCategory);\n const isOpen = open[cat.id];\n return (\n <div key={cat.id}>\n <button\n type=\"button\"\n className=\"flow-palette-section-toggle\"\n onClick={() => setOpen((o) => ({ ...o, [cat.id]: !o[cat.id] }))}\n >\n <span style={{ transform: isOpen ? 'rotate(90deg)' : 'none', transition: 'transform .15s' }}>▸</span>\n {cat.label}\n </button>\n {isOpen && (\n <div className=\"flow-palette-grid\">\n {icons.map((ic) => (\n <div\n key={ic.id}\n className={`flow-palette-item${pendingPlacement?.type === 'shapeSvg' && pendingPlacement.data.svgId === ic.id ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampIcon(ic.id, ic.label)}\n title={ic.label}\n >\n <SvgThumbnail id={ic.id} />\n <span className=\"flow-palette-item-label\">{ic.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\n/** Renders an SVG icon as an <img> (data URL) so it displays in the correct\n * SVG namespace, unlike dangerouslySetInnerHTML on an <svg> element. Brand icons\n * use their authentic brand color; generic outline icons fall back to a neutral\n * gray so the thumbnail matches how the icon looks once placed. */\nfunction SvgThumbnail({ id }: { id: string }) {\n const def = getSvgIcon(id);\n // brandColor may be a `theme:*` token (icons that follow the theme); resolve\n // it to a concrete color for the rasterized data URL.\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n if (!markup) return null;\n const url = `data:image/svg+xml;utf8,${encodeURIComponent(markup)}`;\n return <img src={url} width={20} height={16} alt=\"\" style={{ objectFit: 'contain' }} />;\n}\n\n/** Multimedia stamps: rich DOM-rendered nodes (markdown/html/mermaid/math/image/3D/AI). */\nconst MEDIA_ITEMS: Array<{\n kind: FlowMediaKind;\n label: string;\n width: number;\n height: number;\n content: string;\n icon: React.ReactNode;\n}> = [\n {\n kind: 'markdown', label: 'Markdown', width: 260, height: 180,\n content: '# 标题\\n\\n- 支持 **GFM**\\n- 支持 `代码`\\n\\n> 引用文本',\n icon: <MediaGlyph text={'M↓'} />,\n },\n {\n kind: 'html', label: 'HTML', width: 260, height: 180,\n content: '<div style=\"font-family:sans-serif;padding:12px\">\\n <h3>Hello</h3>\\n <p>可编辑的 HTML 片段</p>\\n</div>',\n icon: <MediaGlyph text={'</>'} />,\n },\n {\n kind: 'mermaid', label: 'Mermaid', width: 280, height: 200,\n content: 'graph TD\\n A[开始] --> B{判断}\\n B -->|是| C[处理]\\n B -->|否| D[结束]',\n icon: <MediaGlyph text={'⎇'} />,\n },\n {\n kind: 'math', label: 'Math', width: 240, height: 120,\n content: 'E = mc^2',\n icon: <MediaGlyph text={'√x'} />,\n },\n {\n kind: 'image', label: 'Image', width: 320, height: 220,\n content: '',\n icon: <MediaGlyph text={'IMG'} />,\n },\n {\n kind: 'model3d', label: '3D', width: 360, height: 280,\n content: '',\n icon: <MediaGlyph text={'3D'} />,\n },\n {\n kind: 'ai', label: 'AI', width: 300, height: 340,\n content: '',\n icon: <MediaGlyph text={'AI'} />,\n },\n {\n kind: 'data', label: 'Data', width: 420, height: 300,\n content: '',\n icon: <MediaGlyph text={'⊞'} />,\n },\n];\n\nfunction MediaGlyph({ text }: { text: string }) {\n return (\n <div\n style={{\n width: 20, height: 16, display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 9, fontWeight: 700, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)',\n border: '1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent)', borderRadius: 3, flexShrink: 0,\n }}\n >\n {text}\n </div>\n );\n}\n\nexport function MediaStampContent() {\n const { setPendingPlacement, setToolMode, pendingPlacement } = useFlowUI();\n\n const stampMedia = useCallback((item: (typeof MEDIA_ITEMS)[number]) => {\n if (pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind) {\n setPendingPlacement(null);\n return;\n }\n const data: FlowNodeData = {\n label: item.label,\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n strokeWidth: 1.5,\n color: 'theme:base-content',\n fontSize: 13,\n borderStyle: 'solid',\n mediaKind: item.kind,\n mediaContent: item.content,\n ...(item.kind === 'ai'\n ? { aiConfig: { gateway: '', protocol: 'openai' as const, model: '' } }\n : item.kind === 'model3d'\n ? { modelFormat: 'stl' as const }\n : item.kind === 'data'\n ? { dataConfig: makeStarterDataConfig() }\n : {}),\n };\n setPendingPlacement({ type: 'mediaNode', width: item.width, height: item.height, data });\n setToolMode('select');\n }, [pendingPlacement, setPendingPlacement, setToolMode]);\n\n return (\n <div className=\"flow-palette-grid\">\n {MEDIA_ITEMS.map((item) => (\n <div\n key={item.kind}\n className={`flow-palette-item${pendingPlacement?.type === 'mediaNode' && pendingPlacement.data.mediaKind === item.kind ? ' flow-palette-item--active' : ''}`}\n onClick={() => stampMedia(item)}\n title={item.label}\n >\n {item.icon}\n <span className=\"flow-palette-item-label\">{item.label}</span>\n </div>\n ))}\n </div>\n );\n}\n\nfunction SectionHeader({ children }: { children: React.ReactNode }) {\n return (\n <div style={{ fontSize: 11, fontWeight: 600, margin: '10px 0 6px', color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {children}\n </div>\n );\n}\n\nexport function PaletteThumbnail({ type }: { type: FlowShapeType }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const shapeMap: Record<string, React.ReactNode> = {\n shapeRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"1\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeRoundRect: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"5\" fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeEllipse: (\n <ellipse cx={w / 2} cy={h / 2} rx={w / 2 - 4} ry={h / 2 - 4} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDiamond: (\n <polygon points={`${w / 2},3 ${w - 4},${h / 2} ${w / 2},${h - 3} 4,${h / 2}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeDocument: (\n <path d={`M4,4 L${w - 4},4 L${w - 4},${h - 8} C${w * 0.7},${h - 12} ${w * 0.3},${h - 2} 4,${h - 8} Z`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeParallelogram: (() => {\n const skew = (w - 8) * 0.2;\n return <polygon points={`${4 + skew},4 ${w - 4},4 ${w - 4 - skew},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeTriangle: (\n <polygon points={`${w / 2},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeTrapezoid: (() => {\n const inset = (w - 8) * 0.15;\n return <polygon points={`${4 + inset},4 ${w - 4 - inset},4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapePentagon: (() => {\n const cx = w / 2, cy = h / 2, r = Math.min(cx, cy) - 4;\n const pts = Array.from({ length: 5 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 5 - Math.PI / 2;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagon: (() => {\n const cx = w / 2, cy = h / 2, rx = cx - 4, ry = cy - 4;\n const pts = Array.from({ length: 6 }, (_, i) => {\n const a = (Math.PI * 2 * i) / 6 - Math.PI / 6;\n return `${cx + rx * Math.cos(a)},${cy + ry * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeStar: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.4;\n const pts = Array.from({ length: 10 }, (_, i) => {\n const a = (Math.PI * i) / 5 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeHexagram: (() => {\n const cx = w / 2, cy = h / 2, outer = Math.min(cx, cy) - 3, inner = outer * 0.55;\n const pts = Array.from({ length: 12 }, (_, i) => {\n const a = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`;\n }).join(' ');\n return <polygon points={pts} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n shapeRightTriangle: (\n <polygon points={`4,4 ${w - 4},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />\n ),\n shapeCorner: (() => {\n const hf = Math.min(w - 8, h - 8) * 0.4;\n return <polygon points={`4,4 ${w - 4},4 ${w - 4},${4 + hf} ${4 + hf},${4 + hf} ${4 + hf},${h - 4} 4,${h - 4}`} fill=\"none\" stroke={s} strokeWidth={sw} />;\n })(),\n textLabel: (\n <text x={w / 2} y={h / 2 + 1} textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"10\" fill=\"currentColor\">Aa</text>\n ),\n animAnchor: (\n <>\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"2\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"4 3\" />\n <circle cx=\"8\" cy=\"9\" r=\"4\" fill=\"none\" stroke={s} strokeWidth={sw} />\n <text x=\"8\" y=\"10.5\" textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"7\" fill=\"currentColor\">1</text>\n </>\n ),\n geometryGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"6 3\" />\n ),\n flowGroup: (\n <rect x=\"3\" y=\"4\" width={w - 6} height={h - 8} rx=\"3\" fill=\"none\" stroke={s} strokeWidth={sw} strokeDasharray=\"2 3\" />\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {shapeMap[type] ?? shapeMap.shapeRect}\n </svg>\n );\n}\n\nfunction LineToolThumbnail({ mode }: { mode: FlowToolMode }) {\n const w = 36, h = 28;\n const s = 'currentColor';\n const sw = 1.5;\n\n const thumbMap: Record<string, React.ReactNode> = {\n connect: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 11},4 ${w - 9},9`} fill={s} />\n </>\n ),\n freehand: (\n <path d={`M6,${h - 8} C10,${h - 14} 14,10 ${w / 2},${h / 2} S${w - 10},6 ${w - 6},8`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinecap=\"round\" />\n ),\n line: (\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n ),\n polyline: (\n <polyline points={`6,${h - 6} 14,8 ${w / 2 + 2},${h - 10} ${w - 6},6`} fill=\"none\" stroke={s} strokeWidth={sw} strokeLinejoin=\"round\" />\n ),\n arrow: (\n <>\n <line x1=\"6\" y1={h - 6} x2={w - 6} y2=\"6\" stroke={s} strokeWidth={sw} />\n <polygon points={`${w - 6},6 ${w - 12},6 ${w - 8},12`} fill={s} />\n </>\n ),\n };\n\n return (\n <svg width={w} height={h} viewBox={`0 0 ${w} ${h}`} style={{ color: 'color-mix(in oklch, var(--color-base-content) 55%, transparent)' }}>\n {thumbMap[mode] ?? thumbMap.line}\n </svg>\n );\n}\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbarIcons.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/toolbarIcons.tsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Toolbar icon set for the Flow editor.\n * Compact 20x20 stroke icons that inherit `currentColor`, so they follow the\n * button's variant (primary/ghost) automatically.\n */\n\nconst base = {\n width: 18,\n height: 18,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const IconSelect: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 3l7 17 2.5-6.5L20 11 4 3z\" />\n </svg>\n);\n\n\nexport const IconAutoFocus: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <path d=\"M4 12H2M22 12h-2M12 4V2M12 22v-2\" />\n <path d=\"M17.5 5.5l1-1M5.5 17.5l-1 1\" />\n </svg>\n);\n\nexport const IconBack: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M19 12H5\" />\n <path d=\"M11 18l-6-6 6-6\" />\n </svg>\n);\n\nexport const IconUndo: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M9 14L4 9l5-5\" />\n <path d=\"M4 9h11a5 5 0 0 1 0 10h-4\" />\n </svg>\n);\n\nexport const IconRedo: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M15 14l5-5-5-5\" />\n <path d=\"M20 9H9a5 5 0 0 0 0 10h4\" />\n </svg>\n);\n\nexport const IconGroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" />\n <rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" />\n <path d=\"M13 6h4a1 1 0 0 1 1 1v4\" strokeDasharray=\"2 2\" />\n </svg>\n);\n\nexport const IconGeoGroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect x=\"7\" y=\"7\" width=\"4\" height=\"4\" rx=\"0.5\" />\n <rect x=\"13\" y=\"13\" width=\"4\" height=\"4\" rx=\"0.5\" />\n </svg>\n);\n\nexport const IconUngroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <path d=\"M14 5h5M17 3v4\" />\n </svg>\n);\n\nexport type AlignIconKind = 'left' | 'center-h' | 'right' | 'top' | 'center-v' | 'bottom' | 'distribute-h' | 'distribute-v';\n\nexport const IconAlign: React.FC<{ kind: AlignIconKind }> = ({ kind }) => {\n const vertical = kind === 'left' || kind === 'center-h' || kind === 'right';\n if (vertical) {\n const x = kind === 'left' ? 5 : kind === 'right' ? 19 : 12;\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d={`M${x} 3v18`} />\n <rect x={kind === 'left' ? 5 : kind === 'right' ? 10 : 7} y=\"5\" width=\"9\" height=\"4\" rx=\"0.5\" />\n <rect x={kind === 'left' ? 5 : kind === 'right' ? 5 : 4} y=\"14\" width=\"14\" height=\"4\" rx=\"0.5\" />\n </svg>\n );\n }\n if (kind === 'top' || kind === 'center-v' || kind === 'bottom') {\n const y = kind === 'top' ? 5 : kind === 'bottom' ? 19 : 12;\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d={`M3 ${y}h18`} />\n <rect x=\"5\" y={kind === 'top' ? 5 : kind === 'bottom' ? 10 : 7} width=\"4\" height=\"9\" rx=\"0.5\" />\n <rect x=\"14\" y={kind === 'top' ? 5 : kind === 'bottom' ? 5 : 4} width=\"4\" height=\"14\" rx=\"0.5\" />\n </svg>\n );\n }\n return (\n <svg {...base} aria-hidden=\"true\">\n {kind === 'distribute-h' ? (\n <><path d=\"M3 3v18M21 3v18\" /><rect x=\"6\" y=\"7\" width=\"4\" height=\"10\" /><rect x=\"14\" y=\"7\" width=\"4\" height=\"10\" /></>\n ) : (\n <><path d=\"M3 3h18M3 21h18\" /><rect x=\"7\" y=\"6\" width=\"10\" height=\"4\" /><rect x=\"7\" y=\"14\" width=\"10\" height=\"4\" /></>\n )}\n </svg>\n );\n};\n\nexport const IconZoomOut: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.3-4.3M8 11h6\" />\n </svg>\n);\n\nexport const IconZoomIn: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.3-4.3M11 8v6M8 11h6\" />\n </svg>\n);\n\nexport const IconFitView: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 9V5a1 1 0 0 1 1-1h4M15 4h4a1 1 0 0 1 1 1v4M20 15v4a1 1 0 0 1-1 1h-4M9 20H5a1 1 0 0 1-1-1v-4\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" rx=\"1\" />\n </svg>\n);\n\nexport const IconShapes: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" />\n <circle cx=\"17\" cy=\"7\" r=\"4\" />\n <path d=\"M13 21l4-7 4 7z\" />\n </svg>\n);\n\nexport const IconInspector: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n);\n\nexport const IconOutline: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </svg>\n);\n\nexport const IconJson: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M8 4H7a2 2 0 0 0-2 2v3a2 2 0 0 1-2 2 2 2 0 0 1 2 2v3a2 2 0 0 0 2 2h1\" />\n <path d=\"M16 4h1a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2 2 2 0 0 0-2 2v3a2 2 0 0 1-2 2h-1\" />\n </svg>\n);\n\nexport const IconAI: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M12 3l1.9 4.6L18.5 9.5 13.9 11.4 12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3z\" />\n <path d=\"M18 15l.9 2.1L21 18l-2.1.9L18 21l-.9-2.1L15 18l2.1-.9L18 15z\" />\n </svg>\n);\n\nexport const IconGrid: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M9 3v18M15 3v18M3 9h18M3 15h18\" />\n </svg>\n);\n\n/** Placement magnet (snap stamps to the canvas grid). */\nexport const IconMagnet: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 12V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v6a2 2 0 0 0 4 0V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v6a7 7 0 0 1-14 0\" />\n <path d=\"M4 9.5h6M14 9.5h6\" />\n </svg>\n);\n\nexport const IconMiniMap: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <rect x=\"13\" y=\"12\" width=\"6\" height=\"6\" rx=\"1\" />\n </svg>\n);\n\nexport const IconImport: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" />\n <path d=\"M14 3v5h5\" />\n <path d=\"M12 18v-6\" />\n <path d=\"M9.5 14.5 12 12l2.5 2.5\" />\n </svg>\n);\n\nexport const IconExport: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M12 15V3\" />\n <path d=\"M8 7l4-4 4 4\" />\n <path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\" />\n </svg>\n);\n\nexport const IconPublish: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M22 2 11 13\" />\n <path d=\"M22 2 15 22l-4-9-9-4 20-7z\" />\n </svg>\n);\n\nexport const IconExportImage: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" />\n <path d=\"M4 17l5-5 3 3 2-2 6 6\" />\n <path d=\"M16 3v7m-3-3 3 3 3-3\" />\n </svg>\n);\n\n/** Export PNG: an image frame with a download arrow into a tray. */\nexport const IconExportPng: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\" />\n <circle cx=\"6.5\" cy=\"6.5\" r=\"1\" />\n <path d=\"M3 11l3.5-3 3 2.5\" />\n <path d=\"M19 12v6M16.5 15.5 19 18l2.5-2.5\" />\n <path d=\"M14 21h10\" opacity=\"0.5\" />\n </svg>\n);\n\n/** Export PDF: a document marked \"PDF\" with a download arrow. */\nexport const IconExportPdf: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M13 3H7a2 2 0 0 0-2 2v6\" />\n <path d=\"M13 3l5 5v3\" />\n <path d=\"M4.5 14h1.6a1.4 1.4 0 0 1 0 2.8H4.5V14v5\" />\n <path d=\"M17 14v6M14.5 17.5 17 20l2.5-2.5\" />\n <path d=\"M10 14v5h1a1.4 1.4 0 0 0 1.4-1.4v-2.2A1.4 1.4 0 0 0 11 14z\" />\n </svg>\n);\n\nexport const IconExportMarkdown: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"M6 15V9l3 3 3-3v6\" />\n <path d=\"M17 9v4m0 0 2-2m-2 2-2-2\" />\n </svg>\n);\n\n/** Export JSON: braces with a download arrow into a tray. */\nexport const IconExportJson: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M9 4c-1.5 0-2 .6-2 2s.4 2-1 2c1.4 0 1 1 1 2s.5 2 2 2\" />\n <path d=\"M15 4c1.5 0 2 .6 2 2s-.4 2 1 2c-1.4 0-1 1-1 2s-.5 2-2 2\" />\n <path d=\"M12 13v6M9 16l3 3 3-3\" />\n <path d=\"M4 20h16\" opacity=\"0.5\" />\n </svg>\n);\n\n/** Layer / z-order controls: to-front, forward, backward, to-back. */\nexport type LayerIconKind = 'front' | 'up' | 'down' | 'back';\n\nexport const IconLayer: React.FC<{ kind: LayerIconKind }> = ({ kind }) => {\n // Metaphor: a stack of layers with the *moving* layer drawn solid and an\n // arrow showing the z-order direction. Front/back push all the way; up/down\n // shift by one. Each variant is visually distinct.\n switch (kind) {\n case 'front':\n // Solid square on top of two outlined layers + up arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M4 15.5l3 1.7M20 15.5l-3 1.7\" opacity=\"0.5\" />\n <path d=\"M4 18.5l8 4.5 8-4.5\" opacity=\"0.5\" />\n <path d=\"M12 5V1M9.5 3 12 .8 14.5 3\" transform=\"translate(0 1)\" />\n </svg>\n );\n case 'up':\n // Solid layer with a single up arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"12\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.4\" />\n <rect x=\"9\" y=\"8\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M14.5 5.5V1M12 3l2.5-2.5L17 3\" />\n </svg>\n );\n case 'down':\n // Solid layer with a single down arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"9\" y=\"8\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.4\" />\n <rect x=\"3\" y=\"12\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M14.5 18.5V23M12 20.5l2.5 2.5 2.5-2.5\" />\n </svg>\n );\n case 'back':\n default:\n // Outlined top layers over a solid bottom layer + down arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 8.5l8-4.5 8 4.5\" opacity=\"0.5\" />\n <path d=\"M4 8.5l3 1.7M20 8.5l-3 1.7\" opacity=\"0.5\" />\n <rect x=\"7\" y=\"9\" width=\"10\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M12 21v4M9.5 23 12 25.2 14.5 23\" transform=\"translate(0 -1)\" />\n </svg>\n );\n }\n};\n\nexport const IconAnchorVisible: React.FC<{ visible?: boolean }> = ({ visible = true }) => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"2\" strokeDasharray=\"3 2\" />\n <circle cx=\"4\" cy=\"5\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n {visible ? (\n <path d=\"M2 12s3.5-5 10-5 10 5 10 5-3.5 5-10 5S2 12 2 12zM12 10a2 2 0 1 0 0 4 2 2 0 0 0 0-4z\" />\n ) : (\n <path d=\"M3 3l18 18\" />\n )}\n </svg>\n);\n\nexport const IconPresent: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"13\" rx=\"2\" />\n <path d=\"M10 8.5l4.5 2.5L10 13.5z\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M12 17v3M8 20h8\" />\n </svg>\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toolbarIcons.js","names":["_Fragment","base","IconAutoFocus","IconBack","IconUndo","IconRedo","IconGroup","IconGeoGroup","IconUngroup","IconAlign","kind","x","y","Fragment","IconZoomOut","IconZoomIn","IconFitView","IconShapes","IconInspector","IconOutline","IconJson","IconAI","IconGrid","IconMagnet","IconMiniMap","IconImport","IconPublish","IconExportPng","IconExportPdf","IconExportMarkdown","IconExportJson","IconLayer","IconAnchorVisible","visible","IconPresent"],"sources":["../../../../../src/components/pro/Flow/panels/toolbarIcons.tsx"],"sourcesContent":["import React from 'react';\n\n/**\n * Toolbar icon set for the Flow editor.\n * Compact 20x20 stroke icons that inherit `currentColor`, so they follow the\n * button's variant (primary/ghost) automatically.\n */\n\nconst base = {\n width: 18,\n height: 18,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const IconSelect: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 3l7 17 2.5-6.5L20 11 4 3z\" />\n </svg>\n);\n\n\nexport const IconAutoFocus: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <path d=\"M4 12H2M22 12h-2M12 4V2M12 22v-2\" />\n <path d=\"M17.5 5.5l1-1M5.5 17.5l-1 1\" />\n </svg>\n);\n\nexport const IconBack: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M19 12H5\" />\n <path d=\"M11 18l-6-6 6-6\" />\n </svg>\n);\n\nexport const IconUndo: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M9 14L4 9l5-5\" />\n <path d=\"M4 9h11a5 5 0 0 1 0 10h-4\" />\n </svg>\n);\n\nexport const IconRedo: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M15 14l5-5-5-5\" />\n <path d=\"M20 9H9a5 5 0 0 0 0 10h4\" />\n </svg>\n);\n\nexport const IconGroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"8\" height=\"8\" rx=\"1\" />\n <rect x=\"13\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" />\n <path d=\"M13 6h4a1 1 0 0 1 1 1v4\" strokeDasharray=\"2 2\" />\n </svg>\n);\n\nexport const IconGeoGroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect x=\"7\" y=\"7\" width=\"4\" height=\"4\" rx=\"0.5\" />\n <rect x=\"13\" y=\"13\" width=\"4\" height=\"4\" rx=\"0.5\" />\n </svg>\n);\n\nexport const IconUngroup: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <path d=\"M14 5h5M17 3v4\" />\n </svg>\n);\n\nexport type AlignIconKind = 'left' | 'center-h' | 'right' | 'top' | 'center-v' | 'bottom' | 'distribute-h' | 'distribute-v';\n\nexport const IconAlign: React.FC<{ kind: AlignIconKind }> = ({ kind }) => {\n const vertical = kind === 'left' || kind === 'center-h' || kind === 'right';\n if (vertical) {\n const x = kind === 'left' ? 5 : kind === 'right' ? 19 : 12;\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d={`M${x} 3v18`} />\n <rect x={kind === 'left' ? 5 : kind === 'right' ? 10 : 7} y=\"5\" width=\"9\" height=\"4\" rx=\"0.5\" />\n <rect x={kind === 'left' ? 5 : kind === 'right' ? 5 : 4} y=\"14\" width=\"14\" height=\"4\" rx=\"0.5\" />\n </svg>\n );\n }\n if (kind === 'top' || kind === 'center-v' || kind === 'bottom') {\n const y = kind === 'top' ? 5 : kind === 'bottom' ? 19 : 12;\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d={`M3 ${y}h18`} />\n <rect x=\"5\" y={kind === 'top' ? 5 : kind === 'bottom' ? 10 : 7} width=\"4\" height=\"9\" rx=\"0.5\" />\n <rect x=\"14\" y={kind === 'top' ? 5 : kind === 'bottom' ? 5 : 4} width=\"4\" height=\"14\" rx=\"0.5\" />\n </svg>\n );\n }\n return (\n <svg {...base} aria-hidden=\"true\">\n {kind === 'distribute-h' ? (\n <><path d=\"M3 3v18M21 3v18\" /><rect x=\"6\" y=\"7\" width=\"4\" height=\"10\" /><rect x=\"14\" y=\"7\" width=\"4\" height=\"10\" /></>\n ) : (\n <><path d=\"M3 3h18M3 21h18\" /><rect x=\"7\" y=\"6\" width=\"10\" height=\"4\" /><rect x=\"7\" y=\"14\" width=\"10\" height=\"4\" /></>\n )}\n </svg>\n );\n};\n\nexport const IconZoomOut: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.3-4.3M8 11h6\" />\n </svg>\n);\n\nexport const IconZoomIn: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"M21 21l-4.3-4.3M11 8v6M8 11h6\" />\n </svg>\n);\n\nexport const IconFitView: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 9V5a1 1 0 0 1 1-1h4M15 4h4a1 1 0 0 1 1 1v4M20 15v4a1 1 0 0 1-1 1h-4M9 20H5a1 1 0 0 1-1-1v-4\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" rx=\"1\" />\n </svg>\n);\n\nexport const IconShapes: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"13\" width=\"8\" height=\"8\" rx=\"1\" />\n <circle cx=\"17\" cy=\"7\" r=\"4\" />\n <path d=\"M13 21l4-7 4 7z\" />\n </svg>\n);\n\nexport const IconInspector: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n);\n\nexport const IconOutline: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </svg>\n);\n\nexport const IconJson: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M8 4H7a2 2 0 0 0-2 2v3a2 2 0 0 1-2 2 2 2 0 0 1 2 2v3a2 2 0 0 0 2 2h1\" />\n <path d=\"M16 4h1a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2 2 2 0 0 0-2 2v3a2 2 0 0 1-2 2h-1\" />\n </svg>\n);\n\nexport const IconAI: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M12 3l1.9 4.6L18.5 9.5 13.9 11.4 12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3z\" />\n <path d=\"M18 15l.9 2.1L21 18l-2.1.9L18 21l-.9-2.1L15 18l2.1-.9L18 15z\" />\n </svg>\n);\n\nexport const IconGrid: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M9 3v18M15 3v18M3 9h18M3 15h18\" />\n </svg>\n);\n\n/** Placement magnet (snap stamps to the canvas grid). */\nexport const IconMagnet: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 12V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v6a2 2 0 0 0 4 0V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v6a7 7 0 0 1-14 0\" />\n <path d=\"M4 9.5h6M14 9.5h6\" />\n </svg>\n);\n\nexport const IconMiniMap: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <rect x=\"13\" y=\"12\" width=\"6\" height=\"6\" rx=\"1\" />\n </svg>\n);\n\nexport const IconImport: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" />\n <path d=\"M14 3v5h5\" />\n <path d=\"M12 18v-6\" />\n <path d=\"M9.5 14.5 12 12l2.5 2.5\" />\n </svg>\n);\n\nexport const IconExport: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M12 15V3\" />\n <path d=\"M8 7l4-4 4 4\" />\n <path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\" />\n </svg>\n);\n\nexport const IconPublish: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M22 2 11 13\" />\n <path d=\"M22 2 15 22l-4-9-9-4 20-7z\" />\n </svg>\n);\n\nexport const IconExportImage: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" />\n <path d=\"M4 17l5-5 3 3 2-2 6 6\" />\n <path d=\"M16 3v7m-3-3 3 3 3-3\" />\n </svg>\n);\n\n/** Export PNG: an image frame with a download arrow into a tray. */\nexport const IconExportPng: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\" />\n <circle cx=\"6.5\" cy=\"6.5\" r=\"1\" />\n <path d=\"M3 11l3.5-3 3 2.5\" />\n <path d=\"M19 12v6M16.5 15.5 19 18l2.5-2.5\" />\n <path d=\"M14 21h10\" opacity=\"0.5\" />\n </svg>\n);\n\n/** Export PDF: a document marked \"PDF\" with a download arrow. */\nexport const IconExportPdf: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M13 3H7a2 2 0 0 0-2 2v6\" />\n <path d=\"M13 3l5 5v3\" />\n <path d=\"M4.5 14h1.6a1.4 1.4 0 0 1 0 2.8H4.5V14v5\" />\n <path d=\"M17 14v6M14.5 17.5 17 20l2.5-2.5\" />\n <path d=\"M10 14v5h1a1.4 1.4 0 0 0 1.4-1.4v-2.2A1.4 1.4 0 0 0 11 14z\" />\n </svg>\n);\n\nexport const IconExportMarkdown: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"M6 15V9l3 3 3-3v6\" />\n <path d=\"M17 9v4m0 0 2-2m-2 2-2-2\" />\n </svg>\n);\n\n/** Export JSON: braces with a download arrow into a tray. */\nexport const IconExportJson: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M9 4c-1.5 0-2 .6-2 2s.4 2-1 2c1.4 0 1 1 1 2s.5 2 2 2\" />\n <path d=\"M15 4c1.5 0 2 .6 2 2s-.4 2 1 2c-1.4 0-1 1-1 2s-.5 2-2 2\" />\n <path d=\"M12 13v6M9 16l3 3 3-3\" />\n <path d=\"M4 20h16\" opacity=\"0.5\" />\n </svg>\n);\n\n/** Layer / z-order controls: to-front, forward, backward, to-back. */\nexport type LayerIconKind = 'front' | 'up' | 'down' | 'back';\n\nexport const IconLayer: React.FC<{ kind: LayerIconKind }> = ({ kind }) => {\n // Metaphor: a stack of layers with the *moving* layer drawn solid and an\n // arrow showing the z-order direction. Front/back push all the way; up/down\n // shift by one. Each variant is visually distinct.\n switch (kind) {\n case 'front':\n // Solid square on top of two outlined layers + up arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M4 15.5l3 1.7M20 15.5l-3 1.7\" opacity=\"0.5\" />\n <path d=\"M4 18.5l8 4.5 8-4.5\" opacity=\"0.5\" />\n <path d=\"M12 5V1M9.5 3 12 .8 14.5 3\" transform=\"translate(0 1)\" />\n </svg>\n );\n case 'up':\n // Solid layer with a single up arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"3\" y=\"12\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.4\" />\n <rect x=\"9\" y=\"8\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M14.5 5.5V1M12 3l2.5-2.5L17 3\" />\n </svg>\n );\n case 'down':\n // Solid layer with a single down arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"9\" y=\"8\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" opacity=\"0.4\" />\n <rect x=\"3\" y=\"12\" width=\"11\" height=\"8\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M14.5 18.5V23M12 20.5l2.5 2.5 2.5-2.5\" />\n </svg>\n );\n case 'back':\n default:\n // Outlined top layers over a solid bottom layer + down arrow.\n return (\n <svg {...base} aria-hidden=\"true\">\n <path d=\"M4 8.5l8-4.5 8 4.5\" opacity=\"0.5\" />\n <path d=\"M4 8.5l3 1.7M20 8.5l-3 1.7\" opacity=\"0.5\" />\n <rect x=\"7\" y=\"9\" width=\"10\" height=\"10\" rx=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M12 21v4M9.5 23 12 25.2 14.5 23\" transform=\"translate(0 -1)\" />\n </svg>\n );\n }\n};\n\nexport const IconAnchorVisible: React.FC<{ visible?: boolean }> = ({ visible = true }) => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"4\" y=\"5\" width=\"16\" height=\"14\" rx=\"2\" strokeDasharray=\"3 2\" />\n <circle cx=\"4\" cy=\"5\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n {visible ? (\n <path d=\"M2 12s3.5-5 10-5 10 5 10 5-3.5 5-10 5S2 12 2 12zM12 10a2 2 0 1 0 0 4 2 2 0 0 0 0-4z\" />\n ) : (\n <path d=\"M3 3l18 18\" />\n )}\n </svg>\n);\n\nexport const IconPresent: React.FC = () => (\n <svg {...base} aria-hidden=\"true\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"13\" rx=\"2\" />\n <path d=\"M10 8.5l4.5 2.5L10 13.5z\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M12 17v3M8 20h8\" />\n </svg>\n);\n"],"mappings":";;;AAQA,IAAMC,IAAO;CACX,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,QAAQ;CACR,aAAa;CACb,eAAe;CACf,gBAAgB;AAClB,GASaC,UACX,kBAAC,OAAD;CAAK,GAAID;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;EAAK,CAAA;EAC/B,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;EAAK,CAAA;EAC/B,kBAAC,QAAD,EAAM,GAAE,mCAAoC,CAAA;EAC5C,kBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;CACpC;IAGME,UACX,kBAAC,OAAD;CAAK,GAAIF;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,WAAY,CAAA,GACpB,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA,CACxB;IAGMG,UACX,kBAAC,OAAD;CAAK,GAAIH;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA,GACzB,kBAAC,QAAD,EAAM,GAAE,4BAA6B,CAAA,CAClC;IAGMI,UACX,kBAAC,OAAD;CAAK,GAAIJ;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,iBAAkB,CAAA,GAC1B,kBAAC,QAAD,EAAM,GAAE,2BAA4B,CAAA,CACjC;IAGMK,UACX,kBAAC,OAAD;CAAK,GAAIL;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAI,QAAO;GAAI,IAAG;EAAK,CAAA;EAC/C,kBAAC,QAAD;GAAM,GAAE;GAAK,GAAE;GAAK,OAAM;GAAI,QAAO;GAAI,IAAG;EAAK,CAAA;EACjD,kBAAC,QAAD;GAAM,GAAE;GAA0B,iBAAgB;EAAO,CAAA;CACtD;IAGMM,UACX,kBAAC,OAAD;CAAK,GAAIN;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;GAAI,iBAAgB;EAAO,CAAA;EACvE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAI,QAAO;GAAI,IAAG;EAAO,CAAA;EACjD,kBAAC,QAAD;GAAM,GAAE;GAAK,GAAE;GAAK,OAAM;GAAI,QAAO;GAAI,IAAG;EAAO,CAAA;CAChD;IAGMO,UACX,kBAAC,OAAD;CAAK,GAAIP;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAI,QAAO;GAAI,IAAG;EAAK,CAAA;EAC/C,kBAAC,QAAD;GAAM,GAAE;GAAK,GAAE;GAAK,OAAM;GAAI,QAAO;GAAI,IAAG;EAAK,CAAA;EACjD,kBAAC,QAAD,EAAM,GAAE,iBAAkB,CAAA;CACvB;IAKMQ,KAAgD,EAAE,cAAW;CAExE,IADiBC,MAAS,UAAUA,MAAS,cAAcA,MAAS,SACtD;EACZ,IAAMC,IAAID,MAAS,SAAS,IAAIA,MAAS,UAAU,KAAK;EACxD,OACE,kBAAC,OAAD;GAAK,GAAIT;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD,EAAM,GAAG,IAAIU,EAAE,OAAS,CAAA;IACxB,kBAAC,QAAD;KAAM,GAAGD,MAAS,SAAS,IAAIA,MAAS,UAAU,KAAK;KAAG,GAAE;KAAI,OAAM;KAAI,QAAO;KAAI,IAAG;IAAO,CAAA;IAC/F,kBAAC,QAAD;KAAM,GAAGA,MAAS,UAAaA,MAAS,UAAb,IAA2B;KAAG,GAAE;KAAK,OAAM;KAAK,QAAO;KAAI,IAAG;IAAO,CAAA;GAC7F;;CAET;CACA,IAAIA,MAAS,SAASA,MAAS,cAAcA,MAAS,UAAU;EAC9D,IAAME,IAAIF,MAAS,QAAQ,IAAIA,MAAS,WAAW,KAAK;EACxD,OACE,kBAAC,OAAD;GAAK,GAAIT;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD,EAAM,GAAG,MAAMW,EAAE,KAAO,CAAA;IACxB,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAGF,MAAS,QAAQ,IAAIA,MAAS,WAAW,KAAK;KAAG,OAAM;KAAI,QAAO;KAAI,IAAG;IAAO,CAAA;IAC/F,kBAAC,QAAD;KAAM,GAAE;KAAK,GAAGA,MAAS,SAAYA,MAAS,WAAb,IAA4B;KAAG,OAAM;KAAI,QAAO;KAAK,IAAG;IAAO,CAAA;GAC7F;;CAET;CACA,OACE,kBAAC,OAAD;EAAK,GAAIT;EAAM,eAAY;EACxB,UAAAS,MAAS,iBACR,kBAAAV,GAAA,EAAA,UAAA;GAAE,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;GAAC,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAI,QAAO;GAAM,CAAA;GAAC,kBAAC,QAAD;IAAM,GAAE;IAAK,GAAE;IAAI,OAAM;IAAI,QAAO;GAAM,CAAA;EAAG,EAAA,CAAA,IAErH,kBAAAA,GAAA,EAAA,UAAA;GAAE,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;GAAC,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;GAAK,CAAA;GAAC,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAK,OAAM;IAAK,QAAO;GAAK,CAAA;EAAG,EAAA,CAAA;CAEpH,CAAA;AAET,GAEac,UACX,kBAAC,OAAD;CAAK,GAAIb;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,UAAD;EAAQ,IAAG;EAAK,IAAG;EAAK,GAAE;CAAK,CAAA,GAC/B,kBAAC,QAAD,EAAM,GAAE,yBAA0B,CAAA,CAC/B;IAGMc,UACX,kBAAC,OAAD;CAAK,GAAId;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,UAAD;EAAQ,IAAG;EAAK,IAAG;EAAK,GAAE;CAAK,CAAA,GAC/B,kBAAC,QAAD,EAAM,GAAE,gCAAiC,CAAA,CACtC;IAGMe,UACX,kBAAC,OAAD;CAAK,GAAIf;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,iGAAkG,CAAA,GAC1G,kBAAC,QAAD;EAAM,GAAE;EAAI,GAAE;EAAI,OAAM;EAAI,QAAO;EAAI,IAAG;CAAK,CAAA,CAC5C;IAGMgB,UACX,kBAAC,OAAD;CAAK,GAAIhB;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAK,OAAM;GAAI,QAAO;GAAI,IAAG;EAAK,CAAA;EAChD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAI,GAAE;EAAK,CAAA;EAC9B,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;CACxB;IAGMiB,UACX,kBAAC,OAAD;CAAK,GAAIjB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,UAAD;EAAQ,IAAG;EAAK,IAAG;EAAK,GAAE;CAAK,CAAA,GAC/B,kBAAC,QAAD,EAAM,GAAE,inBAAknB,CAAA,CACvnB;IAGMkB,UACX,kBAAC,OAAD;CAAK,GAAIlB;CAAM,eAAY;CACzB,UAAA,kBAAC,QAAD,EAAM,GAAE,oDAAqD,CAAA;AAC1D,CAAA,GAGMmB,UACX,kBAAC,OAAD;CAAK,GAAInB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,uEAAwE,CAAA,GAChF,kBAAC,QAAD,EAAM,GAAE,yEAA0E,CAAA,CAC/E;IAGMoB,UACX,kBAAC,OAAD;CAAK,GAAIpB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,wEAAyE,CAAA,GACjF,kBAAC,QAAD,EAAM,GAAE,+DAAgE,CAAA,CACrE;IAGMqB,UACX,kBAAC,OAAD;CAAK,GAAIrB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD;EAAM,GAAE;EAAI,GAAE;EAAI,OAAM;EAAK,QAAO;EAAK,IAAG;CAAK,CAAA,GACjD,kBAAC,QAAD,EAAM,GAAE,iCAAkC,CAAA,CACvC;IAIMsB,UACX,kBAAC,OAAD;CAAK,GAAItB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,yGAA0G,CAAA,GAClH,kBAAC,QAAD,EAAM,GAAE,oBAAqB,CAAA,CAC1B;IAGMuB,UACX,kBAAC,OAAD;CAAK,GAAIvB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD;EAAM,GAAE;EAAI,GAAE;EAAI,OAAM;EAAK,QAAO;EAAK,IAAG;CAAK,CAAA,GACjD,kBAAC,QAAD;EAAM,GAAE;EAAK,GAAE;EAAK,OAAM;EAAI,QAAO;EAAI,IAAG;CAAK,CAAA,CAC9C;IAGMwB,UACX,kBAAC,OAAD;CAAK,GAAIxB;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD,EAAM,GAAE,6DAA8D,CAAA;EACtE,kBAAC,QAAD,EAAM,GAAE,YAAa,CAAA;EACrB,kBAAC,QAAD,EAAM,GAAE,YAAa,CAAA;EACrB,kBAAC,QAAD,EAAM,GAAE,0BAA2B,CAAA;CAChC;IAWMyB,UACX,kBAAC,OAAD;CAAK,GAAIzB;CAAM,eAAY;CAA3B,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,cAAe,CAAA,GACvB,kBAAC,QAAD,EAAM,GAAE,6BAA8B,CAAA,CACnC;IAaM0B,UACX,kBAAC,OAAD;CAAK,GAAI1B;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;EAAO,CAAA;EACnD,kBAAC,UAAD;GAAQ,IAAG;GAAM,IAAG;GAAM,GAAE;EAAK,CAAA;EACjC,kBAAC,QAAD,EAAM,GAAE,oBAAqB,CAAA;EAC7B,kBAAC,QAAD,EAAM,GAAE,mCAAoC,CAAA;EAC5C,kBAAC,QAAD;GAAM,GAAE;GAAY,SAAQ;EAAO,CAAA;CAChC;IAIM2B,UACX,kBAAC,OAAD;CAAK,GAAI3B;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD,EAAM,GAAE,0BAA2B,CAAA;EACnC,kBAAC,QAAD,EAAM,GAAE,cAAe,CAAA;EACvB,kBAAC,QAAD,EAAM,GAAE,2CAA4C,CAAA;EACpD,kBAAC,QAAD,EAAM,GAAE,mCAAoC,CAAA;EAC5C,kBAAC,QAAD,EAAM,GAAE,6DAA8D,CAAA;CACnE;IAGM4B,UACX,kBAAC,OAAD;CAAK,GAAI5B;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;EAAK,CAAA;EACjD,kBAAC,QAAD,EAAM,GAAE,oBAAqB,CAAA;EAC7B,kBAAC,QAAD,EAAM,GAAE,2BAA4B,CAAA;CACjC;IAIM6B,UACX,kBAAC,OAAD;CAAK,GAAI7B;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD,EAAM,GAAE,uDAAwD,CAAA;EAChE,kBAAC,QAAD,EAAM,GAAE,0DAA2D,CAAA;EACnE,kBAAC,QAAD,EAAM,GAAE,wBAAyB,CAAA;EACjC,kBAAC,QAAD;GAAM,GAAE;GAAW,SAAQ;EAAO,CAAA;CAC/B;IAMM8B,KAAgD,EAAE,cAAW;CAIxE,QAAQrB,GAAR;EACE,KAAK,SAEH,OACE,kBAAC,OAAD;GAAK,GAAIT;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAK,IAAG;KAAM,MAAK;KAAe,QAAO;IAAQ,CAAA;IACrF,kBAAC,QAAD;KAAM,GAAE;KAA+B,SAAQ;IAAO,CAAA;IACtD,kBAAC,QAAD;KAAM,GAAE;KAAsB,SAAQ;IAAO,CAAA;IAC7C,kBAAC,QAAD;KAAM,GAAE;KAA6B,WAAU;IAAkB,CAAA;GAC9D;;EAET,KAAK,MAEH,OACE,kBAAC,OAAD;GAAK,GAAIA;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAK,OAAM;KAAK,QAAO;KAAI,IAAG;KAAM,MAAK;KAAe,QAAO;KAAO,SAAQ;IAAO,CAAA;IACnG,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAI,IAAG;KAAM,MAAK;KAAe,QAAO;IAAQ,CAAA;IACpF,kBAAC,QAAD,EAAM,GAAE,gCAAiC,CAAA;GACtC;;EAET,KAAK,QAEH,OACE,kBAAC,OAAD;GAAK,GAAIA;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAI,IAAG;KAAM,MAAK;KAAe,QAAO;KAAO,SAAQ;IAAO,CAAA;IAClG,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAK,OAAM;KAAK,QAAO;KAAI,IAAG;KAAM,MAAK;KAAe,QAAO;IAAQ,CAAA;IACrF,kBAAC,QAAD,EAAM,GAAE,wCAAyC,CAAA;GAC9C;;EAGT,SAEE,OACE,kBAAC,OAAD;GAAK,GAAIA;GAAM,eAAY;GAA3B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAqB,SAAQ;IAAO,CAAA;IAC5C,kBAAC,QAAD;KAAM,GAAE;KAA6B,SAAQ;IAAO,CAAA;IACpD,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAK,QAAO;KAAK,IAAG;KAAM,MAAK;KAAe,QAAO;IAAQ,CAAA;IACrF,kBAAC,QAAD;KAAM,GAAE;KAAkC,WAAU;IAAmB,CAAA;GACpE;;CAEX;AACF,GAEa+B,KAAsD,EAAE,aAAU,SAC7E,kBAAC,OAAD;CAAK,GAAI/B;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;GAAI,iBAAgB;EAAO,CAAA;EACvE,kBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;GAAI,MAAK;GAAe,QAAO;EAAQ,CAAA;EAC9DgC,IACC,kBAAC,QAAD,EAAM,GAAE,sFAAuF,CAAA,IAE/F,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;CAErB;IAGMC,UACX,kBAAC,OAAD;CAAK,GAAIjC;CAAM,eAAY;CAA3B,UAAA;EACE,kBAAC,QAAD;GAAM,GAAE;GAAI,GAAE;GAAI,OAAM;GAAK,QAAO;GAAK,IAAG;EAAK,CAAA;EACjD,kBAAC,QAAD;GAAM,GAAE;GAA2B,MAAK;GAAe,QAAO;EAAQ,CAAA;EACtE,kBAAC,QAAD,EAAM,GAAE,kBAAmB,CAAA;CACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/components/pro/Flow/types.ts"],"sourcesContent":["/** Arrow marker type for edges and lines */\nexport type FlowEdgeMarkerKind = 'none' | 'arrow' | 'arrowclosed';\n\n/** Label placement for SVG icon stamps. */\nexport type FlowIconLabelPlacement = 'top' | 'middle' | 'bottom' | 'left' | 'right';\n\n/** Media stamp kinds rendered via DOM overlay. */\nexport type FlowMediaKind = 'markdown' | 'html' | 'mermaid' | 'math' | 'image' | 'model3d' | 'ai' | 'data';\n\nexport type FlowModelFormat = 'stl' | 'obj' | '3mf';\n\n/** Logical type of a Data-node column, driving parsing/aggregation/axis scales. */\nexport type FlowDataColumnType = 'string' | 'number' | 'date' | 'boolean';\n\n/** A single column definition for a Data node. */\nexport interface FlowDataColumn {\n /** Object key used in each row record. */\n key: string;\n /** Display label; falls back to `key` when unset. */\n label?: string;\n /** Value type; numeric columns can be aggregated and used as chart measures. */\n type: FlowDataColumnType;\n}\n\n/** Which surface the Data node renders: a (pivotable) table or a chart. */\nexport type FlowDataView = 'table' | 'chart';\n\n/** Supported chart renderings for a Data node. */\nexport type FlowDataChartType =\n | 'bar'\n | 'barHorizontal'\n | 'line'\n | 'area'\n | 'scatter'\n | 'pie';\n\n/** Chart-view configuration for a Data node. */\nexport interface FlowDataChartConfig {\n type: FlowDataChartType;\n /** Category / X axis field (dimension). */\n xField?: string;\n /** One or more numeric measure fields drawn as series. */\n yFields?: string[];\n /** Per-series color overrides, keyed by measure field key (cartesian charts). */\n seriesColors?: Record<string, string>;\n /** Slice color palette for pie charts. Defaults to the built-in palette. */\n palette?: string[];\n}\n\n/** Aggregation used by the pivot table view. */\nexport type FlowDataAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max';\n\n/** Pivot configuration panel placement. */\nexport type FlowDataPivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\n/** Pivot-view configuration for a Data node table. */\nexport interface FlowDataPivotConfig {\n enabled: boolean;\n rowFields: string[];\n colFields: string[];\n values: Array<{ field: string; aggFn: FlowDataAggFn }>;\n /** Where the pivot config panel renders. Defaults to 'top'. */\n panelPlacement?: FlowDataPivotPanelPlacement;\n}\n\n/**\n * Persisted state for a Data node (`mediaKind: 'data'`). Holds the parsed\n * columns/rows plus how they should be visualized. Serialized with the document.\n */\nexport interface FlowDataConfig {\n columns: FlowDataColumn[];\n rows: Array<Record<string, unknown>>;\n /** Active rendering surface. Defaults to 'table'. */\n view: FlowDataView;\n /** Chart configuration (used when `view === 'chart'`). */\n chart?: FlowDataChartConfig;\n /** Pivot configuration (used when `view === 'table'`). */\n pivot?: FlowDataPivotConfig;\n /** Original uploaded file name, when imported. */\n sourceName?: string;\n}\n\n/** AI media node configuration (persisted subset). */\nexport interface FlowAIConfig {\n /** API endpoint (OpenAI-compatible chat completions or Anthropic messages). */\n gateway: string;\n protocol: 'openai' | 'anthropic';\n model: string;\n /** API key. Persisted in the document; treat exported JSON as sensitive. */\n apiKey?: string;\n systemPrompt?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n}\n\n/** Line style */\nexport type FlowEdgeLineStyle = 'solid' | 'dashed' | 'dotted' | 'dynamic';\n\n/** Dash density for dashed/dotted lines */\nexport type FlowEdgeDashDensity = 'sparse' | 'medium' | 'dense';\n\n/** Bezier control points for simplebezier edge segments (canvas coordinates) */\nexport interface FlowBezierControl {\n c1x: number;\n c1y: number;\n c2x: number;\n c2y: number;\n}\n\n/** Persisted edge styling on edge.data */\nexport interface FlowEdgeData {\n strokeColor?: string;\n strokeWidth?: number;\n lineStyle?: FlowEdgeLineStyle;\n dashDensity?: FlowEdgeDashDensity;\n markerStart?: FlowEdgeMarkerKind;\n markerEnd?: FlowEdgeMarkerKind;\n labelText?: string;\n labelFontSize?: number;\n labelFontFamily?: string;\n /** Play a source-to-target traveling gradient while in presentation mode. */\n animated?: boolean;\n /** Waypoints; absolute canvas coords unless waypointGroupId set */\n waypoints?: Array<{ x: number; y: number }>;\n waypointGroupId?: string;\n /**\n * Per-segment bezier controls for simplebezier type;\n * null entries use default computed controls.\n */\n bezierControls?: Array<FlowBezierControl | null> | null;\n}\n\n/** Edge type names */\nexport type FlowEdgeTypeName =\n | 'smoothstep'\n | 'step'\n | 'straight'\n | 'simplebezier';\n\n/** Border line style */\nexport type FlowBorderStyle = 'none' | 'solid' | 'dashed' | 'dotted' | 'dynamic';\n\n/** Gradient direction */\nexport type GradientDirection =\n | 'to-r'\n | 'to-l'\n | 'to-b'\n | 'to-t'\n | 'to-br'\n | 'to-tl'\n | 'to-tr'\n | 'to-bl';\n\n/** Group label placement */\nexport type FlowGroupLabelPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type FlowGroupLabelAlign = 'start' | 'center' | 'end';\n\n/** Corner placement for a node's tag pill. */\nexport type FlowTagPlacement = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n/**\n * Label placement for ordinary shape nodes: the center plus the eight compass\n * positions around it. Non-center placements sit just outside / against the\n * corresponding edge or corner and can be nudged with `labelOffsetX/Y`.\n */\nexport type FlowTextPlacement =\n | 'center'\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport const FLOW_NODE_TYPES = [\n 'shapeRect',\n 'shapeRoundRect',\n 'shapeEllipse',\n 'shapeDiamond',\n 'shapeDocument',\n 'shapeParallelogram',\n 'shapeTriangle',\n 'shapeTrapezoid',\n 'shapePentagon',\n 'shapeHexagon',\n 'shapeStar',\n 'shapeHexagram',\n 'shapeRightTriangle',\n 'shapeCorner',\n 'textLabel',\n 'flowGroup',\n 'geometryGroup',\n 'dividerNode',\n 'arrowNode',\n 'polylineNode',\n 'shapeSvg',\n 'mediaNode',\n 'animAnchor',\n] as const;\n\nexport type FlowShapeType = (typeof FLOW_NODE_TYPES)[number];\n\n/** Custom key-value attribute on a node */\nexport interface FlowNodeAttribute {\n key: string;\n value: string;\n}\n\n/** Data stored on each flow node */\n/** Per-side border override for one side of a node (top/right/bottom/left).\n * Unset fields fall back to the node's `stroke` / `strokeWidth`;\n * `visible: false` hides that side entirely. */\nexport interface FlowBorderSideOverride {\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\n/** Independent top/right/bottom/left border overrides. Only honored by the\n * rect-family shapes where sides are geometrically well-defined (rect,\n * round-rect, ellipse quarters, diamond, document, parallelogram, trapezoid,\n * media node frames and group frames); other shapes keep a full outline. */\nexport interface FlowBorderSides {\n top?: FlowBorderSideOverride;\n right?: FlowBorderSideOverride;\n bottom?: FlowBorderSideOverride;\n left?: FlowBorderSideOverride;\n}\n\nexport interface FlowNodeData {\n label: string;\n fill: string;\n stroke: string;\n strokeWidth: number;\n color: string;\n fontSize: number;\n /**\n * Optional secondary line rendered under the bold title, in a muted color.\n * Used by imported Archify diagrams to reproduce the two-line card look\n * (e.g. \"API Gateway\" / \"public :443\").\n */\n sublabel?: string;\n /** Muted color for `sublabel`; falls back to a dimmed label color. */\n sublabelColor?: string;\n /**\n * Optional short pill rendered in a corner of the node (e.g. a tag such as\n * \"SEV-1/2\" or a lifecycle step number). Cosmetic only.\n */\n tag?: string;\n /** Tag pill text/border color. Falls back to the node stroke color. */\n tagColor?: string;\n /** Which corner the tag pill sits in. Defaults to `top-right`. */\n tagPlacement?: FlowTagPlacement;\n /**\n * Label/font color. When unset, falls back to `color` (legacy behavior where\n * a single color drove both the label and the SVG icon tint).\n */\n labelColor?: string;\n /**\n * Label placement for ordinary shape nodes (9-way). When unset the label is\n * centered. Fine-tune with `labelOffsetX` / `labelOffsetY`.\n */\n textPlacement?: FlowTextPlacement;\n /** Independent top/right/bottom/left border overrides (color / width / visibility). */\n borderSides?: FlowBorderSides;\n /**\n * Optional icon rendered beside the title text on ordinary shape nodes,\n * from the built-in SVG icon registry (pure glyph, no text). Fine-tune with\n * `titleIconSide` / `titleIconSize` / `titleIconColor`.\n */\n titleIcon?: string;\n /** Which side of the title the icon sits on. Defaults to `'left'`. */\n titleIconSide?: 'left' | 'right';\n /** Icon box size in canvas units. Defaults to ~1.15× the label font size. */\n titleIconSize?: number;\n /** Icon tint (literal color or `theme:` token). Falls back to the label color. */\n titleIconColor?: string;\n borderStyle?: FlowBorderStyle;\n rotation?: number;\n flipX?: boolean;\n flipY?: boolean;\n fillGradientTo?: string;\n fillGradientDirection?: GradientDirection;\n attributes?: FlowNodeAttribute[];\n childCanvasId?: string;\n isGroup?: boolean;\n groupBorderStyle?: FlowBorderStyle;\n groupLabelPlacement?: FlowGroupLabelPlacement;\n groupLabelAlign?: FlowGroupLabelAlign;\n groupLabelFill?: string;\n groupLabelRotation?: 0 | 90 | 180 | 270;\n groupLabelBgMode?: 'text' | 'full';\n dividerOrientation?: 'horizontal' | 'vertical';\n arrowDouble?: boolean;\n arrowBent?: boolean;\n arrowBendX?: number;\n arrowBendY?: number;\n polylineWaypoints?: Array<{ x: number; y: number }>;\n /** SVG stamp icon id (for type 'shapeSvg'). */\n svgId?: string;\n /** Whether the SVG stamp draws a bordered box around the icon. */\n iconBox?: boolean;\n /** Label placement for SVG stamps. Left/right use top-to-bottom vertical text. */\n labelPlacement?: FlowIconLabelPlacement;\n /** Horizontal offset from the resolved icon label position, in canvas units. */\n labelOffsetX?: number;\n /** Vertical offset from the resolved icon label position, in canvas units. */\n labelOffsetY?: number;\n /** Media node kind (for type 'mediaNode'). */\n mediaKind?: FlowMediaKind;\n /** Source content or URL for the media node. */\n mediaContent?: string;\n /** Explicit model format for 3D media nodes. */\n modelFormat?: FlowModelFormat;\n /** AI media node configuration (serializable subset; secrets are runtime-only). */\n aiConfig?: FlowAIConfig;\n /** Data node configuration (for type 'mediaNode' with mediaKind 'data'). */\n dataConfig?: FlowDataConfig;\n /**\n * Stable creation index for `animAnchor` nodes, used to order slides. The\n * displayed sequence badge is derived from this ordering, so deleting an\n * anchor renumbers the rest automatically.\n */\n animIndex?: number;\n /** Marks nodes managed by Mindmap mode. */\n isMindMapNode?: boolean;\n /** Logical parent used by Mindmap auto-layout (separate from visual groups). */\n mindMapParentId?: string;\n}\n\n/** A flow node */\nexport interface FlowNode {\n id: string;\n type: FlowShapeType;\n position: { x: number; y: number };\n width: number;\n height: number;\n data: FlowNodeData;\n parentId?: string;\n zIndex?: number;\n}\n\n/** A flow edge (connection between nodes) */\nexport interface FlowEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n type: FlowEdgeTypeName;\n data: FlowEdgeData;\n}\n\n/** Independent line types */\nexport type FlowLineType = 'freehand' | 'straight' | 'polyline' | 'arrow';\n\n/** An independent line not attached to nodes */\nexport interface FlowLine {\n id: string;\n type: FlowLineType;\n points: Array<{ x: number; y: number }>;\n strokeColor: string;\n strokeWidth: number;\n lineStyle: FlowEdgeLineStyle;\n dashDensity?: FlowEdgeDashDensity;\n markerStart?: FlowEdgeMarkerKind;\n markerEnd?: FlowEdgeMarkerKind;\n closed?: boolean;\n zIndex?: number;\n parentId?: string;\n}\n\n/** Single canvas layer data */\nexport interface FlowCanvasData {\n nodes: FlowNode[];\n edges: FlowEdge[];\n lines: FlowLine[];\n}\n\n/** Multi-canvas document; root canvas id is 'root' */\nexport interface FlowDocument {\n canvases: Record<string, FlowCanvasData>;\n stack: string[];\n /** Project title, shown in the editable title bar and used as export filename. */\n title?: string;\n}\n\n/** Active tool modes */\nexport type FlowToolMode =\n | 'select'\n | 'pan'\n | 'connect'\n | 'freehand'\n | 'line'\n | 'polyline'\n | 'arrow';\n\n/** Viewport transform state */\nexport interface ViewportState {\n x: number;\n y: number;\n zoom: number;\n}\n\n/** Selection state */\nexport interface SelectionState {\n nodeIds: Set<string>;\n edgeIds: Set<string>;\n lineIds: Set<string>;\n}\n\n/** Props for the Flow component */\nexport interface FlowProps {\n /** Initial document; if not provided, starts with empty doc */\n initialDocument?: FlowDocument;\n /** Callback when document changes */\n onChange?: (doc: FlowDocument) => void;\n /** Width of the component (defaults to 100%) */\n width?: number | string;\n /** Height of the component (defaults to 100%) */\n height?: number | string;\n /** Whether the flow is read-only */\n readOnly?: boolean;\n /** Leave the current document from the built-in toolbar. */\n onBack?: () => void;\n /** Export the current canvas as PNG from the built-in toolbar. */\n onExportPNG?: () => void | Promise<void>;\n /** Publish or configure sharing from the built-in toolbar. */\n onPublish?: () => void;\n /** Show minimap */\n showMiniMap?: boolean;\n /** Show grid */\n showGrid?: boolean;\n /** Grid size in pixels */\n gridSize?: number;\n /** CSS class for outer container */\n className?: string;\n /**\n * Show the AI assistant panel (right side) that turns a text description or\n * an uploaded image into a flow document. Defaults to true.\n */\n showAI?: boolean;\n /**\n * Show the AI model configuration form inside the AI panel (gateway /\n * protocol / model / api key). When false, the config is hidden and the\n * caller is expected to supply `aiConfig`. Defaults to true.\n */\n showAIConfig?: boolean;\n /** Initial / preset AI model configuration for the AI panel. */\n aiConfig?: FlowAIConfig;\n}\n"],"mappings":";AAgLA,IAAa,IAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
1
|
+
{"version":3,"file":"types.js","names":["FLOW_NODE_TYPES"],"sources":["../../../../src/components/pro/Flow/types.ts"],"sourcesContent":["/** Arrow marker type for edges and lines */\nexport type FlowEdgeMarkerKind = 'none' | 'arrow' | 'arrowclosed';\n\n/** Label placement for SVG icon stamps. */\nexport type FlowIconLabelPlacement = 'top' | 'middle' | 'bottom' | 'left' | 'right';\n\n/** Media stamp kinds rendered via DOM overlay. */\nexport type FlowMediaKind = 'markdown' | 'html' | 'mermaid' | 'math' | 'image' | 'model3d' | 'ai' | 'data';\n\nexport type FlowModelFormat = 'stl' | 'obj' | '3mf';\n\n/** Logical type of a Data-node column, driving parsing/aggregation/axis scales. */\nexport type FlowDataColumnType = 'string' | 'number' | 'date' | 'boolean';\n\n/** A single column definition for a Data node. */\nexport interface FlowDataColumn {\n /** Object key used in each row record. */\n key: string;\n /** Display label; falls back to `key` when unset. */\n label?: string;\n /** Value type; numeric columns can be aggregated and used as chart measures. */\n type: FlowDataColumnType;\n}\n\n/** Which surface the Data node renders: a (pivotable) table or a chart. */\nexport type FlowDataView = 'table' | 'chart';\n\n/** Supported chart renderings for a Data node. */\nexport type FlowDataChartType =\n | 'bar'\n | 'barHorizontal'\n | 'line'\n | 'area'\n | 'scatter'\n | 'pie';\n\n/** Chart-view configuration for a Data node. */\nexport interface FlowDataChartConfig {\n type: FlowDataChartType;\n /** Category / X axis field (dimension). */\n xField?: string;\n /** One or more numeric measure fields drawn as series. */\n yFields?: string[];\n /** Per-series color overrides, keyed by measure field key (cartesian charts). */\n seriesColors?: Record<string, string>;\n /** Slice color palette for pie charts. Defaults to the built-in palette. */\n palette?: string[];\n}\n\n/** Aggregation used by the pivot table view. */\nexport type FlowDataAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max';\n\n/** Pivot configuration panel placement. */\nexport type FlowDataPivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\n/** Pivot-view configuration for a Data node table. */\nexport interface FlowDataPivotConfig {\n enabled: boolean;\n rowFields: string[];\n colFields: string[];\n values: Array<{ field: string; aggFn: FlowDataAggFn }>;\n /** Where the pivot config panel renders. Defaults to 'top'. */\n panelPlacement?: FlowDataPivotPanelPlacement;\n}\n\n/**\n * Persisted state for a Data node (`mediaKind: 'data'`). Holds the parsed\n * columns/rows plus how they should be visualized. Serialized with the document.\n */\nexport interface FlowDataConfig {\n columns: FlowDataColumn[];\n rows: Array<Record<string, unknown>>;\n /** Active rendering surface. Defaults to 'table'. */\n view: FlowDataView;\n /** Chart configuration (used when `view === 'chart'`). */\n chart?: FlowDataChartConfig;\n /** Pivot configuration (used when `view === 'table'`). */\n pivot?: FlowDataPivotConfig;\n /** Original uploaded file name, when imported. */\n sourceName?: string;\n}\n\n/** AI media node configuration (persisted subset). */\nexport interface FlowAIConfig {\n /** API endpoint (OpenAI-compatible chat completions or Anthropic messages). */\n gateway: string;\n protocol: 'openai' | 'anthropic';\n model: string;\n /** API key. Persisted in the document; treat exported JSON as sensitive. */\n apiKey?: string;\n systemPrompt?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n}\n\n/** Line style */\nexport type FlowEdgeLineStyle = 'solid' | 'dashed' | 'dotted' | 'dynamic';\n\n/** Dash density for dashed/dotted lines */\nexport type FlowEdgeDashDensity = 'sparse' | 'medium' | 'dense';\n\n/** Bezier control points for simplebezier edge segments (canvas coordinates) */\nexport interface FlowBezierControl {\n c1x: number;\n c1y: number;\n c2x: number;\n c2y: number;\n}\n\n/** Persisted edge styling on edge.data */\nexport interface FlowEdgeData {\n strokeColor?: string;\n strokeWidth?: number;\n lineStyle?: FlowEdgeLineStyle;\n dashDensity?: FlowEdgeDashDensity;\n markerStart?: FlowEdgeMarkerKind;\n markerEnd?: FlowEdgeMarkerKind;\n labelText?: string;\n labelFontSize?: number;\n labelFontFamily?: string;\n /** Play a source-to-target traveling gradient while in presentation mode. */\n animated?: boolean;\n /** Waypoints; absolute canvas coords unless waypointGroupId set */\n waypoints?: Array<{ x: number; y: number }>;\n waypointGroupId?: string;\n /**\n * Per-segment bezier controls for simplebezier type;\n * null entries use default computed controls.\n */\n bezierControls?: Array<FlowBezierControl | null> | null;\n}\n\n/** Edge type names */\nexport type FlowEdgeTypeName =\n | 'smoothstep'\n | 'step'\n | 'straight'\n | 'simplebezier';\n\n/** Border line style */\nexport type FlowBorderStyle = 'none' | 'solid' | 'dashed' | 'dotted' | 'dynamic';\n\n/** Gradient direction */\nexport type GradientDirection =\n | 'to-r'\n | 'to-l'\n | 'to-b'\n | 'to-t'\n | 'to-br'\n | 'to-tl'\n | 'to-tr'\n | 'to-bl';\n\n/** Group label placement */\nexport type FlowGroupLabelPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type FlowGroupLabelAlign = 'start' | 'center' | 'end';\n\n/** Corner placement for a node's tag pill. */\nexport type FlowTagPlacement = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\n/**\n * Label placement for ordinary shape nodes: the center plus the eight compass\n * positions around it. Non-center placements sit just outside / against the\n * corresponding edge or corner and can be nudged with `labelOffsetX/Y`.\n */\nexport type FlowTextPlacement =\n | 'center'\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport const FLOW_NODE_TYPES = [\n 'shapeRect',\n 'shapeRoundRect',\n 'shapeEllipse',\n 'shapeDiamond',\n 'shapeDocument',\n 'shapeParallelogram',\n 'shapeTriangle',\n 'shapeTrapezoid',\n 'shapePentagon',\n 'shapeHexagon',\n 'shapeStar',\n 'shapeHexagram',\n 'shapeRightTriangle',\n 'shapeCorner',\n 'textLabel',\n 'flowGroup',\n 'geometryGroup',\n 'dividerNode',\n 'arrowNode',\n 'polylineNode',\n 'shapeSvg',\n 'mediaNode',\n 'animAnchor',\n] as const;\n\nexport type FlowShapeType = (typeof FLOW_NODE_TYPES)[number];\n\n/** Custom key-value attribute on a node */\nexport interface FlowNodeAttribute {\n key: string;\n value: string;\n}\n\n/** Data stored on each flow node */\n/** Per-side border override for one side of a node (top/right/bottom/left).\n * Unset fields fall back to the node's `stroke` / `strokeWidth`;\n * `visible: false` hides that side entirely. */\nexport interface FlowBorderSideOverride {\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\n/** Independent top/right/bottom/left border overrides. Only honored by the\n * rect-family shapes where sides are geometrically well-defined (rect,\n * round-rect, ellipse quarters, diamond, document, parallelogram, trapezoid,\n * media node frames and group frames); other shapes keep a full outline. */\nexport interface FlowBorderSides {\n top?: FlowBorderSideOverride;\n right?: FlowBorderSideOverride;\n bottom?: FlowBorderSideOverride;\n left?: FlowBorderSideOverride;\n}\n\nexport interface FlowNodeData {\n label: string;\n fill: string;\n stroke: string;\n strokeWidth: number;\n color: string;\n fontSize: number;\n /**\n * Optional secondary line rendered under the bold title, in a muted color.\n * Used by imported Archify diagrams to reproduce the two-line card look\n * (e.g. \"API Gateway\" / \"public :443\").\n */\n sublabel?: string;\n /** Muted color for `sublabel`; falls back to a dimmed label color. */\n sublabelColor?: string;\n /**\n * Optional short pill rendered in a corner of the node (e.g. a tag such as\n * \"SEV-1/2\" or a lifecycle step number). Cosmetic only.\n */\n tag?: string;\n /** Tag pill text/border color. Falls back to the node stroke color. */\n tagColor?: string;\n /** Which corner the tag pill sits in. Defaults to `top-right`. */\n tagPlacement?: FlowTagPlacement;\n /**\n * Label/font color. When unset, falls back to `color` (legacy behavior where\n * a single color drove both the label and the SVG icon tint).\n */\n labelColor?: string;\n /**\n * Label placement for ordinary shape nodes (9-way). When unset the label is\n * centered. Fine-tune with `labelOffsetX` / `labelOffsetY`.\n */\n textPlacement?: FlowTextPlacement;\n /** Independent top/right/bottom/left border overrides (color / width / visibility). */\n borderSides?: FlowBorderSides;\n /**\n * Optional icon rendered beside the title text on ordinary shape nodes,\n * from the built-in SVG icon registry (pure glyph, no text). Fine-tune with\n * `titleIconSide` / `titleIconSize` / `titleIconColor`.\n */\n titleIcon?: string;\n /** Which side of the title the icon sits on. Defaults to `'left'`. */\n titleIconSide?: 'left' | 'right';\n /** Icon box size in canvas units. Defaults to ~1.15× the label font size. */\n titleIconSize?: number;\n /** Icon tint (literal color or `theme:` token). Falls back to the label color. */\n titleIconColor?: string;\n borderStyle?: FlowBorderStyle;\n rotation?: number;\n flipX?: boolean;\n flipY?: boolean;\n fillGradientTo?: string;\n fillGradientDirection?: GradientDirection;\n attributes?: FlowNodeAttribute[];\n childCanvasId?: string;\n isGroup?: boolean;\n groupBorderStyle?: FlowBorderStyle;\n groupLabelPlacement?: FlowGroupLabelPlacement;\n groupLabelAlign?: FlowGroupLabelAlign;\n groupLabelFill?: string;\n groupLabelRotation?: 0 | 90 | 180 | 270;\n groupLabelBgMode?: 'text' | 'full';\n dividerOrientation?: 'horizontal' | 'vertical';\n arrowDouble?: boolean;\n arrowBent?: boolean;\n arrowBendX?: number;\n arrowBendY?: number;\n polylineWaypoints?: Array<{ x: number; y: number }>;\n /** SVG stamp icon id (for type 'shapeSvg'). */\n svgId?: string;\n /** Whether the SVG stamp draws a bordered box around the icon. */\n iconBox?: boolean;\n /** Label placement for SVG stamps. Left/right use top-to-bottom vertical text. */\n labelPlacement?: FlowIconLabelPlacement;\n /** Horizontal offset from the resolved icon label position, in canvas units. */\n labelOffsetX?: number;\n /** Vertical offset from the resolved icon label position, in canvas units. */\n labelOffsetY?: number;\n /** Media node kind (for type 'mediaNode'). */\n mediaKind?: FlowMediaKind;\n /** Source content or URL for the media node. */\n mediaContent?: string;\n /** Explicit model format for 3D media nodes. */\n modelFormat?: FlowModelFormat;\n /** AI media node configuration (serializable subset; secrets are runtime-only). */\n aiConfig?: FlowAIConfig;\n /** Data node configuration (for type 'mediaNode' with mediaKind 'data'). */\n dataConfig?: FlowDataConfig;\n /**\n * Stable creation index for `animAnchor` nodes, used to order slides. The\n * displayed sequence badge is derived from this ordering, so deleting an\n * anchor renumbers the rest automatically.\n */\n animIndex?: number;\n /** Marks nodes managed by Mindmap mode. */\n isMindMapNode?: boolean;\n /** Logical parent used by Mindmap auto-layout (separate from visual groups). */\n mindMapParentId?: string;\n}\n\n/** A flow node */\nexport interface FlowNode {\n id: string;\n type: FlowShapeType;\n position: { x: number; y: number };\n width: number;\n height: number;\n data: FlowNodeData;\n parentId?: string;\n zIndex?: number;\n}\n\n/** A flow edge (connection between nodes) */\nexport interface FlowEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n type: FlowEdgeTypeName;\n data: FlowEdgeData;\n}\n\n/** Independent line types */\nexport type FlowLineType = 'freehand' | 'straight' | 'polyline' | 'arrow';\n\n/** An independent line not attached to nodes */\nexport interface FlowLine {\n id: string;\n type: FlowLineType;\n points: Array<{ x: number; y: number }>;\n strokeColor: string;\n strokeWidth: number;\n lineStyle: FlowEdgeLineStyle;\n dashDensity?: FlowEdgeDashDensity;\n markerStart?: FlowEdgeMarkerKind;\n markerEnd?: FlowEdgeMarkerKind;\n closed?: boolean;\n zIndex?: number;\n parentId?: string;\n}\n\n/** Single canvas layer data */\nexport interface FlowCanvasData {\n nodes: FlowNode[];\n edges: FlowEdge[];\n lines: FlowLine[];\n}\n\n/** Multi-canvas document; root canvas id is 'root' */\nexport interface FlowDocument {\n canvases: Record<string, FlowCanvasData>;\n stack: string[];\n /** Project title, shown in the editable title bar and used as export filename. */\n title?: string;\n}\n\n/** Active tool modes */\nexport type FlowToolMode =\n | 'select'\n | 'pan'\n | 'connect'\n | 'freehand'\n | 'line'\n | 'polyline'\n | 'arrow';\n\n/** Viewport transform state */\nexport interface ViewportState {\n x: number;\n y: number;\n zoom: number;\n}\n\n/** Selection state */\nexport interface SelectionState {\n nodeIds: Set<string>;\n edgeIds: Set<string>;\n lineIds: Set<string>;\n}\n\n/** Props for the Flow component */\nexport interface FlowProps {\n /** Initial document; if not provided, starts with empty doc */\n initialDocument?: FlowDocument;\n /** Callback when document changes */\n onChange?: (doc: FlowDocument) => void;\n /** Width of the component (defaults to 100%) */\n width?: number | string;\n /** Height of the component (defaults to 100%) */\n height?: number | string;\n /** Whether the flow is read-only */\n readOnly?: boolean;\n /** Leave the current document from the built-in toolbar. */\n onBack?: () => void;\n /** Export the current canvas as PNG from the built-in toolbar. */\n onExportPNG?: () => void | Promise<void>;\n /** Publish or configure sharing from the built-in toolbar. */\n onPublish?: () => void;\n /** Show minimap */\n showMiniMap?: boolean;\n /** Show grid */\n showGrid?: boolean;\n /** Grid size in pixels */\n gridSize?: number;\n /** CSS class for outer container */\n className?: string;\n /**\n * Show the AI assistant panel (right side) that turns a text description or\n * an uploaded image into a flow document. Defaults to true.\n */\n showAI?: boolean;\n /**\n * Show the AI model configuration form inside the AI panel (gateway /\n * protocol / model / api key). When false, the config is hidden and the\n * caller is expected to supply `aiConfig`. Defaults to true.\n */\n showAIConfig?: boolean;\n /** Initial / preset AI model configuration for the AI panel. */\n aiConfig?: FlowAIConfig;\n}\n"],"mappings":";AAgLA,IAAaA,IAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashedLine.js","names":[],"sources":["../../../../../src/components/pro/Flow/utils/dashedLine.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\n\ninterface Point { x: number; y: number }\n\n/**\n * Sample a cubic bezier at parameter t.\n */\nfunction sampleCubic(\n p0: Point, p1: Point, p2: Point, p3: Point, t: number,\n): Point {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n };\n}\n\n/**\n * Sample a quadratic bezier at parameter t.\n */\nfunction sampleQuad(p0: Point, p1: Point, p2: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nexport interface PathSeg {\n type: 'M' | 'L' | 'C' | 'Q';\n x: number;\n y: number;\n cp1x?: number; cp1y?: number;\n cp2x?: number; cp2y?: number;\n}\n\n/**\n * Flatten path segments into polyline points by sampling curves.\n */\nfunction flattenPath(segs: PathSeg[], samplesPerCurve = 20): Point[] {\n const pts: Point[] = [];\n let cur: Point = { x: 0, y: 0 };\n\n for (const seg of segs) {\n switch (seg.type) {\n case 'M':\n cur = { x: seg.x, y: seg.y };\n pts.push(cur);\n break;\n case 'L':\n cur = { x: seg.x, y: seg.y };\n pts.push(cur);\n break;\n case 'C': {\n const p0 = cur;\n const p1 = { x: seg.cp1x!, y: seg.cp1y! };\n const p2 = { x: seg.cp2x!, y: seg.cp2y! };\n const p3 = { x: seg.x, y: seg.y };\n for (let i = 1; i <= samplesPerCurve; i++) {\n pts.push(sampleCubic(p0, p1, p2, p3, i / samplesPerCurve));\n }\n cur = p3;\n break;\n }\n case 'Q': {\n const p0 = cur;\n const p1 = { x: seg.cp1x!, y: seg.cp1y! };\n const p2 = { x: seg.x, y: seg.y };\n for (let i = 1; i <= samplesPerCurve; i++) {\n pts.push(sampleQuad(p0, p1, p2, i / samplesPerCurve));\n }\n cur = p2;\n break;\n }\n }\n }\n return pts;\n}\n\n/**\n * Compute cumulative arc-length distances for each point.\n */\nfunction arcLengths(pts: Point[]): number[] {\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n const dx = pts[i].x - pts[i - 1].x;\n const dy = pts[i].y - pts[i - 1].y;\n dists.push(dists[i - 1] + Math.hypot(dx, dy));\n }\n return dists;\n}\n\n/**\n * Interpolate point at a given arc-length distance along polyline.\n */\nfunction pointAtDist(pts: Point[], dists: number[], d: number): Point {\n if (d <= 0) return pts[0];\n if (d >= dists[dists.length - 1]) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) {\n const mid = (lo + hi) >> 1;\n if (dists[mid] <= d) lo = mid; else hi = mid;\n }\n const segLen = dists[hi] - dists[lo];\n const t = segLen > 0 ? (d - dists[lo]) / segLen : 0;\n return {\n x: pts[lo].x + (pts[hi].x - pts[lo].x) * t,\n y: pts[lo].y + (pts[hi].y - pts[lo].y) * t,\n };\n}\n\n/**\n * Draw a dashed/dotted path onto a PixiJS Graphics object.\n *\n * @param g - The Graphics to draw into (should be cleared before calling).\n * @param segs - Path segments (M, L, C, Q).\n * @param dash - Dash pattern [dashLen, gapLen].\n * @param dashOffset - Start offset into the dash pattern (for animation).\n */\nexport function drawDashedPath(\n g: Graphics,\n segs: PathSeg[],\n dash: number[],\n dashOffset = 0,\n): void {\n if (segs.length === 0 || dash.length < 2) return;\n\n const pts = flattenPath(segs);\n if (pts.length < 2) return;\n\n const dists = arcLengths(pts);\n const totalLen = dists[dists.length - 1];\n if (totalLen < 1) return;\n\n const patternLen = dash[0] + dash[1];\n let pos = -(((dashOffset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n while (pos < totalLen) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, totalLen);\n\n if (drawing && end > start) {\n const p0 = pointAtDist(pts, dists, start);\n g.moveTo(p0.x, p0.y);\n const step = 2;\n for (let d = start + step; d < end; d += step) {\n const p = pointAtDist(pts, dists, d);\n g.lineTo(p.x, p.y);\n }\n const pEnd = pointAtDist(pts, dists, end);\n g.lineTo(pEnd.x, pEnd.y);\n }\n\n pos += segLen;\n drawing = !drawing;\n }\n}\n\n/**\n * Draw a dashed polyline (for independent FlowLine objects).\n */\nexport function drawDashedPolyline(\n g: Graphics,\n points: Point[],\n dash: number[],\n dashOffset = 0,\n): void {\n if (points.length < 2 || dash.length < 2) return;\n\n const segs: PathSeg[] = [\n { type: 'M', x: points[0].x, y: points[0].y },\n ...points.slice(1).map(p => ({ type: 'L' as const, x: p.x, y: p.y })),\n ];\n drawDashedPath(g, segs, dash, dashOffset);\n}\n"],"mappings":";AAOA,
|
|
1
|
+
{"version":3,"file":"dashedLine.js","names":["sampleCubic","u","t","p0","p1","p2","p3","sampleQuad","flattenPath","pts","cur","seg","segs","i","samplesPerCurve","arcLengths","dists","dx","dy","pointAtDist","d","lo","hi","mid","segLen","drawDashedPath","dash","totalLen","patternLen","pos","dashOffset","drawing","start","end","p","pEnd","drawDashedPolyline","points","g"],"sources":["../../../../../src/components/pro/Flow/utils/dashedLine.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\n\ninterface Point { x: number; y: number }\n\n/**\n * Sample a cubic bezier at parameter t.\n */\nfunction sampleCubic(\n p0: Point, p1: Point, p2: Point, p3: Point, t: number,\n): Point {\n const u = 1 - t;\n return {\n x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n };\n}\n\n/**\n * Sample a quadratic bezier at parameter t.\n */\nfunction sampleQuad(p0: Point, p1: Point, p2: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nexport interface PathSeg {\n type: 'M' | 'L' | 'C' | 'Q';\n x: number;\n y: number;\n cp1x?: number; cp1y?: number;\n cp2x?: number; cp2y?: number;\n}\n\n/**\n * Flatten path segments into polyline points by sampling curves.\n */\nfunction flattenPath(segs: PathSeg[], samplesPerCurve = 20): Point[] {\n const pts: Point[] = [];\n let cur: Point = { x: 0, y: 0 };\n\n for (const seg of segs) {\n switch (seg.type) {\n case 'M':\n cur = { x: seg.x, y: seg.y };\n pts.push(cur);\n break;\n case 'L':\n cur = { x: seg.x, y: seg.y };\n pts.push(cur);\n break;\n case 'C': {\n const p0 = cur;\n const p1 = { x: seg.cp1x!, y: seg.cp1y! };\n const p2 = { x: seg.cp2x!, y: seg.cp2y! };\n const p3 = { x: seg.x, y: seg.y };\n for (let i = 1; i <= samplesPerCurve; i++) {\n pts.push(sampleCubic(p0, p1, p2, p3, i / samplesPerCurve));\n }\n cur = p3;\n break;\n }\n case 'Q': {\n const p0 = cur;\n const p1 = { x: seg.cp1x!, y: seg.cp1y! };\n const p2 = { x: seg.x, y: seg.y };\n for (let i = 1; i <= samplesPerCurve; i++) {\n pts.push(sampleQuad(p0, p1, p2, i / samplesPerCurve));\n }\n cur = p2;\n break;\n }\n }\n }\n return pts;\n}\n\n/**\n * Compute cumulative arc-length distances for each point.\n */\nfunction arcLengths(pts: Point[]): number[] {\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n const dx = pts[i].x - pts[i - 1].x;\n const dy = pts[i].y - pts[i - 1].y;\n dists.push(dists[i - 1] + Math.hypot(dx, dy));\n }\n return dists;\n}\n\n/**\n * Interpolate point at a given arc-length distance along polyline.\n */\nfunction pointAtDist(pts: Point[], dists: number[], d: number): Point {\n if (d <= 0) return pts[0];\n if (d >= dists[dists.length - 1]) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) {\n const mid = (lo + hi) >> 1;\n if (dists[mid] <= d) lo = mid; else hi = mid;\n }\n const segLen = dists[hi] - dists[lo];\n const t = segLen > 0 ? (d - dists[lo]) / segLen : 0;\n return {\n x: pts[lo].x + (pts[hi].x - pts[lo].x) * t,\n y: pts[lo].y + (pts[hi].y - pts[lo].y) * t,\n };\n}\n\n/**\n * Draw a dashed/dotted path onto a PixiJS Graphics object.\n *\n * @param g - The Graphics to draw into (should be cleared before calling).\n * @param segs - Path segments (M, L, C, Q).\n * @param dash - Dash pattern [dashLen, gapLen].\n * @param dashOffset - Start offset into the dash pattern (for animation).\n */\nexport function drawDashedPath(\n g: Graphics,\n segs: PathSeg[],\n dash: number[],\n dashOffset = 0,\n): void {\n if (segs.length === 0 || dash.length < 2) return;\n\n const pts = flattenPath(segs);\n if (pts.length < 2) return;\n\n const dists = arcLengths(pts);\n const totalLen = dists[dists.length - 1];\n if (totalLen < 1) return;\n\n const patternLen = dash[0] + dash[1];\n let pos = -(((dashOffset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n while (pos < totalLen) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, totalLen);\n\n if (drawing && end > start) {\n const p0 = pointAtDist(pts, dists, start);\n g.moveTo(p0.x, p0.y);\n const step = 2;\n for (let d = start + step; d < end; d += step) {\n const p = pointAtDist(pts, dists, d);\n g.lineTo(p.x, p.y);\n }\n const pEnd = pointAtDist(pts, dists, end);\n g.lineTo(pEnd.x, pEnd.y);\n }\n\n pos += segLen;\n drawing = !drawing;\n }\n}\n\n/**\n * Draw a dashed polyline (for independent FlowLine objects).\n */\nexport function drawDashedPolyline(\n g: Graphics,\n points: Point[],\n dash: number[],\n dashOffset = 0,\n): void {\n if (points.length < 2 || dash.length < 2) return;\n\n const segs: PathSeg[] = [\n { type: 'M', x: points[0].x, y: points[0].y },\n ...points.slice(1).map(p => ({ type: 'L' as const, x: p.x, y: p.y })),\n ];\n drawDashedPath(g, segs, dash, dashOffset);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gradient.js","names":[],"sources":["../../../../../src/components/pro/Flow/utils/gradient.ts"],"sourcesContent":["import type { GradientDirection } from '../types';\n\ninterface GradientVector {\n x1: string;\n y1: string;\n x2: string;\n y2: string;\n}\n\nconst GRADIENT_VECTORS: Record<GradientDirection, GradientVector> = {\n 'to-r': { x1: '0%', y1: '50%', x2: '100%', y2: '50%' },\n 'to-l': { x1: '100%', y1: '50%', x2: '0%', y2: '50%' },\n 'to-b': { x1: '50%', y1: '0%', x2: '50%', y2: '100%' },\n 'to-t': { x1: '50%', y1: '100%', x2: '50%', y2: '0%' },\n 'to-br': { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n 'to-tl': { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n 'to-tr': { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n 'to-bl': { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n};\n\n/** Build an SVG linear-gradient definition for a Flow color gradient. */\nexport function buildSvgGradientDef(\n from: string,\n to: string,\n direction: GradientDirection = 'to-r',\n id = 'flow-gradient',\n): string {\n const { x1, y1, x2, y2 } = GRADIENT_VECTORS[direction];\n return `<defs><linearGradient id=\"${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\"><stop offset=\"0%\" stop-color=\"${from}\"/><stop offset=\"100%\" stop-color=\"${to}\"/></linearGradient></defs>`;\n}\n"],"mappings":";AASA,
|
|
1
|
+
{"version":3,"file":"gradient.js","names":["GRADIENT_VECTORS","buildSvgGradientDef","direction","id","x1","y1","x2","y2","from","to"],"sources":["../../../../../src/components/pro/Flow/utils/gradient.ts"],"sourcesContent":["import type { GradientDirection } from '../types';\n\ninterface GradientVector {\n x1: string;\n y1: string;\n x2: string;\n y2: string;\n}\n\nconst GRADIENT_VECTORS: Record<GradientDirection, GradientVector> = {\n 'to-r': { x1: '0%', y1: '50%', x2: '100%', y2: '50%' },\n 'to-l': { x1: '100%', y1: '50%', x2: '0%', y2: '50%' },\n 'to-b': { x1: '50%', y1: '0%', x2: '50%', y2: '100%' },\n 'to-t': { x1: '50%', y1: '100%', x2: '50%', y2: '0%' },\n 'to-br': { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n 'to-tl': { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n 'to-tr': { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n 'to-bl': { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n};\n\n/** Build an SVG linear-gradient definition for a Flow color gradient. */\nexport function buildSvgGradientDef(\n from: string,\n to: string,\n direction: GradientDirection = 'to-r',\n id = 'flow-gradient',\n): string {\n const { x1, y1, x2, y2 } = GRADIENT_VECTORS[direction];\n return `<defs><linearGradient id=\"${id}\" x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\"><stop offset=\"0%\" stop-color=\"${from}\"/><stop offset=\"100%\" stop-color=\"${to}\"/></linearGradient></defs>`;\n}\n"],"mappings":";AASA,IAAMA,IAA8D;CAClE,QAAQ;EAAE,IAAI;EAAM,IAAI;EAAO,IAAI;EAAQ,IAAI;CAAM;CACrD,QAAQ;EAAE,IAAI;EAAQ,IAAI;EAAO,IAAI;EAAM,IAAI;CAAM;CACrD,QAAQ;EAAE,IAAI;EAAO,IAAI;EAAM,IAAI;EAAO,IAAI;CAAO;CACrD,QAAQ;EAAE,IAAI;EAAO,IAAI;EAAQ,IAAI;EAAO,IAAI;CAAK;CACrD,SAAS;EAAE,IAAI;EAAM,IAAI;EAAM,IAAI;EAAQ,IAAI;CAAO;CACtD,SAAS;EAAE,IAAI;EAAQ,IAAI;EAAQ,IAAI;EAAM,IAAI;CAAK;CACtD,SAAS;EAAE,IAAI;EAAM,IAAI;EAAQ,IAAI;EAAQ,IAAI;CAAK;CACtD,SAAS;EAAE,IAAI;EAAQ,IAAI;EAAM,IAAI;EAAM,IAAI;CAAO;AACxD;AAGA,SAAgBC,EACd,GACA,GACA,IAA+B,QAC/B,IAAK,iBACG;CACR,IAAM,EAAE,OAAI,OAAI,OAAI,UAAOD,EAAiBE;CAC5C,OAAO,6BAA6BC,EAAG,QAAQC,EAAG,QAAQC,EAAG,QAAQC,EAAG,QAAQC,EAAG,kCAAkCC,EAAK,qCAAqCC,EAAG;AACpK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdfExport.js","names":[],"sources":["../../../../../src/components/pro/Flow/utils/pdfExport.ts"],"sourcesContent":["// Minimal client-side PDF writer: assembles a set of JPEG images (one per page)\n// into a single PDF file, with no third-party dependency.\n//\n// Each page is sized to the image's pixel dimensions (interpreted as PDF points)\n// so the exported slides keep their aspect ratio. This is intentionally tiny —\n// it only supports what the anchor→PDF export needs (a sequence of full-page\n// raster images).\n\ninterface PdfPageImage {\n /** Raw JPEG bytes. */\n jpeg: Uint8Array;\n width: number;\n height: number;\n}\n\n/** Convert a data URL (data:image/...;base64,....) to raw bytes. */\nexport function dataUrlToBytes(dataUrl: string): Uint8Array {\n const comma = dataUrl.indexOf(',');\n const base64 = dataUrl.slice(comma + 1);\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Re-encode any image data URL (typically PNG) to a JPEG data URL at the given\n * quality, returning the JPEG bytes and pixel dimensions. JPEG keeps the PDF\n * compact and is natively embeddable via a DCTDecode filter.\n */\nexport async function pngDataUrlToJpeg(\n dataUrl: string,\n quality = 0.92,\n background = '#ffffff',\n): Promise<PdfPageImage> {\n const img = await loadImage(dataUrl);\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth || img.width;\n canvas.height = img.naturalHeight || img.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('无法创建绘图上下文');\n // JPEG has no alpha; paint an opaque background first.\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0);\n const jpegUrl = canvas.toDataURL('image/jpeg', quality);\n return { jpeg: dataUrlToBytes(jpegUrl), width: canvas.width, height: canvas.height };\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('图片加载失败'));\n img.src = src;\n });\n}\n\n/**\n * Build a PDF (as a Blob) from a list of JPEG page images. Every page is sized\n * to its image dimensions (in points) so slides render 1:1 with their capture.\n */\nexport function buildPdfFromJpegs(pages: PdfPageImage[]): Blob {\n // We assemble the PDF as a list of byte chunks, tracking each object's byte\n // offset for the cross-reference (xref) table required by the format.\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n let length = 0;\n const offsets: number[] = [];\n\n const push = (data: Uint8Array | string) => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n chunks.push(bytes);\n length += bytes.length;\n };\n\n // Object numbering:\n // 1 = Catalog, 2 = Pages, then for each page: Page, Image, Content (3 objs).\n const objCount = 2 + pages.length * 3;\n const markObj = (n: number) => { offsets[n] = length; };\n\n push('%PDF-1.4\\n');\n // Binary comment so tools treat the file as binary.\n push(new Uint8Array([0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a]));\n\n // 1: Catalog\n markObj(1);\n push('1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n');\n\n // 2: Pages\n const pageObjNums = pages.map((_, i) => 3 + i * 3);\n markObj(2);\n push(\n `2 0 obj\\n<< /Type /Pages /Count ${pages.length} /Kids [${pageObjNums\n .map((n) => `${n} 0 R`)\n .join(' ')}] >>\\nendobj\\n`,\n );\n\n pages.forEach((page, i) => {\n const pageObj = 3 + i * 3;\n const imageObj = pageObj + 1;\n const contentObj = pageObj + 2;\n const w = page.width;\n const h = page.height;\n\n // Page object.\n markObj(pageObj);\n push(\n `${pageObj} 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${w} ${h}] ` +\n `/Resources << /XObject << /Im0 ${imageObj} 0 R >> >> ` +\n `/Contents ${contentObj} 0 R >>\\nendobj\\n`,\n );\n\n // Image XObject (JPEG via DCTDecode).\n markObj(imageObj);\n push(\n `${imageObj} 0 obj\\n<< /Type /XObject /Subtype /Image /Width ${w} /Height ${h} ` +\n `/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpeg.length} >>\\nstream\\n`,\n );\n push(page.jpeg);\n push('\\nendstream\\nendobj\\n');\n\n // Content stream: draw the image to fill the page.\n const content = `q\\n${w} 0 0 ${h} 0 0 cm\\n/Im0 Do\\nQ\\n`;\n const contentBytes = encoder.encode(content);\n markObj(contentObj);\n push(`${contentObj} 0 obj\\n<< /Length ${contentBytes.length} >>\\nstream\\n`);\n push(contentBytes);\n push('\\nendstream\\nendobj\\n');\n });\n\n // Cross-reference table.\n const xrefOffset = length;\n const total = objCount + 1; // + free object 0\n let xref = `xref\\n0 ${total}\\n0000000000 65535 f \\n`;\n for (let n = 1; n <= objCount; n++) {\n const off = offsets[n] ?? 0;\n xref += `${off.toString().padStart(10, '0')} 00000 n \\n`;\n }\n push(xref);\n push(\n `trailer\\n<< /Size ${total} /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`,\n );\n\n return new Blob(chunks as BlobPart[], { type: 'application/pdf' });\n}\n"],"mappings":";AAgBA,
|
|
1
|
+
{"version":3,"file":"pdfExport.js","names":["dataUrlToBytes","comma","dataUrl","base64","binary","bytes","i","pngDataUrlToJpeg","img","loadImage","canvas","ctx","background","quality","resolve","reject","src","buildPdfFromJpegs","encoder","chunks","length","offsets","push","data","objCount","pages","markObj","n","pageObjNums","pageObj","imageObj","contentObj","w","page","h","content","contentBytes","xrefOffset","total","xref","off"],"sources":["../../../../../src/components/pro/Flow/utils/pdfExport.ts"],"sourcesContent":["// Minimal client-side PDF writer: assembles a set of JPEG images (one per page)\n// into a single PDF file, with no third-party dependency.\n//\n// Each page is sized to the image's pixel dimensions (interpreted as PDF points)\n// so the exported slides keep their aspect ratio. This is intentionally tiny —\n// it only supports what the anchor→PDF export needs (a sequence of full-page\n// raster images).\n\ninterface PdfPageImage {\n /** Raw JPEG bytes. */\n jpeg: Uint8Array;\n width: number;\n height: number;\n}\n\n/** Convert a data URL (data:image/...;base64,....) to raw bytes. */\nexport function dataUrlToBytes(dataUrl: string): Uint8Array {\n const comma = dataUrl.indexOf(',');\n const base64 = dataUrl.slice(comma + 1);\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/**\n * Re-encode any image data URL (typically PNG) to a JPEG data URL at the given\n * quality, returning the JPEG bytes and pixel dimensions. JPEG keeps the PDF\n * compact and is natively embeddable via a DCTDecode filter.\n */\nexport async function pngDataUrlToJpeg(\n dataUrl: string,\n quality = 0.92,\n background = '#ffffff',\n): Promise<PdfPageImage> {\n const img = await loadImage(dataUrl);\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth || img.width;\n canvas.height = img.naturalHeight || img.height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('无法创建绘图上下文');\n // JPEG has no alpha; paint an opaque background first.\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0);\n const jpegUrl = canvas.toDataURL('image/jpeg', quality);\n return { jpeg: dataUrlToBytes(jpegUrl), width: canvas.width, height: canvas.height };\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('图片加载失败'));\n img.src = src;\n });\n}\n\n/**\n * Build a PDF (as a Blob) from a list of JPEG page images. Every page is sized\n * to its image dimensions (in points) so slides render 1:1 with their capture.\n */\nexport function buildPdfFromJpegs(pages: PdfPageImage[]): Blob {\n // We assemble the PDF as a list of byte chunks, tracking each object's byte\n // offset for the cross-reference (xref) table required by the format.\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n let length = 0;\n const offsets: number[] = [];\n\n const push = (data: Uint8Array | string) => {\n const bytes = typeof data === 'string' ? encoder.encode(data) : data;\n chunks.push(bytes);\n length += bytes.length;\n };\n\n // Object numbering:\n // 1 = Catalog, 2 = Pages, then for each page: Page, Image, Content (3 objs).\n const objCount = 2 + pages.length * 3;\n const markObj = (n: number) => { offsets[n] = length; };\n\n push('%PDF-1.4\\n');\n // Binary comment so tools treat the file as binary.\n push(new Uint8Array([0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a]));\n\n // 1: Catalog\n markObj(1);\n push('1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n');\n\n // 2: Pages\n const pageObjNums = pages.map((_, i) => 3 + i * 3);\n markObj(2);\n push(\n `2 0 obj\\n<< /Type /Pages /Count ${pages.length} /Kids [${pageObjNums\n .map((n) => `${n} 0 R`)\n .join(' ')}] >>\\nendobj\\n`,\n );\n\n pages.forEach((page, i) => {\n const pageObj = 3 + i * 3;\n const imageObj = pageObj + 1;\n const contentObj = pageObj + 2;\n const w = page.width;\n const h = page.height;\n\n // Page object.\n markObj(pageObj);\n push(\n `${pageObj} 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${w} ${h}] ` +\n `/Resources << /XObject << /Im0 ${imageObj} 0 R >> >> ` +\n `/Contents ${contentObj} 0 R >>\\nendobj\\n`,\n );\n\n // Image XObject (JPEG via DCTDecode).\n markObj(imageObj);\n push(\n `${imageObj} 0 obj\\n<< /Type /XObject /Subtype /Image /Width ${w} /Height ${h} ` +\n `/ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpeg.length} >>\\nstream\\n`,\n );\n push(page.jpeg);\n push('\\nendstream\\nendobj\\n');\n\n // Content stream: draw the image to fill the page.\n const content = `q\\n${w} 0 0 ${h} 0 0 cm\\n/Im0 Do\\nQ\\n`;\n const contentBytes = encoder.encode(content);\n markObj(contentObj);\n push(`${contentObj} 0 obj\\n<< /Length ${contentBytes.length} >>\\nstream\\n`);\n push(contentBytes);\n push('\\nendstream\\nendobj\\n');\n });\n\n // Cross-reference table.\n const xrefOffset = length;\n const total = objCount + 1; // + free object 0\n let xref = `xref\\n0 ${total}\\n0000000000 65535 f \\n`;\n for (let n = 1; n <= objCount; n++) {\n const off = offsets[n] ?? 0;\n xref += `${off.toString().padStart(10, '0')} 00000 n \\n`;\n }\n push(xref);\n push(\n `trailer\\n<< /Size ${total} /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`,\n );\n\n return new Blob(chunks as BlobPart[], { type: 'application/pdf' });\n}\n"],"mappings":"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"}
|