@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,380 @@
1
+ 'use client';
2
+
3
+ import {
4
+ useEffect, useState, type ComponentProps, type ComponentPropsWithoutRef, type ElementType, type ReactNode
5
+ } from 'react';
6
+
7
+ import * as React from 'react';
8
+
9
+ import { type VariantProps, cva } from 'class-variance-authority';
10
+ import { ChevronDown } from 'lucide-react';
11
+ import { Toolbar as ToolbarPrimitive, Tooltip as TooltipPrimitive } from 'radix-ui';
12
+
13
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
14
+
15
+ import {
16
+ DropdownMenuLabel,
17
+ DropdownMenuRadioGroup,
18
+ DropdownMenuSeparator
19
+ } from './dropdown-menu';
20
+ import { Separator } from './separator';
21
+ import { Tooltip, TooltipProvider, TooltipTrigger } from './tooltip';
22
+
23
+ export function Toolbar({
24
+ className,
25
+ ...props
26
+ }: ComponentProps<typeof ToolbarPrimitive.Root>) {
27
+ return (
28
+ <ToolbarPrimitive.Root
29
+ className={cn('relative flex flex-nowrap select-none items-center gap-1', className)}
30
+ {...props} />
31
+ );
32
+ }
33
+
34
+ export function ToolbarToggleGroup({
35
+ className,
36
+ ...props
37
+ }: ComponentProps<typeof ToolbarPrimitive.ToolbarToggleGroup>) {
38
+ return (
39
+ <ToolbarPrimitive.ToolbarToggleGroup
40
+ className={cn('flex items-center', className)}
41
+ {...props} />
42
+ );
43
+ }
44
+
45
+ export function ToolbarLink({
46
+ className,
47
+ ...props
48
+ }: ComponentProps<typeof ToolbarPrimitive.Link>) {
49
+ return (
50
+ <ToolbarPrimitive.Link
51
+ className={cn('font-medium underline underline-offset-4', className)}
52
+ {...props} />
53
+ );
54
+ }
55
+
56
+ export function ToolbarSeparator({
57
+ className,
58
+ ...props
59
+ }: ComponentProps<typeof ToolbarPrimitive.Separator>) {
60
+ return (
61
+ <ToolbarPrimitive.Separator
62
+ className={cn('mx-2 my-1 w-px shrink-0 bg-border', className)}
63
+ {...props} />
64
+ );
65
+ }
66
+
67
+ // From toggleVariants
68
+ export const toolbarButtonVariants = cva(
69
+ "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-sm outline-none transition-[color,box-shadow] hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-checked:bg-accent aria-checked:text-accent-foreground aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
70
+ {
71
+ defaultVariants: {
72
+ size: 'default',
73
+ variant: 'default'
74
+ },
75
+ variants: {
76
+ size: {
77
+ default: 'h-9 min-w-9 px-2',
78
+ lg: 'h-10 min-w-10 px-2.5',
79
+ sm: 'h-8 min-w-8 px-1.5',
80
+ none: ''
81
+ },
82
+ variant: {
83
+ default: 'bg-transparent',
84
+ outline:
85
+ 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',
86
+ media:
87
+ 'no-focus-ring m-0 h-auto rounded-none not-last:border-r not-last:border-r-white/20 bg-black/20 px-1.5 py-1 text-white hover:bg-white/5 focus:bg-white/5 [&_svg]:size-[14px] [&_svg]:text-white'
88
+ }
89
+ }
90
+ }
91
+ );
92
+
93
+ const dropdownArrowVariants = cva(
94
+ cn(
95
+ 'inline-flex items-center justify-center rounded-r-md font-medium text-foreground text-sm transition-colors disabled:pointer-events-none disabled:opacity-50'
96
+ ),
97
+ {
98
+ defaultVariants: {
99
+ size: 'sm',
100
+ variant: 'default'
101
+ },
102
+ variants: {
103
+ size: {
104
+ default: 'h-9 w-6',
105
+ lg: 'h-10 w-8',
106
+ sm: 'h-8 w-4'
107
+ },
108
+ variant: {
109
+ default:
110
+ 'bg-transparent hover:bg-muted hover:text-muted-foreground aria-checked:bg-accent aria-checked:text-accent-foreground',
111
+ outline:
112
+ 'border border-input border-l-0 bg-transparent hover:bg-accent hover:text-accent-foreground'
113
+ }
114
+ }
115
+ }
116
+ );
117
+
118
+ type ToolbarButtonProps = {
119
+ isDropdown?: boolean;
120
+ pressed?: boolean;
121
+ } & Omit<
122
+ ComponentPropsWithoutRef<typeof ToolbarToggleItem>,
123
+ 'asChild' | 'value'
124
+ >
125
+ & VariantProps<typeof toolbarButtonVariants>;
126
+
127
+ export const ToolbarButton = withTooltip(({
128
+ children,
129
+ className,
130
+ isDropdown,
131
+ pressed,
132
+ size = 'sm',
133
+ variant,
134
+ ...props
135
+ }: ToolbarButtonProps) => {
136
+ return typeof pressed === 'boolean' ? (
137
+ <ToolbarToggleGroup disabled={props.disabled} value="single" type="single">
138
+ <ToolbarToggleItem
139
+ className={cn(
140
+ toolbarButtonVariants({
141
+ size,
142
+ variant
143
+ }),
144
+ isDropdown && 'justify-between gap-1 pr-1',
145
+ className
146
+ )}
147
+ value={pressed ? 'single' : ''}
148
+ {...props}>
149
+ {isDropdown ? (
150
+ <>
151
+ <div className="flex flex-1 items-center gap-2 whitespace-nowrap">
152
+ {children}
153
+ </div>
154
+ <div>
155
+ <ChevronDown
156
+ className="size-3.5 text-muted-foreground"
157
+ data-icon />
158
+ </div>
159
+ </>
160
+ ) : (
161
+ children
162
+ )}
163
+ </ToolbarToggleItem>
164
+ </ToolbarToggleGroup>
165
+ ) : (
166
+ <ToolbarPrimitive.Button
167
+ className={cn(
168
+ toolbarButtonVariants({
169
+ size,
170
+ variant
171
+ }),
172
+ isDropdown && 'pr-1',
173
+ className
174
+ )}
175
+ {...props}>
176
+ {children}
177
+ </ToolbarPrimitive.Button>
178
+ );
179
+ });
180
+
181
+ export function ToolbarSplitButton({
182
+ className,
183
+ ...props
184
+ }: ComponentPropsWithoutRef<typeof ToolbarButton>) {
185
+ return (
186
+ <ToolbarButton
187
+ className={cn('group flex gap-0 px-0 hover:bg-transparent', className)}
188
+ {...props} />
189
+ );
190
+ }
191
+
192
+ type ToolbarSplitButtonPrimaryProps = Omit<
193
+ ComponentPropsWithoutRef<typeof ToolbarToggleItem>,
194
+ 'value'
195
+ >
196
+ & VariantProps<typeof toolbarButtonVariants>;
197
+
198
+ export function ToolbarSplitButtonPrimary({
199
+ children,
200
+ className,
201
+ size = 'sm',
202
+ variant,
203
+ ...props
204
+ }: ToolbarSplitButtonPrimaryProps) {
205
+ return (
206
+ <span
207
+ className={cn(
208
+ toolbarButtonVariants({
209
+ size,
210
+ variant
211
+ }),
212
+ 'rounded-r-none',
213
+ 'group-data-[pressed=true]:bg-accent group-data-[pressed=true]:text-accent-foreground',
214
+ className
215
+ )}
216
+ {...props}>
217
+ {children}
218
+ </span>
219
+ );
220
+ }
221
+
222
+ export function ToolbarSplitButtonSecondary({
223
+ className,
224
+ size,
225
+ variant,
226
+ ...props
227
+ }: ComponentPropsWithoutRef<'span'>
228
+ & VariantProps<typeof dropdownArrowVariants>) {
229
+ return (
230
+ <span
231
+ className={cn(
232
+ dropdownArrowVariants({
233
+ size,
234
+ variant
235
+ }),
236
+ 'group-data-[pressed=true]:bg-accent group-data-[pressed=true]:text-accent-foreground',
237
+ className
238
+ )}
239
+ onClick={e => e.stopPropagation()}
240
+ role="button"
241
+ {...props}>
242
+ <ChevronDown className="size-3.5 text-muted-foreground" data-icon />
243
+ </span>
244
+ );
245
+ }
246
+
247
+ export function ToolbarToggleItem({
248
+ className,
249
+ size = 'sm',
250
+ variant,
251
+ ...props
252
+ }: ComponentProps<typeof ToolbarPrimitive.ToggleItem>
253
+ & VariantProps<typeof toolbarButtonVariants>) {
254
+ return (
255
+ <ToolbarPrimitive.ToggleItem
256
+ className={cn(toolbarButtonVariants({ size, variant }), className)}
257
+ {...props} />
258
+ );
259
+ }
260
+
261
+ export function ToolbarGroup({
262
+ children,
263
+ className
264
+ }: ComponentProps<'div'>) {
265
+ return (
266
+ <div
267
+ className={cn(
268
+ 'group/toolbar-group',
269
+ 'relative hidden has-[button]:flex flex-shrink-0',
270
+ className
271
+ )}>
272
+ <div className="flex items-center flex-shrink-0">{children}</div>
273
+
274
+ <div className="group-last/toolbar-group:hidden! mx-1.5 py-0.5">
275
+ <Separator orientation="vertical" />
276
+ </div>
277
+ </div>
278
+ );
279
+ }
280
+
281
+ type TooltipProps<T extends ElementType> = {
282
+ tooltip?: ReactNode;
283
+ tooltipContentProps?: Omit<
284
+ ComponentPropsWithoutRef<typeof TooltipContent>,
285
+ 'children'
286
+ >;
287
+ tooltipProps?: Omit<
288
+ ComponentPropsWithoutRef<typeof Tooltip>,
289
+ 'children'
290
+ >;
291
+ tooltipTriggerProps?: ComponentPropsWithoutRef<typeof TooltipTrigger>;
292
+ } & ComponentProps<T>;
293
+
294
+ function withTooltip<T extends ElementType>(Component: T) {
295
+ return function ExtendComponent({
296
+ tooltip,
297
+ tooltipContentProps,
298
+ tooltipProps,
299
+ tooltipTriggerProps,
300
+ ...props
301
+ }: TooltipProps<T>) {
302
+ const [mounted, setMounted] = useState(false);
303
+
304
+ useEffect(() => {
305
+ setMounted(true);
306
+ }, []);
307
+
308
+ const component = <Component {...(props as ComponentProps<T>)} />;
309
+
310
+ if (tooltip && mounted) {
311
+ return (
312
+ <TooltipProvider>
313
+ <Tooltip {...tooltipProps}>
314
+ <TooltipTrigger asChild {...tooltipTriggerProps}>
315
+ {component}
316
+ </TooltipTrigger>
317
+
318
+ <TooltipContent {...tooltipContentProps}>{tooltip}</TooltipContent>
319
+ </Tooltip>
320
+ </TooltipProvider>
321
+ );
322
+ }
323
+
324
+ return component;
325
+ };
326
+ }
327
+
328
+ function TooltipContent({
329
+ children,
330
+ className,
331
+ sideOffset = 4,
332
+ ...props
333
+ }: ComponentProps<typeof TooltipPrimitive.Content>) {
334
+ return (
335
+ <TooltipPrimitive.Portal>
336
+ <TooltipPrimitive.Content
337
+ className={cn(
338
+ 'z-50 w-fit origin-(--radix-tooltip-content-transform-origin) text-balance rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs',
339
+ className
340
+ )}
341
+ data-slot="tooltip-content"
342
+ sideOffset={sideOffset}
343
+ {...props}>
344
+ {children}
345
+ </TooltipPrimitive.Content>
346
+ </TooltipPrimitive.Portal>
347
+ );
348
+ }
349
+
350
+ export function ToolbarMenuGroup({
351
+ children,
352
+ className,
353
+ label,
354
+ ...props
355
+ }: ComponentProps<typeof DropdownMenuRadioGroup> & { label?: string }) {
356
+ return (
357
+ <>
358
+ <DropdownMenuSeparator
359
+ className={cn(
360
+ 'hidden',
361
+ 'mb-0 shrink-0 peer-has-[[role=menuitem]]/menu-group:block peer-has-[[role=menuitemradio]]/menu-group:block peer-has-[[role=option]]/menu-group:block'
362
+ )} />
363
+
364
+ <DropdownMenuRadioGroup
365
+ {...props}
366
+ className={cn(
367
+ 'hidden',
368
+ 'peer/menu-group group/menu-group my-1.5 has-[[role=menuitem]]:block has-[[role=menuitemradio]]:block has-[[role=option]]:block',
369
+ className
370
+ )}>
371
+ {label && (
372
+ <DropdownMenuLabel className="select-none font-semibold text-muted-foreground text-xs">
373
+ {label}
374
+ </DropdownMenuLabel>
375
+ )}
376
+ {children}
377
+ </DropdownMenuRadioGroup>
378
+ </>
379
+ );
380
+ }
@@ -0,0 +1,149 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import {
5
+ useSyncExternalStore, type ComponentProps, type ComponentPropsWithoutRef, type ElementType, type ReactNode
6
+ } from 'react';
7
+
8
+ import { Tooltip as TooltipPrimitive } from 'radix-ui';
9
+
10
+ import { cn } from '@docyrus/ui-pro-shared/lib/utils';
11
+
12
+ const useMounted = () => {
13
+ return useSyncExternalStore(
14
+ () => () => {},
15
+ () => true,
16
+ () => false
17
+ );
18
+ };
19
+
20
+ export function TooltipProvider({
21
+ delayDuration = 200,
22
+ disableHoverableContent = true,
23
+ skipDelayDuration = 0,
24
+ ...props
25
+ }: ComponentProps<typeof TooltipPrimitive.Provider>) {
26
+ return (
27
+ <TooltipPrimitive.Provider
28
+ delayDuration={delayDuration}
29
+ disableHoverableContent={disableHoverableContent}
30
+ skipDelayDuration={skipDelayDuration}
31
+ {...props} />
32
+ );
33
+ }
34
+
35
+ export const Tooltip = TooltipPrimitive.Root;
36
+
37
+ export const TooltipTrigger = TooltipPrimitive.Trigger;
38
+
39
+ export const TooltipPortal = TooltipPrimitive.Portal;
40
+
41
+ export function TooltipContent({
42
+ className,
43
+ sideOffset = 4,
44
+ ...props
45
+ }: ComponentProps<typeof TooltipPrimitive.Content>) {
46
+ return (
47
+ <TooltipPrimitive.Content
48
+ className={cn(
49
+ 'z-9999 overflow-hidden rounded-md bg-primary px-2 py-1.5 font-semibold text-primary-foreground text-xs shadow-md',
50
+ className
51
+ )}
52
+ sideOffset={sideOffset}
53
+ {...props} />
54
+ );
55
+ }
56
+
57
+ export function TooltipTC({
58
+ children,
59
+ className,
60
+ content,
61
+ defaultOpen,
62
+ delayDuration,
63
+ disableHoverableContent,
64
+ open,
65
+ onOpenChange,
66
+ ...props
67
+ }: {
68
+ content: ReactNode;
69
+ } & ComponentProps<typeof TooltipPrimitive.Content>
70
+ & ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>) {
71
+ const mounted = useMounted();
72
+
73
+ if (!mounted) {
74
+ return children;
75
+ }
76
+
77
+ return (
78
+ <TooltipProvider>
79
+ <Tooltip
80
+ defaultOpen={defaultOpen}
81
+ delayDuration={delayDuration}
82
+ disableHoverableContent={disableHoverableContent}
83
+ onOpenChange={onOpenChange}
84
+ open={open}>
85
+ <TooltipTrigger asChild>{children}</TooltipTrigger>
86
+
87
+ <TooltipPortal>
88
+ <TooltipContent className={className} {...props}>
89
+ {content}
90
+ </TooltipContent>
91
+ </TooltipPortal>
92
+ </Tooltip>
93
+ </TooltipProvider>
94
+ );
95
+ }
96
+
97
+ type TooltipProps<T extends ElementType> = {
98
+ shortcut?: ReactNode;
99
+ tooltip?: ReactNode;
100
+ tooltipContentProps?: Omit<
101
+ ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,
102
+ 'children'
103
+ >;
104
+ tooltipProps?: Omit<
105
+ ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>,
106
+ 'children'
107
+ >;
108
+ tooltipTriggerProps?: ComponentPropsWithoutRef<
109
+ typeof TooltipPrimitive.Trigger
110
+ >;
111
+ } & ComponentProps<T>;
112
+
113
+ export function withTooltip<T extends ElementType>(Component: T) {
114
+ return function ExtendComponent({
115
+ shortcut,
116
+ tooltip,
117
+ tooltipContentProps,
118
+ tooltipProps,
119
+ tooltipTriggerProps,
120
+ ...props
121
+ }: TooltipProps<T>) {
122
+ const isMounted = useMounted();
123
+
124
+ const component = <Component {...(props as ComponentProps<T>)} />;
125
+
126
+ if (tooltip && isMounted) {
127
+ return (
128
+ <TooltipProvider>
129
+ <Tooltip {...tooltipProps}>
130
+ <TooltipTrigger asChild {...tooltipTriggerProps}>
131
+ {component}
132
+ </TooltipTrigger>
133
+
134
+ <TooltipPortal>
135
+ <TooltipContent {...tooltipContentProps}>
136
+ {tooltip}
137
+ {shortcut && (
138
+ <div className="mt-px text-gray-400">{shortcut}</div>
139
+ )}
140
+ </TooltipContent>
141
+ </TooltipPortal>
142
+ </Tooltip>
143
+ </TooltipProvider>
144
+ );
145
+ }
146
+
147
+ return component;
148
+ };
149
+ }
@@ -0,0 +1,177 @@
1
+ 'use client';
2
+
3
+ import { useMemo } from 'react';
4
+
5
+ import * as React from 'react';
6
+
7
+ import {
8
+ ChevronDownIcon,
9
+ Code2Icon,
10
+ Columns3Icon,
11
+ Heading1Icon,
12
+ Heading2Icon,
13
+ Heading3Icon,
14
+ LightbulbIcon,
15
+ ListIcon,
16
+ ListOrderedIcon,
17
+ PilcrowIcon,
18
+ QuoteIcon,
19
+ SquareIcon
20
+ } from 'lucide-react';
21
+ import { KEYS } from 'platejs';
22
+ import { useEditorRef, useSelectionFragmentProp } from 'platejs/react';
23
+
24
+ import {
25
+ DropdownMenu,
26
+ DropdownMenuContent,
27
+ DropdownMenuGroup,
28
+ DropdownMenuLabel,
29
+ DropdownMenuPortal,
30
+ type DropdownMenuProps,
31
+ DropdownMenuRadioGroup,
32
+ DropdownMenuRadioItem,
33
+ DropdownMenuTrigger,
34
+ useOpenState
35
+ } from './dropdown-menu';
36
+
37
+ import { ToolbarButton } from './toolbar';
38
+
39
+ import {
40
+ getBlockType,
41
+ setBlockType
42
+ } from '../editor/transforms';
43
+
44
+ export const turnIntoItems = [
45
+ {
46
+ icon: <PilcrowIcon />,
47
+ keywords: ['paragraph'],
48
+ label: 'Text',
49
+ value: KEYS.p
50
+ },
51
+ {
52
+ icon: <Heading1Icon />,
53
+ keywords: ['title', 'h1'],
54
+ label: 'Heading 1',
55
+ value: KEYS.h1
56
+ },
57
+ {
58
+ icon: <Heading2Icon />,
59
+ keywords: ['subtitle', 'h2'],
60
+ label: 'Heading 2',
61
+ value: KEYS.h2
62
+ },
63
+ {
64
+ icon: <Heading3Icon />,
65
+ keywords: ['subtitle', 'h3'],
66
+ label: 'Heading 3',
67
+ value: KEYS.h3
68
+ },
69
+ {
70
+ icon: <SquareIcon />,
71
+ keywords: [
72
+ 'checklist',
73
+ 'task',
74
+ 'checkbox',
75
+ '[]'
76
+ ],
77
+ label: 'To-do list',
78
+ value: KEYS.listTodo
79
+ },
80
+ {
81
+ icon: <ListIcon />,
82
+ keywords: ['unordered', 'ul', '-'],
83
+ label: 'Bulleted list',
84
+ value: KEYS.ul
85
+ },
86
+ {
87
+ icon: <ListOrderedIcon />,
88
+ keywords: ['ordered', 'ol', '1'],
89
+ label: 'Numbered list',
90
+ value: KEYS.ol
91
+ },
92
+ {
93
+ icon: <ChevronDownIcon />,
94
+ keywords: ['collapsible', 'expandable'],
95
+ label: 'Toggle list',
96
+ value: KEYS.toggle
97
+ },
98
+ {
99
+ icon: <Code2Icon />,
100
+ keywords: ['```'],
101
+ label: 'Code',
102
+ value: KEYS.codeBlock
103
+ },
104
+ {
105
+ icon: <QuoteIcon />,
106
+ keywords: ['citation', 'blockquote', '>'],
107
+ label: 'Quote',
108
+ value: KEYS.blockquote
109
+ },
110
+ {
111
+ icon: <LightbulbIcon />,
112
+ keywords: ['highlight', 'note', 'important'],
113
+ label: 'Callout',
114
+ value: KEYS.callout
115
+ },
116
+ {
117
+ icon: <Columns3Icon />,
118
+ label: '3 columns',
119
+ value: 'action_three_columns'
120
+ }
121
+ ];
122
+
123
+ export function TurnIntoToolbarButton(props: DropdownMenuProps) {
124
+ const editor = useEditorRef();
125
+ const openState = useOpenState();
126
+
127
+ const value = useSelectionFragmentProp({
128
+ defaultValue: KEYS.p,
129
+ getProp: node => getBlockType(node as any)
130
+ });
131
+ const selectedItem = useMemo(
132
+ () => turnIntoItems.find(item => item.value === (value ?? KEYS.p))
133
+ ?? turnIntoItems[0],
134
+ [value]
135
+ );
136
+
137
+ return (
138
+ <DropdownMenu modal={false} {...openState} {...props}>
139
+ <DropdownMenuTrigger asChild>
140
+ <ToolbarButton isDropdown pressed={openState.open} tooltip="Turn into">
141
+ {selectedItem.label}
142
+ </ToolbarButton>
143
+ </DropdownMenuTrigger>
144
+
145
+ <DropdownMenuPortal>
146
+ <DropdownMenuContent
147
+ align="start"
148
+ className="ignore-click-outside/toolbar min-w-0"
149
+ data-plate-prevent-overlay>
150
+ <DropdownMenuGroup>
151
+ <DropdownMenuLabel>Turn into</DropdownMenuLabel>
152
+
153
+ <DropdownMenuRadioGroup
154
+ className="flex flex-col gap-0.5"
155
+ onValueChange={(type) => {
156
+ setBlockType(editor, type);
157
+ editor.tf.focus();
158
+ }}
159
+ value={selectedItem.value}>
160
+ {turnIntoItems.map(({ icon, label, value: itemValue }) => (
161
+ <DropdownMenuRadioItem
162
+ className="min-w-[180px]"
163
+ key={itemValue}
164
+ value={itemValue}>
165
+ <div className="mr-2 flex size-5 items-center justify-center rounded-sm border border-foreground/15 bg-white p-0.5 text-subtle-foreground [&_svg]:size-3">
166
+ {icon}
167
+ </div>
168
+ {label}
169
+ </DropdownMenuRadioItem>
170
+ ))}
171
+ </DropdownMenuRadioGroup>
172
+ </DropdownMenuGroup>
173
+ </DropdownMenuContent>
174
+ </DropdownMenuPortal>
175
+ </DropdownMenu>
176
+ );
177
+ }