dishui 0.0.108 → 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.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/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.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":"FloatingDialog.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const startGesture = useCallback((e: React.PointerEvent<HTMLDivElement>, resize: boolean) => {\n if (editor.isDestroyed || !editor.isEditable || !e.isPrimary || e.button !== 0) return;\n if (!resize && (!isFloat || (e.target as HTMLElement).closest('button, input'))) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget;\n const doc = target.ownerDocument;\n const pointerId = e.pointerId;\n const { clientX, clientY } = e;\n let lastX = resize ? attrs.width : attrs.x;\n let lastY = resize ? attrs.height : attrs.y;\n const startX = lastX;\n const startY = lastY;\n\n const onMove = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return;\n const x = resize ? Math.max(160, startX + ev.clientX - clientX) : startX + ev.clientX - clientX;\n const y = resize ? Math.max(80, startY + ev.clientY - clientY) : startY + ev.clientY - clientY;\n if (x === lastX && y === lastY) return;\n lastX = x;\n lastY = y;\n updateAttributes(resize ? { width: x, height: y } : { x, y });\n };\n const cleanup = () => {\n doc.removeEventListener('pointermove', onMove);\n doc.removeEventListener('pointerup', onEnd);\n doc.removeEventListener('pointercancel', onEnd);\n target.removeEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = null;\n if (target.hasPointerCapture(pointerId)) target.releasePointerCapture(pointerId);\n };\n const onEnd = (ev: PointerEvent) => {\n if (ev.pointerId === pointerId) cleanup();\n };\n // Capture keeps the gesture paired even when a finger leaves the handle.\n target.setPointerCapture(pointerId);\n doc.addEventListener('pointermove', onMove);\n doc.addEventListener('pointerup', onEnd);\n doc.addEventListener('pointercancel', onEnd);\n target.addEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = cleanup;\n }, [editor, isFloat, attrs.x, attrs.y, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor, touchAction: isFloat && editable ? 'none' : undefined }}\n onPointerDown={(e) => startGesture(e, false)}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\" onPointerDown={(e) => e.stopPropagation()}>\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onPointerDown={(e) => startGesture(e, true)} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FloatingDialog.js","names":["DIALOG_COLORS","LAYOUT_OPTIONS","collectFloatZIndices","indices","editor","node","FloatingDialogView","writeAttributes","editable","useNodeEditable","updateAttributes","useCallback","attributes","gestureCleanup","useRef","attrs","layout","isFloat","zIndex","editingTitle","setEditingTitle","useState","localTitle","setLocalTitle","showColorPicker","setShowColorPicker","showLayoutPicker","setShowLayoutPicker","colorRef","layoutRef","useEffect","cleanup","handler","startGesture","resize","target","doc","pointerId","lastX","lastY","startX","startY","onMove","ev","x","clientX","y","clientY","onEnd","saveTitle","bringForward","all","maxZ","sendBackward","minZ","wrapperClass","cn","selected","wrapperStyle","boxStyle","layoutIcon","l","NodeViewWrapper","opt","c","deleteNode","NodeViewContent","getNextFloatZIndex","z","FloatingDialogExtension","Node","mergeAttributes","HTMLAttributes","ReactNodeViewRenderer"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const startGesture = useCallback((e: React.PointerEvent<HTMLDivElement>, resize: boolean) => {\n if (editor.isDestroyed || !editor.isEditable || !e.isPrimary || e.button !== 0) return;\n if (!resize && (!isFloat || (e.target as HTMLElement).closest('button, input'))) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget;\n const doc = target.ownerDocument;\n const pointerId = e.pointerId;\n const { clientX, clientY } = e;\n let lastX = resize ? attrs.width : attrs.x;\n let lastY = resize ? attrs.height : attrs.y;\n const startX = lastX;\n const startY = lastY;\n\n const onMove = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return;\n const x = resize ? Math.max(160, startX + ev.clientX - clientX) : startX + ev.clientX - clientX;\n const y = resize ? Math.max(80, startY + ev.clientY - clientY) : startY + ev.clientY - clientY;\n if (x === lastX && y === lastY) return;\n lastX = x;\n lastY = y;\n updateAttributes(resize ? { width: x, height: y } : { x, y });\n };\n const cleanup = () => {\n doc.removeEventListener('pointermove', onMove);\n doc.removeEventListener('pointerup', onEnd);\n doc.removeEventListener('pointercancel', onEnd);\n target.removeEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = null;\n if (target.hasPointerCapture(pointerId)) target.releasePointerCapture(pointerId);\n };\n const onEnd = (ev: PointerEvent) => {\n if (ev.pointerId === pointerId) cleanup();\n };\n // Capture keeps the gesture paired even when a finger leaves the handle.\n target.setPointerCapture(pointerId);\n doc.addEventListener('pointermove', onMove);\n doc.addEventListener('pointerup', onEnd);\n doc.addEventListener('pointercancel', onEnd);\n target.addEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = cleanup;\n }, [editor, isFloat, attrs.x, attrs.y, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor, touchAction: isFloat && editable ? 'none' : undefined }}\n onPointerDown={(e) => startGesture(e, false)}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\" onPointerDown={(e) => e.stopPropagation()}>\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onPointerDown={(e) => startGesture(e, true)} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FontSize.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FontSize.ts"],"sourcesContent":["import { Extension } from '@tiptap/react';\n\nexport type FontSizeOptions = {\n types: string[];\n};\n\ndeclare module '@tiptap/react' {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nfunction isFontSize(value: unknown): value is string {\n return typeof value === 'string' && /^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|pt|pc|em|rem|ex|ch|%|vw|vh|vmin|vmax)|xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large|smaller|larger|inherit|initial|unset|revert)$/i.test(value);\n}\n\nconst FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) => element.style.fontSize?.replace(/['\"]+/g, '') || null,\n renderHTML: (attributes) => {\n if (!isFontSize(attributes.fontSize)) return {};\n return { style: `font-size: ${attributes.fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain, editor }) => {\n if (!editor.isEditable || !isFontSize(fontSize)) return false;\n return chain().setMark('textStyle', { fontSize }).run();\n },\n unsetFontSize:\n () =>\n ({ chain, editor }) => {\n if (!editor.isEditable) return false;\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n\nexport default FontSize;\n"],"mappings":";;AAeA,
|
|
1
|
+
{"version":3,"file":"FontSize.js","names":["isFontSize","value","FontSize","Extension","element","attributes","editor","fontSize","chain"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FontSize.ts"],"sourcesContent":["import { Extension } from '@tiptap/react';\n\nexport type FontSizeOptions = {\n types: string[];\n};\n\ndeclare module '@tiptap/react' {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nfunction isFontSize(value: unknown): value is string {\n return typeof value === 'string' && /^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|pt|pc|em|rem|ex|ch|%|vw|vh|vmin|vmax)|xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large|smaller|larger|inherit|initial|unset|revert)$/i.test(value);\n}\n\nconst FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) => element.style.fontSize?.replace(/['\"]+/g, '') || null,\n renderHTML: (attributes) => {\n if (!isFontSize(attributes.fontSize)) return {};\n return { style: `font-size: ${attributes.fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain, editor }) => {\n if (!editor.isEditable || !isFontSize(fontSize)) return false;\n return chain().setMark('textStyle', { fontSize }).run();\n },\n unsetFontSize:\n () =>\n ({ chain, editor }) => {\n if (!editor.isEditable) return false;\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n\nexport default FontSize;\n"],"mappings":";;AAeA,SAASA,EAAW,GAAiC;CACnD,OAAO,OAAOC,KAAU,YAAY,yLAAyL,KAAKA,CAAK;AACzO;AAEA,IAAMC,IAAWC,EAAU,OAAwB;CACjD,MAAM;CAEN,aAAa;EACX,OAAO,EACL,OAAO,CAAC,WAAW,EACrB;CACF;CAEA,sBAAsB;EACpB,OAAO,CACL;GACE,OAAO,KAAK,QAAQ;GACpB,YAAY,EACV,UAAU;IACR,SAAS;IACT,YAAY,MAAYC,EAAQ,MAAM,UAAU,QAAQ,UAAU,EAAE,KAAK;IACzE,aAAa,MACNJ,EAAWK,EAAW,QAAQ,IAC5B,EAAE,OAAO,cAAcA,EAAW,WAAW,IADP,CAAC;GAGlD,EACF;EACF,CACF;CACF;CAEA,cAAc;EACZ,OAAO;GACL,cACG,OACA,EAAE,UAAO,gBACJ,CAACC,EAAO,cAAc,CAACN,EAAWO,CAAQ,IAAU,KACjDC,EAAM,CAAC,CAAC,QAAQ,aAAa,EAAE,YAAS,CAAC,CAAC,CAAC,IAAI;GAE1D,sBAEG,EAAE,UAAO,gBACHF,EAAO,aACLE,EAAM,CAAC,CAAC,QAAQ,aAAa,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,IAAI,IADpD;EAGrC;CACF;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownBlock.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/MarkdownBlock.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback, useSyncExternalStore } from 'react';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\n\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport mermaid from 'mermaid';\nimport { normalizeLegacyMermaid } from './legacyMermaid';\nimport 'katex/dist/katex.min.css';\n\nexport function useNodeEditable(editor: NodeViewProps['editor']) {\n const subscribe = useCallback((notify: () => void) => {\n // setEditable emits update, not transaction, in Tiptap 3.\n editor.on('update', notify);\n editor.on('transaction', notify);\n editor.on('destroy', notify);\n return () => {\n editor.off('update', notify);\n editor.off('transaction', notify);\n editor.off('destroy', notify);\n };\n }, [editor]);\n return useSyncExternalStore(subscribe, () => !editor.isDestroyed && editor.isEditable, () => false);\n}\n\nlet renderQueue: Promise<unknown> = Promise.resolve();\n\nfunction renderMermaid(id: string, code: string) {\n const result = renderQueue.then(() => {\n // Capture strict config when rendering starts, not before Mermaid's global queue runs.\n mermaid.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'strict',\n suppressErrorRendering: true,\n fontFamily: 'inherit',\n flowchart: { useMaxWidth: true, htmlLabels: false },\n });\n return mermaid.mermaidAPI.render(id, code);\n });\n renderQueue = result.catch(() => undefined);\n return result;\n}\n\nexport const MermaidRenderer: React.FC<{ code: string }> = ({ code }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n containerRef.current.replaceChildren();\n if (!code.trim()) return;\n\n let cancelled = false;\n const render = async () => {\n try {\n const id = `mermaid-md-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const { svg } = await renderMermaid(id, normalizeLegacyMermaid(code));\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = svg;\n }\n } catch (err) {\n if (!cancelled && containerRef.current) {\n containerRef.current.textContent = String(err);\n }\n }\n };\n render();\n return () => { cancelled = true; };\n }, [code]);\n\n return <div ref={containerRef} className=\"rte-mermaid-container\" />;\n};\n\nconst MarkdownPreview: React.FC<{ content: string }> = ({ content }) => {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n const lang = match?.[1];\n const text = String(children).replace(/\\n$/, '');\n\n if (lang === 'mermaid') {\n return <MermaidRenderer code={text} />;\n }\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0.5em 0',\n }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {content}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownBlockView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const [isEditing, setIsEditing] = useState(false);\n const [localContent, setLocalContent] = useState(node.attrs.content || '');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n setLocalContent(node.attrs.content || '');\n setIsEditing(false);\n }, [node.attrs.content, editable]);\n\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n adjustTextareaHeight(textareaRef.current);\n }\n }, [isEditing]);\n\n const adjustTextareaHeight = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto';\n el.style.height = el.scrollHeight + 'px';\n };\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setLocalContent(e.target.value);\n adjustTextareaHeight(e.target);\n }, []);\n\n const handleBlur = useCallback(() => {\n if (!editor.isDestroyed && editor.isEditable) updateAttributes({ content: localContent });\n setIsEditing(false);\n }, [editor, localContent, updateAttributes]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleBlur();\n }\n }, [handleBlur]);\n\n const defaultContent = `# Markdown Block\n\nWrite your **markdown** here.\n\n\\`\\`\\`mermaid\ngraph LR\n A[Start] --> B[End]\n\\`\\`\\`\n`;\n\n const displayContent = localContent || defaultContent;\n\n return (\n <NodeViewWrapper contentEditable={false} className={`rte-markdown-block ${selected ? 'rte-markdown-block--selected' : ''}`}>\n <div className=\"rte-markdown-block__header\">\n <span className=\"rte-markdown-block__label\">Markdown</span>\n <button\n type=\"button\"\n className={`rte-markdown-block__toggle ${isEditing ? 'rte-markdown-block__toggle--active' : ''}`}\n disabled={!editable}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (isEditing) {\n updateAttributes({ content: localContent });\n }\n setIsEditing(!isEditing);\n }}\n title={isEditing ? 'Preview' : 'Edit'}\n >\n {isEditing ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n )}\n <span>{isEditing ? 'Preview' : 'Edit'}</span>\n </button>\n </div>\n\n <div className=\"rte-markdown-block__body\">\n {isEditing && editable ? (\n <textarea\n ref={textareaRef}\n className=\"rte-markdown-block__editor\"\n value={localContent}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter Markdown content...\"\n rows={5}\n />\n ) : (\n <div\n className=\"rte-markdown-block__preview prose\"\n onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setIsEditing(true); }}\n >\n {displayContent.trim() ? (\n <MarkdownPreview content={displayContent} />\n ) : (\n <p className=\"rte-markdown-block__placeholder\">\n Double-click to edit Markdown content...\n </p>\n )}\n </div>\n )}\n </div>\n </NodeViewWrapper>\n );\n};\n\nexport const MarkdownBlockExtension = Node.create({\n name: 'markdownBlock',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n content: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"markdown-block\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'markdown-block' })];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(MarkdownBlockView);\n },\n});\n\nexport default MarkdownBlockExtension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownBlock.js","names":["SyntaxHighlighter","ReactMarkdown","remarkGfm","rehypeKatex","remarkMath","mermaid","useNodeEditable","subscribe","useCallback","editor","notify","useSyncExternalStore","renderQueue","renderMermaid","result","id","code","MermaidRenderer","containerRef","useRef","useEffect","cancelled","normalizeLegacyMermaid","svg","err","MarkdownPreview","props","lang","className","text","children","Prism","oneLight","content","MarkdownBlockView","editable","isEditing","setIsEditing","useState","localContent","setLocalContent","node","textareaRef","adjustTextareaHeight","el","handleChange","handleBlur","updateAttributes","handleKeyDown","displayContent","NodeViewWrapper","selected","MarkdownBlockExtension","Node","mergeAttributes","HTMLAttributes","ReactNodeViewRenderer"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/MarkdownBlock.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback, useSyncExternalStore } from 'react';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\n\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport mermaid from 'mermaid';\nimport { normalizeLegacyMermaid } from './legacyMermaid';\nimport 'katex/dist/katex.min.css';\n\nexport function useNodeEditable(editor: NodeViewProps['editor']) {\n const subscribe = useCallback((notify: () => void) => {\n // setEditable emits update, not transaction, in Tiptap 3.\n editor.on('update', notify);\n editor.on('transaction', notify);\n editor.on('destroy', notify);\n return () => {\n editor.off('update', notify);\n editor.off('transaction', notify);\n editor.off('destroy', notify);\n };\n }, [editor]);\n return useSyncExternalStore(subscribe, () => !editor.isDestroyed && editor.isEditable, () => false);\n}\n\nlet renderQueue: Promise<unknown> = Promise.resolve();\n\nfunction renderMermaid(id: string, code: string) {\n const result = renderQueue.then(() => {\n // Capture strict config when rendering starts, not before Mermaid's global queue runs.\n mermaid.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'strict',\n suppressErrorRendering: true,\n fontFamily: 'inherit',\n flowchart: { useMaxWidth: true, htmlLabels: false },\n });\n return mermaid.mermaidAPI.render(id, code);\n });\n renderQueue = result.catch(() => undefined);\n return result;\n}\n\nexport const MermaidRenderer: React.FC<{ code: string }> = ({ code }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n containerRef.current.replaceChildren();\n if (!code.trim()) return;\n\n let cancelled = false;\n const render = async () => {\n try {\n const id = `mermaid-md-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const { svg } = await renderMermaid(id, normalizeLegacyMermaid(code));\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = svg;\n }\n } catch (err) {\n if (!cancelled && containerRef.current) {\n containerRef.current.textContent = String(err);\n }\n }\n };\n render();\n return () => { cancelled = true; };\n }, [code]);\n\n return <div ref={containerRef} className=\"rte-mermaid-container\" />;\n};\n\nconst MarkdownPreview: React.FC<{ content: string }> = ({ content }) => {\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n const lang = match?.[1];\n const text = String(children).replace(/\\n$/, '');\n\n if (lang === 'mermaid') {\n return <MermaidRenderer code={text} />;\n }\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0.5em 0',\n }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {content}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownBlockView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const [isEditing, setIsEditing] = useState(false);\n const [localContent, setLocalContent] = useState(node.attrs.content || '');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n setLocalContent(node.attrs.content || '');\n setIsEditing(false);\n }, [node.attrs.content, editable]);\n\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n textareaRef.current.focus();\n adjustTextareaHeight(textareaRef.current);\n }\n }, [isEditing]);\n\n const adjustTextareaHeight = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto';\n el.style.height = el.scrollHeight + 'px';\n };\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setLocalContent(e.target.value);\n adjustTextareaHeight(e.target);\n }, []);\n\n const handleBlur = useCallback(() => {\n if (!editor.isDestroyed && editor.isEditable) updateAttributes({ content: localContent });\n setIsEditing(false);\n }, [editor, localContent, updateAttributes]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleBlur();\n }\n }, [handleBlur]);\n\n const defaultContent = `# Markdown Block\n\nWrite your **markdown** here.\n\n\\`\\`\\`mermaid\ngraph LR\n A[Start] --> B[End]\n\\`\\`\\`\n`;\n\n const displayContent = localContent || defaultContent;\n\n return (\n <NodeViewWrapper contentEditable={false} className={`rte-markdown-block ${selected ? 'rte-markdown-block--selected' : ''}`}>\n <div className=\"rte-markdown-block__header\">\n <span className=\"rte-markdown-block__label\">Markdown</span>\n <button\n type=\"button\"\n className={`rte-markdown-block__toggle ${isEditing ? 'rte-markdown-block__toggle--active' : ''}`}\n disabled={!editable}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (isEditing) {\n updateAttributes({ content: localContent });\n }\n setIsEditing(!isEditing);\n }}\n title={isEditing ? 'Preview' : 'Edit'}\n >\n {isEditing ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n )}\n <span>{isEditing ? 'Preview' : 'Edit'}</span>\n </button>\n </div>\n\n <div className=\"rte-markdown-block__body\">\n {isEditing && editable ? (\n <textarea\n ref={textareaRef}\n className=\"rte-markdown-block__editor\"\n value={localContent}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder=\"Enter Markdown content...\"\n rows={5}\n />\n ) : (\n <div\n className=\"rte-markdown-block__preview prose\"\n onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setIsEditing(true); }}\n >\n {displayContent.trim() ? (\n <MarkdownPreview content={displayContent} />\n ) : (\n <p className=\"rte-markdown-block__placeholder\">\n Double-click to edit Markdown content...\n </p>\n )}\n </div>\n )}\n </div>\n </NodeViewWrapper>\n );\n};\n\nexport const MarkdownBlockExtension = Node.create({\n name: 'markdownBlock',\n group: 'block',\n atom: true,\n draggable: true,\n\n addAttributes() {\n return {\n content: {\n default: '',\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"markdown-block\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'markdown-block' })];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(MarkdownBlockView);\n },\n});\n\nexport default MarkdownBlockExtension;\n"],"mappings":";;;;;;;;;;;;;AAeA,SAAgBM,EAAgB,GAAiC;CAC/D,IAAMC,IAAYC,GAAa,OAE7BC,EAAO,GAAG,UAAUC,CAAM,GAC1BD,EAAO,GAAG,eAAeC,CAAM,GAC/BD,EAAO,GAAG,WAAWC,CAAM,SACd;EAGX,AAFAD,EAAO,IAAI,UAAUC,CAAM,GAC3BD,EAAO,IAAI,eAAeC,CAAM,GAChCD,EAAO,IAAI,WAAWC,CAAM;CAC9B,IACC,CAACD,CAAM,CAAC;CACX,OAAOE,EAAqBJ,SAAiB,CAACE,EAAO,eAAeA,EAAO,kBAAkB,EAAK;AACpG;AAEA,IAAIG,IAAgC,QAAQ,QAAQ;AAEpD,SAASC,EAAc,GAAY,GAAc;CAC/C,IAAMC,IAASF,EAAY,YAEzBP,EAAQ,WAAW;EACjB,aAAa;EACb,OAAO;EACP,eAAe;EACf,wBAAwB;EACxB,YAAY;EACZ,WAAW;GAAE,aAAa;GAAM,YAAY;EAAM;CACpD,CAAC,GACMA,EAAQ,WAAW,OAAOU,GAAIC,CAAI,EAC1C;CAED,OADA,IAAcF,EAAO,YAAY,KAAA,CAAS,GACnCA;AACT;AAEA,IAAaG,KAA+C,EAAE,cAAW;CACvE,IAAMC,IAAeC,EAAuB,IAAI;CAyBhD,OAvBAC,QAAgB;EAGd,IAFI,CAACF,EAAa,YAClBA,EAAa,QAAQ,gBAAgB,GACjC,CAACF,EAAK,KAAK,IAAG;EAElB,IAAIK,IAAY;EAehB,QADA,YAb2B;GACzB,IAAI;IAEF,IAAM,EAAE,WAAQ,MAAMR,EAAc,cADX,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KACpCS,EAAuBN,CAAI,CAAC;IACpE,AAAI,CAACK,KAAaH,EAAa,YAC7B,EAAa,QAAQ,YAAYK;GAErC,SAASC,GAAK;IACZ,AAAI,CAACH,KAAaH,EAAa,YAC7B,EAAa,QAAQ,cAAc,OAAOM,CAAG;GAEjD;EACF,EACA,CAAO,SACM;GAAE,IAAY;EAAM;CACnC,GAAG,CAACR,CAAI,CAAC,GAEF,kBAAC,OAAD;EAAK,KAAKE;EAAc,WAAU;CAAyB,CAAA;AACpE,GAEMO,KAAkD,EAAE,iBAEtD,kBAACxB,GAAD;CACE,eAAe,CAACC,GAAWE,CAAU;CACrC,eAAe,CAACD,CAAW;CAC3B,YAAY,EACV,KAAK,EAAE,cAAW,aAAU,GAAGuB,KAAS;EAEtC,IAAMC,IADQ,iBAAiB,KAAKC,KAAa,EACpC,CAAA,GAAQ,IACfC,IAAO,OAAOC,CAAQ,CAAC,CAAC,QAAQ,OAAO,EAAE;EAuB/C,OArBIH,MAAS,YACJ,kBAACV,GAAD,EAAiB,MAAMY,EAAO,CAAA,IAGnCF,IAEA,kBAAC3B,GAAD;GACE,OAAOgC;GACP,UAAUL;GACV,QAAO;GACP,aAAa;IACX,cAAc;IACd,UAAU;IACV,SAAS;IACT,QAAQ;GACV;GAEC,UAAAE;EACgB,CAAA,IAGhB,kBAAC,QAAD;GAAiB;GAAW,GAAIH;GAAQ;EAAe,CAAA;CAChE,EACF;CAEC,UAAAO;AACY,CAAA,GAIbC,KAA8C,EAClD,SACA,WACA,qBACA,kBACI;CACJ,IAAMC,IAAW7B,EAAgBG,CAAM,GACjC,CAAC2B,GAAWC,KAAgBC,EAAS,EAAK,GAC1C,CAACC,GAAcC,KAAmBF,EAASG,EAAK,MAAM,WAAW,EAAE,GACnEC,IAAcvB,EAA4B,IAAI;CAOpD,AALAC,QAAgB;EAEd,AADAoB,EAAgBC,EAAK,MAAM,WAAW,EAAE,GACxCJ,EAAa,EAAK;CACpB,GAAG,CAACI,EAAK,MAAM,SAASN,CAAQ,CAAC,GAEjCf,QAAgB;EACd,AAAIgB,KAAaM,EAAY,YAC3BA,EAAY,QAAQ,MAAM,GAC1BC,EAAqBD,EAAY,OAAO;CAE5C,GAAG,CAACN,CAAS,CAAC;CAEd,IAAMO,KAAwB,MAA4B;EAExD,AADA,EAAG,MAAM,SAAS,QAClB,EAAG,MAAM,SAASC,EAAG,eAAe;CACtC,GAEMC,IAAerC,GAAa,MAA8C;EAE9E,AADAgC,EAAgB,EAAE,OAAO,KAAK,GAC9BG,EAAqB,EAAE,MAAM;CAC/B,GAAG,CAAC,CAAC,GAECG,IAAatC,QAAkB;EAEnC,AADI,CAACC,EAAO,eAAeA,EAAO,cAAYsC,EAAiB,EAAE,SAASR,EAAa,CAAC,GACxFF,EAAa,EAAK;CACpB,GAAG;EAAC5B;EAAQ8B;EAAcQ;CAAgB,CAAC,GAErCC,IAAgBxC,GAAa,MAA2B;EAC5D,AAAI,EAAE,QAAQ,YACZsC,EAAW;CAEf,GAAG,CAACA,CAAU,CAAC,GAYTG,IAAiBV,KAAgB;CAEvC,OACE,kBAACW,GAAD;EAAiB,iBAAiB;EAAO,WAAW,sBAAsBC,IAAW,iCAAiC;EAAtH,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,QAAD;IAAM,WAAU;IAA4B,UAAA;GAAc,CAAA,GAC1D,kBAAC,UAAD;IACE,MAAK;IACL,WAAW,8BAA8Bf,IAAY,uCAAuC;IAC5F,UAAU,CAACD;IACX,cAAc,MAAM,EAAE,eAAe;IACrC,eAAe;KACb,AAAI,GAAO,eAAgB1B,EAAO,eAC9B2B,KACFW,EAAiB,EAAE,SAASR,EAAa,CAAC,GAE5CF,EAAa,CAACD,CAAS;IACzB;IACA,OAAOA,IAAY,YAAY;IAZjC,UAAA,CAcGA,IACC,kBAAC,OAAD;KAAK,OAAM;KAAK,QAAO;KAAK,SAAQ;KAAY,MAAK;KAAO,QAAO;KAAe,aAAY;KAAI,eAAc;KAAQ,gBAAe;KAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,+CAAgD,CAAA,GACxD,kBAAC,UAAD;MAAQ,IAAG;MAAK,IAAG;MAAK,GAAE;KAAK,CAAA,CAC5B;IAEL,CAAA,IAAA,kBAAC,OAAD;KAAK,OAAM;KAAK,QAAO;KAAK,SAAQ;KAAY,MAAK;KAAO,QAAO;KAAe,aAAY;KAAI,eAAc;KAAQ,gBAAe;KAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA,GACjE,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA,CAC9D;IAEP,CAAA,GAAA,kBAAC,QAAD,EAAA,UAAOA,IAAY,YAAY,OAAa,CAAA,CACtC;GACL,CAAA,CAAA;EAEL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAAA,KAAaD,IACZ,kBAAC,YAAD;IACE,KAAKO;IACL,WAAU;IACV,OAAOH;IACP,UAAUM;IACV,QAAQC;IACR,WAAWE;IACX,aAAY;IACZ,MAAM;GACP,CAAA,IAED,kBAAC,OAAD;IACE,WAAU;IACV,qBAAqB;KAAE,AAAI,CAACvC,EAAO,eAAeA,EAAO,cAAY4B,EAAa,EAAI;IAAG;IAExF,UAAAY,EAAe,KAAK,IACnB,kBAACxB,GAAD,EAAiB,SAASwB,EAAiB,CAAA,IAE3C,kBAAC,KAAD;KAAG,WAAU;KAAkC,UAAA;IAE5C,CAAA;GAEF,CAAA;EAEJ,CAAA,CACU;;AAErB,GAEaG,IAAyBC,EAAK,OAAO;CAChD,MAAM;CACN,OAAO;CACP,MAAM;CACN,WAAW;CAEX,gBAAgB;EACd,OAAO,EACL,SAAS,EACP,SAAS,GACX,EACF;CACF;CAEA,YAAY;EACV,OAAO,CACL,EACE,KAAK,oCACP,CACF;CACF;CAEA,WAAW,EAAE,qBAAkB;EAC7B,OAAO,CAAC,OAAOC,EAAgBC,GAAgB,EAAE,aAAa,iBAAiB,CAAC,CAAC;CACnF;CAEA,cAAc;EACZ,OAAOC,EAAsBtB,CAAiB;CAChD;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizableImage.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/ResizableImage.tsx"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\nimport Image from '@tiptap/extension-image';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\n/**\n * ResizableImage extends the stock Tiptap Image node with:\n * - persisted `width` / `height` / `align` attributes (serialized to HTML)\n * - a React NodeView that renders drag handles on the four corners so users can\n * resize the image by dragging (mouse + touch), keeping the aspect ratio.\n *\n * The public API is unchanged: `editor.chain().setImage({ src })` still works,\n * and existing documents (plain `<img>`) upgrade transparently.\n */\n\nconst MIN_WIDTH = 40;\n\ntype Corner = 'nw' | 'ne' | 'sw' | 'se';\n\nconst ResizableImageNodeView: React.FC<NodeViewProps> = ({ node, updateAttributes, selected, editor }) => {\n const editable = useNodeEditable(editor);\n const imgRef = useRef<HTMLImageElement>(null);\n const [resizing, setResizing] = useState(false);\n\n const { src, alt, title, width, align } = node.attrs as {\n src: string;\n alt?: string;\n title?: string;\n width?: number | null;\n height?: number | null;\n align?: 'left' | 'center' | 'right' | null;\n };\n\n const startResize = useCallback(\n (corner: Corner) => (event: React.MouseEvent | React.TouchEvent) => {\n if (!editable) return;\n event.preventDefault();\n event.stopPropagation();\n\n const img = imgRef.current;\n if (!img) return;\n\n const isTouch = 'touches' in event;\n const startX = isTouch ? event.touches[0].clientX : (event as React.MouseEvent).clientX;\n const startWidth = img.getBoundingClientRect().width;\n const ratio = img.naturalHeight && img.naturalWidth ? img.naturalHeight / img.naturalWidth : 0;\n // Left-side handles grow the image when dragged leftwards.\n const dir = corner === 'nw' || corner === 'sw' ? -1 : 1;\n const maxWidth = img.parentElement?.parentElement?.getBoundingClientRect().width ?? Infinity;\n\n setResizing(true);\n\n const move = (clientX: number) => {\n const delta = (clientX - startX) * dir;\n const next = Math.round(Math.min(maxWidth, Math.max(MIN_WIDTH, startWidth + delta)));\n updateAttributes({ width: next, height: ratio ? Math.round(next * ratio) : null });\n };\n\n const onMouseMove = (e: MouseEvent) => move(e.clientX);\n const onTouchMove = (e: TouchEvent) => {\n if (e.cancelable) e.preventDefault();\n move(e.touches[0].clientX);\n };\n const stop = () => {\n setResizing(false);\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', stop);\n window.removeEventListener('touchmove', onTouchMove);\n window.removeEventListener('touchend', stop);\n window.removeEventListener('touchcancel', stop);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', stop);\n window.addEventListener('touchmove', onTouchMove, { passive: false });\n window.addEventListener('touchend', stop);\n window.addEventListener('touchcancel', stop);\n },\n [editable, updateAttributes],\n );\n\n const active = editable && (selected || resizing);\n const corners: Corner[] = ['nw', 'ne', 'sw', 'se'];\n\n return (\n <NodeViewWrapper\n className=\"rte-resizable-image\"\n data-align={align || 'left'}\n data-active={active ? 'true' : undefined}\n >\n <span className=\"rte-resizable-image__frame\" style={{ width: width ? `${width}px` : undefined }}>\n <img\n ref={imgRef}\n src={src}\n alt={alt || ''}\n title={title || undefined}\n draggable={false}\n style={{ width: width ? `${width}px` : undefined }}\n />\n {active &&\n corners.map((corner) => (\n <span\n key={corner}\n className={`rte-resizable-image__handle rte-resizable-image__handle--${corner}`}\n onMouseDown={startResize(corner)}\n onTouchStart={startResize(corner)}\n role=\"presentation\"\n />\n ))}\n </span>\n </NodeViewWrapper>\n );\n};\n\nexport const ResizableImage = Image.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: null,\n parseHTML: (element) => {\n const attr = element.getAttribute('width');\n if (attr) return parseInt(attr, 10) || null;\n const style = element.style.width;\n return style ? parseInt(style, 10) || null : null;\n },\n renderHTML: (attributes) =>\n attributes.width ? { width: attributes.width, style: `width: ${attributes.width}px` } : {},\n },\n height: {\n default: null,\n parseHTML: (element) => {\n const attr = element.getAttribute('height');\n return attr ? parseInt(attr, 10) || null : null;\n },\n renderHTML: (attributes) => (attributes.height ? { height: attributes.height } : {}),\n },\n align: {\n default: 'left',\n parseHTML: (element) => element.getAttribute('data-align') || 'left',\n renderHTML: (attributes) => (attributes.align ? { 'data-align': attributes.align } : {}),\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ResizableImageNodeView);\n },\n});\n\nexport default ResizableImage;\n"],"mappings":";;;;;;AAgBA,
|
|
1
|
+
{"version":3,"file":"ResizableImage.js","names":["Image","MIN_WIDTH","ResizableImageNodeView","editable","useNodeEditable","editor","imgRef","useRef","resizing","setResizing","useState","node","startResize","useCallback","event","img","startX","startWidth","ratio","dir","corner","maxWidth","move","delta","clientX","next","onMouseMove","onTouchMove","stop","updateAttributes","active","selected","NodeViewWrapper","align","width","alt","title","ResizableImage","attr","element","style","attributes","ReactNodeViewRenderer"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/ResizableImage.tsx"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\nimport Image from '@tiptap/extension-image';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\n/**\n * ResizableImage extends the stock Tiptap Image node with:\n * - persisted `width` / `height` / `align` attributes (serialized to HTML)\n * - a React NodeView that renders drag handles on the four corners so users can\n * resize the image by dragging (mouse + touch), keeping the aspect ratio.\n *\n * The public API is unchanged: `editor.chain().setImage({ src })` still works,\n * and existing documents (plain `<img>`) upgrade transparently.\n */\n\nconst MIN_WIDTH = 40;\n\ntype Corner = 'nw' | 'ne' | 'sw' | 'se';\n\nconst ResizableImageNodeView: React.FC<NodeViewProps> = ({ node, updateAttributes, selected, editor }) => {\n const editable = useNodeEditable(editor);\n const imgRef = useRef<HTMLImageElement>(null);\n const [resizing, setResizing] = useState(false);\n\n const { src, alt, title, width, align } = node.attrs as {\n src: string;\n alt?: string;\n title?: string;\n width?: number | null;\n height?: number | null;\n align?: 'left' | 'center' | 'right' | null;\n };\n\n const startResize = useCallback(\n (corner: Corner) => (event: React.MouseEvent | React.TouchEvent) => {\n if (!editable) return;\n event.preventDefault();\n event.stopPropagation();\n\n const img = imgRef.current;\n if (!img) return;\n\n const isTouch = 'touches' in event;\n const startX = isTouch ? event.touches[0].clientX : (event as React.MouseEvent).clientX;\n const startWidth = img.getBoundingClientRect().width;\n const ratio = img.naturalHeight && img.naturalWidth ? img.naturalHeight / img.naturalWidth : 0;\n // Left-side handles grow the image when dragged leftwards.\n const dir = corner === 'nw' || corner === 'sw' ? -1 : 1;\n const maxWidth = img.parentElement?.parentElement?.getBoundingClientRect().width ?? Infinity;\n\n setResizing(true);\n\n const move = (clientX: number) => {\n const delta = (clientX - startX) * dir;\n const next = Math.round(Math.min(maxWidth, Math.max(MIN_WIDTH, startWidth + delta)));\n updateAttributes({ width: next, height: ratio ? Math.round(next * ratio) : null });\n };\n\n const onMouseMove = (e: MouseEvent) => move(e.clientX);\n const onTouchMove = (e: TouchEvent) => {\n if (e.cancelable) e.preventDefault();\n move(e.touches[0].clientX);\n };\n const stop = () => {\n setResizing(false);\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', stop);\n window.removeEventListener('touchmove', onTouchMove);\n window.removeEventListener('touchend', stop);\n window.removeEventListener('touchcancel', stop);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', stop);\n window.addEventListener('touchmove', onTouchMove, { passive: false });\n window.addEventListener('touchend', stop);\n window.addEventListener('touchcancel', stop);\n },\n [editable, updateAttributes],\n );\n\n const active = editable && (selected || resizing);\n const corners: Corner[] = ['nw', 'ne', 'sw', 'se'];\n\n return (\n <NodeViewWrapper\n className=\"rte-resizable-image\"\n data-align={align || 'left'}\n data-active={active ? 'true' : undefined}\n >\n <span className=\"rte-resizable-image__frame\" style={{ width: width ? `${width}px` : undefined }}>\n <img\n ref={imgRef}\n src={src}\n alt={alt || ''}\n title={title || undefined}\n draggable={false}\n style={{ width: width ? `${width}px` : undefined }}\n />\n {active &&\n corners.map((corner) => (\n <span\n key={corner}\n className={`rte-resizable-image__handle rte-resizable-image__handle--${corner}`}\n onMouseDown={startResize(corner)}\n onTouchStart={startResize(corner)}\n role=\"presentation\"\n />\n ))}\n </span>\n </NodeViewWrapper>\n );\n};\n\nexport const ResizableImage = Image.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: null,\n parseHTML: (element) => {\n const attr = element.getAttribute('width');\n if (attr) return parseInt(attr, 10) || null;\n const style = element.style.width;\n return style ? parseInt(style, 10) || null : null;\n },\n renderHTML: (attributes) =>\n attributes.width ? { width: attributes.width, style: `width: ${attributes.width}px` } : {},\n },\n height: {\n default: null,\n parseHTML: (element) => {\n const attr = element.getAttribute('height');\n return attr ? parseInt(attr, 10) || null : null;\n },\n renderHTML: (attributes) => (attributes.height ? { height: attributes.height } : {}),\n },\n align: {\n default: 'left',\n parseHTML: (element) => element.getAttribute('data-align') || 'left',\n renderHTML: (attributes) => (attributes.align ? { 'data-align': attributes.align } : {}),\n },\n };\n },\n addNodeView() {\n return ReactNodeViewRenderer(ResizableImageNodeView);\n },\n});\n\nexport default ResizableImage;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacyMermaid.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/legacyMermaid.ts"],"sourcesContent":["// Encode user text before embedding it in Mermaid syntax (including entity-like input).\nfunction text(value: string): string {\n return Array.from(value, char => /[\\p{L}\\p{N} ,.!?_-]/u.test(char)\n ? char : `#${char.codePointAt(0)};`).join('');\n}\n\n/** Convert only explicit legacy headers. Unsupported syntax fails rather than changing meaning. */\nexport function normalizeLegacyMermaid(source: string): string {\n const lines = source.split(/\\r?\\n/);\n const kind = lines[0].trim();\n if (kind !== 'flow' && kind !== 'seq') return source;\n const fail = (line: number, reason: string): never => {\n throw new Error(`Legacy ${kind}, line ${line + 1}: ${reason}`);\n };\n const body = lines.map((value, line) => ({ value: value.trim(), line }))\n .slice(1).filter(({ value }) => value && !value.startsWith('#'));\n if (!body.length) fail(0, 'Empty diagram');\n\n if (kind === 'seq') {\n const actors = new Map<string, string>();\n const actor = (name: string, line: number) => {\n name = name.trim();\n if (!name || /[\\r\\n:<>]/.test(name)) fail(line, 'Invalid participant name');\n if (!actors.has(name)) actors.set(name, `p${actors.size}`);\n return actors.get(name)!;\n };\n const output: string[] = [];\n const arrows: Record<string, string> = { '->': '->>', '-->': '-->>', '->>': '->', '-->>': '-->' };\n for (const { value, line } of body) {\n const note = /^Note\\s+(right of|left of|over)\\s+([^:]+):\\s*(.*)$/i.exec(value);\n if (note) {\n const placement = note[1].toLowerCase();\n const names = note[2].split(',');\n if (names.length > (placement === 'over' ? 2 : 1)) fail(line, 'Unsupported note participants');\n output.push(`Note ${placement} ${names.map(name => actor(name, line)).join(',')}: ${text(note[3])}`);\n continue;\n }\n const message = /^([^:<>]+?)(-->>|->>|-->|->)([^:<>]+):\\s*(.*)$/.exec(value);\n if (!message || /[-]$/.test(message[1].trim())) fail(line, 'Unsupported sequence statement or arrow');\n output.push(`${actor(message![1], line)}${arrows[message![2]]}${actor(message![3], line)}: ${text(message![4])}`);\n }\n return ['sequenceDiagram', ...Array.from(actors, ([name, id]) => `participant ${id} as ${text(name)}`), ...output].join('\\n');\n }\n\n const nodes = new Map<string, { id: string; type: string }>();\n const declarations: string[] = [];\n const edges: string[] = [];\n const shapes: Record<string, [string, string]> = {\n start: ['([', '])'], end: ['([', '])'], operation: ['[', ']'],\n condition: ['{', '}'], inputoutput: ['[/', '/]'], subroutine: ['[[', ']]'],\n };\n for (const { value, line } of body) {\n if (!value.includes('=>')) continue;\n const match = /^([A-Za-z_][\\w]*)=>([a-z]+)(?::\\s*(.*))?$/.exec(value);\n if (!match || !Object.hasOwn(shapes, match[2])) fail(line, 'Unsupported node declaration/type');\n const [, name, type, label] = match!;\n if (nodes.has(name)) fail(line, `Duplicate node: ${name}`);\n // flowchart.js uses these as state/link metadata, not literal label text.\n if (label && /\\||:>/.test(label)) fail(line, 'Node styles and links are unsupported');\n const id = `n${nodes.size}`;\n nodes.set(name, { id, type });\n const [open, close] = shapes[type];\n declarations.push(`${id}${open}\"${text(label ?? type)}\"${close}`);\n }\n let direction: string | undefined;\n const directions: Record<string, string> = { right: 'LR', left: 'RL', top: 'BT', bottom: 'TD' };\n for (const { value, line } of body) {\n if (value.includes('=>')) continue;\n const parts = value.split('->');\n if (parts.length < 2) fail(line, 'Unsupported flow statement');\n const refs = parts.map(part => {\n const match = /^\\s*([A-Za-z_][\\w]*)(?:\\(([^()]+)\\))?\\s*$/.exec(part);\n if (!match || !nodes.has(match[1])) fail(line, 'Invalid or undefined node reference');\n return { node: nodes.get(match![1])!, options: match![2]?.split(',').map(option => option.trim()) ?? [] };\n });\n for (let i = 0; i < refs.length; i++) {\n const { node, options } = refs[i];\n if (i === refs.length - 1) {\n if (options.length) fail(line, 'Options on a terminal reference are unsupported');\n break;\n }\n let branch: string | undefined;\n let hint: string | undefined;\n for (const option of options) {\n if ((option === 'yes' || option === 'no') && node.type === 'condition' && !branch) branch = option;\n else if (Object.hasOwn(directions, option) && !hint) hint = directions[option];\n else fail(line, `Unsupported branch/direction: ${option}`);\n }\n if (hint) {\n if (direction && direction !== hint) fail(line, 'Mixed edge directions cannot be represented reliably');\n direction = hint;\n }\n edges.push(`${node.id} -->${branch ? `|${branch}|` : ''} ${refs[i + 1].node.id}`);\n }\n }\n if (!nodes.size) fail(0, 'No node declarations');\n return [`flowchart ${direction ?? 'TD'}`, ...declarations, ...edges].join('\\n');\n}\n"],"mappings":";AACA,
|
|
1
|
+
{"version":3,"file":"legacyMermaid.js","names":["text","value","char","normalizeLegacyMermaid","lines","source","kind","fail","line","reason","body","actors","actor","name","output","arrows","note","placement","names","message","id","nodes","declarations","edges","shapes","match","type","label","open","close","direction","directions","parts","refs","part","option","i","options","branch","hint","node"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/legacyMermaid.ts"],"sourcesContent":["// Encode user text before embedding it in Mermaid syntax (including entity-like input).\nfunction text(value: string): string {\n return Array.from(value, char => /[\\p{L}\\p{N} ,.!?_-]/u.test(char)\n ? char : `#${char.codePointAt(0)};`).join('');\n}\n\n/** Convert only explicit legacy headers. Unsupported syntax fails rather than changing meaning. */\nexport function normalizeLegacyMermaid(source: string): string {\n const lines = source.split(/\\r?\\n/);\n const kind = lines[0].trim();\n if (kind !== 'flow' && kind !== 'seq') return source;\n const fail = (line: number, reason: string): never => {\n throw new Error(`Legacy ${kind}, line ${line + 1}: ${reason}`);\n };\n const body = lines.map((value, line) => ({ value: value.trim(), line }))\n .slice(1).filter(({ value }) => value && !value.startsWith('#'));\n if (!body.length) fail(0, 'Empty diagram');\n\n if (kind === 'seq') {\n const actors = new Map<string, string>();\n const actor = (name: string, line: number) => {\n name = name.trim();\n if (!name || /[\\r\\n:<>]/.test(name)) fail(line, 'Invalid participant name');\n if (!actors.has(name)) actors.set(name, `p${actors.size}`);\n return actors.get(name)!;\n };\n const output: string[] = [];\n const arrows: Record<string, string> = { '->': '->>', '-->': '-->>', '->>': '->', '-->>': '-->' };\n for (const { value, line } of body) {\n const note = /^Note\\s+(right of|left of|over)\\s+([^:]+):\\s*(.*)$/i.exec(value);\n if (note) {\n const placement = note[1].toLowerCase();\n const names = note[2].split(',');\n if (names.length > (placement === 'over' ? 2 : 1)) fail(line, 'Unsupported note participants');\n output.push(`Note ${placement} ${names.map(name => actor(name, line)).join(',')}: ${text(note[3])}`);\n continue;\n }\n const message = /^([^:<>]+?)(-->>|->>|-->|->)([^:<>]+):\\s*(.*)$/.exec(value);\n if (!message || /[-]$/.test(message[1].trim())) fail(line, 'Unsupported sequence statement or arrow');\n output.push(`${actor(message![1], line)}${arrows[message![2]]}${actor(message![3], line)}: ${text(message![4])}`);\n }\n return ['sequenceDiagram', ...Array.from(actors, ([name, id]) => `participant ${id} as ${text(name)}`), ...output].join('\\n');\n }\n\n const nodes = new Map<string, { id: string; type: string }>();\n const declarations: string[] = [];\n const edges: string[] = [];\n const shapes: Record<string, [string, string]> = {\n start: ['([', '])'], end: ['([', '])'], operation: ['[', ']'],\n condition: ['{', '}'], inputoutput: ['[/', '/]'], subroutine: ['[[', ']]'],\n };\n for (const { value, line } of body) {\n if (!value.includes('=>')) continue;\n const match = /^([A-Za-z_][\\w]*)=>([a-z]+)(?::\\s*(.*))?$/.exec(value);\n if (!match || !Object.hasOwn(shapes, match[2])) fail(line, 'Unsupported node declaration/type');\n const [, name, type, label] = match!;\n if (nodes.has(name)) fail(line, `Duplicate node: ${name}`);\n // flowchart.js uses these as state/link metadata, not literal label text.\n if (label && /\\||:>/.test(label)) fail(line, 'Node styles and links are unsupported');\n const id = `n${nodes.size}`;\n nodes.set(name, { id, type });\n const [open, close] = shapes[type];\n declarations.push(`${id}${open}\"${text(label ?? type)}\"${close}`);\n }\n let direction: string | undefined;\n const directions: Record<string, string> = { right: 'LR', left: 'RL', top: 'BT', bottom: 'TD' };\n for (const { value, line } of body) {\n if (value.includes('=>')) continue;\n const parts = value.split('->');\n if (parts.length < 2) fail(line, 'Unsupported flow statement');\n const refs = parts.map(part => {\n const match = /^\\s*([A-Za-z_][\\w]*)(?:\\(([^()]+)\\))?\\s*$/.exec(part);\n if (!match || !nodes.has(match[1])) fail(line, 'Invalid or undefined node reference');\n return { node: nodes.get(match![1])!, options: match![2]?.split(',').map(option => option.trim()) ?? [] };\n });\n for (let i = 0; i < refs.length; i++) {\n const { node, options } = refs[i];\n if (i === refs.length - 1) {\n if (options.length) fail(line, 'Options on a terminal reference are unsupported');\n break;\n }\n let branch: string | undefined;\n let hint: string | undefined;\n for (const option of options) {\n if ((option === 'yes' || option === 'no') && node.type === 'condition' && !branch) branch = option;\n else if (Object.hasOwn(directions, option) && !hint) hint = directions[option];\n else fail(line, `Unsupported branch/direction: ${option}`);\n }\n if (hint) {\n if (direction && direction !== hint) fail(line, 'Mixed edge directions cannot be represented reliably');\n direction = hint;\n }\n edges.push(`${node.id} -->${branch ? `|${branch}|` : ''} ${refs[i + 1].node.id}`);\n }\n }\n if (!nodes.size) fail(0, 'No node declarations');\n return [`flowchart ${direction ?? 'TD'}`, ...declarations, ...edges].join('\\n');\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport type AIEditMode = 'replace' | 'insert';\n\nexport interface AIRequest {\n /** Text sent to the provider. For insert mode this is the user's prompt. */\n text: string;\n /** The instruction entered by the user, when provided. */\n prompt: string;\n /** Selected editor text. Empty when generating at the cursor. */\n selectedText: string;\n /** Replace a selection or insert at the captured cursor position. */\n mode: AIEditMode;\n action: AIAction;\n systemPrompt: string;\n signal: AbortSignal;\n}\n\nexport interface AIConfig {\n /** Required by built-in OpenAI and Anthropic protocols. */\n gateway?: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n /** Required by built-in OpenAI and Anthropic protocols. */\n model?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n /** Base system instruction applied to every AI edit request. */\n systemPrompt?: string;\n /** Custom handler; useful for keeping provider credentials outside the browser. */\n customHandler?: (params: AIRequest) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarButtonConfig {\n undo?: boolean;\n redo?: boolean;\n fontFamily?: boolean;\n fontSize?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n formatPainter?: boolean;\n heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n heading4?: boolean;\n heading5?: boolean;\n heading6?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n taskList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n mermaidBlock?: boolean;\n link?: boolean;\n image?: boolean;\n table?: boolean;\n tableOps?: boolean;\n horizontalRule?: boolean;\n markdownBlock?: boolean;\n markdownTemplates?: boolean;\n floatingDialog?: boolean;\n textColor?: boolean;\n highlight?: boolean;\n ai?: boolean;\n comments?: boolean;\n}\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n /** Fine-grained visibility overrides for every toolbar control. */\n buttons?: ToolbarButtonConfig;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI editing configuration. May be supplied or updated by the consuming app. */\n aiConfig?: AIConfig;\n /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */\n onRequestAIConfig?: () => void;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Keep an open AI panel's selected text and replacement target in sync with new editor selections. */\n aiSelectionFollowsEditor?: boolean;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n aiPromptLabel?: string;\n aiPromptPlaceholder?: string;\n aiSelectedText?: string;\n aiInsertHint?: string;\n aiResult?: string;\n aiGenerate?: string;\n aiCancel?: string;\n aiClose?: string;\n aiDismiss?: string;\n aiNotConfigured?: string;\n aiConfigure?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n aiPromptLabel: 'Prompt',\n aiPromptPlaceholder: 'Describe what AI should write… (Ctrl+Enter to generate)',\n aiSelectedText: 'Selected text',\n aiInsertHint: 'No text selected. The result will be inserted at the cursor.',\n aiResult: 'Result',\n aiGenerate: 'Generate',\n aiCancel: 'Cancel',\n aiClose: 'Close AI assistant',\n aiDismiss: 'Dismiss',\n aiNotConfigured: 'AI is not configured',\n aiConfigure: 'Configure AI',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AAqOA,IAAa,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}
|
|
1
|
+
{"version":3,"file":"types.js","names":["defaultLabels"],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport type AIEditMode = 'replace' | 'insert';\n\nexport interface AIRequest {\n /** Text sent to the provider. For insert mode this is the user's prompt. */\n text: string;\n /** The instruction entered by the user, when provided. */\n prompt: string;\n /** Selected editor text. Empty when generating at the cursor. */\n selectedText: string;\n /** Replace a selection or insert at the captured cursor position. */\n mode: AIEditMode;\n action: AIAction;\n systemPrompt: string;\n signal: AbortSignal;\n}\n\nexport interface AIConfig {\n /** Required by built-in OpenAI and Anthropic protocols. */\n gateway?: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n /** Required by built-in OpenAI and Anthropic protocols. */\n model?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n /** Base system instruction applied to every AI edit request. */\n systemPrompt?: string;\n /** Custom handler; useful for keeping provider credentials outside the browser. */\n customHandler?: (params: AIRequest) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarButtonConfig {\n undo?: boolean;\n redo?: boolean;\n fontFamily?: boolean;\n fontSize?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n formatPainter?: boolean;\n heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n heading4?: boolean;\n heading5?: boolean;\n heading6?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n taskList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n mermaidBlock?: boolean;\n link?: boolean;\n image?: boolean;\n table?: boolean;\n tableOps?: boolean;\n horizontalRule?: boolean;\n markdownBlock?: boolean;\n markdownTemplates?: boolean;\n floatingDialog?: boolean;\n textColor?: boolean;\n highlight?: boolean;\n ai?: boolean;\n comments?: boolean;\n}\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n /** Fine-grained visibility overrides for every toolbar control. */\n buttons?: ToolbarButtonConfig;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI editing configuration. May be supplied or updated by the consuming app. */\n aiConfig?: AIConfig;\n /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */\n onRequestAIConfig?: () => void;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Keep an open AI panel's selected text and replacement target in sync with new editor selections. */\n aiSelectionFollowsEditor?: boolean;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n aiPromptLabel?: string;\n aiPromptPlaceholder?: string;\n aiSelectedText?: string;\n aiInsertHint?: string;\n aiResult?: string;\n aiGenerate?: string;\n aiCancel?: string;\n aiClose?: string;\n aiDismiss?: string;\n aiNotConfigured?: string;\n aiConfigure?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n aiPromptLabel: 'Prompt',\n aiPromptPlaceholder: 'Describe what AI should write… (Ctrl+Enter to generate)',\n aiSelectedText: 'Selected text',\n aiInsertHint: 'No text selected. The result will be inserted at the cursor.',\n aiResult: 'Result',\n aiGenerate: 'Generate',\n aiCancel: 'Cancel',\n aiClose: 'Close AI assistant',\n aiDismiss: 'Dismiss',\n aiNotConfigured: 'AI is not configured',\n aiConfigure: 'Configure AI',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AAqOA,IAAaA,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { animateFace as e, samplePose as t } from "../shared/animation.js";
|
|
2
|
+
import { createMagicEffect as n } from "../shared/magicEffect.js";
|
|
3
|
+
import { createMollyLocomotion as r } from "./locomotion.js";
|
|
4
|
+
import * as i from "three";
|
|
5
|
+
//#region src/components/pro/Sprite/Molly/animations.ts
|
|
6
|
+
function a(a) {
|
|
7
|
+
let { body: o, head: s, front: c, back: l, tail: u } = a, d = r(a), f = n({
|
|
8
|
+
name: "starlight-magic",
|
|
9
|
+
palette: [
|
|
10
|
+
16766330,
|
|
11
|
+
16772532,
|
|
12
|
+
12577535
|
|
13
|
+
],
|
|
14
|
+
core: {
|
|
15
|
+
shape: "star",
|
|
16
|
+
growth: .17,
|
|
17
|
+
rotate: (e, t) => {
|
|
18
|
+
e.set(0, 0, Math.sin(t * 2) * .12);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
haloColor: 16766843,
|
|
22
|
+
sparkSpeed: .8,
|
|
23
|
+
orbit: {
|
|
24
|
+
count: 2,
|
|
25
|
+
tube: .012,
|
|
26
|
+
arc: Math.PI * 2,
|
|
27
|
+
radius: .3,
|
|
28
|
+
spacing: .09,
|
|
29
|
+
opacity: .4,
|
|
30
|
+
rotate: (e, t, n) => {
|
|
31
|
+
e.set(1.05, n * .65, t * (n % 2 ? -.8 : .8) + n * .22);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return u.add(f.group), {
|
|
36
|
+
pose: (n) => {
|
|
37
|
+
let r = t(n), { t: p, happy: m, talk: h, comfort: g, curious: _, greet: v, bye: y, rise: b, sad: x, wave: S, phase: C, magic: w, beat: T } = r, E = i.MathUtils.clamp((C - .16) / .4, 0, 1), D = 2.08 * E * (1 - E), O = b * (C < .16 ? Math.sin(C / .16 * Math.PI) : C > .56 && C < .82 ? Math.sin((C - .56) / .26 * Math.PI) : 0) * .15, k = C > .12 && C < .28 ? b * Math.sin((C - .12) / .16 * Math.PI) * .1 : 0, A = b * Math.sin(E * Math.PI), j = b * Math.sin(Math.min(1, E / .68) * Math.PI), M = -b * .12 * Math.sin(E * Math.PI * 2);
|
|
38
|
+
o.scale.set(1 + O * .35 - k * .25, 1 - O + k, 1 + O * .35 - k * .25), o.position.y = m * (.045 + .045 * Math.sin(p * 10)) + b * D, o.rotation.set(M + v * .06 + w, -y * .65, m * .025 * T + g * .025 - v * .025 + y * .045), o.position.y += w ? .48 - (Math.cos(w) * .48 + Math.sin(w) * .3) : 0, o.position.z = w ? -.3 - (Math.sin(w) * .48 - Math.cos(w) * .3) : 0, s.rotation.set(g * .09 + h * .022 * Math.sin(p * 8) + v * .2 * Math.sin(C * Math.PI) + x * .24 - w * .7 - M * .4, _ * .18 + y * .28, _ * -.13 + g * .12 + m * .035 * T - y * .1), s.position.y = 1.8 + m * .025 * T - x * .045, s.position.z = .06;
|
|
39
|
+
for (let e = 0; e < 2; e++) {
|
|
40
|
+
let t = e ? 1 : -1;
|
|
41
|
+
c[e].position.set(t * .285, 1.03, .115), c[e].scale.set(1, 1, 1), c[e].rotation.set(-m * (.35 + t * .25 * T) - h * (.1 + .1 * Math.sin(p * 6 + e)) - _ * (e ? .02 : .24) - j * .8 - w * 2.08 - (e ? v * 1.05 : y * .3), 0, t * (m * .18 + g * .1 + A * .08 + w * .06) + (e ? v * .16 : -y * (1.72 + .28 * Math.sin(p * 14)))), l[e].position.set(t * .34, .47 + w * .12, -.12), l[e].scale.set(1, 1, 1), l[e].rotation.set(m * (t * .2 * T - .12) + A * .65 - w, 0, t * (m * .045 + A * .05));
|
|
42
|
+
}
|
|
43
|
+
if (r.run === 0) for (let e = 0; e < 4; e++) a.flexLeg(e, 0);
|
|
44
|
+
e(a, r, -.3, .25), a.shapeTail(Math.max(w, r.run)), u.rotation.set(-w + A * .22, m * .25 * T + _ * .12 + S * .16 * Math.sin(p * 7), m * .2 * Math.sin(p * 10) + g * .08 + x * -.4), w > 0 && a.groundFeet(), d(r), f.group.position.set(.49 - w * .35, .7 + w * .76, -.08 + w * .25), f.update(p, C, w), a.face.update();
|
|
45
|
+
},
|
|
46
|
+
dispose: f.dispose
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { a as createMollyAnimations };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=animations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animations.js","names":["THREE","createMollyAnimations","rig","locomotion","createMollyLocomotion","magicEffect","createMagicEffect","i","tail","state","samplePose","input","prowl","flight","phase","jumpHeight","compression","rise","extension","tuck","foreTuck","jumpPitch","body","happy","t","greet","bye","beat","comfort","head","talk","sad","curious","side","front","back","animateFace","wave"],"sources":["../../../../../src/components/pro/Sprite/Molly/animations.ts"],"sourcesContent":["import * as THREE from 'three';\nimport type { SpritePose } from '../types';\nimport type { MollyRig } from './rig';\nimport { createMollyLocomotion } from './locomotion';\nimport { animateFace, samplePose } from '../shared/animation';\nimport { createMagicEffect } from '../shared/magicEffect';\n\nexport function createMollyAnimations(rig: MollyRig) {\n const { body, head, front, back, tail } = rig;\n const locomotion = createMollyLocomotion(rig);\n const magicEffect = createMagicEffect({\n name: 'starlight-magic', palette: [0xffd57a, 0xffedb4, 0xbfeaff],\n core: { shape: 'star', growth: 0.17, rotate: (rotation, t) => { rotation.set(0, 0, Math.sin(t * 2) * 0.12); } },\n haloColor: 0xffd77b, sparkSpeed: 0.8,\n orbit: {\n count: 2, tube: 0.012, arc: Math.PI * 2, radius: 0.30, spacing: 0.09, opacity: 0.40,\n rotate: (rotation, t, i) => { rotation.set(1.05, i * 0.65, t * (i % 2 ? -0.8 : 0.8) + i * 0.22); },\n },\n });\n tail.add(magicEffect.group);\n\n const pose = (input: SpritePose) => {\n const state = samplePose(input);\n const { t, happy, talk, comfort, curious, greet, bye, rise, sad, wave, phase, magic: prowl, beat } = state;\n // 720 ms of flight over 0.52 model units: y = v0*t - g*t²/2, g ≈ 8.02 units/s².\n // No easing at the apex or touchdown: gravity keeps accelerating the fall until paw contact.\n const flight = THREE.MathUtils.clamp((phase - 0.16) / 0.40, 0, 1);\n const jumpHeight = 4 * 0.52 * flight * (1 - flight);\n const crouch = phase < 0.16 ? Math.sin(phase / 0.16 * Math.PI)\n : phase > 0.56 && phase < 0.82 ? Math.sin((phase - 0.56) / 0.26 * Math.PI) : 0;\n const compression = rise * crouch * 0.15;\n const extension = phase > 0.12 && phase < 0.28 ? rise * Math.sin((phase - 0.12) / 0.16 * Math.PI) * 0.10 : 0;\n const tuck = rise * Math.sin(flight * Math.PI);\n const foreTuck = rise * Math.sin(Math.min(1, flight / 0.68) * Math.PI);\n const jumpPitch = -rise * 0.12 * Math.sin(flight * Math.PI * 2);\n body.scale.set(1 + compression * 0.35 - extension * 0.25, 1 - compression + extension, 1 + compression * 0.35 - extension * 0.25);\n body.position.y = happy * (0.045 + 0.045 * Math.sin(t * 10)) + rise * jumpHeight;\n body.rotation.set(jumpPitch + greet * 0.06 + prowl, -bye * 0.65,\n happy * 0.025 * beat + comfort * 0.025 - greet * 0.025 + bye * 0.045);\n // Pitch around the seated rump, keeping the tail attachment and hind support in place.\n body.position.y += prowl ? 0.48 - (Math.cos(prowl) * 0.48 + Math.sin(prowl) * 0.30) : 0;\n body.position.z = prowl ? -0.30 - (Math.sin(prowl) * 0.48 - Math.cos(prowl) * 0.30) : 0;\n head.rotation.set(comfort * 0.09 + talk * 0.022 * Math.sin(t * 8) + greet * 0.20 * Math.sin(phase * Math.PI) + sad * 0.24 - prowl * 0.70 - jumpPitch * 0.4,\n curious * 0.18 + bye * 0.28,\n curious * -0.13 + comfort * 0.12 + happy * 0.035 * beat - bye * 0.10);\n head.position.y = 1.80 + happy * 0.025 * beat - sad * 0.045;\n head.position.z = 0.06;\n for (let i = 0; i < 2; i++) {\n const side = i ? 1 : -1;\n front[i].position.set(side * 0.285, 1.03, 0.115);\n front[i].scale.set(1, 1, 1);\n front[i].rotation.set(-happy * (0.35 + side * 0.25 * beat) - talk * (0.1 + 0.10 * Math.sin(t * 6 + i))\n - curious * (i ? 0.02 : 0.24) - foreTuck * 0.80 - prowl * 2.08 - (i ? greet * 1.05 : bye * 0.30),\n 0, side * (happy * 0.18 + comfort * 0.1 + tuck * 0.08 + prowl * 0.06)\n + (i ? greet * 0.16 : -bye * (1.72 + 0.28 * Math.sin(t * 14))));\n back[i].position.set(side * 0.34, 0.47 + prowl * 0.12, -0.12);\n back[i].scale.set(1, 1, 1);\n back[i].rotation.set(happy * (side * 0.2 * beat - 0.12) + tuck * 0.65 - prowl, 0, side * (happy * 0.045 + tuck * 0.05));\n }\n if (state.run === 0) for (let i = 0; i < 4; i++) rig.flexLeg(i, 0);\n animateFace(rig, state, -0.30, 0.25);\n rig.shapeTail(Math.max(prowl, state.run));\n tail.rotation.set(-prowl + tuck * 0.22, happy * 0.25 * beat + curious * 0.12 + wave * 0.16 * Math.sin(t * 7),\n happy * 0.2 * Math.sin(t * 10) + comfort * 0.08 + sad * -0.40);\n if (prowl > 0) rig.groundFeet();\n locomotion(state);\n magicEffect.group.position.set(0.49 - prowl * 0.35, 0.70 + prowl * 0.76, -0.08 + prowl * 0.25);\n magicEffect.update(t, phase, prowl);\n rig.face.update();\n };\n return { pose, dispose: magicEffect.dispose };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { SPRITE_ACTION_DURATIONS as e } from "../actions.js";
|
|
2
|
+
//#region src/components/pro/Sprite/Molly/events.ts
|
|
3
|
+
var t = {
|
|
4
|
+
zh: "喵~我是 Molly。来和我聊聊今天的好心情吧!",
|
|
5
|
+
en: "Meow! I’m Molly. Tell me about your day!"
|
|
6
|
+
}, n = {
|
|
7
|
+
greeting: t,
|
|
8
|
+
localReply(e, n) {
|
|
9
|
+
switch (e) {
|
|
10
|
+
case "greeting": return t[n];
|
|
11
|
+
case "comfort": return n === "zh" ? "喵~我陪你待一会儿,要不要说说发生了什么?" : "Purr… I can stay with you. Want to tell me what happened?";
|
|
12
|
+
case "thanks": return n === "zh" ? "不客气!能陪你聊天我很开心。" : "You’re welcome! I love chatting with you.";
|
|
13
|
+
case "identity": return n === "zh" ? "我是喜欢晒太阳的小猫咪 Molly!" : "I’m Molly, the sunshine-loving cat!";
|
|
14
|
+
case "default": return n === "zh" ? "喵~我听到了!接下来发生了什么?" : "Meow, I’m listening! What happened next?";
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
action(t) {
|
|
18
|
+
switch (t.type) {
|
|
19
|
+
case "greet": return {
|
|
20
|
+
mood: "greet",
|
|
21
|
+
duration: e.greet
|
|
22
|
+
};
|
|
23
|
+
case "turn": return {
|
|
24
|
+
mood: "curious",
|
|
25
|
+
duration: 580
|
|
26
|
+
};
|
|
27
|
+
case "message-pending": return {
|
|
28
|
+
mood: "talk",
|
|
29
|
+
duration: 700,
|
|
30
|
+
sustain: !0
|
|
31
|
+
};
|
|
32
|
+
case "message-replied": return {
|
|
33
|
+
mood: t.comfort ? "comfort" : "talk",
|
|
34
|
+
duration: 1100
|
|
35
|
+
};
|
|
36
|
+
case "message-failed": return {
|
|
37
|
+
mood: "comfort",
|
|
38
|
+
duration: 1100
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { n as mollyEvents };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","names":["greeting","mollyEvents","intent","locale","event","SPRITE_ACTION_DURATIONS"],"sources":["../../../../../src/components/pro/Sprite/Molly/events.ts"],"sourcesContent":["import { SPRITE_ACTION_DURATIONS } from '../actions';\nimport type { SpriteCharacterEvents } from '../types';\n\nconst greeting: SpriteCharacterEvents['greeting'] = {\n zh: '喵~我是 Molly。来和我聊聊今天的好心情吧!',\n en: 'Meow! I’m Molly. Tell me about your day!',\n};\n\nexport const mollyEvents: SpriteCharacterEvents = {\n greeting,\n localReply(intent, locale) {\n switch (intent) {\n case 'greeting': return greeting[locale];\n case 'comfort': return locale === 'zh'\n ? '喵~我陪你待一会儿,要不要说说发生了什么?'\n : 'Purr… I can stay with you. Want to tell me what happened?';\n case 'thanks': return locale === 'zh'\n ? '不客气!能陪你聊天我很开心。'\n : 'You’re welcome! I love chatting with you.';\n case 'identity': return locale === 'zh'\n ? '我是喜欢晒太阳的小猫咪 Molly!'\n : 'I’m Molly, the sunshine-loving cat!';\n case 'default': return locale === 'zh'\n ? '喵~我听到了!接下来发生了什么?'\n : 'Meow, I’m listening! What happened next?';\n }\n },\n action(event) {\n switch (event.type) {\n case 'greet': return { mood: 'greet', duration: SPRITE_ACTION_DURATIONS.greet };\n case 'turn': return { mood: 'curious', duration: 580 };\n case 'message-pending': return { mood: 'talk', duration: 700, sustain: true };\n case 'message-replied': return { mood: event.comfort ? 'comfort' : 'talk', duration: 1100 };\n case 'message-failed': return { mood: 'comfort', duration: 1100 };\n }\n },\n};\n"],"mappings":";;AAGA,IAAMA,IAA8C;CAClD,IAAI;CACJ,IAAI;AACN,GAEaC,IAAqC;CAChD;CACA,WAAW,GAAQ,GAAQ;EACzB,QAAQC,GAAR;GACE,KAAK,YAAY,OAAOF,EAASG;GACjC,KAAK,WAAW,OAAOA,MAAW,OAC9B,0BACA;GACJ,KAAK,UAAU,OAAOA,MAAW,OAC7B,mBACA;GACJ,KAAK,YAAY,OAAOA,MAAW,OAC/B,uBACA;GACJ,KAAK,WAAW,OAAOA,MAAW,OAC9B,qBACA;EACN;CACF;CACA,OAAO,GAAO;EACZ,QAAQC,EAAM,MAAd;GACE,KAAK,SAAS,OAAO;IAAE,MAAM;IAAS,UAAUC,EAAwB;GAAM;GAC9E,KAAK,QAAQ,OAAO;IAAE,MAAM;IAAW,UAAU;GAAI;GACrD,KAAK,mBAAmB,OAAO;IAAE,MAAM;IAAQ,UAAU;IAAK,SAAS;GAAK;GAC5E,KAAK,mBAAmB,OAAO;IAAE,MAAMD,EAAM,UAAU,YAAY;IAAQ,UAAU;GAAK;GAC1F,KAAK,kBAAkB,OAAO;IAAE,MAAM;IAAW,UAAU;GAAK;EAClE;CACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createMolly(): import("../types").SpriteScene;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { assembleSprite as e } from "../shared/scene.js";
|
|
2
|
+
import { createMollyRig as t } from "./rig.js";
|
|
3
|
+
import { createMollyAnimations as n } from "./animations.js";
|
|
4
|
+
//#region src/components/pro/Sprite/Molly/index.ts
|
|
5
|
+
function r() {
|
|
6
|
+
let r = t();
|
|
7
|
+
return e(r, n(r));
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { r as createMolly };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["createMolly","rig","createMollyRig","assembleSprite","createMollyAnimations"],"sources":["../../../../../src/components/pro/Sprite/Molly/index.ts"],"sourcesContent":["import { createMollyRig } from './rig';\nimport { createMollyAnimations } from './animations';\nimport { assembleSprite } from '../shared/scene';\n\nexport function createMolly() {\n const rig = createMollyRig();\n return assembleSprite(rig, createMollyAnimations(rig));\n}\n"],"mappings":";;;;AAIA,SAAgBA,IAAc;CAC5B,IAAMC,IAAMC,EAAe;CAC3B,OAAOC,EAAeF,GAAKG,EAAsBH,CAAG,CAAC;AACvD"}
|