dishui 0.0.108 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) 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.js.map +1 -1
  234. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  235. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  243. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  258. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  259. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  260. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  261. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  262. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  263. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  264. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  265. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  266. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  267. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  268. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  269. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  270. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  271. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  272. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  273. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  274. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  275. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  276. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  277. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  278. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  279. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  280. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  281. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  282. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  283. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  284. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  285. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  286. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  287. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  288. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  289. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  290. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  291. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  292. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  293. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  294. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  295. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  296. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  297. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  298. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  299. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  300. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  301. package/dist/components/pro/Sprite/actions.js +16 -0
  302. package/dist/components/pro/Sprite/actions.js.map +1 -0
  303. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  304. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  305. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  306. package/dist/components/pro/Sprite/index.d.ts +4 -0
  307. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  308. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  309. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  310. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  311. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  312. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  313. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  314. package/dist/components/pro/Sprite/shared/events.js +21 -0
  315. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  316. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  317. package/dist/components/pro/Sprite/shared/face.js +33 -0
  318. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  319. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  320. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  321. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  322. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  323. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  324. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  325. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  326. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  327. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  328. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  329. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  330. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  331. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  332. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  333. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  334. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  335. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  336. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  337. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  338. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  339. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  340. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  341. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  342. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  343. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  344. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  345. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  346. package/dist/components/pro/Sprite/types.d.ts +40 -0
  347. package/dist/contexts/AppContext.js.map +1 -1
  348. package/dist/contexts/authentication.js.map +1 -1
  349. package/dist/data-table.js +3 -3
  350. package/dist/data-table.js.map +1 -1
  351. package/dist/dishui.css +1 -1
  352. package/dist/hooks/useClickOutside.js.map +1 -1
  353. package/dist/hooks/useContainerElement.js.map +1 -1
  354. package/dist/hooks/useControllableState.js.map +1 -1
  355. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  356. package/dist/hooks/useDebounce.js.map +1 -1
  357. package/dist/hooks/useDraggable.js.map +1 -1
  358. package/dist/hooks/useTableColumns.js.map +1 -1
  359. package/dist/hooks/useTableData.js.map +1 -1
  360. package/dist/index-nostyled.d.ts +2 -0
  361. package/dist/index.d.ts +2 -0
  362. package/dist/index.js +116 -115
  363. package/dist/layouts/MainLayout.js.map +1 -1
  364. package/dist/layouts/Navbar.js.map +1 -1
  365. package/dist/layouts/Sidebar.js.map +1 -1
  366. package/dist/layouts/headbar/Headbar.js.map +1 -1
  367. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  368. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  369. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  370. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  371. package/dist/sprite.js +2 -0
  372. package/dist/styles/themeStyles.js.map +1 -1
  373. package/dist/utils/cn.js.map +1 -1
  374. package/dist/utils/flexLayout.js.map +1 -1
  375. package/dist/utils/i18n.js.map +1 -1
  376. package/dist/utils/menu.js.map +1 -1
  377. package/dist/utils/rehype-code-meta.js.map +1 -1
  378. package/dist/utils/remark-code-meta.js.map +1 -1
  379. package/dist/utils/routerBuilder.js.map +1 -1
  380. package/dist/utils/safeStorage.js.map +1 -1
  381. package/dist/utils/selection.js +29 -20
  382. package/dist/utils/selection.js.map +1 -1
  383. package/dist/utils/themes.js.map +1 -1
  384. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingDialog.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const startGesture = useCallback((e: React.PointerEvent<HTMLDivElement>, resize: boolean) => {\n if (editor.isDestroyed || !editor.isEditable || !e.isPrimary || e.button !== 0) return;\n if (!resize && (!isFloat || (e.target as HTMLElement).closest('button, input'))) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget;\n const doc = target.ownerDocument;\n const pointerId = e.pointerId;\n const { clientX, clientY } = e;\n let lastX = resize ? attrs.width : attrs.x;\n let lastY = resize ? attrs.height : attrs.y;\n const startX = lastX;\n const startY = lastY;\n\n const onMove = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return;\n const x = resize ? Math.max(160, startX + ev.clientX - clientX) : startX + ev.clientX - clientX;\n const y = resize ? Math.max(80, startY + ev.clientY - clientY) : startY + ev.clientY - clientY;\n if (x === lastX && y === lastY) return;\n lastX = x;\n lastY = y;\n updateAttributes(resize ? { width: x, height: y } : { x, y });\n };\n const cleanup = () => {\n doc.removeEventListener('pointermove', onMove);\n doc.removeEventListener('pointerup', onEnd);\n doc.removeEventListener('pointercancel', onEnd);\n target.removeEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = null;\n if (target.hasPointerCapture(pointerId)) target.releasePointerCapture(pointerId);\n };\n const onEnd = (ev: PointerEvent) => {\n if (ev.pointerId === pointerId) cleanup();\n };\n // Capture keeps the gesture paired even when a finger leaves the handle.\n target.setPointerCapture(pointerId);\n doc.addEventListener('pointermove', onMove);\n doc.addEventListener('pointerup', onEnd);\n doc.addEventListener('pointercancel', onEnd);\n target.addEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = cleanup;\n }, [editor, isFloat, attrs.x, attrs.y, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor, touchAction: isFloat && editable ? 'none' : undefined }}\n onPointerDown={(e) => startGesture(e, false)}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\" onPointerDown={(e) => e.stopPropagation()}>\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onPointerDown={(e) => startGesture(e, true)} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FloatingDialog.js","names":["DIALOG_COLORS","LAYOUT_OPTIONS","collectFloatZIndices","indices","editor","node","FloatingDialogView","writeAttributes","editable","useNodeEditable","updateAttributes","useCallback","attributes","gestureCleanup","useRef","attrs","layout","isFloat","zIndex","editingTitle","setEditingTitle","useState","localTitle","setLocalTitle","showColorPicker","setShowColorPicker","showLayoutPicker","setShowLayoutPicker","colorRef","layoutRef","useEffect","cleanup","handler","startGesture","resize","target","doc","pointerId","lastX","lastY","startX","startY","onMove","ev","x","clientX","y","clientY","onEnd","saveTitle","bringForward","all","maxZ","sendBackward","minZ","wrapperClass","cn","selected","wrapperStyle","boxStyle","layoutIcon","l","NodeViewWrapper","opt","c","deleteNode","NodeViewContent","getNextFloatZIndex","z","FloatingDialogExtension","Node","mergeAttributes","HTMLAttributes","ReactNodeViewRenderer"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const startGesture = useCallback((e: React.PointerEvent<HTMLDivElement>, resize: boolean) => {\n if (editor.isDestroyed || !editor.isEditable || !e.isPrimary || e.button !== 0) return;\n if (!resize && (!isFloat || (e.target as HTMLElement).closest('button, input'))) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget;\n const doc = target.ownerDocument;\n const pointerId = e.pointerId;\n const { clientX, clientY } = e;\n let lastX = resize ? attrs.width : attrs.x;\n let lastY = resize ? attrs.height : attrs.y;\n const startX = lastX;\n const startY = lastY;\n\n const onMove = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return;\n const x = resize ? Math.max(160, startX + ev.clientX - clientX) : startX + ev.clientX - clientX;\n const y = resize ? Math.max(80, startY + ev.clientY - clientY) : startY + ev.clientY - clientY;\n if (x === lastX && y === lastY) return;\n lastX = x;\n lastY = y;\n updateAttributes(resize ? { width: x, height: y } : { x, y });\n };\n const cleanup = () => {\n doc.removeEventListener('pointermove', onMove);\n doc.removeEventListener('pointerup', onEnd);\n doc.removeEventListener('pointercancel', onEnd);\n target.removeEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = null;\n if (target.hasPointerCapture(pointerId)) target.releasePointerCapture(pointerId);\n };\n const onEnd = (ev: PointerEvent) => {\n if (ev.pointerId === pointerId) cleanup();\n };\n // Capture keeps the gesture paired even when a finger leaves the handle.\n target.setPointerCapture(pointerId);\n doc.addEventListener('pointermove', onMove);\n doc.addEventListener('pointerup', onEnd);\n doc.addEventListener('pointercancel', onEnd);\n target.addEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = cleanup;\n }, [editor, isFloat, attrs.x, attrs.y, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor, touchAction: isFloat && editable ? 'none' : undefined }}\n onPointerDown={(e) => startGesture(e, false)}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\" onPointerDown={(e) => e.stopPropagation()}>\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onPointerDown={(e) => startGesture(e, true)} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FontSize.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FontSize.ts"],"sourcesContent":["import { Extension } from '@tiptap/react';\n\nexport type FontSizeOptions = {\n types: string[];\n};\n\ndeclare module '@tiptap/react' {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nfunction isFontSize(value: unknown): value is string {\n return typeof value === 'string' && /^(?:0|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:px|pt|pc|em|rem|ex|ch|%|vw|vh|vmin|vmax)|xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large|smaller|larger|inherit|initial|unset|revert)$/i.test(value);\n}\n\nconst FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element) => element.style.fontSize?.replace(/['\"]+/g, '') || null,\n renderHTML: (attributes) => {\n if (!isFontSize(attributes.fontSize)) return {};\n return { style: `font-size: ${attributes.fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain, editor }) => {\n if (!editor.isEditable || !isFontSize(fontSize)) return false;\n return chain().setMark('textStyle', { fontSize }).run();\n },\n unsetFontSize:\n () =>\n ({ chain, editor }) => {\n if (!editor.isEditable) return false;\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n\nexport default FontSize;\n"],"mappings":";;AAeA,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":"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"}
1
+ {"version":3,"file":"legacyMermaid.js","names":["text","value","char","normalizeLegacyMermaid","lines","source","kind","fail","line","reason","body","actors","actor","name","output","arrows","note","placement","names","message","id","nodes","declarations","edges","shapes","match","type","label","open","close","direction","directions","parts","refs","part","option","i","options","branch","hint","node"],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/legacyMermaid.ts"],"sourcesContent":["// Encode user text before embedding it in Mermaid syntax (including entity-like input).\nfunction text(value: string): string {\n return Array.from(value, char => /[\\p{L}\\p{N} ,.!?_-]/u.test(char)\n ? char : `#${char.codePointAt(0)};`).join('');\n}\n\n/** Convert only explicit legacy headers. Unsupported syntax fails rather than changing meaning. */\nexport function normalizeLegacyMermaid(source: string): string {\n const lines = source.split(/\\r?\\n/);\n const kind = lines[0].trim();\n if (kind !== 'flow' && kind !== 'seq') return source;\n const fail = (line: number, reason: string): never => {\n throw new Error(`Legacy ${kind}, line ${line + 1}: ${reason}`);\n };\n const body = lines.map((value, line) => ({ value: value.trim(), line }))\n .slice(1).filter(({ value }) => value && !value.startsWith('#'));\n if (!body.length) fail(0, 'Empty diagram');\n\n if (kind === 'seq') {\n const actors = new Map<string, string>();\n const actor = (name: string, line: number) => {\n name = name.trim();\n if (!name || /[\\r\\n:<>]/.test(name)) fail(line, 'Invalid participant name');\n if (!actors.has(name)) actors.set(name, `p${actors.size}`);\n return actors.get(name)!;\n };\n const output: string[] = [];\n const arrows: Record<string, string> = { '->': '->>', '-->': '-->>', '->>': '->', '-->>': '-->' };\n for (const { value, line } of body) {\n const note = /^Note\\s+(right of|left of|over)\\s+([^:]+):\\s*(.*)$/i.exec(value);\n if (note) {\n const placement = note[1].toLowerCase();\n const names = note[2].split(',');\n if (names.length > (placement === 'over' ? 2 : 1)) fail(line, 'Unsupported note participants');\n output.push(`Note ${placement} ${names.map(name => actor(name, line)).join(',')}: ${text(note[3])}`);\n continue;\n }\n const message = /^([^:<>]+?)(-->>|->>|-->|->)([^:<>]+):\\s*(.*)$/.exec(value);\n if (!message || /[-]$/.test(message[1].trim())) fail(line, 'Unsupported sequence statement or arrow');\n output.push(`${actor(message![1], line)}${arrows[message![2]]}${actor(message![3], line)}: ${text(message![4])}`);\n }\n return ['sequenceDiagram', ...Array.from(actors, ([name, id]) => `participant ${id} as ${text(name)}`), ...output].join('\\n');\n }\n\n const nodes = new Map<string, { id: string; type: string }>();\n const declarations: string[] = [];\n const edges: string[] = [];\n const shapes: Record<string, [string, string]> = {\n start: ['([', '])'], end: ['([', '])'], operation: ['[', ']'],\n condition: ['{', '}'], inputoutput: ['[/', '/]'], subroutine: ['[[', ']]'],\n };\n for (const { value, line } of body) {\n if (!value.includes('=>')) continue;\n const match = /^([A-Za-z_][\\w]*)=>([a-z]+)(?::\\s*(.*))?$/.exec(value);\n if (!match || !Object.hasOwn(shapes, match[2])) fail(line, 'Unsupported node declaration/type');\n const [, name, type, label] = match!;\n if (nodes.has(name)) fail(line, `Duplicate node: ${name}`);\n // flowchart.js uses these as state/link metadata, not literal label text.\n if (label && /\\||:>/.test(label)) fail(line, 'Node styles and links are unsupported');\n const id = `n${nodes.size}`;\n nodes.set(name, { id, type });\n const [open, close] = shapes[type];\n declarations.push(`${id}${open}\"${text(label ?? type)}\"${close}`);\n }\n let direction: string | undefined;\n const directions: Record<string, string> = { right: 'LR', left: 'RL', top: 'BT', bottom: 'TD' };\n for (const { value, line } of body) {\n if (value.includes('=>')) continue;\n const parts = value.split('->');\n if (parts.length < 2) fail(line, 'Unsupported flow statement');\n const refs = parts.map(part => {\n const match = /^\\s*([A-Za-z_][\\w]*)(?:\\(([^()]+)\\))?\\s*$/.exec(part);\n if (!match || !nodes.has(match[1])) fail(line, 'Invalid or undefined node reference');\n return { node: nodes.get(match![1])!, options: match![2]?.split(',').map(option => option.trim()) ?? [] };\n });\n for (let i = 0; i < refs.length; i++) {\n const { node, options } = refs[i];\n if (i === refs.length - 1) {\n if (options.length) fail(line, 'Options on a terminal reference are unsupported');\n break;\n }\n let branch: string | undefined;\n let hint: string | undefined;\n for (const option of options) {\n if ((option === 'yes' || option === 'no') && node.type === 'condition' && !branch) branch = option;\n else if (Object.hasOwn(directions, option) && !hint) hint = directions[option];\n else fail(line, `Unsupported branch/direction: ${option}`);\n }\n if (hint) {\n if (direction && direction !== hint) fail(line, 'Mixed edge directions cannot be represented reliably');\n direction = hint;\n }\n edges.push(`${node.id} -->${branch ? `|${branch}|` : ''} ${refs[i + 1].node.id}`);\n }\n }\n if (!nodes.size) fail(0, 'No node declarations');\n return [`flowchart ${direction ?? 'TD'}`, ...declarations, ...edges].join('\\n');\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport type AIEditMode = 'replace' | 'insert';\n\nexport interface AIRequest {\n /** Text sent to the provider. For insert mode this is the user's prompt. */\n text: string;\n /** The instruction entered by the user, when provided. */\n prompt: string;\n /** Selected editor text. Empty when generating at the cursor. */\n selectedText: string;\n /** Replace a selection or insert at the captured cursor position. */\n mode: AIEditMode;\n action: AIAction;\n systemPrompt: string;\n signal: AbortSignal;\n}\n\nexport interface AIConfig {\n /** Required by built-in OpenAI and Anthropic protocols. */\n gateway?: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n /** Required by built-in OpenAI and Anthropic protocols. */\n model?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n /** Base system instruction applied to every AI edit request. */\n systemPrompt?: string;\n /** Custom handler; useful for keeping provider credentials outside the browser. */\n customHandler?: (params: AIRequest) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarButtonConfig {\n undo?: boolean;\n redo?: boolean;\n fontFamily?: boolean;\n fontSize?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n formatPainter?: boolean;\n heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n heading4?: boolean;\n heading5?: boolean;\n heading6?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n taskList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n mermaidBlock?: boolean;\n link?: boolean;\n image?: boolean;\n table?: boolean;\n tableOps?: boolean;\n horizontalRule?: boolean;\n markdownBlock?: boolean;\n markdownTemplates?: boolean;\n floatingDialog?: boolean;\n textColor?: boolean;\n highlight?: boolean;\n ai?: boolean;\n comments?: boolean;\n}\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n /** Fine-grained visibility overrides for every toolbar control. */\n buttons?: ToolbarButtonConfig;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI editing configuration. May be supplied or updated by the consuming app. */\n aiConfig?: AIConfig;\n /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */\n onRequestAIConfig?: () => void;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Keep an open AI panel's selected text and replacement target in sync with new editor selections. */\n aiSelectionFollowsEditor?: boolean;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n aiPromptLabel?: string;\n aiPromptPlaceholder?: string;\n aiSelectedText?: string;\n aiInsertHint?: string;\n aiResult?: string;\n aiGenerate?: string;\n aiCancel?: string;\n aiClose?: string;\n aiDismiss?: string;\n aiNotConfigured?: string;\n aiConfigure?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n aiPromptLabel: 'Prompt',\n aiPromptPlaceholder: 'Describe what AI should write… (Ctrl+Enter to generate)',\n aiSelectedText: 'Selected text',\n aiInsertHint: 'No text selected. The result will be inserted at the cursor.',\n aiResult: 'Result',\n aiGenerate: 'Generate',\n aiCancel: 'Cancel',\n aiClose: 'Close AI assistant',\n aiDismiss: 'Dismiss',\n aiNotConfigured: 'AI is not configured',\n aiConfigure: 'Configure AI',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AAqOA,IAAa,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}
1
+ {"version":3,"file":"types.js","names":["defaultLabels"],"sources":["../../../../src/components/pro/RichTextEditor/types.ts"],"sourcesContent":["import type { Editor } from '@tiptap/react';\n\nexport type AIEditMode = 'replace' | 'insert';\n\nexport interface AIRequest {\n /** Text sent to the provider. For insert mode this is the user's prompt. */\n text: string;\n /** The instruction entered by the user, when provided. */\n prompt: string;\n /** Selected editor text. Empty when generating at the cursor. */\n selectedText: string;\n /** Replace a selection or insert at the captured cursor position. */\n mode: AIEditMode;\n action: AIAction;\n systemPrompt: string;\n signal: AbortSignal;\n}\n\nexport interface AIConfig {\n /** Required by built-in OpenAI and Anthropic protocols. */\n gateway?: string;\n protocol: 'openai' | 'anthropic' | 'custom';\n /** Required by built-in OpenAI and Anthropic protocols. */\n model?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n /** Base system instruction applied to every AI edit request. */\n systemPrompt?: string;\n /** Custom handler; useful for keeping provider credentials outside the browser. */\n customHandler?: (params: AIRequest) => AsyncIterable<string>;\n}\n\nexport type AIAction =\n | 'rewrite'\n | 'shorten'\n | 'expand'\n | 'fix_grammar'\n | 'translate_en'\n | 'translate_zh'\n | 'professional'\n | 'casual';\n\nexport interface ToolbarButtonConfig {\n undo?: boolean;\n redo?: boolean;\n fontFamily?: boolean;\n fontSize?: boolean;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n formatPainter?: boolean;\n heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n heading4?: boolean;\n heading5?: boolean;\n heading6?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n taskList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n mermaidBlock?: boolean;\n link?: boolean;\n image?: boolean;\n table?: boolean;\n tableOps?: boolean;\n horizontalRule?: boolean;\n markdownBlock?: boolean;\n markdownTemplates?: boolean;\n floatingDialog?: boolean;\n textColor?: boolean;\n highlight?: boolean;\n ai?: boolean;\n comments?: boolean;\n}\n\nexport interface ToolbarSection {\n textFormat?: boolean;\n heading?: boolean;\n alignment?: boolean;\n list?: boolean;\n insert?: boolean;\n color?: boolean;\n history?: boolean;\n ai?: boolean;\n tableOps?: boolean;\n fontStyle?: boolean;\n formatPainter?: boolean;\n /** Fine-grained visibility overrides for every toolbar control. */\n buttons?: ToolbarButtonConfig;\n}\n\nexport interface RichTextEditorProps {\n /** Initial HTML content */\n content?: string;\n /** Controlled content (HTML string) */\n value?: string;\n /** Called when content changes, returns HTML */\n onChange?: (html: string) => void;\n /** Called when content changes, returns JSON */\n onChangeJSON?: (json: Record<string, unknown>) => void;\n /** Editor placeholder text */\n placeholder?: string;\n /** Whether the editor is read-only */\n editable?: boolean;\n /** AI editing configuration. May be supplied or updated by the consuming app. */\n aiConfig?: AIConfig;\n /** Called when the AI button is clicked without aiConfig. Open your configuration UI here. */\n onRequestAIConfig?: () => void;\n /** Toggle toolbar sections (all enabled by default) */\n toolbarConfig?: ToolbarSection;\n /** Keep an open AI panel's selected text and replacement target in sync with new editor selections. */\n aiSelectionFollowsEditor?: boolean;\n /** Minimum editor height */\n minHeight?: string | number;\n /** Maximum editor height */\n maxHeight?: string | number;\n /** Additional CSS class for the root container */\n className?: string;\n /** Whether to autofocus on mount */\n autofocus?: boolean;\n /** Labels for i18n */\n labels?: RichTextEditorLabels;\n /** Ref to access the Tiptap editor instance */\n editorRef?: React.MutableRefObject<Editor | null>;\n /** Show comment panel by default */\n showComments?: boolean;\n /** Controlled comment threads */\n commentThreads?: import('./extensions/CommentMark').CommentThread[];\n /** Callback when comment threads change */\n onCommentThreadsChange?: (threads: import('./extensions/CommentMark').CommentThread[]) => void;\n /** Current user name for comments */\n currentUser?: string;\n}\n\nexport interface RichTextEditorLabels {\n bold?: string;\n italic?: string;\n underline?: string;\n strikethrough?: string;\n subscript?: string;\n superscript?: string;\n heading?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n alignJustify?: string;\n bulletList?: string;\n orderedList?: string;\n taskList?: string;\n blockquote?: string;\n codeBlock?: string;\n link?: string;\n image?: string;\n table?: string;\n markdownBlock?: string;\n undo?: string;\n redo?: string;\n color?: string;\n highlight?: string;\n ai?: string;\n aiRewrite?: string;\n aiShorten?: string;\n aiExpand?: string;\n aiFixGrammar?: string;\n aiTranslateEn?: string;\n aiTranslateZh?: string;\n aiProfessional?: string;\n aiCasual?: string;\n aiProcessing?: string;\n aiAccept?: string;\n aiReject?: string;\n aiPromptLabel?: string;\n aiPromptPlaceholder?: string;\n aiSelectedText?: string;\n aiInsertHint?: string;\n aiResult?: string;\n aiGenerate?: string;\n aiCancel?: string;\n aiClose?: string;\n aiDismiss?: string;\n aiNotConfigured?: string;\n aiConfigure?: string;\n markdownEditMode?: string;\n markdownPreviewMode?: string;\n insertLinkUrl?: string;\n insertImageUrl?: string;\n horizontalRule?: string;\n tableAddColumnBefore?: string;\n tableAddColumnAfter?: string;\n tableDeleteColumn?: string;\n tableAddRowBefore?: string;\n tableAddRowAfter?: string;\n tableDeleteRow?: string;\n tableMergeCells?: string;\n tableSplitCell?: string;\n tableDelete?: string;\n tableOps?: string;\n fontFamily?: string;\n fontSize?: string;\n formatPainter?: string;\n formatPainterActive?: string;\n mermaidBlock?: string;\n mdTemplates?: string;\n mdTplFlowchart?: string;\n mdTplSequence?: string;\n mdTplPieChart?: string;\n mdTplGantt?: string;\n mdTplBarChart?: string;\n mdTplPython?: string;\n mdTplTypeScript?: string;\n mdTplRust?: string;\n mdTplMath?: string;\n mdTplMixed?: string;\n floatingDialog?: string;\n layoutBlock?: string;\n layoutWrapLeft?: string;\n layoutWrapRight?: string;\n layoutFloat?: string;\n}\n\nexport const defaultLabels: RichTextEditorLabels = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n subscript: 'Subscript',\n superscript: 'Superscript',\n heading: 'Heading',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n link: 'Link',\n image: 'Image',\n table: 'Table',\n markdownBlock: 'Markdown Block',\n undo: 'Undo',\n redo: 'Redo',\n color: 'Text Color',\n highlight: 'Highlight',\n ai: 'AI',\n aiRewrite: 'Rewrite',\n aiShorten: 'Shorten',\n aiExpand: 'Expand',\n aiFixGrammar: 'Fix Grammar',\n aiTranslateEn: 'Translate to English',\n aiTranslateZh: 'Translate to Chinese',\n aiProfessional: 'Professional Tone',\n aiCasual: 'Casual Tone',\n aiProcessing: 'AI Processing...',\n aiAccept: 'Accept',\n aiReject: 'Reject',\n aiPromptLabel: 'Prompt',\n aiPromptPlaceholder: 'Describe what AI should write… (Ctrl+Enter to generate)',\n aiSelectedText: 'Selected text',\n aiInsertHint: 'No text selected. The result will be inserted at the cursor.',\n aiResult: 'Result',\n aiGenerate: 'Generate',\n aiCancel: 'Cancel',\n aiClose: 'Close AI assistant',\n aiDismiss: 'Dismiss',\n aiNotConfigured: 'AI is not configured',\n aiConfigure: 'Configure AI',\n markdownEditMode: 'Edit',\n markdownPreviewMode: 'Preview',\n insertLinkUrl: 'Enter URL',\n insertImageUrl: 'Enter image URL',\n horizontalRule: 'Horizontal Rule',\n tableAddColumnBefore: 'Add Column Before',\n tableAddColumnAfter: 'Add Column After',\n tableDeleteColumn: 'Delete Column',\n tableAddRowBefore: 'Add Row Before',\n tableAddRowAfter: 'Add Row After',\n tableDeleteRow: 'Delete Row',\n tableMergeCells: 'Merge Cells',\n tableSplitCell: 'Split Cell',\n tableDelete: 'Delete Table',\n tableOps: 'Table Operations',\n fontFamily: 'Font Family',\n fontSize: 'Font Size',\n formatPainter: 'Format Painter',\n formatPainterActive: 'Format Painter (click target)',\n mermaidBlock: 'Mermaid Diagram',\n mdTemplates: 'Markdown Templates',\n mdTplFlowchart: 'Flowchart',\n mdTplSequence: 'Sequence Diagram',\n mdTplPieChart: 'Pie Chart',\n mdTplGantt: 'Gantt Chart',\n mdTplBarChart: 'Bar Chart (xychart)',\n mdTplPython: 'Python Code',\n mdTplTypeScript: 'TypeScript Code',\n mdTplRust: 'Rust Code',\n mdTplMath: 'Math Formulas (TeX)',\n mdTplMixed: 'Mixed Example',\n floatingDialog: 'Floating Dialog',\n layoutBlock: 'Block (Full Width)',\n layoutWrapLeft: 'Wrap Left',\n layoutWrapRight: 'Wrap Right',\n layoutFloat: 'Float (Overlay)',\n};\n"],"mappings":";AAqOA,IAAaA,IAAsC;CACjD,MAAM;CACN,QAAQ;CACR,WAAW;CACX,eAAe;CACf,WAAW;CACX,aAAa;CACb,SAAS;CACT,WAAW;CACX,aAAa;CACb,YAAY;CACZ,cAAc;CACd,YAAY;CACZ,aAAa;CACb,UAAU;CACV,YAAY;CACZ,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,eAAe;CACf,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,UAAU;CACV,cAAc;CACd,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,UAAU;CACV,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,gBAAgB;CAChB,cAAc;CACd,UAAU;CACV,YAAY;CACZ,UAAU;CACV,SAAS;CACT,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,sBAAsB;CACtB,qBAAqB;CACrB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,YAAY;CACZ,UAAU;CACV,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf,eAAe;CACf,YAAY;CACZ,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,WAAW;CACX,WAAW;CACX,YAAY;CACZ,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;AACf"}
@@ -0,0 +1,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
+ };
@@ -0,0 +1,52 @@
1
+ import { animateFace as e, samplePose as t } from "../shared/animation.js";
2
+ import { createMagicEffect as n } from "../shared/magicEffect.js";
3
+ import { createMollyLocomotion as r } from "./locomotion.js";
4
+ import * as i from "three";
5
+ //#region src/components/pro/Sprite/Molly/animations.ts
6
+ function a(a) {
7
+ let { body: o, head: s, front: c, back: l, tail: u } = a, d = r(a), f = n({
8
+ name: "starlight-magic",
9
+ palette: [
10
+ 16766330,
11
+ 16772532,
12
+ 12577535
13
+ ],
14
+ core: {
15
+ shape: "star",
16
+ growth: .17,
17
+ rotate: (e, t) => {
18
+ e.set(0, 0, Math.sin(t * 2) * .12);
19
+ }
20
+ },
21
+ haloColor: 16766843,
22
+ sparkSpeed: .8,
23
+ orbit: {
24
+ count: 2,
25
+ tube: .012,
26
+ arc: Math.PI * 2,
27
+ radius: .3,
28
+ spacing: .09,
29
+ opacity: .4,
30
+ rotate: (e, t, n) => {
31
+ e.set(1.05, n * .65, t * (n % 2 ? -.8 : .8) + n * .22);
32
+ }
33
+ }
34
+ });
35
+ return u.add(f.group), {
36
+ pose: (n) => {
37
+ let r = t(n), { t: p, happy: m, talk: h, comfort: g, curious: _, greet: v, bye: y, rise: b, sad: x, wave: S, phase: C, magic: w, beat: T } = r, E = i.MathUtils.clamp((C - .16) / .4, 0, 1), D = 2.08 * E * (1 - E), O = b * (C < .16 ? Math.sin(C / .16 * Math.PI) : C > .56 && C < .82 ? Math.sin((C - .56) / .26 * Math.PI) : 0) * .15, k = C > .12 && C < .28 ? b * Math.sin((C - .12) / .16 * Math.PI) * .1 : 0, A = b * Math.sin(E * Math.PI), j = b * Math.sin(Math.min(1, E / .68) * Math.PI), M = -b * .12 * Math.sin(E * Math.PI * 2);
38
+ o.scale.set(1 + O * .35 - k * .25, 1 - O + k, 1 + O * .35 - k * .25), o.position.y = m * (.045 + .045 * Math.sin(p * 10)) + b * D, o.rotation.set(M + v * .06 + w, -y * .65, m * .025 * T + g * .025 - v * .025 + y * .045), o.position.y += w ? .48 - (Math.cos(w) * .48 + Math.sin(w) * .3) : 0, o.position.z = w ? -.3 - (Math.sin(w) * .48 - Math.cos(w) * .3) : 0, s.rotation.set(g * .09 + h * .022 * Math.sin(p * 8) + v * .2 * Math.sin(C * Math.PI) + x * .24 - w * .7 - M * .4, _ * .18 + y * .28, _ * -.13 + g * .12 + m * .035 * T - y * .1), s.position.y = 1.8 + m * .025 * T - x * .045, s.position.z = .06;
39
+ for (let e = 0; e < 2; e++) {
40
+ let t = e ? 1 : -1;
41
+ c[e].position.set(t * .285, 1.03, .115), c[e].scale.set(1, 1, 1), c[e].rotation.set(-m * (.35 + t * .25 * T) - h * (.1 + .1 * Math.sin(p * 6 + e)) - _ * (e ? .02 : .24) - j * .8 - w * 2.08 - (e ? v * 1.05 : y * .3), 0, t * (m * .18 + g * .1 + A * .08 + w * .06) + (e ? v * .16 : -y * (1.72 + .28 * Math.sin(p * 14)))), l[e].position.set(t * .34, .47 + w * .12, -.12), l[e].scale.set(1, 1, 1), l[e].rotation.set(m * (t * .2 * T - .12) + A * .65 - w, 0, t * (m * .045 + A * .05));
42
+ }
43
+ if (r.run === 0) for (let e = 0; e < 4; e++) a.flexLeg(e, 0);
44
+ e(a, r, -.3, .25), a.shapeTail(Math.max(w, r.run)), u.rotation.set(-w + A * .22, m * .25 * T + _ * .12 + S * .16 * Math.sin(p * 7), m * .2 * Math.sin(p * 10) + g * .08 + x * -.4), w > 0 && a.groundFeet(), d(r), f.group.position.set(.49 - w * .35, .7 + w * .76, -.08 + w * .25), f.update(p, C, w), a.face.update();
45
+ },
46
+ dispose: f.dispose
47
+ };
48
+ }
49
+ //#endregion
50
+ export { a as createMollyAnimations };
51
+
52
+ //# sourceMappingURL=animations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.js","names":["THREE","createMollyAnimations","rig","locomotion","createMollyLocomotion","magicEffect","createMagicEffect","i","tail","state","samplePose","input","prowl","flight","phase","jumpHeight","compression","rise","extension","tuck","foreTuck","jumpPitch","body","happy","t","greet","bye","beat","comfort","head","talk","sad","curious","side","front","back","animateFace","wave"],"sources":["../../../../../src/components/pro/Sprite/Molly/animations.ts"],"sourcesContent":["import * as THREE from 'three';\nimport type { SpritePose } from '../types';\nimport type { MollyRig } from './rig';\nimport { createMollyLocomotion } from './locomotion';\nimport { animateFace, samplePose } from '../shared/animation';\nimport { createMagicEffect } from '../shared/magicEffect';\n\nexport function createMollyAnimations(rig: MollyRig) {\n const { body, head, front, back, tail } = rig;\n const locomotion = createMollyLocomotion(rig);\n const magicEffect = createMagicEffect({\n name: 'starlight-magic', palette: [0xffd57a, 0xffedb4, 0xbfeaff],\n core: { shape: 'star', growth: 0.17, rotate: (rotation, t) => { rotation.set(0, 0, Math.sin(t * 2) * 0.12); } },\n haloColor: 0xffd77b, sparkSpeed: 0.8,\n orbit: {\n count: 2, tube: 0.012, arc: Math.PI * 2, radius: 0.30, spacing: 0.09, opacity: 0.40,\n rotate: (rotation, t, i) => { rotation.set(1.05, i * 0.65, t * (i % 2 ? -0.8 : 0.8) + i * 0.22); },\n },\n });\n tail.add(magicEffect.group);\n\n const pose = (input: SpritePose) => {\n const state = samplePose(input);\n const { t, happy, talk, comfort, curious, greet, bye, rise, sad, wave, phase, magic: prowl, beat } = state;\n // 720 ms of flight over 0.52 model units: y = v0*t - g*t²/2, g ≈ 8.02 units/s².\n // No easing at the apex or touchdown: gravity keeps accelerating the fall until paw contact.\n const flight = THREE.MathUtils.clamp((phase - 0.16) / 0.40, 0, 1);\n const jumpHeight = 4 * 0.52 * flight * (1 - flight);\n const crouch = phase < 0.16 ? Math.sin(phase / 0.16 * Math.PI)\n : phase > 0.56 && phase < 0.82 ? Math.sin((phase - 0.56) / 0.26 * Math.PI) : 0;\n const compression = rise * crouch * 0.15;\n const extension = phase > 0.12 && phase < 0.28 ? rise * Math.sin((phase - 0.12) / 0.16 * Math.PI) * 0.10 : 0;\n const tuck = rise * Math.sin(flight * Math.PI);\n const foreTuck = rise * Math.sin(Math.min(1, flight / 0.68) * Math.PI);\n const jumpPitch = -rise * 0.12 * Math.sin(flight * Math.PI * 2);\n body.scale.set(1 + compression * 0.35 - extension * 0.25, 1 - compression + extension, 1 + compression * 0.35 - extension * 0.25);\n body.position.y = happy * (0.045 + 0.045 * Math.sin(t * 10)) + rise * jumpHeight;\n body.rotation.set(jumpPitch + greet * 0.06 + prowl, -bye * 0.65,\n happy * 0.025 * beat + comfort * 0.025 - greet * 0.025 + bye * 0.045);\n // Pitch around the seated rump, keeping the tail attachment and hind support in place.\n body.position.y += prowl ? 0.48 - (Math.cos(prowl) * 0.48 + Math.sin(prowl) * 0.30) : 0;\n body.position.z = prowl ? -0.30 - (Math.sin(prowl) * 0.48 - Math.cos(prowl) * 0.30) : 0;\n head.rotation.set(comfort * 0.09 + talk * 0.022 * Math.sin(t * 8) + greet * 0.20 * Math.sin(phase * Math.PI) + sad * 0.24 - prowl * 0.70 - jumpPitch * 0.4,\n curious * 0.18 + bye * 0.28,\n curious * -0.13 + comfort * 0.12 + happy * 0.035 * beat - bye * 0.10);\n head.position.y = 1.80 + happy * 0.025 * beat - sad * 0.045;\n head.position.z = 0.06;\n for (let i = 0; i < 2; i++) {\n const side = i ? 1 : -1;\n front[i].position.set(side * 0.285, 1.03, 0.115);\n front[i].scale.set(1, 1, 1);\n front[i].rotation.set(-happy * (0.35 + side * 0.25 * beat) - talk * (0.1 + 0.10 * Math.sin(t * 6 + i))\n - curious * (i ? 0.02 : 0.24) - foreTuck * 0.80 - prowl * 2.08 - (i ? greet * 1.05 : bye * 0.30),\n 0, side * (happy * 0.18 + comfort * 0.1 + tuck * 0.08 + prowl * 0.06)\n + (i ? greet * 0.16 : -bye * (1.72 + 0.28 * Math.sin(t * 14))));\n back[i].position.set(side * 0.34, 0.47 + prowl * 0.12, -0.12);\n back[i].scale.set(1, 1, 1);\n back[i].rotation.set(happy * (side * 0.2 * beat - 0.12) + tuck * 0.65 - prowl, 0, side * (happy * 0.045 + tuck * 0.05));\n }\n if (state.run === 0) for (let i = 0; i < 4; i++) rig.flexLeg(i, 0);\n animateFace(rig, state, -0.30, 0.25);\n rig.shapeTail(Math.max(prowl, state.run));\n tail.rotation.set(-prowl + tuck * 0.22, happy * 0.25 * beat + curious * 0.12 + wave * 0.16 * Math.sin(t * 7),\n happy * 0.2 * Math.sin(t * 10) + comfort * 0.08 + sad * -0.40);\n if (prowl > 0) rig.groundFeet();\n locomotion(state);\n magicEffect.group.position.set(0.49 - prowl * 0.35, 0.70 + prowl * 0.76, -0.08 + prowl * 0.25);\n magicEffect.update(t, phase, prowl);\n rig.face.update();\n };\n return { pose, dispose: magicEffect.dispose };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { SpriteCharacterEvents } from '../types';
2
+ export declare const mollyEvents: SpriteCharacterEvents;
@@ -0,0 +1,46 @@
1
+ import { SPRITE_ACTION_DURATIONS as e } from "../actions.js";
2
+ //#region src/components/pro/Sprite/Molly/events.ts
3
+ var t = {
4
+ zh: "喵~我是 Molly。来和我聊聊今天的好心情吧!",
5
+ en: "Meow! I’m Molly. Tell me about your day!"
6
+ }, n = {
7
+ greeting: t,
8
+ localReply(e, n) {
9
+ switch (e) {
10
+ case "greeting": return t[n];
11
+ case "comfort": return n === "zh" ? "喵~我陪你待一会儿,要不要说说发生了什么?" : "Purr… I can stay with you. Want to tell me what happened?";
12
+ case "thanks": return n === "zh" ? "不客气!能陪你聊天我很开心。" : "You’re welcome! I love chatting with you.";
13
+ case "identity": return n === "zh" ? "我是喜欢晒太阳的小猫咪 Molly!" : "I’m Molly, the sunshine-loving cat!";
14
+ case "default": return n === "zh" ? "喵~我听到了!接下来发生了什么?" : "Meow, I’m listening! What happened next?";
15
+ }
16
+ },
17
+ action(t) {
18
+ switch (t.type) {
19
+ case "greet": return {
20
+ mood: "greet",
21
+ duration: e.greet
22
+ };
23
+ case "turn": return {
24
+ mood: "curious",
25
+ duration: 580
26
+ };
27
+ case "message-pending": return {
28
+ mood: "talk",
29
+ duration: 700,
30
+ sustain: !0
31
+ };
32
+ case "message-replied": return {
33
+ mood: t.comfort ? "comfort" : "talk",
34
+ duration: 1100
35
+ };
36
+ case "message-failed": return {
37
+ mood: "comfort",
38
+ duration: 1100
39
+ };
40
+ }
41
+ }
42
+ };
43
+ //#endregion
44
+ export { n as mollyEvents };
45
+
46
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","names":["greeting","mollyEvents","intent","locale","event","SPRITE_ACTION_DURATIONS"],"sources":["../../../../../src/components/pro/Sprite/Molly/events.ts"],"sourcesContent":["import { SPRITE_ACTION_DURATIONS } from '../actions';\nimport type { SpriteCharacterEvents } from '../types';\n\nconst greeting: SpriteCharacterEvents['greeting'] = {\n zh: '喵~我是 Molly。来和我聊聊今天的好心情吧!',\n en: 'Meow! I’m Molly. Tell me about your day!',\n};\n\nexport const mollyEvents: SpriteCharacterEvents = {\n greeting,\n localReply(intent, locale) {\n switch (intent) {\n case 'greeting': return greeting[locale];\n case 'comfort': return locale === 'zh'\n ? '喵~我陪你待一会儿,要不要说说发生了什么?'\n : 'Purr… I can stay with you. Want to tell me what happened?';\n case 'thanks': return locale === 'zh'\n ? '不客气!能陪你聊天我很开心。'\n : 'You’re welcome! I love chatting with you.';\n case 'identity': return locale === 'zh'\n ? '我是喜欢晒太阳的小猫咪 Molly!'\n : 'I’m Molly, the sunshine-loving cat!';\n case 'default': return locale === 'zh'\n ? '喵~我听到了!接下来发生了什么?'\n : 'Meow, I’m listening! What happened next?';\n }\n },\n action(event) {\n switch (event.type) {\n case 'greet': return { mood: 'greet', duration: SPRITE_ACTION_DURATIONS.greet };\n case 'turn': return { mood: 'curious', duration: 580 };\n case 'message-pending': return { mood: 'talk', duration: 700, sustain: true };\n case 'message-replied': return { mood: event.comfort ? 'comfort' : 'talk', duration: 1100 };\n case 'message-failed': return { mood: 'comfort', duration: 1100 };\n }\n },\n};\n"],"mappings":";;AAGA,IAAMA,IAA8C;CAClD,IAAI;CACJ,IAAI;AACN,GAEaC,IAAqC;CAChD;CACA,WAAW,GAAQ,GAAQ;EACzB,QAAQC,GAAR;GACE,KAAK,YAAY,OAAOF,EAASG;GACjC,KAAK,WAAW,OAAOA,MAAW,OAC9B,0BACA;GACJ,KAAK,UAAU,OAAOA,MAAW,OAC7B,mBACA;GACJ,KAAK,YAAY,OAAOA,MAAW,OAC/B,uBACA;GACJ,KAAK,WAAW,OAAOA,MAAW,OAC9B,qBACA;EACN;CACF;CACA,OAAO,GAAO;EACZ,QAAQC,EAAM,MAAd;GACE,KAAK,SAAS,OAAO;IAAE,MAAM;IAAS,UAAUC,EAAwB;GAAM;GAC9E,KAAK,QAAQ,OAAO;IAAE,MAAM;IAAW,UAAU;GAAI;GACrD,KAAK,mBAAmB,OAAO;IAAE,MAAM;IAAQ,UAAU;IAAK,SAAS;GAAK;GAC5E,KAAK,mBAAmB,OAAO;IAAE,MAAMD,EAAM,UAAU,YAAY;IAAQ,UAAU;GAAK;GAC1F,KAAK,kBAAkB,OAAO;IAAE,MAAM;IAAW,UAAU;GAAK;EAClE;CACF;AACF"}
@@ -0,0 +1 @@
1
+ export declare function createMolly(): import("../types").SpriteScene;
@@ -0,0 +1,12 @@
1
+ import { assembleSprite as e } from "../shared/scene.js";
2
+ import { createMollyRig as t } from "./rig.js";
3
+ import { createMollyAnimations as n } from "./animations.js";
4
+ //#region src/components/pro/Sprite/Molly/index.ts
5
+ function r() {
6
+ let r = t();
7
+ return e(r, n(r));
8
+ }
9
+ //#endregion
10
+ export { r as createMolly };
11
+
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["createMolly","rig","createMollyRig","assembleSprite","createMollyAnimations"],"sources":["../../../../../src/components/pro/Sprite/Molly/index.ts"],"sourcesContent":["import { createMollyRig } from './rig';\nimport { createMollyAnimations } from './animations';\nimport { assembleSprite } from '../shared/scene';\n\nexport function createMolly() {\n const rig = createMollyRig();\n return assembleSprite(rig, createMollyAnimations(rig));\n}\n"],"mappings":";;;;AAIA,SAAgBA,IAAc;CAC5B,IAAMC,IAAMC,EAAe;CAC3B,OAAOC,EAAeF,GAAKG,EAAsBH,CAAG,CAAC;AACvD"}
@@ -0,0 +1,3 @@
1
+ import * as THREE from 'three';
2
+ /** Bend the existing continuous sculpt around an elbow/hock without opening seams. */
3
+ export declare function createMollyLegFlexion(front: THREE.Group[], back: THREE.Group[]): (index: number, bend: number, stance?: number) => void;