@docyrus/ui-pro-ai-assistant 0.0.1

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 (308) hide show
  1. package/dist/index.js +26161 -0
  2. package/dist/index.js.map +1 -0
  3. package/package.json +155 -0
  4. package/src/components/assistant-animations.tsx +29 -0
  5. package/src/components/assistant-dialogs.tsx +235 -0
  6. package/src/components/code-view.tsx +278 -0
  7. package/src/components/create-agent-task.tsx +104 -0
  8. package/src/components/create-new-work-version.tsx +30 -0
  9. package/src/components/extract-web.tsx +160 -0
  10. package/src/components/forward-to-agent.tsx +90 -0
  11. package/src/components/generate-chart.tsx +101 -0
  12. package/src/components/generative-action-button.tsx +122 -0
  13. package/src/components/generative-tool.tsx +685 -0
  14. package/src/components/generative-ui-object.tsx +210 -0
  15. package/src/components/input-area.tsx +1209 -0
  16. package/src/components/json-schema-layout.tsx +326 -0
  17. package/src/components/list-item-card.tsx +92 -0
  18. package/src/components/mermaid-diagram.tsx +192 -0
  19. package/src/components/preview-image.tsx +47 -0
  20. package/src/components/request-approval.tsx +48 -0
  21. package/src/components/request-user-input.tsx +270 -0
  22. package/src/components/search-web.tsx +319 -0
  23. package/src/components/sheet-command.tsx +88 -0
  24. package/src/components/shell-canvas.tsx +122 -0
  25. package/src/components/show-advanced-data-table.tsx +352 -0
  26. package/src/components/show-generated-content-options.tsx +93 -0
  27. package/src/components/show-people-cards.tsx +180 -0
  28. package/src/components/subagent-tool.tsx +180 -0
  29. package/src/components/text-editor-tool.tsx +328 -0
  30. package/src/components/work-canvas.tsx +88 -0
  31. package/src/components/work-card.tsx +42 -0
  32. package/src/declarations.d.ts +1 -0
  33. package/src/docy-assistant.tsx +1962 -0
  34. package/src/hooks/index.ts +7 -0
  35. package/src/hooks/use-assistant-api.ts +507 -0
  36. package/src/hooks/use-deployment-data.ts +162 -0
  37. package/src/hooks/use-project-state.ts +347 -0
  38. package/src/hooks/use-session-state.ts +207 -0
  39. package/src/hooks/use-speech-recognition.ts +137 -0
  40. package/src/hooks/use-ui-state.ts +185 -0
  41. package/src/hooks/use-works-state.ts +146 -0
  42. package/src/i18n/context.tsx +253 -0
  43. package/src/i18n/index.ts +19 -0
  44. package/src/i18n/locales/de.json +198 -0
  45. package/src/i18n/locales/el.json +198 -0
  46. package/src/i18n/locales/en.json +226 -0
  47. package/src/i18n/locales/es.json +198 -0
  48. package/src/i18n/locales/fr.json +198 -0
  49. package/src/i18n/locales/it.json +198 -0
  50. package/src/i18n/locales/pt.json +198 -0
  51. package/src/i18n/locales/sl.json +198 -0
  52. package/src/i18n/locales/tr.json +211 -0
  53. package/src/i18n/types.ts +23 -0
  54. package/src/i18n/use-translation.ts +17 -0
  55. package/src/index.ts +18 -0
  56. package/src/internal/plate-editor/editor/auth-context.ts +11 -0
  57. package/src/internal/plate-editor/editor/editor-base-kit.tsx +39 -0
  58. package/src/internal/plate-editor/editor/editor-kit.tsx +89 -0
  59. package/src/internal/plate-editor/editor/plate-editor.tsx +75 -0
  60. package/src/internal/plate-editor/editor/plate-types.ts +126 -0
  61. package/src/internal/plate-editor/editor/plugins/ai-kit.tsx +172 -0
  62. package/src/internal/plate-editor/editor/plugins/autoformat-kit.tsx +211 -0
  63. package/src/internal/plate-editor/editor/plugins/basic-blocks-base-kit.tsx +26 -0
  64. package/src/internal/plate-editor/editor/plugins/basic-blocks-kit.tsx +51 -0
  65. package/src/internal/plate-editor/editor/plugins/basic-marks-base-kit.tsx +24 -0
  66. package/src/internal/plate-editor/editor/plugins/basic-marks-kit.tsx +38 -0
  67. package/src/internal/plate-editor/editor/plugins/basic-nodes-kit.tsx +6 -0
  68. package/src/internal/plate-editor/editor/plugins/block-menu-kit.tsx +14 -0
  69. package/src/internal/plate-editor/editor/plugins/block-placeholder-kit.tsx +17 -0
  70. package/src/internal/plate-editor/editor/plugins/block-selection-kit.tsx +31 -0
  71. package/src/internal/plate-editor/editor/plugins/callout-base-kit.tsx +5 -0
  72. package/src/internal/plate-editor/editor/plugins/callout-kit.tsx +7 -0
  73. package/src/internal/plate-editor/editor/plugins/code-block-base-kit.tsx +23 -0
  74. package/src/internal/plate-editor/editor/plugins/code-block-kit.tsx +26 -0
  75. package/src/internal/plate-editor/editor/plugins/column-base-kit.tsx +8 -0
  76. package/src/internal/plate-editor/editor/plugins/column-kit.tsx +7 -0
  77. package/src/internal/plate-editor/editor/plugins/comment-base-kit.tsx +5 -0
  78. package/src/internal/plate-editor/editor/plugins/comment-kit.tsx +174 -0
  79. package/src/internal/plate-editor/editor/plugins/copilot-kit.tsx +68 -0
  80. package/src/internal/plate-editor/editor/plugins/cursor-overlay-kit.tsx +13 -0
  81. package/src/internal/plate-editor/editor/plugins/date-base-kit.tsx +5 -0
  82. package/src/internal/plate-editor/editor/plugins/date-kit.tsx +7 -0
  83. package/src/internal/plate-editor/editor/plugins/discussion-kit.tsx +36 -0
  84. package/src/internal/plate-editor/editor/plugins/dnd-kit.tsx +27 -0
  85. package/src/internal/plate-editor/editor/plugins/docx-export-kit.tsx +43 -0
  86. package/src/internal/plate-editor/editor/plugins/docx-kit.tsx +6 -0
  87. package/src/internal/plate-editor/editor/plugins/emoji-kit.tsx +15 -0
  88. package/src/internal/plate-editor/editor/plugins/exit-break-kit.tsx +12 -0
  89. package/src/internal/plate-editor/editor/plugins/floating-toolbar-kit.tsx +19 -0
  90. package/src/internal/plate-editor/editor/plugins/font-base-kit.tsx +36 -0
  91. package/src/internal/plate-editor/editor/plugins/font-kit.tsx +47 -0
  92. package/src/internal/plate-editor/editor/plugins/indent-base-kit.tsx +19 -0
  93. package/src/internal/plate-editor/editor/plugins/indent-kit.tsx +22 -0
  94. package/src/internal/plate-editor/editor/plugins/link-base-kit.tsx +5 -0
  95. package/src/internal/plate-editor/editor/plugins/link-kit.tsx +35 -0
  96. package/src/internal/plate-editor/editor/plugins/list-base-kit.tsx +24 -0
  97. package/src/internal/plate-editor/editor/plugins/list-kit.tsx +27 -0
  98. package/src/internal/plate-editor/editor/plugins/markdown-kit.tsx +18 -0
  99. package/src/internal/plate-editor/editor/plugins/math-base-kit.tsx +8 -0
  100. package/src/internal/plate-editor/editor/plugins/math-kit.tsx +10 -0
  101. package/src/internal/plate-editor/editor/plugins/media-base-kit.tsx +37 -0
  102. package/src/internal/plate-editor/editor/plugins/media-kit.tsx +53 -0
  103. package/src/internal/plate-editor/editor/plugins/mention-base-kit.tsx +5 -0
  104. package/src/internal/plate-editor/editor/plugins/mention-kit.tsx +36 -0
  105. package/src/internal/plate-editor/editor/plugins/slash-kit.tsx +17 -0
  106. package/src/internal/plate-editor/editor/plugins/suggestion-base-kit.tsx +5 -0
  107. package/src/internal/plate-editor/editor/plugins/suggestion-kit.tsx +95 -0
  108. package/src/internal/plate-editor/editor/plugins/table-base-kit.tsx +20 -0
  109. package/src/internal/plate-editor/editor/plugins/table-kit.tsx +22 -0
  110. package/src/internal/plate-editor/editor/plugins/toc-base-kit.tsx +5 -0
  111. package/src/internal/plate-editor/editor/plugins/toc-kit.tsx +14 -0
  112. package/src/internal/plate-editor/editor/plugins/toggle-base-kit.tsx +5 -0
  113. package/src/internal/plate-editor/editor/plugins/toggle-kit.tsx +9 -0
  114. package/src/internal/plate-editor/editor/transforms.ts +165 -0
  115. package/src/internal/plate-editor/editor/use-chat.ts +152 -0
  116. package/src/internal/plate-editor/hooks/index.ts +3 -0
  117. package/src/internal/plate-editor/hooks/use-copy-to-clipboard.ts +31 -0
  118. package/src/internal/plate-editor/hooks/use-is-touch-device.ts +26 -0
  119. package/src/internal/plate-editor/hooks/use-lock-scroll.ts +21 -0
  120. package/src/internal/plate-editor/hooks/use-media-query.ts +44 -0
  121. package/src/internal/plate-editor/hooks/use-mounted.ts +18 -0
  122. package/src/internal/plate-editor/hooks/use-on-click-outside.ts +114 -0
  123. package/src/internal/plate-editor/hooks/use-upload-file.ts +81 -0
  124. package/src/internal/plate-editor/i18n/context.tsx +58 -0
  125. package/src/internal/plate-editor/i18n/index.ts +3 -0
  126. package/src/internal/plate-editor/i18n/locales/de.json +57 -0
  127. package/src/internal/plate-editor/i18n/locales/el.json +57 -0
  128. package/src/internal/plate-editor/i18n/locales/en.json +57 -0
  129. package/src/internal/plate-editor/i18n/locales/es.json +57 -0
  130. package/src/internal/plate-editor/i18n/locales/fr.json +57 -0
  131. package/src/internal/plate-editor/i18n/locales/it.json +57 -0
  132. package/src/internal/plate-editor/i18n/locales/pt.json +57 -0
  133. package/src/internal/plate-editor/i18n/locales/sl.json +57 -0
  134. package/src/internal/plate-editor/i18n/locales/tr.json +57 -0
  135. package/src/internal/plate-editor/i18n/types.ts +59 -0
  136. package/src/internal/plate-editor/i18n/use-translation.ts +22 -0
  137. package/src/internal/plate-editor/index.ts +39 -0
  138. package/src/internal/plate-editor/lib/ai-output-converter.ts +153 -0
  139. package/src/internal/plate-editor/lib/download-file.ts +17 -0
  140. package/src/internal/plate-editor/plate-ui/ai-chat-editor.tsx +26 -0
  141. package/src/internal/plate-editor/plate-ui/ai-menu.tsx +828 -0
  142. package/src/internal/plate-editor/plate-ui/ai-node.tsx +41 -0
  143. package/src/internal/plate-editor/plate-ui/ai-toolbar-button.tsx +27 -0
  144. package/src/internal/plate-editor/plate-ui/alert-dialog.tsx +147 -0
  145. package/src/internal/plate-editor/plate-ui/align-toolbar-button.tsx +90 -0
  146. package/src/internal/plate-editor/plate-ui/avatar.tsx +3 -0
  147. package/src/internal/plate-editor/plate-ui/block-context-menu.tsx +106 -0
  148. package/src/internal/plate-editor/plate-ui/block-discussion.tsx +364 -0
  149. package/src/internal/plate-editor/plate-ui/block-draggable.tsx +556 -0
  150. package/src/internal/plate-editor/plate-ui/block-list-static.tsx +78 -0
  151. package/src/internal/plate-editor/plate-ui/block-list.tsx +85 -0
  152. package/src/internal/plate-editor/plate-ui/block-menu.tsx +557 -0
  153. package/src/internal/plate-editor/plate-ui/block-selection.tsx +47 -0
  154. package/src/internal/plate-editor/plate-ui/block-suggestion.tsx +469 -0
  155. package/src/internal/plate-editor/plate-ui/blockquote-node-static.tsx +10 -0
  156. package/src/internal/plate-editor/plate-ui/blockquote-node.tsx +11 -0
  157. package/src/internal/plate-editor/plate-ui/button.tsx +190 -0
  158. package/src/internal/plate-editor/plate-ui/calendar.tsx +3 -0
  159. package/src/internal/plate-editor/plate-ui/callout-node-static.tsx +76 -0
  160. package/src/internal/plate-editor/plate-ui/callout-node.tsx +54 -0
  161. package/src/internal/plate-editor/plate-ui/caption.tsx +48 -0
  162. package/src/internal/plate-editor/plate-ui/checkbox.tsx +3 -0
  163. package/src/internal/plate-editor/plate-ui/code-block-node-static.tsx +172 -0
  164. package/src/internal/plate-editor/plate-ui/code-block-node.tsx +228 -0
  165. package/src/internal/plate-editor/plate-ui/code-node-static.tsx +11 -0
  166. package/src/internal/plate-editor/plate-ui/code-node.tsx +12 -0
  167. package/src/internal/plate-editor/plate-ui/column-node-static.tsx +65 -0
  168. package/src/internal/plate-editor/plate-ui/column-node.tsx +24 -0
  169. package/src/internal/plate-editor/plate-ui/command.tsx +204 -0
  170. package/src/internal/plate-editor/plate-ui/comment-node-static.tsx +12 -0
  171. package/src/internal/plate-editor/plate-ui/comment-node.tsx +45 -0
  172. package/src/internal/plate-editor/plate-ui/comment-toolbar-button.tsx +24 -0
  173. package/src/internal/plate-editor/plate-ui/comment.tsx +619 -0
  174. package/src/internal/plate-editor/plate-ui/cursor-overlay.tsx +85 -0
  175. package/src/internal/plate-editor/plate-ui/date-node-static.tsx +43 -0
  176. package/src/internal/plate-editor/plate-ui/date-node.tsx +56 -0
  177. package/src/internal/plate-editor/plate-ui/dialog.tsx +426 -0
  178. package/src/internal/plate-editor/plate-ui/dropdown-menu.tsx +266 -0
  179. package/src/internal/plate-editor/plate-ui/editor-static.tsx +40 -0
  180. package/src/internal/plate-editor/plate-ui/editor.tsx +148 -0
  181. package/src/internal/plate-editor/plate-ui/emoji-node.tsx +48 -0
  182. package/src/internal/plate-editor/plate-ui/emoji-toolbar-button.tsx +626 -0
  183. package/src/internal/plate-editor/plate-ui/equation-node-static.tsx +155 -0
  184. package/src/internal/plate-editor/plate-ui/equation-node.tsx +226 -0
  185. package/src/internal/plate-editor/plate-ui/equation-toolbar-button.tsx +26 -0
  186. package/src/internal/plate-editor/plate-ui/export-toolbar-button.tsx +208 -0
  187. package/src/internal/plate-editor/plate-ui/fixed-toolbar-buttons.tsx +157 -0
  188. package/src/internal/plate-editor/plate-ui/fixed-toolbar.tsx +27 -0
  189. package/src/internal/plate-editor/plate-ui/floating-discussion.tsx +1129 -0
  190. package/src/internal/plate-editor/plate-ui/floating-toolbar-buttons.tsx +129 -0
  191. package/src/internal/plate-editor/plate-ui/floating-toolbar.tsx +99 -0
  192. package/src/internal/plate-editor/plate-ui/font-color-toolbar-button.tsx +211 -0
  193. package/src/internal/plate-editor/plate-ui/font-size-toolbar-button.tsx +154 -0
  194. package/src/internal/plate-editor/plate-ui/ghost-text.tsx +20 -0
  195. package/src/internal/plate-editor/plate-ui/heading-node-static.tsx +52 -0
  196. package/src/internal/plate-editor/plate-ui/heading-node.tsx +56 -0
  197. package/src/internal/plate-editor/plate-ui/highlight-node-static.tsx +9 -0
  198. package/src/internal/plate-editor/plate-ui/highlight-node.tsx +11 -0
  199. package/src/internal/plate-editor/plate-ui/history-toolbar-button.tsx +52 -0
  200. package/src/internal/plate-editor/plate-ui/hover-card.tsx +7 -0
  201. package/src/internal/plate-editor/plate-ui/hr-node-static.tsx +18 -0
  202. package/src/internal/plate-editor/plate-ui/hr-node.tsx +28 -0
  203. package/src/internal/plate-editor/plate-ui/import-toolbar-button.tsx +124 -0
  204. package/src/internal/plate-editor/plate-ui/indent-toolbar-button.tsx +34 -0
  205. package/src/internal/plate-editor/plate-ui/inline-combobox.tsx +409 -0
  206. package/src/internal/plate-editor/plate-ui/input.tsx +39 -0
  207. package/src/internal/plate-editor/plate-ui/insert-toolbar-button.tsx +260 -0
  208. package/src/internal/plate-editor/plate-ui/label.tsx +1 -0
  209. package/src/internal/plate-editor/plate-ui/line-height-toolbar-button.tsx +71 -0
  210. package/src/internal/plate-editor/plate-ui/link-node-static.tsx +15 -0
  211. package/src/internal/plate-editor/plate-ui/link-node.tsx +33 -0
  212. package/src/internal/plate-editor/plate-ui/link-toolbar-button.tsx +30 -0
  213. package/src/internal/plate-editor/plate-ui/link-toolbar.tsx +149 -0
  214. package/src/internal/plate-editor/plate-ui/list-toolbar-button.tsx +179 -0
  215. package/src/internal/plate-editor/plate-ui/mark-toolbar-button.tsx +36 -0
  216. package/src/internal/plate-editor/plate-ui/media-audio-node-static.tsx +21 -0
  217. package/src/internal/plate-editor/plate-ui/media-audio-node.tsx +32 -0
  218. package/src/internal/plate-editor/plate-ui/media-embed-node.tsx +103 -0
  219. package/src/internal/plate-editor/plate-ui/media-file-node-static.tsx +30 -0
  220. package/src/internal/plate-editor/plate-ui/media-file-node.tsx +52 -0
  221. package/src/internal/plate-editor/plate-ui/media-image-node-static.tsx +37 -0
  222. package/src/internal/plate-editor/plate-ui/media-image-node.tsx +183 -0
  223. package/src/internal/plate-editor/plate-ui/media-placeholder-node.tsx +441 -0
  224. package/src/internal/plate-editor/plate-ui/media-preview-dialog.tsx +127 -0
  225. package/src/internal/plate-editor/plate-ui/media-toolbar-button.tsx +229 -0
  226. package/src/internal/plate-editor/plate-ui/media-toolbar.tsx +216 -0
  227. package/src/internal/plate-editor/plate-ui/media-upload-toast.tsx +73 -0
  228. package/src/internal/plate-editor/plate-ui/media-video-node-static.tsx +35 -0
  229. package/src/internal/plate-editor/plate-ui/media-video-node.tsx +119 -0
  230. package/src/internal/plate-editor/plate-ui/mention-node-static.tsx +46 -0
  231. package/src/internal/plate-editor/plate-ui/mention-node.tsx +79 -0
  232. package/src/internal/plate-editor/plate-ui/menu.tsx +532 -0
  233. package/src/internal/plate-editor/plate-ui/mode-toolbar-button.tsx +126 -0
  234. package/src/internal/plate-editor/plate-ui/more-toolbar-button.tsx +34 -0
  235. package/src/internal/plate-editor/plate-ui/paragraph-node-static.tsx +15 -0
  236. package/src/internal/plate-editor/plate-ui/paragraph-node.tsx +16 -0
  237. package/src/internal/plate-editor/plate-ui/popover.tsx +77 -0
  238. package/src/internal/plate-editor/plate-ui/progress.tsx +1 -0
  239. package/src/internal/plate-editor/plate-ui/remote-cursor-overlay.tsx +81 -0
  240. package/src/internal/plate-editor/plate-ui/resize-handle.tsx +88 -0
  241. package/src/internal/plate-editor/plate-ui/separator.tsx +43 -0
  242. package/src/internal/plate-editor/plate-ui/slash-node.tsx +435 -0
  243. package/src/internal/plate-editor/plate-ui/spinner.tsx +1 -0
  244. package/src/internal/plate-editor/plate-ui/suggestion-node-static.tsx +35 -0
  245. package/src/internal/plate-editor/plate-ui/suggestion-node.tsx +168 -0
  246. package/src/internal/plate-editor/plate-ui/suggestion-toolbar-button.tsx +24 -0
  247. package/src/internal/plate-editor/plate-ui/table-node-static.tsx +85 -0
  248. package/src/internal/plate-editor/plate-ui/table-node.tsx +285 -0
  249. package/src/internal/plate-editor/plate-ui/table-toolbar-button.tsx +254 -0
  250. package/src/internal/plate-editor/plate-ui/tabs.tsx +3 -0
  251. package/src/internal/plate-editor/plate-ui/textarea.tsx +58 -0
  252. package/src/internal/plate-editor/plate-ui/toc-node-static.tsx +142 -0
  253. package/src/internal/plate-editor/plate-ui/toc-node.tsx +57 -0
  254. package/src/internal/plate-editor/plate-ui/toc-sidebar.tsx +50 -0
  255. package/src/internal/plate-editor/plate-ui/toggle-node-static.tsx +18 -0
  256. package/src/internal/plate-editor/plate-ui/toggle-node.tsx +33 -0
  257. package/src/internal/plate-editor/plate-ui/toggle-toolbar-button.tsx +26 -0
  258. package/src/internal/plate-editor/plate-ui/toggle.tsx +3 -0
  259. package/src/internal/plate-editor/plate-ui/toolbar.tsx +380 -0
  260. package/src/internal/plate-editor/plate-ui/tooltip.tsx +149 -0
  261. package/src/internal/plate-editor/plate-ui/turn-into-toolbar-button.tsx +177 -0
  262. package/src/internal/plate-editor/types/index.ts +22 -0
  263. package/src/internal/plate-editor/vite.ts +284 -0
  264. package/src/internal/sheets/components/univer-sheets.tsx +1104 -0
  265. package/src/internal/sheets/i18n/context.tsx +183 -0
  266. package/src/internal/sheets/i18n/index.ts +19 -0
  267. package/src/internal/sheets/i18n/locales/de.json +21 -0
  268. package/src/internal/sheets/i18n/locales/el.json +21 -0
  269. package/src/internal/sheets/i18n/locales/en.json +21 -0
  270. package/src/internal/sheets/i18n/locales/es.json +21 -0
  271. package/src/internal/sheets/i18n/locales/fr.json +21 -0
  272. package/src/internal/sheets/i18n/locales/it.json +21 -0
  273. package/src/internal/sheets/i18n/locales/pt.json +21 -0
  274. package/src/internal/sheets/i18n/locales/sl.json +21 -0
  275. package/src/internal/sheets/i18n/locales/tr.json +21 -0
  276. package/src/internal/sheets/i18n/types.ts +23 -0
  277. package/src/internal/sheets/i18n/use-translation.ts +17 -0
  278. package/src/internal/sheets/index.ts +14 -0
  279. package/src/internal/sheets/types/css.d.ts +11 -0
  280. package/src/internal/sheets/types/index.ts +260 -0
  281. package/src/internal/sheets/xlsx.ts +1169 -0
  282. package/src/lib/api-client.ts +77 -0
  283. package/src/lib/assistant-api-actions.ts +549 -0
  284. package/src/lib/assistant-config.tsx +71 -0
  285. package/src/lib/class-utils.ts +40 -0
  286. package/src/lib/index.ts +7 -0
  287. package/src/lib/message-utils.ts +131 -0
  288. package/src/tools/tools-schema.json +512 -0
  289. package/src/types/index.ts +235 -0
  290. package/src/views/assistant-view.tsx +1137 -0
  291. package/src/views/canvas-app.tsx +839 -0
  292. package/src/views/canvas-code.tsx +93 -0
  293. package/src/views/canvas-deep-research.tsx +44 -0
  294. package/src/views/canvas-image.tsx +25 -0
  295. package/src/views/canvas-record-view.tsx +285 -0
  296. package/src/views/canvas-spreadsheet.tsx +125 -0
  297. package/src/views/canvas-text.tsx +52 -0
  298. package/src/views/canvas.tsx +274 -0
  299. package/src/views/chat-panel.tsx +149 -0
  300. package/src/views/index.ts +20 -0
  301. package/src/views/memories-panel.tsx +365 -0
  302. package/src/views/message-list.tsx +370 -0
  303. package/src/views/project-detail.tsx +257 -0
  304. package/src/views/projects-panel.tsx +131 -0
  305. package/src/views/sessions-list.tsx +98 -0
  306. package/src/views/sidebar-content.tsx +256 -0
  307. package/src/views/work-detail.tsx +98 -0
  308. package/src/vite.ts +284 -0
