dishui 0.0.106 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/dist/.release-verified.json +3 -2
  2. package/dist/components/Accordion/index.js.map +1 -1
  3. package/dist/components/Avatar/index.js.map +1 -1
  4. package/dist/components/Badge/index.js.map +1 -1
  5. package/dist/components/Button/index.js.map +1 -1
  6. package/dist/components/ButtonMenu/index.js.map +1 -1
  7. package/dist/components/Card/Metric2.js.map +1 -1
  8. package/dist/components/Card/Ticket2.js.map +1 -1
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Chart/Chart.js.map +1 -1
  11. package/dist/components/Checkbox/index.js.map +1 -1
  12. package/dist/components/ChoicePicker/index.js.map +1 -1
  13. package/dist/components/Column/index.js.map +1 -1
  14. package/dist/components/ConfirmDialog/index.js.map +1 -1
  15. package/dist/components/DateTimeInput/index.js.map +1 -1
  16. package/dist/components/Demo/index.js.map +1 -1
  17. package/dist/components/Demo/source.js.map +1 -1
  18. package/dist/components/Divider/index.js.map +1 -1
  19. package/dist/components/EmptyState/index.js.map +1 -1
  20. package/dist/components/Field/index.js.map +1 -1
  21. package/dist/components/FileUploader/DropZone.js.map +1 -1
  22. package/dist/components/FileUploader/FileItem.js.map +1 -1
  23. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  24. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  25. package/dist/components/GroupButton/index.js.map +1 -1
  26. package/dist/components/GroupedTable/index.js.map +1 -1
  27. package/dist/components/Icon/index.js.map +1 -1
  28. package/dist/components/Image/index.js.map +1 -1
  29. package/dist/components/Input/index.js.map +1 -1
  30. package/dist/components/Label/index.js.map +1 -1
  31. package/dist/components/Layout/index.js.map +1 -1
  32. package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
  33. package/dist/components/LayoutSuite/index.js.map +1 -1
  34. package/dist/components/List/index.js.map +1 -1
  35. package/dist/components/Markdown/Markdown.js.map +1 -1
  36. package/dist/components/Markdown/codeThemes.js.map +1 -1
  37. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  38. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  39. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  40. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  41. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  42. package/dist/components/Modal/focusScope.js.map +1 -1
  43. package/dist/components/Modal/index.js.map +1 -1
  44. package/dist/components/MultipleChoice/index.js.map +1 -1
  45. package/dist/components/NavigationList/index.js.map +1 -1
  46. package/dist/components/Page/Float2.js.map +1 -1
  47. package/dist/components/Page/index.js.map +1 -1
  48. package/dist/components/Page/resize2.js.map +1 -1
  49. package/dist/components/PageHeader/index.js.map +1 -1
  50. package/dist/components/PagePanel/index.js.map +1 -1
  51. package/dist/components/ProtectedRoute/index.js.map +1 -1
  52. package/dist/components/Resizable/ResizeGrip.js.map +1 -1
  53. package/dist/components/Resizable/index.js.map +1 -1
  54. package/dist/components/Resizable/useResize.js.map +1 -1
  55. package/dist/components/Row/index.js.map +1 -1
  56. package/dist/components/Section/index.js.map +1 -1
  57. package/dist/components/Select/index.js.map +1 -1
  58. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  59. package/dist/components/Skeleton/index.js.map +1 -1
  60. package/dist/components/Slider/index.js.map +1 -1
  61. package/dist/components/Switch/index.js.map +1 -1
  62. package/dist/components/Tab/index.js.map +1 -1
  63. package/dist/components/Table/index.js.map +1 -1
  64. package/dist/components/Tabs/index.js.map +1 -1
  65. package/dist/components/Tabs/tabNavigation.js.map +1 -1
  66. package/dist/components/Text/index.js.map +1 -1
  67. package/dist/components/Textarea/index.js.map +1 -1
  68. package/dist/components/Tooltip/index.js.map +1 -1
  69. package/dist/components/Tree/Tree.js.map +1 -1
  70. package/dist/components/ai/AgentChat/index.js.map +1 -1
  71. package/dist/components/ai/AgentRunCard/index.js.map +1 -1
  72. package/dist/components/ai/AgentScreen/index.js.map +1 -1
  73. package/dist/components/ai/ApprovalCard/index.js.map +1 -1
  74. package/dist/components/ai/CodeView/index.js.map +1 -1
  75. package/dist/components/ai/CommandSearch/index.js.map +1 -1
  76. package/dist/components/ai/ContextCards/index.js.map +1 -1
  77. package/dist/components/ai/DiffTable/index.js.map +1 -1
  78. package/dist/components/ai/FilterTable/index.js.map +1 -1
  79. package/dist/components/ai/FineTuneCard/index.js.map +1 -1
  80. package/dist/components/ai/InsightCards/index.js.map +1 -1
  81. package/dist/components/ai/IssueCard/index.js.map +1 -1
  82. package/dist/components/ai/LoadingState/index.js.map +1 -1
  83. package/dist/components/ai/PromptBar/index.js.map +1 -1
  84. package/dist/components/ai/RecommendationCard/index.js.map +1 -1
  85. package/dist/components/ai/RecordsTable/index.js.map +1 -1
  86. package/dist/components/ai/SelectionActions/index.js.map +1 -1
  87. package/dist/components/ai/StateFlow/index.js.map +1 -1
  88. package/dist/components/ai/StreamingText/index.js.map +1 -1
  89. package/dist/components/ai/TaskRows/index.js.map +1 -1
  90. package/dist/components/ai/Thinking/index.js.map +1 -1
  91. package/dist/components/ai/ToolChips/index.js.map +1 -1
  92. package/dist/components/ai/shared.js.map +1 -1
  93. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  94. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  95. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  96. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  97. package/dist/components/pro/Calendar/Calendar.js +165 -160
  98. package/dist/components/pro/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
  100. package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
  101. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
  102. package/dist/components/pro/Calendar/utils.js.map +1 -1
  103. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  104. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  105. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  106. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  107. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  108. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  109. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  110. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  111. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  112. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  113. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
  114. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  115. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  116. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  117. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  118. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  119. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  120. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  121. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  122. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  123. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  124. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  125. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  126. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  127. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  128. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  129. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  130. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  131. package/dist/components/pro/DataTable/extension.js.map +1 -1
  132. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  133. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  134. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  135. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  136. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  137. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  138. package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
  139. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
  140. package/dist/components/pro/DataTable/utils.js.map +1 -1
  141. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  142. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  143. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  144. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  145. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  146. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  147. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  148. package/dist/components/pro/Flow/Flow.js.map +1 -1
  149. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  150. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  151. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  152. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  153. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  154. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  155. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  156. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  157. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  158. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  159. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  160. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  161. package/dist/components/pro/Flow/constants.js.map +1 -1
  162. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  163. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  164. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  165. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  166. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  167. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  168. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  169. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  170. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  171. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  172. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  173. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  174. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  175. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  176. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  177. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  178. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  179. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  180. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  181. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  182. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  183. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  184. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  185. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  186. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  187. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  188. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  189. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  190. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  191. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  192. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  193. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  194. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  195. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  196. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  197. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  198. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  199. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
  200. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  201. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
  202. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  203. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  204. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  205. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  206. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  207. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  208. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  209. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  210. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  211. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  212. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  213. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  214. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  215. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  216. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  217. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  218. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  219. package/dist/components/pro/Flow/types.js.map +1 -1
  220. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  221. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  222. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  223. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  224. package/dist/components/pro/Gantt/Gantt.js.map +1 -1
  225. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
  226. package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
  227. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
  228. package/dist/components/pro/Gantt/utils.js.map +1 -1
  229. package/dist/components/pro/Kanban/Kanban.js.map +1 -1
  230. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
  231. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
  232. package/dist/components/pro/Kanban/utils.js.map +1 -1
  233. package/dist/components/pro/RichTextEditor/AIRewrite.d.ts +1 -0
  234. package/dist/components/pro/RichTextEditor/AIRewrite.js +109 -88
  235. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/RichTextEditor.js +133 -132
  243. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  258. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  259. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  260. package/dist/components/pro/RichTextEditor/types.d.ts +2 -0
  261. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  262. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  263. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  264. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  265. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  266. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  267. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  268. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  269. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  270. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  271. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  272. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  273. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  274. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  275. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  276. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  277. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  278. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  279. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  280. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  281. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  282. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  283. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  284. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  285. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  286. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  287. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  288. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  289. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  290. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  291. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  292. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  293. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  294. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  295. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  296. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  297. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  298. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  299. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  300. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  301. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  302. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  303. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  304. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  305. package/dist/components/pro/Sprite/actions.js +16 -0
  306. package/dist/components/pro/Sprite/actions.js.map +1 -0
  307. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  308. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  309. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  310. package/dist/components/pro/Sprite/index.d.ts +4 -0
  311. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  312. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  313. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  314. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  315. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  316. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  317. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  318. package/dist/components/pro/Sprite/shared/events.js +21 -0
  319. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  320. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  321. package/dist/components/pro/Sprite/shared/face.js +33 -0
  322. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  323. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  324. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  325. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  326. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  327. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  328. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  329. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  330. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  331. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  332. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  333. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  334. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  335. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  336. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  337. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  338. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  339. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  340. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  341. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  342. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  343. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  344. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  345. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  346. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  347. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  348. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  349. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  350. package/dist/components/pro/Sprite/types.d.ts +40 -0
  351. package/dist/contexts/AppContext.js.map +1 -1
  352. package/dist/contexts/authentication.js.map +1 -1
  353. package/dist/data-table.js +3 -3
  354. package/dist/data-table.js.map +1 -1
  355. package/dist/dishui.css +1 -1
  356. package/dist/hooks/useClickOutside.js.map +1 -1
  357. package/dist/hooks/useContainerElement.js.map +1 -1
  358. package/dist/hooks/useControllableState.js.map +1 -1
  359. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  360. package/dist/hooks/useDebounce.js.map +1 -1
  361. package/dist/hooks/useDraggable.js.map +1 -1
  362. package/dist/hooks/useTableColumns.js.map +1 -1
  363. package/dist/hooks/useTableData.js.map +1 -1
  364. package/dist/index-nostyled.d.ts +2 -0
  365. package/dist/index.d.ts +2 -0
  366. package/dist/index.js +116 -115
  367. package/dist/layouts/MainLayout.js.map +1 -1
  368. package/dist/layouts/Navbar.js.map +1 -1
  369. package/dist/layouts/Sidebar.js.map +1 -1
  370. package/dist/layouts/headbar/Headbar.js.map +1 -1
  371. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  372. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  373. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  374. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  375. package/dist/sprite.js +2 -0
  376. package/dist/styles/themeStyles.js.map +1 -1
  377. package/dist/utils/cn.js.map +1 -1
  378. package/dist/utils/flexLayout.js.map +1 -1
  379. package/dist/utils/i18n.js.map +1 -1
  380. package/dist/utils/menu.js.map +1 -1
  381. package/dist/utils/rehype-code-meta.js.map +1 -1
  382. package/dist/utils/remark-code-meta.js.map +1 -1
  383. package/dist/utils/routerBuilder.js.map +1 -1
  384. package/dist/utils/safeStorage.js.map +1 -1
  385. package/dist/utils/selection.js +29 -20
  386. package/dist/utils/selection.js.map +1 -1
  387. package/dist/utils/themes.js.map +1 -1
  388. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockView.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CodeBlockView.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/react';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { MermaidRenderer, useNodeEditable } from './MarkdownBlock';\nimport Select from '../../../Select';\nimport 'katex/dist/katex.min.css';\n\n\nconst KatexRenderer: React.FC<{ code: string }> = ({ code }) => {\n const wrapped = code.includes('$$') ? code : `$$\\n${code}\\n$$`;\n return (\n <ReactMarkdown\n remarkPlugins={[remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {wrapped}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownRenderer: React.FC<{ code: string }> = ({ code }) => {\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') return <MermaidRenderer code={text} />;\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{ borderRadius: '0.5rem', fontSize: '0.875em', padding: '1em', margin: '0.5em 0' }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {code}\n </ReactMarkdown>\n );\n};\n\nconst RENDER_LANGUAGES = ['markdown', 'mermaid', 'math'];\n\nconst HIGHLIGHT_LANGUAGES = [\n '', 'javascript', 'typescript', 'python', 'rust', 'go', 'java', 'c', 'cpp',\n 'csharp', 'ruby', 'php', 'swift', 'kotlin', 'sql', 'bash', 'shell',\n 'html', 'css', 'json', 'yaml', 'toml', 'xml',\n 'docker', 'graphql', 'latex', 'tex',\n];\n\nconst LANGUAGE_OPTIONS = [\n { label: 'Plain text', value: '' },\n ...HIGHLIGHT_LANGUAGES.filter(Boolean).map(lang => ({ label: `Syntax · ${lang}`, value: lang })),\n ...RENDER_LANGUAGES.map(lang => ({ label: `Render · ${lang}`, value: lang })),\n];\n\nfunction renderLang(lang: string): string {\n // Legacy documents keep their r- attributes; the selector uses canonical names.\n const canonical = lang.startsWith('r-') ? lang.slice(2) : lang;\n return RENDER_LANGUAGES.includes(canonical) ? canonical : '';\n}\n\nfunction highlightLang(lang: string): string {\n if (lang === 'math' || lang === 'latex' || lang === 'tex') return 'latex';\n return lang;\n}\n\nconst CodeBlockNodeView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes,\n}) => {\n const editable = useNodeEditable(editor);\n const language = node.attrs.language || '';\n const textContent = node.textContent;\n const hasLanguage = !!language;\n const renderLanguage = renderLang(language);\n const isRenderable = !!renderLanguage;\n\n const [isEditing, setIsEditing] = useState(true);\n\n useEffect(() => {\n if (!hasLanguage) setIsEditing(true);\n }, [language, hasLanguage]);\n\n // Read-only viewers always get the rendered/preview state, never the editor chrome.\n useEffect(() => {\n if (!editable) setIsEditing(false);\n }, [editable]);\n\n const showEditing = isEditing && editable;\n\n const editIcon = (\n <svg width=\"12\" height=\"12\" 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 const previewIcon = (\n <svg width=\"12\" height=\"12\" 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\n const renderPreview = () => {\n if (renderLanguage === 'mermaid') {\n return textContent.trim()\n ? <MermaidRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter mermaid diagram code...</p>;\n }\n if (renderLanguage === 'math') {\n return textContent.trim()\n ? <KatexRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter KaTeX math formula...</p>;\n }\n if (renderLanguage === 'markdown') {\n return textContent.trim()\n ? <MarkdownRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter Markdown content...</p>;\n }\n return null;\n };\n\n const displayLabel = renderLanguage ? renderLanguage + ' (render)' : language || 'plain text';\n\n return (\n <NodeViewWrapper className={`rte-codeblock-wrapper ${!isEditing && hasLanguage ? 'rte-codeblock-wrapper--preview' : ''}`}>\n {showEditing ? (\n <>\n <div className=\"rte-codeblock__header\">\n <div contentEditable={false} className=\"rte-codeblock__lang-control\">\n <Select\n className=\"rte-codeblock__lang-select\"\n aria-label=\"Code language\"\n value={renderLanguage || language}\n options={LANGUAGE_OPTIONS}\n onChange={(next) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const selected = String(next);\n updateAttributes({ language: selected });\n if (!selected) setIsEditing(true);\n }}\n />\n </div>\n {hasLanguage && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-btn\"\n onClick={() => setIsEditing(false)}\n contentEditable={false}\n >\n {previewIcon} Preview\n </button>\n )}\n </div>\n <pre className=\"rte-codeblock__editable-pre\">\n <NodeViewContent as={'code' as any} />\n </pre>\n </>\n ) : isRenderable ? (\n <div\n className=\"rte-codeblock__render-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <div className=\"rte-codeblock__render-body\">\n {renderPreview()}\n </div>\n {/* 预览分支也必须挂载 contentDOM(隐藏):不渲染 NodeViewContent 时\n tiptap 会把代码文本以 data-node-view-content-react 形式再渲染\n 一份裸露副本,只读 / 预览下出现重复的原始代码。 */}\n <div style={{ display: 'none' }} aria-hidden=\"true\">\n <NodeViewContent as={'code' as any} />\n </div>\n </div>\n ) : (\n <div\n className=\"rte-codeblock__syntax-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={highlightLang(language)}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0 0 0.5rem 0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0',\n }}\n >\n {textContent || ' '}\n </SyntaxHighlighter>\n <div style={{ display: 'none' }} aria-hidden=\"true\">\n <NodeViewContent as={'code' as any} />\n </div>\n </div>\n )}\n </NodeViewWrapper>\n );\n};\n\nconst backtickInputRegex = /^```([a-z-]*)[\\s\\n]$/;\nconst tildeInputRegex = /^~~~([a-z-]*)[\\s\\n]$/;\nconst tableShortcutRegex = /^(?:```|~~~)table(?:(\\d+)[x×X*](\\d+))?\\s?$/;\n\nexport const CodeBlockExtension = Node.create({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: (element) => {\n const classAttr = element.querySelector('code')?.className ||\n element.className || '';\n const match = /language-([\\w-]+)/.exec(classAttr);\n return match?.[1] || element.getAttribute('data-language') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.language) return {};\n return { 'data-language': attributes.language };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(HTMLAttributes, { 'data-language': node.attrs.language }),\n ['code', { class: node.attrs.language ? `language-${node.attrs.language}` : undefined }, 0],\n ];\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: backtickInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n textblockTypeInputRule({\n find: tildeInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const editorRef = this.editor;\n return [\n new Plugin({\n key: new PluginKey('tableShortcut'),\n props: {\n handleTextInput(view, from, to, text) {\n if (!editorRef.isEditable || text !== ' ') return false;\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, from, '\\0');\n const full = textBefore + ' ';\n const m = tableShortcutRegex.exec(full);\n if (!m) return false;\n\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, to, rows, cols);\n return true;\n },\n handleKeyDown(view, event) {\n if (!editorRef.isEditable || event.key !== 'Enter') return false;\n const { state } = view;\n const { $from } = state.selection;\n if (!$from.parent.isTextblock) return false;\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, $from.pos, '\\0');\n const m = tableShortcutRegex.exec(textBefore);\n if (!m) return false;\n\n event.preventDefault();\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, $from.pos, rows, cols);\n return true;\n },\n },\n }),\n ];\n\n function dispatchTable(view: typeof editorRef.view, from: number, to: number, rows: number, cols: number) {\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockNode = $from.parent;\n const blockPos = $from.before();\n\n const tableType = state.schema.nodes.table;\n const rowType = state.schema.nodes.tableRow;\n const headerType = state.schema.nodes.tableHeader;\n const cellType = state.schema.nodes.tableCell;\n if (!tableType || !rowType || !cellType) return;\n\n const emptyParagraph = state.schema.nodes.paragraph.create();\n const buildRow = (isHeader: boolean) => {\n const type = isHeader && headerType ? headerType : cellType;\n const cells = Array.from({ length: cols }, () => type.create(null, emptyParagraph));\n return rowType.create(null, cells);\n };\n\n const tableRows = [\n buildRow(true),\n ...Array.from({ length: rows - 1 }, () => buildRow(false)),\n ];\n const table = tableType.create(null, tableRows);\n const tr = state.tr.replaceWith(blockPos, blockPos + blockNode.nodeSize, table);\n view.dispatch(tr);\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.isEditable && this.editor.commands.toggleNode('codeBlock', 'paragraph'),\n Tab: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (editor.isActive('codeBlock')) {\n editor.commands.insertContent('\\t');\n return true;\n }\n return false;\n },\n Enter: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n editor.commands.newlineInCode();\n return true;\n },\n ArrowDown: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n const { $from } = editor.state.selection;\n const isAtEnd = $from.parentOffset === $from.parent.content.size;\n if (!isAtEnd) return false;\n const after = $from.after();\n if (after === undefined) return false;\n const nodeAfter = editor.state.doc.nodeAt(after);\n if (nodeAfter) return false;\n editor.commands.exitCode();\n return true;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockNodeView);\n },\n});\n\nexport default CodeBlockExtension;\n"],"mappings":"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"}
1
+ {"version":3,"file":"CodeBlockView.js","names":["SyntaxHighlighter","_Fragment","Select","ReactMarkdown","remarkGfm","rehypeKatex","remarkMath","KatexRenderer","wrapped","code","MarkdownRenderer","props","lang","className","text","children","MermaidRenderer","Prism","oneLight","RENDER_LANGUAGES","LANGUAGE_OPTIONS","renderLang","canonical","highlightLang","CodeBlockNodeView","editable","useNodeEditable","editor","language","node","textContent","hasLanguage","renderLanguage","isRenderable","isEditing","setIsEditing","useState","useEffect","showEditing","editIcon","previewIcon","renderPreview","displayLabel","NodeViewWrapper","Fragment","selected","next","updateAttributes","NodeViewContent","backtickInputRegex","tildeInputRegex","tableShortcutRegex","CodeBlockExtension","Node","classAttr","element","attributes","mergeAttributes","HTMLAttributes","textblockTypeInputRule","match","editorRef","Plugin","PluginKey","view","blockStart","state","from","full","m","dispatchTable","to","event","$from","textBefore","rows","cols","blockNode","blockPos","tableType","rowType","headerType","cellType","emptyParagraph","buildRow","type","isHeader","cells","tableRows","table","tr","after","ReactNodeViewRenderer"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CodeBlockView.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/react';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { MermaidRenderer, useNodeEditable } from './MarkdownBlock';\nimport Select from '../../../Select';\nimport 'katex/dist/katex.min.css';\n\n\nconst KatexRenderer: React.FC<{ code: string }> = ({ code }) => {\n const wrapped = code.includes('$$') ? code : `$$\\n${code}\\n$$`;\n return (\n <ReactMarkdown\n remarkPlugins={[remarkMath]}\n rehypePlugins={[rehypeKatex]}\n >\n {wrapped}\n </ReactMarkdown>\n );\n};\n\nconst MarkdownRenderer: React.FC<{ code: string }> = ({ code }) => {\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') return <MermaidRenderer code={text} />;\n\n if (lang) {\n return (\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={lang}\n PreTag=\"div\"\n customStyle={{ borderRadius: '0.5rem', fontSize: '0.875em', padding: '1em', margin: '0.5em 0' }}\n >\n {text}\n </SyntaxHighlighter>\n );\n }\n return <code className={className} {...props}>{children}</code>;\n },\n }}\n >\n {code}\n </ReactMarkdown>\n );\n};\n\nconst RENDER_LANGUAGES = ['markdown', 'mermaid', 'math'];\n\nconst HIGHLIGHT_LANGUAGES = [\n '', 'javascript', 'typescript', 'python', 'rust', 'go', 'java', 'c', 'cpp',\n 'csharp', 'ruby', 'php', 'swift', 'kotlin', 'sql', 'bash', 'shell',\n 'html', 'css', 'json', 'yaml', 'toml', 'xml',\n 'docker', 'graphql', 'latex', 'tex',\n];\n\nconst LANGUAGE_OPTIONS = [\n { label: 'Plain text', value: '' },\n ...HIGHLIGHT_LANGUAGES.filter(Boolean).map(lang => ({ label: `Syntax · ${lang}`, value: lang })),\n ...RENDER_LANGUAGES.map(lang => ({ label: `Render · ${lang}`, value: lang })),\n];\n\nfunction renderLang(lang: string): string {\n // Legacy documents keep their r- attributes; the selector uses canonical names.\n const canonical = lang.startsWith('r-') ? lang.slice(2) : lang;\n return RENDER_LANGUAGES.includes(canonical) ? canonical : '';\n}\n\nfunction highlightLang(lang: string): string {\n if (lang === 'math' || lang === 'latex' || lang === 'tex') return 'latex';\n return lang;\n}\n\nconst CodeBlockNodeView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes,\n}) => {\n const editable = useNodeEditable(editor);\n const language = node.attrs.language || '';\n const textContent = node.textContent;\n const hasLanguage = !!language;\n const renderLanguage = renderLang(language);\n const isRenderable = !!renderLanguage;\n\n const [isEditing, setIsEditing] = useState(true);\n\n useEffect(() => {\n if (!hasLanguage) setIsEditing(true);\n }, [language, hasLanguage]);\n\n // Read-only viewers always get the rendered/preview state, never the editor chrome.\n useEffect(() => {\n if (!editable) setIsEditing(false);\n }, [editable]);\n\n const showEditing = isEditing && editable;\n\n const editIcon = (\n <svg width=\"12\" height=\"12\" 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 const previewIcon = (\n <svg width=\"12\" height=\"12\" 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\n const renderPreview = () => {\n if (renderLanguage === 'mermaid') {\n return textContent.trim()\n ? <MermaidRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter mermaid diagram code...</p>;\n }\n if (renderLanguage === 'math') {\n return textContent.trim()\n ? <KatexRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter KaTeX math formula...</p>;\n }\n if (renderLanguage === 'markdown') {\n return textContent.trim()\n ? <MarkdownRenderer code={textContent} />\n : <p className=\"rte-codeblock__placeholder\">Enter Markdown content...</p>;\n }\n return null;\n };\n\n const displayLabel = renderLanguage ? renderLanguage + ' (render)' : language || 'plain text';\n\n return (\n <NodeViewWrapper className={`rte-codeblock-wrapper ${!isEditing && hasLanguage ? 'rte-codeblock-wrapper--preview' : ''}`}>\n {showEditing ? (\n <>\n <div className=\"rte-codeblock__header\">\n <div contentEditable={false} className=\"rte-codeblock__lang-control\">\n <Select\n className=\"rte-codeblock__lang-select\"\n aria-label=\"Code language\"\n value={renderLanguage || language}\n options={LANGUAGE_OPTIONS}\n onChange={(next) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n const selected = String(next);\n updateAttributes({ language: selected });\n if (!selected) setIsEditing(true);\n }}\n />\n </div>\n {hasLanguage && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-btn\"\n onClick={() => setIsEditing(false)}\n contentEditable={false}\n >\n {previewIcon} Preview\n </button>\n )}\n </div>\n <pre className=\"rte-codeblock__editable-pre\">\n <NodeViewContent as={'code' as any} />\n </pre>\n </>\n ) : isRenderable ? (\n <div\n className=\"rte-codeblock__render-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <div className=\"rte-codeblock__render-body\">\n {renderPreview()}\n </div>\n {/* 预览分支也必须挂载 contentDOM(隐藏):不渲染 NodeViewContent 时\n tiptap 会把代码文本以 data-node-view-content-react 形式再渲染\n 一份裸露副本,只读 / 预览下出现重复的原始代码。 */}\n <div style={{ display: 'none' }} aria-hidden=\"true\">\n <NodeViewContent as={'code' as any} />\n </div>\n </div>\n ) : (\n <div\n className=\"rte-codeblock__syntax-preview\"\n contentEditable={false}\n onDoubleClick={() => { if (editable) setIsEditing(true); }}\n >\n <div className=\"rte-codeblock__preview-toolbar\" contentEditable={false}>\n <span className=\"rte-codeblock__preview-label\">{displayLabel}</span>\n {editable && (\n <button\n type=\"button\"\n className=\"rte-codeblock__preview-edit-btn\"\n onClick={() => setIsEditing(true)}\n >\n {editIcon} Edit\n </button>\n )}\n </div>\n <SyntaxHighlighter\n style={oneLight as Record<string, React.CSSProperties>}\n language={highlightLang(language)}\n PreTag=\"div\"\n customStyle={{\n borderRadius: '0 0 0.5rem 0.5rem',\n fontSize: '0.875em',\n padding: '1em',\n margin: '0',\n }}\n >\n {textContent || ' '}\n </SyntaxHighlighter>\n <div style={{ display: 'none' }} aria-hidden=\"true\">\n <NodeViewContent as={'code' as any} />\n </div>\n </div>\n )}\n </NodeViewWrapper>\n );\n};\n\nconst backtickInputRegex = /^```([a-z-]*)[\\s\\n]$/;\nconst tildeInputRegex = /^~~~([a-z-]*)[\\s\\n]$/;\nconst tableShortcutRegex = /^(?:```|~~~)table(?:(\\d+)[x×X*](\\d+))?\\s?$/;\n\nexport const CodeBlockExtension = Node.create({\n name: 'codeBlock',\n group: 'block',\n content: 'text*',\n marks: '',\n code: true,\n defining: true,\n\n addAttributes() {\n return {\n language: {\n default: null,\n parseHTML: (element) => {\n const classAttr = element.querySelector('code')?.className ||\n element.className || '';\n const match = /language-([\\w-]+)/.exec(classAttr);\n return match?.[1] || element.getAttribute('data-language') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.language) return {};\n return { 'data-language': attributes.language };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'pre',\n mergeAttributes(HTMLAttributes, { 'data-language': node.attrs.language }),\n ['code', { class: node.attrs.language ? `language-${node.attrs.language}` : undefined }, 0],\n ];\n },\n\n addInputRules() {\n return [\n textblockTypeInputRule({\n find: backtickInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n textblockTypeInputRule({\n find: tildeInputRegex,\n type: this.type,\n getAttributes: (match) => {\n if (match[1]?.startsWith('table')) return false;\n return { language: match[1] || null };\n },\n }),\n ];\n },\n\n addProseMirrorPlugins() {\n const editorRef = this.editor;\n return [\n new Plugin({\n key: new PluginKey('tableShortcut'),\n props: {\n handleTextInput(view, from, to, text) {\n if (!editorRef.isEditable || text !== ' ') return false;\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, from, '\\0');\n const full = textBefore + ' ';\n const m = tableShortcutRegex.exec(full);\n if (!m) return false;\n\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, to, rows, cols);\n return true;\n },\n handleKeyDown(view, event) {\n if (!editorRef.isEditable || event.key !== 'Enter') return false;\n const { state } = view;\n const { $from } = state.selection;\n if (!$from.parent.isTextblock) return false;\n const blockStart = $from.start();\n const textBefore = state.doc.textBetween(blockStart, $from.pos, '\\0');\n const m = tableShortcutRegex.exec(textBefore);\n if (!m) return false;\n\n event.preventDefault();\n const rows = Math.min(Math.max(parseInt(m[1], 10) || 3, 1), 20);\n const cols = Math.min(Math.max(parseInt(m[2], 10) || 3, 1), 20);\n dispatchTable(view, blockStart, $from.pos, rows, cols);\n return true;\n },\n },\n }),\n ];\n\n function dispatchTable(view: typeof editorRef.view, from: number, to: number, rows: number, cols: number) {\n const { state } = view;\n const $from = state.doc.resolve(from);\n const blockNode = $from.parent;\n const blockPos = $from.before();\n\n const tableType = state.schema.nodes.table;\n const rowType = state.schema.nodes.tableRow;\n const headerType = state.schema.nodes.tableHeader;\n const cellType = state.schema.nodes.tableCell;\n if (!tableType || !rowType || !cellType) return;\n\n const emptyParagraph = state.schema.nodes.paragraph.create();\n const buildRow = (isHeader: boolean) => {\n const type = isHeader && headerType ? headerType : cellType;\n const cells = Array.from({ length: cols }, () => type.create(null, emptyParagraph));\n return rowType.create(null, cells);\n };\n\n const tableRows = [\n buildRow(true),\n ...Array.from({ length: rows - 1 }, () => buildRow(false)),\n ];\n const table = tableType.create(null, tableRows);\n const tr = state.tr.replaceWith(blockPos, blockPos + blockNode.nodeSize, table);\n view.dispatch(tr);\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.isEditable && this.editor.commands.toggleNode('codeBlock', 'paragraph'),\n Tab: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (editor.isActive('codeBlock')) {\n editor.commands.insertContent('\\t');\n return true;\n }\n return false;\n },\n Enter: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n editor.commands.newlineInCode();\n return true;\n },\n ArrowDown: ({ editor }) => {\n if (!editor.isEditable) return false;\n if (!editor.isActive('codeBlock')) return false;\n const { $from } = editor.state.selection;\n const isAtEnd = $from.parentOffset === $from.parent.content.size;\n if (!isAtEnd) return false;\n const after = $from.after();\n if (after === undefined) return false;\n const nodeAfter = editor.state.doc.nodeAt(after);\n if (nodeAfter) return false;\n editor.commands.exitCode();\n return true;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockNodeView);\n },\n});\n\nexport default CodeBlockExtension;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CommentMark.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CommentMark.ts"],"sourcesContent":["import { Mark, mergeAttributes } from '@tiptap/react';\n\nexport interface CommentThread {\n id: string;\n resolved: boolean;\n comments: CommentItem[];\n createdAt: number;\n}\n\nexport interface CommentItem {\n id: string;\n author: string;\n text: string;\n createdAt: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n commentMark: {\n setComment: (id: string) => ReturnType;\n unsetComment: () => ReturnType;\n };\n }\n}\n\nexport const CommentMark = Mark.create({\n name: 'comment',\n inclusive: false,\n excludes: '',\n\n addAttributes() {\n return {\n commentId: {\n default: null,\n parseHTML: (el) => el.getAttribute('data-comment-id'),\n renderHTML: (attrs) => {\n if (!attrs.commentId) return {};\n return { 'data-comment-id': attrs.commentId };\n },\n },\n resolved: {\n default: false,\n parseHTML: (el) => el.getAttribute('data-resolved') === 'true',\n renderHTML: (attrs) => {\n if (!attrs.resolved) return {};\n return { 'data-resolved': 'true' };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-comment-id]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(HTMLAttributes, {\n class: `rte-comment-mark ${HTMLAttributes['data-resolved'] === 'true' ? 'rte-comment-mark--resolved' : ''}`,\n }), 0];\n },\n\n addCommands() {\n return {\n setComment: (id: string) => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.setMark(this.name, { commentId: id });\n },\n unsetComment: () => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n\nexport default CommentMark;\n"],"mappings":";;AAyBA,IAAa,IAAc,EAAK,OAAO;CACrC,MAAM;CACN,WAAW;CACX,UAAU;CAEV,gBAAgB;EACd,OAAO;GACL,WAAW;IACT,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,iBAAiB;IACpD,aAAa,MACN,EAAM,YACJ,EAAE,mBAAmB,EAAM,UAAU,IADf,CAAC;GAGlC;GACA,UAAU;IACR,SAAS;IACT,YAAY,MAAO,EAAG,aAAa,eAAe,MAAM;IACxD,aAAa,MACN,EAAM,WACJ,EAAE,iBAAiB,OAAO,IADL,CAAC;GAGjC;EACF;CACF;CAEA,YAAY;EACV,OAAO,CAAC,EAAE,KAAK,wBAAwB,CAAC;CAC1C;CAEA,WAAW,EAAE,qBAAkB;EAC7B,OAAO;GAAC;GAAQ,EAAgB,GAAgB,EAC9C,OAAO,oBAAoB,EAAe,qBAAqB,SAAS,+BAA+B,KACzG,CAAC;GAAG;EAAC;CACP;CAEA,cAAc;EACZ,OAAO;GACL,aAAa,OAAgB,EAAE,aAAU,gBAClC,EAAO,aACL,EAAS,QAAQ,KAAK,MAAM,EAAE,WAAW,EAAG,CAAC,IADrB;GAGjC,qBAAqB,EAAE,aAAU,gBAC1B,EAAO,aACL,EAAS,UAAU,KAAK,IAAI,IADJ;EAGnC;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"CommentMark.js","names":["CommentMark","Mark","el","attrs","mergeAttributes","HTMLAttributes","editor","commands","id"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/CommentMark.ts"],"sourcesContent":["import { Mark, mergeAttributes } from '@tiptap/react';\n\nexport interface CommentThread {\n id: string;\n resolved: boolean;\n comments: CommentItem[];\n createdAt: number;\n}\n\nexport interface CommentItem {\n id: string;\n author: string;\n text: string;\n createdAt: number;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n commentMark: {\n setComment: (id: string) => ReturnType;\n unsetComment: () => ReturnType;\n };\n }\n}\n\nexport const CommentMark = Mark.create({\n name: 'comment',\n inclusive: false,\n excludes: '',\n\n addAttributes() {\n return {\n commentId: {\n default: null,\n parseHTML: (el) => el.getAttribute('data-comment-id'),\n renderHTML: (attrs) => {\n if (!attrs.commentId) return {};\n return { 'data-comment-id': attrs.commentId };\n },\n },\n resolved: {\n default: false,\n parseHTML: (el) => el.getAttribute('data-resolved') === 'true',\n renderHTML: (attrs) => {\n if (!attrs.resolved) return {};\n return { 'data-resolved': 'true' };\n },\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-comment-id]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes(HTMLAttributes, {\n class: `rte-comment-mark ${HTMLAttributes['data-resolved'] === 'true' ? 'rte-comment-mark--resolved' : ''}`,\n }), 0];\n },\n\n addCommands() {\n return {\n setComment: (id: string) => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.setMark(this.name, { commentId: id });\n },\n unsetComment: () => ({ commands, editor }) => {\n if (!editor.isEditable) return false;\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n\nexport default CommentMark;\n"],"mappings":";;AAyBA,IAAaA,IAAcC,EAAK,OAAO;CACrC,MAAM;CACN,WAAW;CACX,UAAU;CAEV,gBAAgB;EACd,OAAO;GACL,WAAW;IACT,SAAS;IACT,YAAY,MAAOC,EAAG,aAAa,iBAAiB;IACpD,aAAa,MACNC,EAAM,YACJ,EAAE,mBAAmBA,EAAM,UAAU,IADf,CAAC;GAGlC;GACA,UAAU;IACR,SAAS;IACT,YAAY,MAAOD,EAAG,aAAa,eAAe,MAAM;IACxD,aAAa,MACNC,EAAM,WACJ,EAAE,iBAAiB,OAAO,IADL,CAAC;GAGjC;EACF;CACF;CAEA,YAAY;EACV,OAAO,CAAC,EAAE,KAAK,wBAAwB,CAAC;CAC1C;CAEA,WAAW,EAAE,qBAAkB;EAC7B,OAAO;GAAC;GAAQC,EAAgBC,GAAgB,EAC9C,OAAO,oBAAoBA,EAAe,qBAAqB,SAAS,+BAA+B,KACzG,CAAC;GAAG;EAAC;CACP;CAEA,cAAc;EACZ,OAAO;GACL,aAAa,OAAgB,EAAE,aAAU,gBAClCC,EAAO,aACLC,EAAS,QAAQ,KAAK,MAAM,EAAE,WAAWC,EAAG,CAAC,IADrB;GAGjC,qBAAqB,EAAE,aAAU,gBAC1BF,EAAO,aACLC,EAAS,UAAU,KAAK,IAAI,IADJ;EAGnC;CACF;AACF,CAAC"}
@@ -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,SAAS,EAAW,GAAiC;CACnD,OAAO,OAAO,KAAU,YAAY,yLAAyL,KAAK,CAAK;AACzO;AAEA,IAAM,IAAW,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,MAAY,EAAQ,MAAM,UAAU,QAAQ,UAAU,EAAE,KAAK;IACzE,aAAa,MACN,EAAW,EAAW,QAAQ,IAC5B,EAAE,OAAO,cAAc,EAAW,WAAW,IADP,CAAC;GAGlD,EACF;EACF,CACF;CACF;CAEA,cAAc;EACZ,OAAO;GACL,cACG,OACA,EAAE,UAAO,gBACJ,CAAC,EAAO,cAAc,CAAC,EAAW,CAAQ,IAAU,KACjD,EAAM,CAAC,CAAC,QAAQ,aAAa,EAAE,YAAS,CAAC,CAAC,CAAC,IAAI;GAE1D,sBAEG,EAAE,UAAO,gBACH,EAAO,aACL,EAAM,CAAC,CAAC,QAAQ,aAAa,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,IAAI,IADpD;EAGrC;CACF;AACF,CAAC"}
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":"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"}
@@ -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":"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"}
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,SAAS,EAAK,GAAuB;CACnC,OAAO,MAAM,KAAK,IAAO,MAAQ,uBAAuB,KAAK,CAAI,IAC7D,IAAO,IAAI,EAAK,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE;AAChD;AAGA,SAAgB,EAAuB,GAAwB;CAC7D,IAAM,IAAQ,EAAO,MAAM,OAAO,GAC5B,IAAO,EAAM,EAAE,CAAC,KAAK;CAC3B,IAAI,MAAS,UAAU,MAAS,OAAO,OAAO;CAC9C,IAAM,KAAQ,GAAc,MAA0B;EACpD,MAAU,MAAM,UAAU,EAAK,SAAS,IAAO,EAAE,IAAI,GAAQ;CAC/D,GACM,IAAO,EAAM,KAAK,GAAO,OAAU;EAAE,OAAO,EAAM,KAAK;EAAG;CAAK,EAAE,CAAC,CACrE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,eAAY,KAAS,CAAC,EAAM,WAAW,GAAG,CAAC;CAGjE,IAFK,EAAK,UAAQ,EAAK,GAAG,eAAe,GAErC,MAAS,OAAO;EAClB,IAAM,oBAAS,IAAI,IAAoB,GACjC,KAAS,GAAc,OAC3B,IAAO,EAAK,KAAK,IACb,CAAC,KAAQ,YAAY,KAAK,CAAI,MAAG,EAAK,GAAM,0BAA0B,GACrE,EAAO,IAAI,CAAI,KAAG,EAAO,IAAI,GAAM,IAAI,EAAO,MAAM,GAClD,EAAO,IAAI,CAAI,IAElB,IAAmB,CAAC,GACpB,IAAiC;GAAE,MAAM;GAAO,OAAO;GAAQ,OAAO;GAAM,QAAQ;EAAM;EAChG,KAAK,IAAM,EAAE,UAAO,aAAU,GAAM;GAClC,IAAM,IAAO,sDAAsD,KAAK,CAAK;GAC7E,IAAI,GAAM;IACR,IAAM,IAAY,EAAK,EAAE,CAAC,YAAY,GAChC,IAAQ,EAAK,EAAE,CAAC,MAAM,GAAG;IAE/B,AADI,EAAM,UAAU,MAAc,SAAS,IAAI,MAAI,EAAK,GAAM,+BAA+B,GAC7F,EAAO,KAAK,QAAQ,EAAU,GAAG,EAAM,KAAI,MAAQ,EAAM,GAAM,CAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,EAAK,EAAK,EAAE,GAAG;IACnG;GACF;GACA,IAAM,IAAU,iDAAiD,KAAK,CAAK;GAE3E,CADI,CAAC,KAAW,OAAO,KAAK,EAAQ,EAAE,CAAC,KAAK,CAAC,MAAG,EAAK,GAAM,yCAAyC,GACpG,EAAO,KAAK,GAAG,EAAM,EAAS,IAAI,CAAI,IAAI,EAAO,EAAS,MAAM,EAAM,EAAS,IAAI,CAAI,EAAE,IAAI,EAAK,EAAS,EAAE,GAAG;EAClH;EACA,OAAO;GAAC;GAAmB,GAAG,MAAM,KAAK,IAAS,CAAC,GAAM,OAAQ,eAAe,EAAG,MAAM,EAAK,CAAI,GAAG;GAAG,GAAG;EAAM,CAAC,CAAC,KAAK,IAAI;CAC9H;CAEA,IAAM,oBAAQ,IAAI,IAA0C,GACtD,IAAyB,CAAC,GAC1B,IAAkB,CAAC,GACnB,IAA2C;EAC/C,OAAO,CAAC,MAAM,IAAI;EAAG,KAAK,CAAC,MAAM,IAAI;EAAG,WAAW,CAAC,KAAK,GAAG;EAC5D,WAAW,CAAC,KAAK,GAAG;EAAG,aAAa,CAAC,MAAM,IAAI;EAAG,YAAY,CAAC,MAAM,IAAI;CAC3E;CACA,KAAK,IAAM,EAAE,UAAO,aAAU,GAAM;EAClC,IAAI,CAAC,EAAM,SAAS,IAAI,GAAG;EAC3B,IAAM,IAAQ,4CAA4C,KAAK,CAAK;EACpE,CAAI,CAAC,KAAS,CAAC,OAAO,OAAO,GAAQ,EAAM,EAAE,MAAG,EAAK,GAAM,mCAAmC;EAC9F,IAAM,GAAG,GAAM,GAAM,KAAS;EAG9B,AAFI,EAAM,IAAI,CAAI,KAAG,EAAK,GAAM,mBAAmB,GAAM,GAErD,KAAS,QAAQ,KAAK,CAAK,KAAG,EAAK,GAAM,uCAAuC;EACpF,IAAM,IAAK,IAAI,EAAM;EACrB,EAAM,IAAI,GAAM;GAAE;GAAI;EAAK,CAAC;EAC5B,IAAM,CAAC,GAAM,KAAS,EAAO;EAC7B,EAAa,KAAK,GAAG,IAAK,EAAK,GAAG,EAAK,KAAS,CAAI,EAAE,GAAG,GAAO;CAClE;CACA,IAAI,GACE,IAAqC;EAAE,OAAO;EAAM,MAAM;EAAM,KAAK;EAAM,QAAQ;CAAK;CAC9F,KAAK,IAAM,EAAE,UAAO,aAAU,GAAM;EAClC,IAAI,EAAM,SAAS,IAAI,GAAG;EAC1B,IAAM,IAAQ,EAAM,MAAM,IAAI;EAC9B,AAAI,EAAM,SAAS,KAAG,EAAK,GAAM,4BAA4B;EAC7D,IAAM,IAAO,EAAM,KAAI,MAAQ;GAC7B,IAAM,IAAQ,4CAA4C,KAAK,CAAI;GAEnE,QADI,CAAC,KAAS,CAAC,EAAM,IAAI,EAAM,EAAE,MAAG,EAAK,GAAM,qCAAqC,GAC7E;IAAE,MAAM,EAAM,IAAI,EAAO,EAAE;IAAI,SAAS,EAAO,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,KAAI,MAAU,EAAO,KAAK,CAAC,KAAK,CAAC;GAAE;EAC1G,CAAC;EACD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;GACpC,IAAM,EAAE,SAAM,eAAY,EAAK;GAC/B,IAAI,MAAM,EAAK,SAAS,GAAG;IACzB,AAAI,EAAQ,UAAQ,EAAK,GAAM,iDAAiD;IAChF;GACF;GACA,IAAI,GACA;GACJ,KAAK,IAAM,KAAU,GACnB,CAAK,MAAW,SAAS,MAAW,SAAS,EAAK,SAAS,eAAe,CAAC,IAAQ,IAAS,IACnF,OAAO,OAAO,GAAY,CAAM,KAAK,CAAC,IAAM,IAAO,EAAW,KAClE,EAAK,GAAM,iCAAiC,GAAQ;GAM3D,AAJI,MACE,KAAa,MAAc,KAAM,EAAK,GAAM,sDAAsD,GACtG,IAAY,IAEd,EAAM,KAAK,GAAG,EAAK,GAAG,MAAM,IAAS,IAAI,EAAO,KAAK,GAAG,GAAG,EAAK,IAAI,EAAE,CAAC,KAAK,IAAI;EAClF;CACF;CAEA,OADK,EAAM,QAAM,EAAK,GAAG,sBAAsB,GACxC;EAAC,aAAa,KAAa;EAAQ,GAAG;EAAc,GAAG;CAAK,CAAC,CAAC,KAAK,IAAI;AAChF"}
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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"}
@@ -102,6 +102,8 @@ export interface RichTextEditorProps {
102
102
  onRequestAIConfig?: () => void;
103
103
  /** Toggle toolbar sections (all enabled by default) */
104
104
  toolbarConfig?: ToolbarSection;
105
+ /** Keep an open AI panel's selected text and replacement target in sync with new editor selections. */
106
+ aiSelectionFollowsEditor?: boolean;
105
107
  /** Minimum editor height */
106
108
  minHeight?: string | number;
107
109
  /** Maximum editor height */
@@ -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 /** 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":";AAmOA,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,6 @@
1
+ import type { SpritePose } from '../types';
2
+ import type { MollyRig } from './rig';
3
+ export declare function createMollyAnimations(rig: MollyRig): {
4
+ pose: (input: SpritePose) => void;
5
+ dispose: () => void;
6
+ };