@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,46 @@
1
+
2
+ import { type TMentionElement, IS_APPLE } from 'platejs';
3
+
4
+ import { SlateElement, type SlateElementProps } from 'platejs/static';
5
+
6
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
7
+
8
+ export function MentionElementStatic({
9
+ prefix,
10
+ ...props
11
+ }: SlateElementProps<TMentionElement> & {
12
+ prefix?: string;
13
+ }) {
14
+ const { element } = props;
15
+
16
+ return (
17
+ <SlateElement
18
+ {...props}
19
+ attributes={{
20
+ ...props.attributes,
21
+ 'data-slate-value': element.value
22
+ }}
23
+ className={cn(
24
+ 'inline-block cursor-pointer rounded-md bg-muted px-1.5 py-0.5 align-baseline font-medium text-sm',
25
+ element.children[0].bold === true && 'font-bold',
26
+ element.children[0].italic === true && 'italic',
27
+ element.children[0].underline === true && 'underline'
28
+ )}>
29
+ {IS_APPLE ? (
30
+ // Mac OS IME https://github.com/ianstormtaylor/slate/issues/3490
31
+ <>
32
+ {props.children}
33
+ {prefix}
34
+ {element.value}
35
+ </>
36
+ ) : (
37
+ // Others like Android https://github.com/ianstormtaylor/slate/pull/5360
38
+ <>
39
+ {prefix}
40
+ {element.value}
41
+ {props.children}
42
+ </>
43
+ )}
44
+ </SlateElement>
45
+ );
46
+ }
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+
3
+ import { IS_APPLE, type TElement } from 'platejs';
4
+ import {
5
+ PlateElement,
6
+ type PlateElementProps,
7
+ useSelected
8
+ } from 'platejs/react';
9
+
10
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
11
+
12
+ import {
13
+ InlineCombobox,
14
+ InlineComboboxContent,
15
+ InlineComboboxEmpty,
16
+ InlineComboboxInput
17
+ } from './inline-combobox';
18
+
19
+ type TMentionElement = TElement & { value: string };
20
+ type TMentionInputElement = TElement;
21
+
22
+ export function MentionElement(
23
+ props: PlateElementProps<TMentionElement> & { prefix?: string }
24
+ ) {
25
+ const { prefix } = props;
26
+ const { element } = props;
27
+ const selected = useSelected();
28
+
29
+ return (
30
+ <PlateElement
31
+ {...props}
32
+ attributes={{
33
+ ...props.attributes,
34
+ 'data-slate-value': element.value
35
+ }}
36
+ className={cn(
37
+ 'inline-block cursor-pointer rounded-md bg-muted px-1.5 py-0.5 align-baseline font-medium text-sm',
38
+ selected && 'ring-2 ring-ring',
39
+ element.children[0].bold === true && 'font-bold',
40
+ element.children[0].italic === true && 'italic',
41
+ element.children[0].underline === true && 'underline'
42
+ )}>
43
+ {IS_APPLE ? (
44
+ <>
45
+ {props.children}
46
+ {prefix}
47
+ {element.value}
48
+ </>
49
+ ) : (
50
+ <>
51
+ {prefix}
52
+ {element.value}
53
+ {props.children}
54
+ </>
55
+ )}
56
+ </PlateElement>
57
+ );
58
+ }
59
+
60
+ export function MentionInputElement(
61
+ props: PlateElementProps<TMentionInputElement>
62
+ ) {
63
+ const { element } = props;
64
+
65
+ return (
66
+ <PlateElement {...props} as="span">
67
+ <InlineCombobox element={element} trigger="@">
68
+ <InlineComboboxInput />
69
+
70
+ <InlineComboboxContent>
71
+ <InlineComboboxEmpty>No results found.</InlineComboboxEmpty>
72
+
73
+ {/* Mention items would be populated by the mention plugin */}
74
+ </InlineComboboxContent>
75
+ </InlineCombobox>
76
+ {props.children}
77
+ </PlateElement>
78
+ );
79
+ }
@@ -0,0 +1,532 @@
1
+ 'use client';
2
+
3
+ import {
4
+ createContext, use, useEffect, useRef, useState, type ComponentProps, type MouseEvent, type ReactNode
5
+ } from 'react';
6
+
7
+ import * as Ariakit from '@ariakit/react';
8
+ import { useComposedRef } from 'platejs/react';
9
+ import { cva, type VariantProps } from 'class-variance-authority';
10
+ import { CornerDownLeftIcon } from 'lucide-react';
11
+
12
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
13
+
14
+ import { useOnClickOutside } from '../hooks/use-on-click-outside';
15
+
16
+ export type Action = {
17
+ filterItems?: boolean;
18
+ focusEditor?: boolean;
19
+ group?: string;
20
+ icon?: ReactNode;
21
+ items?: Action[];
22
+ keywords?: string[];
23
+ label?: string;
24
+ shortcut?: string;
25
+ value?: string;
26
+ };
27
+
28
+ export type ActionGroup = {
29
+ group?: string;
30
+ value?: string;
31
+ };
32
+
33
+ const SearchableContext = createContext(false);
34
+
35
+ const MenuContext = createContext<{
36
+ isRootMenu: boolean;
37
+ open: boolean;
38
+ }>({
39
+ isRootMenu: false,
40
+ open: false
41
+ });
42
+
43
+ export type MenuProps = Ariakit.MenuProviderProps & {
44
+ trigger?: ReactNode;
45
+ value?: string;
46
+ onOpenChange?: Ariakit.MenuProviderProps['setOpen'];
47
+ onRootMenuClose?: () => void;
48
+ onValueChange?: Ariakit.ComboboxProviderProps['setValue'];
49
+ onValuesChange?: Ariakit.MenuProviderProps['setValues'];
50
+ };
51
+
52
+ export function Menu({
53
+ children,
54
+ trigger,
55
+ value,
56
+ onOpenChange,
57
+ onRootMenuClose: _onRootMenuClose,
58
+ onValueChange = () => {},
59
+ onValuesChange,
60
+ ...props
61
+ }: MenuProps) {
62
+ const isRootMenu = !Ariakit.useMenuContext();
63
+ const [open, setOpen] = useState(false);
64
+
65
+ const searchable = !!onValuesChange || isRootMenu;
66
+
67
+ const content = (
68
+ <Ariakit.MenuProvider
69
+ open={open}
70
+ setOpen={(v) => {
71
+ if (props.open === undefined) {
72
+ setOpen(v);
73
+ }
74
+
75
+ onOpenChange?.(v);
76
+ }}
77
+ setValues={onValuesChange}
78
+ showTimeout={100}
79
+ {...props}>
80
+ {trigger}
81
+
82
+ <MenuContext value={{ isRootMenu, open: props.open ?? open }}>
83
+ <SearchableContext value={searchable}>
84
+ {children}
85
+ </SearchableContext>
86
+ </MenuContext>
87
+ </Ariakit.MenuProvider>
88
+ );
89
+
90
+ return searchable ? (
91
+ <Ariakit.ComboboxProvider
92
+ includesBaseElement={false}
93
+ resetValueOnHide
94
+ setValue={onValueChange}
95
+ value={value}>
96
+ {content}
97
+ </Ariakit.ComboboxProvider>
98
+ ) : (
99
+ content
100
+ );
101
+ }
102
+
103
+ export function MenuTrigger({
104
+ children,
105
+ icon,
106
+ label,
107
+ ...props
108
+ }: ComponentProps<typeof Ariakit.MenuButton> & {
109
+ icon?: ReactNode;
110
+ label?: ReactNode;
111
+ }) {
112
+ return (
113
+ <Ariakit.MenuButton render={(children as any) ?? <MenuItem />} {...props}>
114
+ {icon}
115
+ {label && <span>{label}</span>}
116
+ <Ariakit.MenuButtonArrow className="ml-auto text-muted-foreground/80" />
117
+ </Ariakit.MenuButton>
118
+ );
119
+ }
120
+
121
+ const menuVariants = cva(
122
+ cn(
123
+ 'group/menu',
124
+ 'z-50 flex h-full min-w-[180px] max-w-[calc(100vw-24px)] flex-col p-0 text-popover-foreground',
125
+ 'data-[state=closed]:hidden'
126
+ ),
127
+ {
128
+ defaultVariants: {
129
+ animateZoom: false,
130
+ variant: 'default'
131
+ },
132
+ variants: {
133
+ animateZoom: {
134
+ false: 'data-[state=open]:animate-popover',
135
+ true: 'data-[side=bottom]:origin-top data-[side=left]:origin-right data-[side=right]:origin-left data-[side=top]:origin-bottom data-[state=open]:animate-zoom'
136
+ },
137
+ variant: {
138
+ ai: 'w-full px-12 sm:px-[max(64px,calc(50%-350px))]',
139
+ aiSub: 'max-h-[70vh] w-[220px] rounded-xl bg-popover shadow-floating',
140
+ default:
141
+ 'max-h-[70vh] w-[260px] overflow-y-auto rounded-xl bg-popover shadow-floating'
142
+ }
143
+ }
144
+ }
145
+ );
146
+
147
+ export type MenuContentProps = Ariakit.MenuProps
148
+ & VariantProps<typeof menuVariants> & {
149
+ animateZoom?: boolean;
150
+ onClickOutside?: (event: MouseEvent) => void;
151
+ };
152
+
153
+ export function MenuContent({
154
+ animateZoom,
155
+ children,
156
+ className,
157
+ ref,
158
+ variant,
159
+ onClickOutside,
160
+ ...props
161
+ }: MenuContentProps) {
162
+ const menuRef = useRef<HTMLDivElement | null>(null);
163
+ const { open } = use(MenuContext);
164
+ const side = useMenuSide();
165
+
166
+ useOnClickOutside(menuRef, onClickOutside);
167
+
168
+ return (
169
+ <Ariakit.Menu
170
+ className={cn(menuVariants({ animateZoom, variant }), className)}
171
+ data-side={side}
172
+ data-state={open ? 'open' : 'closed'}
173
+ fitViewport={true}
174
+ flip
175
+ gutter={4}
176
+ ref={useComposedRef(ref, menuRef)}
177
+ unmountOnHide
178
+ {...props}>
179
+ {children}
180
+ </Ariakit.Menu>
181
+ );
182
+ }
183
+
184
+ export function MenuSeparator(
185
+ props: ComponentProps<typeof Ariakit.MenuSeparator>
186
+ ) {
187
+ return <Ariakit.MenuSeparator {...props} className={cn(props.className)} />;
188
+ }
189
+
190
+ export function MenuGroup({
191
+ label,
192
+ ...props
193
+ }: ComponentProps<typeof Ariakit.MenuGroup> & {
194
+ label?: ReactNode;
195
+ }) {
196
+ return (
197
+ <>
198
+ <MenuSeparator
199
+ className={cn(
200
+ 'hidden',
201
+ 'peer-has-[[role=menuitem]]/menu-group:block peer-has-[[role=option]]/menu-group:block'
202
+ )} />
203
+
204
+ <Ariakit.MenuGroup
205
+ {...props}
206
+ className={cn(
207
+ 'hidden',
208
+ 'peer/menu-group group/menu-group my-1.5 has-[[role=menuitem]]:block has-[[role=option]]:block',
209
+ props.className
210
+ )}>
211
+ {label && (
212
+ <Ariakit.MenuGroupLabel className="select-none px-[14px] pt-1.5 pb-2 font-medium text-muted-foreground text-xs">
213
+ {label}
214
+ </Ariakit.MenuGroupLabel>
215
+ )}
216
+ {props.children}
217
+ </Ariakit.MenuGroup>
218
+ </>
219
+ );
220
+ }
221
+
222
+ export function MenuShortcut({ ...props }: ComponentProps<'span'>) {
223
+ return (
224
+ <span
225
+ {...props}
226
+ className={cn('text-muted-foreground/80 text-xs', props.className)} />
227
+ );
228
+ }
229
+
230
+ const menuItemVariants = cva(
231
+ 'group/menu-item relative flex min-h-[28px] select-none items-center justify-between gap-2 px-2.5 text-accent-foreground text-sm outline-hidden transition-bg-ease data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:size-4',
232
+ {
233
+ defaultVariants: {
234
+ isEmpty: false,
235
+ variant: 'default'
236
+ },
237
+ variants: {
238
+ isEmpty: {
239
+ false:
240
+ 'cursor-pointer hover:bg-accent aria-expanded:bg-accent aria-selected:bg-accent data-active-item:bg-accent data-active-item:text-accent-foreground',
241
+ true: 'text-muted-foreground'
242
+ },
243
+ variant: {
244
+ default: 'mx-1 w-[calc(100%-8px)] rounded-sm'
245
+ }
246
+ }
247
+ }
248
+ );
249
+
250
+ export type MenuItemProps = Omit<Ariakit.ComboboxItemProps, 'store'> & {
251
+ checked?: boolean;
252
+ group?: string;
253
+ icon?: ReactNode;
254
+ label?: string;
255
+ name?: string;
256
+ parentGroup?: string;
257
+ preventClose?: boolean;
258
+ shortcut?: ReactNode;
259
+ shortcutEnter?: boolean;
260
+ value?: string;
261
+ } & VariantProps<typeof menuItemVariants>;
262
+
263
+ export function MenuItem({
264
+ checked,
265
+ className,
266
+ group,
267
+ icon,
268
+ isEmpty,
269
+ label,
270
+ name,
271
+ parentGroup,
272
+ preventClose,
273
+ shortcut,
274
+ shortcutEnter,
275
+ variant,
276
+ ...props
277
+ }: Omit<Ariakit.ComboboxItemProps, 'store'> & {
278
+ checked?: boolean;
279
+ group?: string;
280
+ icon?: ReactNode;
281
+ label?: string;
282
+ name?: string;
283
+ parentGroup?: string;
284
+ preventClose?: boolean;
285
+ shortcut?: ReactNode;
286
+ shortcutEnter?: boolean;
287
+ value?: string;
288
+ } & VariantProps<typeof menuItemVariants>) {
289
+ const menu = Ariakit.useMenuContext();
290
+
291
+ if (!menu) throw new Error('MenuItem should be used inside a Menu');
292
+
293
+ const searchable = use(SearchableContext);
294
+
295
+ const hasShortcut = !!shortcut || shortcutEnter;
296
+
297
+ const baseProps: MenuItemProps = {
298
+ blurOnHoverEnd: false,
299
+ focusOnHover: true,
300
+ label,
301
+ ...props,
302
+ className: cn(
303
+ menuItemVariants({ isEmpty, variant }),
304
+ !!hasShortcut && 'justify-between',
305
+ className
306
+ ),
307
+ group: parentGroup,
308
+ name: group
309
+ };
310
+
311
+ baseProps.children = (
312
+ <>
313
+ <div className="flex w-full items-center gap-2 whitespace-nowrap">
314
+ {icon && (
315
+ <span className="menu-item-icon text-subtle-foreground">{icon}</span>
316
+ )}
317
+ {baseProps.children ?? label}
318
+ </div>
319
+
320
+ {(hasShortcut || checked) && (
321
+ <div className="flex shrink-0 items-center justify-end">
322
+ {checked && <Ariakit.MenuItemCheck checked={checked} />}
323
+ {hasShortcut && (
324
+ <MenuShortcut>
325
+ {shortcut ?? (
326
+ <CornerDownLeftIcon className="hidden group-data-[active-item='true']/menu-item:inline-block" />
327
+ )}
328
+ </MenuShortcut>
329
+ )}
330
+ {checked && searchable && (
331
+ <Ariakit.VisuallyHidden>
332
+ {checked ? 'checked' : 'not checked'}
333
+ </Ariakit.VisuallyHidden>
334
+ )}
335
+ </div>
336
+ )}
337
+ </>
338
+ );
339
+
340
+ if (!searchable) {
341
+ if (!!name && props.value !== null) {
342
+ const radioProps = {
343
+ ...baseProps,
344
+ hideOnClick: true,
345
+ name,
346
+ value: props.value as any
347
+ };
348
+
349
+ return <Ariakit.MenuItemRadio {...radioProps} />;
350
+ }
351
+
352
+ return <Ariakit.MenuItem {...baseProps} />;
353
+ }
354
+
355
+ const hideOnClick = (event: MouseEvent<HTMLElement, MouseEvent>) => {
356
+ const expandable = event.currentTarget.hasAttribute('aria-expanded');
357
+
358
+ if (expandable) return false;
359
+ if (preventClose) return false;
360
+
361
+ menu.hideAll();
362
+
363
+ return false;
364
+ };
365
+
366
+ return <Ariakit.ComboboxItem {...baseProps} hideOnClick={hideOnClick} />;
367
+ }
368
+
369
+ export const comboboxVariants = cva('', {
370
+ defaultVariants: {
371
+ variant: 'default'
372
+ },
373
+ variants: {
374
+ variant: {
375
+ ai: 'min-w-[280px] max-w-[calc(100vw-24px)] rounded-xl bg-popover py-0.5 shadow-toolbar',
376
+ default: 'mx-3 pt-3.5 pb-1.5'
377
+ }
378
+ }
379
+ });
380
+
381
+ export function ComboboxContent({
382
+ className,
383
+ variant = 'default',
384
+ ...props
385
+ }: ComponentProps<'div'> & VariantProps<typeof comboboxVariants>) {
386
+ return (
387
+ <div className={cn(comboboxVariants({ variant }), className)} {...props} />
388
+ );
389
+ }
390
+
391
+ const comboboxListVariants = cva(
392
+ cn(
393
+ 'group/combobox-list',
394
+ 'h-full max-h-[70vh] grow overflow-y-auto rounded-lg [&:has(>:last-child:not([role=group]))]:pb-1.5',
395
+ 'hidden has-[[role=option]]:block'
396
+ ),
397
+ {
398
+ defaultVariants: {
399
+ variant: 'default'
400
+ },
401
+ variants: {
402
+ variant: {
403
+ ai: 'my-1 h-full max-h-[min(40vh,320px)] w-fit min-w-[280px] max-w-[320px] overflow-y-auto bg-popover p-0 shadow-floating',
404
+ default: ''
405
+ }
406
+ }
407
+ }
408
+ );
409
+
410
+ export function ComboboxList({
411
+ className,
412
+ variant = 'default',
413
+ ...props
414
+ }: ComponentProps<typeof Ariakit.ComboboxList>
415
+ & VariantProps<typeof comboboxListVariants>) {
416
+ return (
417
+ <Ariakit.ComboboxList
418
+ className={cn(comboboxListVariants({ variant }), className)}
419
+ {...props} />
420
+ );
421
+ }
422
+
423
+ export function ComboboxInput({
424
+ children,
425
+ ...props
426
+ }: ComponentProps<typeof Ariakit.Combobox>) {
427
+ return <Ariakit.Combobox autoSelect render={children as any} {...props} />;
428
+ }
429
+
430
+ export function ComboboxEmpty() {
431
+ return (
432
+ <div className="py-1.5 group-has-[[role=option]]/combobox-list:hidden">
433
+ <div
434
+ className={cn(menuItemVariants({ isEmpty: true }), '')}
435
+ role="menuitem">
436
+ No results
437
+ </div>
438
+ </div>
439
+ );
440
+ }
441
+
442
+ // biome-ignore lint/performance/noBarrelFile: intentional re-export
443
+ export * as Ariakit from '@ariakit/react';
444
+
445
+ export function filterMenuItems(
446
+ { items = [], ...group }: Action,
447
+ searchValue: string
448
+ ): Action[] {
449
+ if (!searchValue) return items;
450
+ if (
451
+ [group.label, ...(group.keywords || [])]
452
+ .join(' ')
453
+ .toLowerCase()
454
+ .includes(searchValue.toLowerCase())
455
+ ) {
456
+ return items;
457
+ }
458
+
459
+ return items.filter(
460
+ item => item.filterItems
461
+ || [item.label, item.value, ...(item.keywords || [])]
462
+ .join(' ')
463
+ .toLowerCase()
464
+ .includes(searchValue.toLowerCase())
465
+ );
466
+ }
467
+
468
+ export function filterMenuGroups(
469
+ menuGroups: Action[],
470
+ searchValue: string
471
+ ): Action[] {
472
+ if (!searchValue) return menuGroups;
473
+
474
+ return menuGroups.reduce<Action[]>((acc, group) => {
475
+ const filteredItems = filterMenuItems(group, searchValue);
476
+
477
+ if (filteredItems.length > 0) {
478
+ acc.push({
479
+ ...group,
480
+ items: filteredItems
481
+ });
482
+ }
483
+
484
+ return acc;
485
+ }, []);
486
+ }
487
+
488
+ export function useComboboxValueState() {
489
+ const store = Ariakit.useComboboxContext();
490
+ const searchValue = store?.useState('value') ?? '';
491
+
492
+ return [searchValue, store!.setValue] as const;
493
+ }
494
+
495
+ export function useMenuSide() {
496
+ const store = Ariakit.useMenuStore();
497
+ const currentPlacement = store?.useState('currentPlacement').split('-')[0];
498
+
499
+ return currentPlacement;
500
+ }
501
+
502
+ export function useContextMenu(anchorRect: { x: number; y: number }) {
503
+ const menu = Ariakit.useMenuStore();
504
+
505
+ useEffect(() => {
506
+ if (anchorRect) {
507
+ menu.render();
508
+ }
509
+ }, [anchorRect, menu]);
510
+
511
+ return {
512
+ store: menu,
513
+ getAnchorRect: () => anchorRect,
514
+ show: () => {
515
+ menu.show();
516
+ menu.setAutoFocusOnShow(true);
517
+ }
518
+ };
519
+ }
520
+
521
+ export function useMenuStore() {
522
+ const menu = Ariakit.useMenuStore();
523
+
524
+ return {
525
+ store: menu,
526
+ show: (anchorElement: HTMLElement) => {
527
+ menu.setAnchorElement(anchorElement);
528
+ menu.show();
529
+ menu.setAutoFocusOnShow(true);
530
+ }
531
+ };
532
+ }