@@ -0,0 +1,619 @@
1
+ 'use client';
2
+
3
+ import {
4
+ useCallback, useEffect, useMemo, useRef, useState, type Dispatch, type MouseEvent, type SetStateAction
5
+ } from 'react';
6
+
7
+ import { getCommentKey, getDraftCommentKey } from '@platejs/comment';
8
+ import { CommentPlugin, useCommentId } from '@platejs/comment/react';
9
+ import {
10
+ differenceInDays,
11
+ differenceInHours,
12
+ differenceInMinutes,
13
+ format
14
+ } from 'date-fns';
15
+ import {
16
+ ArrowUpIcon,
17
+ CheckIcon,
18
+ MoreHorizontalIcon,
19
+ PencilIcon,
20
+ TrashIcon,
21
+ XIcon
22
+ } from 'lucide-react';
23
+ import { NodeApi, nanoid, type Value } from 'platejs';
24
+ import {
25
+ type CreatePlateEditorOptions,
26
+ Plate,
27
+ useEditorPlugin,
28
+ useEditorRef,
29
+ usePlateEditor,
30
+ usePluginOption
31
+ } from 'platejs/react';
32
+
33
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
34
+
35
+ import { Avatar, AvatarFallback, AvatarImage } from '@docyrus/ui-pro-shared/avatar';
36
+
37
+ import { Button } from './button';
38
+ import {
39
+ DropdownMenu,
40
+ DropdownMenuContent,
41
+ DropdownMenuGroup,
42
+ DropdownMenuItem,
43
+ DropdownMenuTrigger
44
+ } from './dropdown-menu';
45
+ import { Editor, EditorContainer } from './editor';
46
+
47
+ import {
48
+ discussionPlugin,
49
+ type TDiscussion
50
+ } from '../editor/plugins/discussion-kit';
51
+ import { BasicMarksKit } from '../editor/plugins/basic-marks-kit';
52
+
53
+ export type TComment = {
54
+ id: string;
55
+ contentRich: Value;
56
+ createdAt: Date;
57
+ discussionId: string;
58
+ isEdited: boolean;
59
+ userId: string;
60
+ };
61
+
62
+ export function Comment(props: {
63
+ comment: TComment;
64
+ discussionLength: number;
65
+ editingId: string | null;
66
+ index: number;
67
+ setEditingId: Dispatch<SetStateAction<string | null>>;
68
+ documentContent?: string;
69
+ showDocumentContent?: boolean;
70
+ onEditorClick?: () => void;
71
+ }) {
72
+ const {
73
+ comment,
74
+ discussionLength,
75
+ documentContent,
76
+ editingId,
77
+ index,
78
+ setEditingId,
79
+ showDocumentContent = false,
80
+ onEditorClick
81
+ } = props;
82
+
83
+ const editor = useEditorRef();
84
+
85
+ const discussions = usePluginOption(discussionPlugin, 'discussions');
86
+ const userInfo = usePluginOption(discussionPlugin, 'user', comment.userId);
87
+ const currentUserId = usePluginOption(discussionPlugin, 'currentUserId');
88
+
89
+ const resolveDiscussion = (id: string) => {
90
+ const updatedDiscussions = discussions.map((discussion) => {
91
+ if (discussion.id === id) {
92
+ return { ...discussion, isResolved: true };
93
+ }
94
+
95
+ return discussion;
96
+ });
97
+
98
+ editor.setOption(discussionPlugin, 'discussions', updatedDiscussions);
99
+ };
100
+
101
+ const removeDiscussion = (id: string) => {
102
+ const updatedDiscussions = discussions.filter(
103
+ (discussion: any) => discussion.id !== id
104
+ );
105
+
106
+ editor.setOption(discussionPlugin, 'discussions', updatedDiscussions);
107
+ };
108
+
109
+ const updateComment = (input: {
110
+ id: string;
111
+ contentRich: any;
112
+ discussionId: string;
113
+ isEdited: boolean;
114
+ }) => {
115
+ const updatedDiscussions = discussions.map((discussion) => {
116
+ if (discussion.id === input.discussionId) {
117
+ const updatedComments = discussion.comments.map((comment) => {
118
+ if (comment.id === input.id) {
119
+ return {
120
+ ...comment,
121
+ contentRich: input.contentRich,
122
+ isEdited: true,
123
+ updatedAt: new Date()
124
+ };
125
+ }
126
+
127
+ return comment;
128
+ });
129
+
130
+ return { ...discussion, comments: updatedComments };
131
+ }
132
+
133
+ return discussion;
134
+ });
135
+
136
+ editor.setOption(discussionPlugin, 'discussions', updatedDiscussions);
137
+ };
138
+
139
+ const { tf } = useEditorPlugin(CommentPlugin);
140
+
141
+ // Replace to your own backend or refer to potion
142
+ const isMyComment = currentUserId === comment.userId;
143
+
144
+ const initialValue = comment.contentRich;
145
+
146
+ const commentEditor = useCommentEditor(
147
+ {
148
+ id: comment.id,
149
+ value: initialValue
150
+ },
151
+ [initialValue]
152
+ );
153
+
154
+ const onCancel = () => {
155
+ setEditingId(null);
156
+ commentEditor.tf.replaceNodes(initialValue, {
157
+ at: [],
158
+ children: true
159
+ });
160
+ };
161
+
162
+ const onSave = () => {
163
+ void updateComment({
164
+ id: comment.id,
165
+ contentRich: commentEditor.children,
166
+ discussionId: comment.discussionId,
167
+ isEdited: true
168
+ });
169
+ setEditingId(null);
170
+ };
171
+
172
+ const onResolveComment = () => {
173
+ void resolveDiscussion(comment.discussionId);
174
+ tf.comment.unsetMark({ id: comment.discussionId });
175
+ };
176
+
177
+ const isFirst = index === 0;
178
+ const isLast = index === discussionLength - 1;
179
+ const isEditing = editingId && editingId === comment.id;
180
+
181
+ const [hovering, setHovering] = useState(false);
182
+ const [dropdownOpen, setDropdownOpen] = useState(false);
183
+
184
+ return (
185
+ <div
186
+ onMouseEnter={() => setHovering(true)}
187
+ onMouseLeave={() => setHovering(false)}>
188
+ <div className="relative flex items-center">
189
+ {userInfo && (
190
+ <Avatar className="size-6">
191
+ <AvatarImage alt={userInfo.name} src={userInfo.avatarUrl} />
192
+ <AvatarFallback>{userInfo.name?.[0]}</AvatarFallback>
193
+ </Avatar>
194
+ )}
195
+ <h4 className="mx-2 font-semibold text-sm leading-none">
196
+ {/* Replace to your own backend or refer to potion */}
197
+ {userInfo?.name}
198
+ </h4>
199
+
200
+ <div className="text-muted-foreground/80 text-xs leading-none">
201
+ <span className="mr-1">
202
+ {formatCommentDate(new Date(comment.createdAt))}
203
+ </span>
204
+ {comment.isEdited && <span>(edited)</span>}
205
+ </div>
206
+
207
+ {isMyComment && (hovering || dropdownOpen) && (
208
+ <div className="absolute top-0 right-0 flex space-x-1">
209
+ {index === 0 && (
210
+ <Button
211
+ className="h-6 p-1 text-muted-foreground"
212
+ onClick={onResolveComment}
213
+ type="button"
214
+ variant="ghost">
215
+ <CheckIcon className="size-4" />
216
+ </Button>
217
+ )}
218
+
219
+ <CommentMoreDropdown
220
+ comment={comment}
221
+ dropdownOpen={dropdownOpen}
222
+ onCloseAutoFocus={() => {
223
+ setTimeout(() => {
224
+ commentEditor.tf.focus({ edge: 'endEditor' });
225
+ }, 0);
226
+ }}
227
+ onRemoveComment={() => {
228
+ if (discussionLength === 1) {
229
+ tf.comment.unsetMark({ id: comment.discussionId });
230
+ void removeDiscussion(comment.discussionId);
231
+ }
232
+ }}
233
+ setDropdownOpen={setDropdownOpen}
234
+ setEditingId={setEditingId} />
235
+ </div>
236
+ )}
237
+ </div>
238
+
239
+ {isFirst && showDocumentContent && (
240
+ <div className="relative mt-1 flex pl-[32px] text-sm text-subtle-foreground">
241
+ {discussionLength > 1 && (
242
+ <div className="absolute top-[5px] left-3 h-full w-0.5 shrink-0 bg-muted" />
243
+ )}
244
+ <div className="my-px w-0.5 shrink-0 bg-highlight" />
245
+ {documentContent && <div className="ml-2">{documentContent}</div>}
246
+ </div>
247
+ )}
248
+
249
+ <div className="relative my-1 pl-[26px]">
250
+ {!isLast && (
251
+ <div className="absolute top-0 left-3 h-full w-0.5 shrink-0 bg-muted" />
252
+ )}
253
+ <Plate editor={commentEditor} readOnly={!isEditing}>
254
+ <EditorContainer variant="comment">
255
+ <Editor
256
+ className="w-auto grow"
257
+ onClick={() => onEditorClick?.()}
258
+ variant="comment" />
259
+
260
+ {isEditing && (
261
+ <div className="ml-auto flex shrink-0 gap-1">
262
+ <Button
263
+ className="size-[28px]"
264
+ onClick={(e: MouseEvent<HTMLButtonElement>) => {
265
+ e.stopPropagation();
266
+ void onCancel();
267
+ }}
268
+ size="icon"
269
+ variant="ghost">
270
+ <div className="flex size-5 shrink-0 items-center justify-center rounded-[50%] bg-primary/40">
271
+ <XIcon className="!size-3 stroke-[3px] text-background" />
272
+ </div>
273
+ </Button>
274
+
275
+ <Button
276
+ onClick={(e: MouseEvent<HTMLButtonElement>) => {
277
+ e.stopPropagation();
278
+ void onSave();
279
+ }}
280
+ size="icon"
281
+ variant="ghost">
282
+ <div className="flex size-5 shrink-0 items-center justify-center rounded-[50%] bg-brand">
283
+ <CheckIcon className="!size-3 stroke-[3px] text-background" />
284
+ </div>
285
+ </Button>
286
+ </div>
287
+ )}
288
+ </EditorContainer>
289
+ </Plate>
290
+ </div>
291
+ </div>
292
+ );
293
+ }
294
+
295
+ function CommentMoreDropdown(props: {
296
+ comment: TComment;
297
+ dropdownOpen: boolean;
298
+ setDropdownOpen: Dispatch<SetStateAction<boolean>>;
299
+ setEditingId: Dispatch<SetStateAction<string | null>>;
300
+ onCloseAutoFocus?: () => void;
301
+ onRemoveComment?: () => void;
302
+ }) {
303
+ const {
304
+ comment,
305
+ dropdownOpen,
306
+ setDropdownOpen,
307
+ setEditingId,
308
+ onCloseAutoFocus,
309
+ onRemoveComment
310
+ } = props;
311
+
312
+ const discussions = usePluginOption(discussionPlugin, 'discussions');
313
+ const editor = useEditorRef();
314
+
315
+ const selectedEditCommentRef = useRef<boolean>(false);
316
+
317
+ const onDeleteComment = useCallback(() => {
318
+ if (!comment.id) return;
319
+
320
+ // Find and update the discussion
321
+ const updatedDiscussions = discussions.map((discussion: any) => {
322
+ if (discussion.id !== comment.discussionId) {
323
+ return discussion;
324
+ }
325
+
326
+ const commentIndex = discussion.comments.findIndex(
327
+ (c: any) => c.id === comment.id
328
+ );
329
+
330
+ if (commentIndex === -1) {
331
+ return discussion;
332
+ }
333
+
334
+ return {
335
+ ...discussion,
336
+ comments: [...discussion.comments.slice(0, commentIndex), ...discussion.comments.slice(commentIndex + 1)]
337
+ };
338
+ });
339
+
340
+ // Save back to session storage
341
+ editor.setOption(discussionPlugin, 'discussions', updatedDiscussions);
342
+ onRemoveComment?.();
343
+ }, [
344
+ comment.discussionId,
345
+ comment.id,
346
+ discussions,
347
+ editor,
348
+ onRemoveComment
349
+ ]);
350
+
351
+ const onEditComment = useCallback(() => {
352
+ selectedEditCommentRef.current = true;
353
+
354
+ if (!comment.id) return;
355
+
356
+ setEditingId(comment.id);
357
+ }, [comment.id, setEditingId]);
358
+
359
+ return (
360
+ <DropdownMenu
361
+ modal={false}
362
+ onOpenChange={setDropdownOpen}
363
+ open={dropdownOpen}>
364
+ <DropdownMenuTrigger asChild onClick={e => e.stopPropagation()}>
365
+ <Button className={cn('h-6 p-1 text-muted-foreground')} variant="ghost">
366
+ <MoreHorizontalIcon className="size-4" />
367
+ </Button>
368
+ </DropdownMenuTrigger>
369
+ <DropdownMenuContent
370
+ className="w-48"
371
+ onCloseAutoFocus={(e) => {
372
+ if (selectedEditCommentRef.current) {
373
+ onCloseAutoFocus?.();
374
+ selectedEditCommentRef.current = false;
375
+ }
376
+
377
+ return e.preventDefault();
378
+ }}>
379
+ <DropdownMenuGroup>
380
+ <DropdownMenuItem onClick={onEditComment}>
381
+ <PencilIcon className="size-4" />
382
+ Edit comment
383
+ </DropdownMenuItem>
384
+ <DropdownMenuItem onClick={onDeleteComment}>
385
+ <TrashIcon className="size-4" />
386
+ Delete comment
387
+ </DropdownMenuItem>
388
+ </DropdownMenuGroup>
389
+ </DropdownMenuContent>
390
+ </DropdownMenu>
391
+ );
392
+ }
393
+
394
+ export const useCommentEditor = (
395
+ options: Omit<CreatePlateEditorOptions, 'plugins'> = {},
396
+ deps: any[] = []
397
+ ) => {
398
+ const commentEditor = usePlateEditor(
399
+ {
400
+ id: 'comment',
401
+ plugins: BasicMarksKit,
402
+ value: [],
403
+ ...options
404
+ },
405
+ deps
406
+ );
407
+
408
+ return commentEditor;
409
+ };
410
+
411
+ export function CommentCreateForm({
412
+ autoFocus = false,
413
+ className,
414
+ discussionId: discussionIdProp,
415
+ focusOnMount = false
416
+ }: {
417
+ autoFocus?: boolean;
418
+ className?: string;
419
+ discussionId?: string;
420
+ focusOnMount?: boolean;
421
+ }) {
422
+ const discussions = usePluginOption(discussionPlugin, 'discussions');
423
+
424
+ const editor = useEditorRef();
425
+ const commentId = useCommentId();
426
+ const discussionId = discussionIdProp ?? commentId;
427
+
428
+ const userInfo = usePluginOption(discussionPlugin, 'currentUser');
429
+ const [commentValue, setCommentValue] = useState<Value | undefined>();
430
+ const commentContent = useMemo(
431
+ () => commentValue ? NodeApi.string({ children: commentValue as any, type: 'p' }) : '',
432
+ [commentValue]
433
+ );
434
+ const commentEditor = useCommentEditor();
435
+
436
+ useEffect(() => {
437
+ if (commentEditor && focusOnMount) {
438
+ commentEditor.tf.focus();
439
+ }
440
+ }, [commentEditor, focusOnMount]);
441
+
442
+ const onAddComment = useCallback(() => {
443
+ if (!commentValue) return;
444
+
445
+ commentEditor.tf.reset();
446
+
447
+ if (discussionId) {
448
+ // Get existing discussion
449
+ const discussion = discussions.find((d: any) => d.id === discussionId);
450
+
451
+ if (!discussion) {
452
+ // Mock creating suggestion
453
+ const newDiscussion: TDiscussion = {
454
+ id: discussionId,
455
+ comments: [
456
+ {
457
+ id: nanoid(),
458
+ contentRich: commentValue,
459
+ createdAt: new Date(),
460
+ discussionId,
461
+ isEdited: false,
462
+ userId: editor.getOption(discussionPlugin, 'currentUserId')
463
+ }
464
+ ],
465
+ createdAt: new Date(),
466
+ isResolved: false,
467
+ userId: editor.getOption(discussionPlugin, 'currentUserId')
468
+ };
469
+
470
+ editor.setOption(discussionPlugin, 'discussions', [...discussions, newDiscussion]);
471
+
472
+ return;
473
+ }
474
+
475
+ // Create reply comment
476
+ const comment: TComment = {
477
+ id: nanoid(),
478
+ contentRich: commentValue,
479
+ createdAt: new Date(),
480
+ discussionId,
481
+ isEdited: false,
482
+ userId: editor.getOption(discussionPlugin, 'currentUserId')
483
+ };
484
+
485
+ // Add reply to discussion comments
486
+ const updatedDiscussion = {
487
+ ...discussion,
488
+ comments: [...discussion.comments, comment]
489
+ };
490
+
491
+ // Filter out old discussion and add updated one
492
+ const updatedDiscussions = discussions
493
+ .filter((d: any) => d.id !== discussionId)
494
+ .concat(updatedDiscussion);
495
+
496
+ editor.setOption(discussionPlugin, 'discussions', updatedDiscussions);
497
+
498
+ return;
499
+ }
500
+
501
+ const commentsNodeEntry = editor
502
+ .getApi(CommentPlugin)
503
+ .comment.nodes({ at: [], isDraft: true });
504
+
505
+ if (commentsNodeEntry.length === 0) return;
506
+
507
+ const documentContent = commentsNodeEntry
508
+ .map(([node]) => node.text)
509
+ .join('');
510
+
511
+ const _discussionId = nanoid();
512
+ // Mock creating new discussion
513
+ const newDiscussion: TDiscussion = {
514
+ id: _discussionId,
515
+ comments: [
516
+ {
517
+ id: nanoid(),
518
+ contentRich: commentValue,
519
+ createdAt: new Date(),
520
+ discussionId: _discussionId,
521
+ isEdited: false,
522
+ userId: editor.getOption(discussionPlugin, 'currentUserId')
523
+ }
524
+ ],
525
+ createdAt: new Date(),
526
+ documentContent,
527
+ isResolved: false,
528
+ userId: editor.getOption(discussionPlugin, 'currentUserId')
529
+ };
530
+
531
+ editor.setOption(discussionPlugin, 'discussions', [...discussions, newDiscussion]);
532
+
533
+ const { id } = newDiscussion;
534
+
535
+ commentsNodeEntry.forEach(([_, path]) => {
536
+ editor.tf.setNodes(
537
+ {
538
+ [getCommentKey(id)]: true
539
+ },
540
+ { at: path, split: true }
541
+ );
542
+ editor.tf.unsetNodes([getDraftCommentKey()], { at: path });
543
+ });
544
+ }, [
545
+ commentValue,
546
+ commentEditor.tf,
547
+ discussionId,
548
+ editor,
549
+ discussions
550
+ ]);
551
+
552
+ return (
553
+ <div className={cn('flex w-full', className)}>
554
+ <div className="mt-1 mr-1 shrink-0">
555
+ {/* Replace to your own backend or refer to potion */}
556
+ <Avatar className="size-5">
557
+ <AvatarImage alt={userInfo?.name} src={userInfo?.avatarUrl} />
558
+ <AvatarFallback>{userInfo?.name?.[0]}</AvatarFallback>
559
+ </Avatar>
560
+ </div>
561
+
562
+ <div className="relative flex grow gap-2">
563
+ <Plate
564
+ editor={commentEditor}
565
+ onChange={({ value }) => {
566
+ setCommentValue(value);
567
+ }}>
568
+ <EditorContainer variant="comment">
569
+ <Editor
570
+ autoComplete="off"
571
+ autoFocus={autoFocus}
572
+ className="min-h-[25px] grow pt-0.5 pr-8"
573
+ onKeyDown={(e) => {
574
+ if (e.key === 'Enter' && !e.shiftKey) {
575
+ e.preventDefault();
576
+ void onAddComment();
577
+ }
578
+ }}
579
+ placeholder="Reply..."
580
+ variant="comment" />
581
+
582
+ <Button
583
+ className="absolute right-0 bottom-0 ml-auto shrink-0"
584
+ disabled={commentContent.trim().length === 0}
585
+ onClick={(e) => {
586
+ e.stopPropagation();
587
+ void onAddComment();
588
+ }}
589
+ size="icon"
590
+ variant="ghost">
591
+ <div className="flex size-6 items-center justify-center rounded-full">
592
+ <ArrowUpIcon />
593
+ </div>
594
+ </Button>
595
+ </EditorContainer>
596
+ </Plate>
597
+ </div>
598
+ </div>
599
+ );
600
+ }
601
+
602
+ export const formatCommentDate = (date: Date) => {
603
+ const now = new Date();
604
+ const diffMinutes = differenceInMinutes(now, date);
605
+ const diffHours = differenceInHours(now, date);
606
+ const diffDays = differenceInDays(now, date);
607
+
608
+ if (diffMinutes < 60) {
609
+ return `${diffMinutes}m`;
610
+ }
611
+ if (diffHours < 24) {
612
+ return `${diffHours}h`;
613
+ }
614
+ if (diffDays < 2) {
615
+ return `${diffDays}d`;
616
+ }
617
+
618
+ return format(date, 'MM/dd/yyyy');
619
+ };
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+
3
+ import { AIChatPlugin } from '@platejs/ai/react';
4
+ import {
5
+ type CursorData,
6
+ type CursorOverlayState,
7
+ useCursorOverlay
8
+ } from '@platejs/selection/react';
9
+ import { getTableGridAbove } from '@platejs/table';
10
+ import { RangeApi } from 'platejs';
11
+ import { useEditorRef, usePluginOption } from 'platejs/react';
12
+
13
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
14
+
15
+ const OVERLAY_ID = '__plate_cursor_overlay__';
16
+
17
+ // TODO:Move to core
18
+ export const getCursorOverlayElement = () => document.querySelector(`#${OVERLAY_ID}`);
19
+
20
+ export function Cursor({
21
+ id,
22
+ caretPosition,
23
+ data,
24
+ selection,
25
+ selectionRects
26
+ }: CursorOverlayState<CursorData>) {
27
+ const editor = useEditorRef();
28
+ const streaming = usePluginOption(AIChatPlugin, 'streaming');
29
+ const { style, selectionStyle = style } = data ?? ({} as CursorData);
30
+ const isCursor = RangeApi.isCollapsed(selection);
31
+
32
+ if (streaming) return null;
33
+
34
+ // Skip overlay for multi-cell table selection (table has its own selection UI)
35
+ if (id === 'selection' && selection) {
36
+ const cellEntries = getTableGridAbove(editor, {
37
+ at: selection,
38
+ format: 'cell'
39
+ });
40
+
41
+ if (cellEntries.length > 1) {
42
+ return null;
43
+ }
44
+ }
45
+
46
+ return (
47
+ <>
48
+ {selectionRects.map((position, i) => (
49
+ <div
50
+ className={cn(
51
+ 'pointer-events-none absolute z-10',
52
+ id === 'selection' && 'bg-brand/25',
53
+ id === 'selection' && isCursor && 'bg-primary'
54
+ )}
55
+ id={OVERLAY_ID}
56
+ key={i}
57
+ style={{
58
+ ...selectionStyle,
59
+ ...position
60
+ }} />
61
+ ))}
62
+ {caretPosition && (
63
+ <div
64
+ className={cn(
65
+ 'pointer-events-none absolute z-10 w-0.5',
66
+ id === 'drag' && 'w-px bg-brand'
67
+ )}
68
+ id={OVERLAY_ID}
69
+ style={{ ...caretPosition, ...style }} />
70
+ )}
71
+ </>
72
+ );
73
+ }
74
+
75
+ export function CursorOverlay() {
76
+ const { cursors } = useCursorOverlay();
77
+
78
+ return (
79
+ <>
80
+ {cursors.map(cursor => (
81
+ <Cursor key={cursor.id} {...cursor} />
82
+ ))}
83
+ </>
84
+ );
85
+ }