@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,409 @@
1
+ 'use client';
2
+
3
+ import {
4
+ createContext, startTransition, use, useCallback, useEffect, useMemo, useRef, useState, type ComponentProps, type HTMLAttributes, type ReactNode, type RefObject
5
+ } from 'react';
6
+
7
+ import { type Point, type TElement } from 'platejs';
8
+
9
+ import { filterWords } from '@platejs/combobox';
10
+ import {
11
+ type UseComboboxInputResult,
12
+ useComboboxInput,
13
+ useHTMLInputCursorState
14
+ } from '@platejs/combobox/react';
15
+ import { cva, type VariantProps } from 'class-variance-authority';
16
+ import { useComposedRef, useEditorRef } from 'platejs/react';
17
+
18
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
19
+
20
+ import { Ariakit } from './menu';
21
+
22
+ type FilterFn = (
23
+ item: {
24
+ value: string; group?: string; keywords?: string[]; label?: string;
25
+ },
26
+ search: string
27
+ ) => boolean;
28
+
29
+ type InlineComboboxContextValue = {
30
+ filter: FilterFn | false;
31
+ inputProps: UseComboboxInputResult['props'];
32
+ inputRef: RefObject<HTMLInputElement | null>;
33
+ removeInput: UseComboboxInputResult['removeInput'];
34
+ showTrigger: boolean;
35
+ trigger: string;
36
+ setHasEmpty: (hasEmpty: boolean) => void;
37
+ };
38
+
39
+ const InlineComboboxContext = createContext<InlineComboboxContextValue>(
40
+ null as any
41
+ );
42
+
43
+ const defaultFilter: FilterFn = (
44
+ {
45
+ group, keywords = [], label, value
46
+ },
47
+ search
48
+ ) => {
49
+ const uniqueTerms = new Set(
50
+ [
51
+ value,
52
+ ...keywords,
53
+ group,
54
+ label
55
+ ].filter(Boolean)
56
+ );
57
+
58
+ return Array.from(uniqueTerms).some(keyword => filterWords(keyword!, search));
59
+ };
60
+
61
+ type InlineComboboxProps = {
62
+ children: ReactNode;
63
+ element: TElement;
64
+ trigger: string;
65
+ filter?: FilterFn | false;
66
+ hideWhenNoValue?: boolean;
67
+ showTrigger?: boolean;
68
+ value?: string;
69
+ setValue?: (value: string) => void;
70
+ };
71
+
72
+ function InlineCombobox({
73
+ children,
74
+ element,
75
+ filter = defaultFilter,
76
+ hideWhenNoValue = false,
77
+ setValue: setValueProp,
78
+ showTrigger = true,
79
+ trigger,
80
+ value: valueProp
81
+ }: InlineComboboxProps) {
82
+ const editor = useEditorRef();
83
+ const inputRef = useRef<HTMLInputElement>(null);
84
+ const cursorState = useHTMLInputCursorState(inputRef);
85
+
86
+ const [valueState, setValueState] = useState('');
87
+ const hasValueProp = valueProp !== undefined;
88
+ const value = hasValueProp ? valueProp : valueState;
89
+
90
+ // Check if current user is the creator of this element (for Yjs collaboration)
91
+ const isCreator = useMemo(() => {
92
+ const elementUserId = (element as any).userId;
93
+ const currentUserId = editor.meta.userId;
94
+
95
+ // If no userId (backwards compatibility or non-Yjs), allow
96
+ if (!elementUserId) return true;
97
+
98
+ return elementUserId === currentUserId;
99
+ }, [editor, element]);
100
+
101
+ const setValue = useCallback(
102
+ (newValue: string) => {
103
+ setValueProp?.(newValue);
104
+
105
+ if (!hasValueProp) {
106
+ setValueState(newValue);
107
+ }
108
+ },
109
+ [setValueProp, hasValueProp]
110
+ );
111
+
112
+ const insertPoint = useRef<Point | null>(null);
113
+
114
+ useEffect(() => {
115
+ const path = editor.api.findPath(element);
116
+
117
+ if (!path) return;
118
+
119
+ const point = editor.api.before(path);
120
+
121
+ if (!point) return;
122
+
123
+ const pointRef = editor.api.pointRef(point);
124
+
125
+ insertPoint.current = pointRef.current;
126
+
127
+ return () => {
128
+ pointRef.unref();
129
+ };
130
+ }, [editor, element]);
131
+
132
+ const { props: inputProps, removeInput } = useComboboxInput({
133
+ cancelInputOnBlur: false,
134
+ cursorState,
135
+ autoFocus: isCreator,
136
+ ref: inputRef,
137
+ onCancelInput: (cause) => {
138
+ if (cause !== 'backspace') {
139
+ editor.tf.insertText(trigger + value, {
140
+ at: insertPoint?.current ?? undefined
141
+ });
142
+ }
143
+ if (cause === 'arrowLeft' || cause === 'arrowRight') {
144
+ editor.tf.move({
145
+ distance: 1,
146
+ reverse: cause === 'arrowLeft'
147
+ });
148
+ }
149
+ }
150
+ });
151
+
152
+ const [hasEmpty, setHasEmpty] = useState(false);
153
+
154
+ const contextValue: InlineComboboxContextValue = useMemo(
155
+ () => ({
156
+ filter,
157
+ inputProps,
158
+ inputRef,
159
+ removeInput,
160
+ setHasEmpty,
161
+ showTrigger,
162
+ trigger
163
+ }),
164
+ [
165
+ trigger,
166
+ showTrigger,
167
+ filter,
168
+ inputRef,
169
+ inputProps,
170
+ removeInput,
171
+ setHasEmpty
172
+ ]
173
+ );
174
+
175
+ const store = Ariakit.useComboboxStore({
176
+ setValue: newValue => startTransition(() => setValue(newValue))
177
+ });
178
+
179
+ const items = store.useState('items');
180
+
181
+ return (
182
+ <span contentEditable={false}>
183
+ <Ariakit.ComboboxProvider
184
+ open={
185
+ isCreator
186
+ && (items.length > 0 || hasEmpty)
187
+ && (!hideWhenNoValue || value.length > 0)
188
+ }
189
+ store={store}>
190
+ <InlineComboboxContext value={contextValue}>
191
+ {children}
192
+ </InlineComboboxContext>
193
+ </Ariakit.ComboboxProvider>
194
+ </span>
195
+ );
196
+ }
197
+
198
+ function InlineComboboxInput({
199
+ className,
200
+ ref: refProp,
201
+ ...props
202
+ }: ComponentProps<'input'>) {
203
+ const {
204
+ inputProps,
205
+ inputRef: contextRef,
206
+ showTrigger,
207
+ trigger
208
+ } = use(InlineComboboxContext);
209
+
210
+ const store = Ariakit.useComboboxContext()!;
211
+ const value = store.useState('value');
212
+
213
+ const ref = useComposedRef(refProp, contextRef);
214
+
215
+ return (
216
+ <>
217
+ {showTrigger && trigger}
218
+
219
+ <span className="relative min-h-[1lh]">
220
+ <span
221
+ aria-hidden="true"
222
+ className="invisible overflow-hidden text-nowrap">
223
+ {value || props.placeholder || '\u200B'}
224
+ </span>
225
+
226
+ <Ariakit.Combobox
227
+ autoSelect
228
+ className={cn(
229
+ 'absolute top-0 left-0 size-full bg-transparent outline-hidden',
230
+ className
231
+ )}
232
+ ref={ref}
233
+ value={value}
234
+ {...inputProps}
235
+ {...props} />
236
+ </span>
237
+ </>
238
+ );
239
+ }
240
+
241
+ const comboboxVariants = cva(
242
+ 'z-500 mt-1 h-full max-h-[40vh] min-w-[180px] max-w-[calc(100vw-24px)] animate-popover overflow-y-auto rounded-lg bg-popover shadow-floating',
243
+ {
244
+ defaultVariants: {
245
+ variant: 'default'
246
+ },
247
+ variants: {
248
+ variant: {
249
+ default: '',
250
+ emoji: 'max-h-[270px] w-[408px]',
251
+ mention: 'w-[300px]',
252
+ slash: 'w-[320px]'
253
+ }
254
+ }
255
+ }
256
+ );
257
+
258
+ const comboboxItemVariants = cva(
259
+ 'relative mx-1 flex select-none items-center rounded-sm px-2 py-1 text-foreground text-sm outline-hidden transition-bg-ease [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
260
+ {
261
+ defaultVariants: {
262
+ interactive: true
263
+ },
264
+ variants: {
265
+ interactive: {
266
+ false: '',
267
+ true: 'cursor-pointer hover:bg-accent hover:text-accent-foreground data-[active-item=true]:bg-accent data-[active-item=true]:text-accent-foreground'
268
+ }
269
+ }
270
+ }
271
+ );
272
+
273
+ function InlineComboboxContent({
274
+ className,
275
+ variant,
276
+ ...props
277
+ }: ComponentProps<typeof Ariakit.ComboboxPopover>
278
+ & VariantProps<typeof comboboxVariants>) {
279
+ return (
280
+ <Ariakit.Portal>
281
+ <Ariakit.ComboboxPopover
282
+ className={cn(comboboxVariants({ variant }), className)}
283
+ {...props}>
284
+ {props.children}
285
+ </Ariakit.ComboboxPopover>
286
+ </Ariakit.Portal>
287
+ );
288
+ }
289
+
290
+ function InlineComboboxItem({
291
+ className,
292
+ focusEditor = true,
293
+ group,
294
+ keywords,
295
+ label,
296
+ onClick,
297
+ ...props
298
+ }: {
299
+ focusEditor?: boolean;
300
+ group?: string;
301
+ keywords?: string[];
302
+ label?: string;
303
+ } & Ariakit.ComboboxItemProps
304
+ & Required<Pick<Ariakit.ComboboxItemProps, 'value'>>) {
305
+ const { value } = props;
306
+
307
+ const { filter, removeInput } = use(InlineComboboxContext);
308
+
309
+ const store = Ariakit.useComboboxContext()!;
310
+
311
+ const search = filter && store.useState('value');
312
+
313
+ const visible = useMemo(
314
+ () => !filter || filter({
315
+ group, keywords, label, value
316
+ }, search as string),
317
+ [
318
+ filter,
319
+ group,
320
+ keywords,
321
+ value,
322
+ label,
323
+ search
324
+ ]
325
+ );
326
+
327
+ if (!visible) return null;
328
+
329
+ return (
330
+ <Ariakit.ComboboxItem
331
+ className={cn(comboboxItemVariants(), className)}
332
+ onClick={(event) => {
333
+ removeInput(focusEditor);
334
+ onClick?.(event);
335
+ }}
336
+ {...props} />
337
+ );
338
+ }
339
+
340
+ function InlineComboboxEmpty({
341
+ children,
342
+ className
343
+ }: HTMLAttributes<HTMLDivElement>) {
344
+ const { setHasEmpty } = use(InlineComboboxContext);
345
+ const store = Ariakit.useComboboxContext()!;
346
+ const items = store.useState('items');
347
+
348
+ useEffect(() => {
349
+ setHasEmpty(true);
350
+
351
+ return () => {
352
+ setHasEmpty(false);
353
+ };
354
+ }, [setHasEmpty]);
355
+
356
+ if (items.length > 0) return null;
357
+
358
+ return (
359
+ <div
360
+ className={cn(
361
+ comboboxItemVariants({ interactive: false }),
362
+ 'my-1.5 text-muted-foreground',
363
+ className
364
+ )}>
365
+ {children}
366
+ </div>
367
+ );
368
+ }
369
+
370
+ function InlineComboboxGroup({
371
+ className,
372
+ ...props
373
+ }: ComponentProps<typeof Ariakit.ComboboxGroup>) {
374
+ return (
375
+ <Ariakit.ComboboxGroup
376
+ className={cn(
377
+ 'hidden not-last:border-b py-1.5 [&:has([role=option])]:block',
378
+ className
379
+ )}
380
+ {...props} />
381
+ );
382
+ }
383
+
384
+ function InlineComboboxGroupLabel({
385
+ className,
386
+ ...props
387
+ }: ComponentProps<typeof Ariakit.ComboboxGroupLabel>) {
388
+ return (
389
+ <Ariakit.ComboboxGroupLabel
390
+ className={cn(
391
+ 'mt-1.5 mb-2 px-3 font-medium text-muted-foreground text-xs',
392
+ className
393
+ )}
394
+ {...props} />
395
+ );
396
+ }
397
+
398
+ const InlineComboboxRow = Ariakit.ComboboxRow;
399
+
400
+ export {
401
+ InlineCombobox,
402
+ InlineComboboxContent,
403
+ InlineComboboxEmpty,
404
+ InlineComboboxGroup,
405
+ InlineComboboxGroupLabel,
406
+ InlineComboboxInput,
407
+ InlineComboboxItem,
408
+ InlineComboboxRow
409
+ };
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+
3
+ import { type ComponentProps } from 'react';
4
+
5
+ import * as React from 'react';
6
+
7
+ import { cva, type VariantProps } from 'class-variance-authority';
8
+
9
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
10
+
11
+ export const inputVariants = cva(
12
+ cn(
13
+ 'flex w-full rounded-md text-base outline-hidden file:border-0 file:bg-transparent file:font-medium file:text-sm disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
14
+ 'h-[28px] border-[1.5px] border-input bg-muted/80 px-1.5 placeholder:text-muted-foreground/80',
15
+ 'read-only:ring-0 read-only:focus:border-input'
16
+ ),
17
+ {
18
+ defaultVariants: {
19
+ variant: 'default'
20
+ },
21
+ variants: {
22
+ variant: {
23
+ default: 'focus:border-brand/50 focus:ring-2 focus:ring-brand/30',
24
+ flat: '',
25
+ link: 'border-none bg-transparent',
26
+ search: 'border-none bg-transparent text-lg'
27
+ }
28
+ }
29
+ }
30
+ );
31
+
32
+ export type InputProps = ComponentProps<'input'>
33
+ & VariantProps<typeof inputVariants>;
34
+
35
+ export function Input({ className, variant, ...props }: InputProps) {
36
+ return (
37
+ <input className={cn(inputVariants({ variant }), className)} {...props} />
38
+ );
39
+ }
@@ -0,0 +1,260 @@
1
+ 'use client';
2
+
3
+ import { useState, type ReactNode } from 'react';
4
+
5
+ import * as React from 'react';
6
+
7
+ import {
8
+ CalendarIcon,
9
+ ChevronRightIcon,
10
+ Columns3Icon,
11
+ FileCodeIcon,
12
+ FilmIcon,
13
+ Heading1Icon,
14
+ Heading2Icon,
15
+ Heading3Icon,
16
+ ImageIcon,
17
+ Link2Icon,
18
+ ListIcon,
19
+ ListOrderedIcon,
20
+ MinusIcon,
21
+ PenToolIcon,
22
+ PilcrowIcon,
23
+ PlusIcon,
24
+ QuoteIcon,
25
+ RadicalIcon,
26
+ SquareIcon,
27
+ TableIcon,
28
+ ListTree as TableOfContentsIcon
29
+ } from 'lucide-react';
30
+ import { KEYS } from 'platejs';
31
+ import { type PlateEditor, useEditorRef } from 'platejs/react';
32
+
33
+ import {
34
+ DropdownMenu,
35
+ DropdownMenuContent,
36
+ DropdownMenuItem,
37
+ DropdownMenuPortal,
38
+ DropdownMenuTrigger,
39
+ type DropdownMenuProps
40
+ } from './dropdown-menu';
41
+ import {
42
+ insertBlock,
43
+ insertInlineElement
44
+ } from '../editor/transforms';
45
+
46
+ import { ToolbarButton, ToolbarMenuGroup } from './toolbar';
47
+
48
+ type Group = {
49
+ group: string;
50
+ items: Item[];
51
+ };
52
+
53
+ type Item = {
54
+ icon: ReactNode;
55
+ value: string;
56
+ onSelect: (editor: PlateEditor, value: string) => void;
57
+ focusEditor?: boolean;
58
+ label?: string;
59
+ };
60
+
61
+ const groups: Group[] = [
62
+ {
63
+ group: 'Basic blocks',
64
+ items: [
65
+ {
66
+ icon: <PilcrowIcon />,
67
+ label: 'Paragraph',
68
+ value: KEYS.p
69
+ },
70
+ {
71
+ icon: <Heading1Icon />,
72
+ label: 'Heading 1',
73
+ value: 'h1'
74
+ },
75
+ {
76
+ icon: <Heading2Icon />,
77
+ label: 'Heading 2',
78
+ value: 'h2'
79
+ },
80
+ {
81
+ icon: <Heading3Icon />,
82
+ label: 'Heading 3',
83
+ value: 'h3'
84
+ },
85
+ {
86
+ icon: <TableIcon />,
87
+ label: 'Table',
88
+ value: KEYS.table
89
+ },
90
+ {
91
+ icon: <FileCodeIcon />,
92
+ label: 'Code',
93
+ value: KEYS.codeBlock
94
+ },
95
+ {
96
+ icon: <QuoteIcon />,
97
+ label: 'Quote',
98
+ value: KEYS.blockquote
99
+ },
100
+ {
101
+ icon: <MinusIcon />,
102
+ label: 'Divider',
103
+ value: KEYS.hr
104
+ }
105
+ ].map(item => ({
106
+ ...item,
107
+ onSelect: (editor, value) => {
108
+ insertBlock(editor, value);
109
+ }
110
+ }))
111
+ },
112
+ {
113
+ group: 'Lists',
114
+ items: [
115
+ {
116
+ icon: <ListIcon />,
117
+ label: 'Bulleted list',
118
+ value: KEYS.ul
119
+ },
120
+ {
121
+ icon: <ListOrderedIcon />,
122
+ label: 'Numbered list',
123
+ value: KEYS.ol
124
+ },
125
+ {
126
+ icon: <SquareIcon />,
127
+ label: 'To-do list',
128
+ value: KEYS.listTodo
129
+ },
130
+ {
131
+ icon: <ChevronRightIcon />,
132
+ label: 'Toggle list',
133
+ value: KEYS.toggle
134
+ }
135
+ ].map(item => ({
136
+ ...item,
137
+ onSelect: (editor, value) => {
138
+ insertBlock(editor, value);
139
+ }
140
+ }))
141
+ },
142
+ {
143
+ group: 'Media',
144
+ items: [
145
+ {
146
+ icon: <ImageIcon />,
147
+ label: 'Image',
148
+ value: KEYS.img
149
+ },
150
+ {
151
+ icon: <FilmIcon />,
152
+ label: 'Embed',
153
+ value: KEYS.mediaEmbed
154
+ }
155
+ ].map(item => ({
156
+ ...item,
157
+ onSelect: (editor, value) => {
158
+ insertBlock(editor, value);
159
+ }
160
+ }))
161
+ },
162
+ {
163
+ group: 'Advanced blocks',
164
+ items: [
165
+ {
166
+ icon: <TableOfContentsIcon />,
167
+ label: 'Table of contents',
168
+ value: KEYS.toc
169
+ },
170
+ {
171
+ icon: <Columns3Icon />,
172
+ label: '3 columns',
173
+ value: 'action_three_columns'
174
+ },
175
+ {
176
+ focusEditor: false,
177
+ icon: <RadicalIcon />,
178
+ label: 'Equation',
179
+ value: KEYS.equation
180
+ },
181
+ {
182
+ icon: <PenToolIcon />,
183
+ label: 'Excalidraw',
184
+ value: KEYS.excalidraw
185
+ }
186
+ ].map(item => ({
187
+ ...item,
188
+ onSelect: (editor, value) => {
189
+ insertBlock(editor, value);
190
+ }
191
+ }))
192
+ },
193
+ {
194
+ group: 'Inline',
195
+ items: [
196
+ {
197
+ icon: <Link2Icon />,
198
+ label: 'Link',
199
+ value: KEYS.link
200
+ },
201
+ {
202
+ focusEditor: true,
203
+ icon: <CalendarIcon />,
204
+ label: 'Date',
205
+ value: KEYS.date
206
+ },
207
+ {
208
+ focusEditor: false,
209
+ icon: <RadicalIcon />,
210
+ label: 'Inline Equation',
211
+ value: KEYS.inlineEquation
212
+ }
213
+ ].map(item => ({
214
+ ...item,
215
+ onSelect: (editor, value) => {
216
+ insertInlineElement(editor, value);
217
+ }
218
+ }))
219
+ }
220
+ ];
221
+
222
+ export function InsertToolbarButton(props: DropdownMenuProps) {
223
+ const editor = useEditorRef();
224
+ const [open, setOpen] = useState(false);
225
+
226
+ return (
227
+ <DropdownMenu open={open} onOpenChange={setOpen} modal={false} {...props}>
228
+ <DropdownMenuTrigger asChild>
229
+ <ToolbarButton pressed={open} tooltip="Insert" isDropdown>
230
+ <PlusIcon />
231
+ </ToolbarButton>
232
+ </DropdownMenuTrigger>
233
+
234
+ <DropdownMenuPortal>
235
+ <DropdownMenuContent
236
+ className="flex max-h-[500px] min-w-0 flex-col overflow-y-auto"
237
+ align="start">
238
+ {groups.map(({ group, items: nestedItems }) => (
239
+ <ToolbarMenuGroup key={group} label={group}>
240
+ {nestedItems.map(({
241
+ icon, label, value, onSelect
242
+ }) => (
243
+ <DropdownMenuItem
244
+ key={value}
245
+ className="min-w-[180px]"
246
+ onSelect={() => {
247
+ onSelect(editor, value);
248
+ editor.tf.focus();
249
+ }}>
250
+ {icon}
251
+ {label}
252
+ </DropdownMenuItem>
253
+ ))}
254
+ </ToolbarMenuGroup>
255
+ ))}
256
+ </DropdownMenuContent>
257
+ </DropdownMenuPortal>
258
+ </DropdownMenu>
259
+ );
260
+ }
@@ -0,0 +1 @@
1
+ export { Label } from '@docyrus/ui-pro-shared/label';