@gientech/modual 1.3.2 → 1.3.3

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 (309) hide show
  1. package/.editorconfig +38 -0
  2. package/.prettierignore +16 -0
  3. package/.prettierrc +17 -0
  4. package/README.md +129 -129
  5. package/USAGE.md +191 -0
  6. package/bash.exe.stackdump +40 -0
  7. package/components.json +21 -0
  8. package/dist/README.md +129 -0
  9. package/{assets → dist/assets}/database.svg +11 -11
  10. package/{assets → dist/assets}/database_add.svg +53 -53
  11. package/{assets → dist/assets}/database_connect.svg +66 -66
  12. package/{assets → dist/assets}/database_upload.svg +29 -29
  13. package/{assets → dist/assets}/defaultWeLogo.svg +14 -14
  14. package/{assets/index-ldqIbm0x.js → dist/assets/index-XvC_4jDB.js} +106 -101
  15. package/{assets/index-D-dGaGjW.js → dist/assets/index-mPgEc8KC.js} +288 -102
  16. package/{assets/MySQL.svg → dist/assets/mysql.svg} +14 -14
  17. package/dist/assets/style.css +1 -0
  18. package/dist/assets/style3.css +1 -0
  19. package/{chat.js → dist/chat.js} +78 -78
  20. package/dist/database.js +20 -0
  21. package/{databaseId.js → dist/databaseId.js} +1 -1
  22. package/{databaseTable.js → dist/databaseTable.js} +1 -1
  23. package/{modelManage.js → dist/modelManage.js} +1 -1
  24. package/dist/package.json +56 -0
  25. package/{sensitive.js → dist/sensitive.js} +1 -1
  26. package/{streamFilesReader.js → dist/streamFilesReader.js} +11 -11
  27. package/{worker → dist/worker}/pdf.worker.min.js +21 -21
  28. package/doc_assets/2.png +0 -0
  29. package/doc_assets/demo.md +27 -0
  30. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +2 -0
  31. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +23699 -0
  32. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +1 -0
  33. package/doc_assets/demos/dist-app/index.html +14 -0
  34. package/doc_assets/demos/dist-app/vite.svg +1 -0
  35. package/doc_assets/images/1.png +0 -0
  36. package/doc_assets/images/3.png +0 -0
  37. package/doc_assets/images/component-screenshot.png +1 -0
  38. package/doc_assets/install.md +5 -0
  39. package/eslint.config.js +92 -0
  40. package/index.html +13 -0
  41. package/package.json +83 -39
  42. package/postcss.config.cjs +19 -0
  43. package/public/vite.svg +1 -0
  44. package/public/worker/pdf.worker.min.js +22 -0
  45. package/scripts/README.md +133 -0
  46. package/scripts/build-demo.js +88 -0
  47. package/scripts/demo-selector.js +216 -0
  48. package/scripts/dev-demo.js +76 -0
  49. package/scripts/preview-demo.js +130 -0
  50. package/scripts/run-demo.bat +34 -0
  51. package/src/assets/img/downArrow.png +0 -0
  52. package/src/assets/img/excel.png +0 -0
  53. package/src/assets/img/img.png +0 -0
  54. package/src/assets/img/pdf.png +0 -0
  55. package/src/assets/img/ppt.png +0 -0
  56. package/src/assets/img/txt.png +0 -0
  57. package/src/assets/img/word.png +0 -0
  58. package/src/assets/login/homeBg.png +0 -0
  59. package/src/assets/login/left.jpg +0 -0
  60. package/src/assets/login/logoImg.png +0 -0
  61. package/src/examples/LoginPage/index.tsx +18 -0
  62. package/src/examples/aaa/index.tsx +3758 -0
  63. package/src/examples/chat/components/DrawerGraphPreview.tsx +78 -0
  64. package/src/examples/chat/index.tsx +190 -0
  65. package/src/examples/gientechStreamFilesReader/index.tsx +1016 -0
  66. package/src/examples/ragDatabaseDataPage/index.tsx +36 -0
  67. package/src/examples/ragDatabaseIdPage/index.tsx +44 -0
  68. package/src/examples/ragDatabasePage/index.tsx +36 -0
  69. package/src/examples/ragModelManagePage/index.tsx +37 -0
  70. package/src/examples/ragSearchPage/index.tsx +0 -0
  71. package/src/examples/ragSensitiveWordsPage/index.tsx +32 -0
  72. package/src/examples/streamFiles/index.tsx +384 -0
  73. package/src/lib_enter.ts +38 -0
  74. package/src/main.tsx +5 -0
  75. package/src/main.tsx.backup +5 -0
  76. package/src/modules/chat/Conversations/Item.tsx +167 -0
  77. package/src/modules/chat/Conversations/List.tsx +143 -0
  78. package/src/modules/chat/Conversations/groupByTime.ts +39 -0
  79. package/src/modules/chat/Conversations/index.tsx +212 -0
  80. package/src/modules/chat/constants.tsx +33 -0
  81. package/src/modules/chat/data.txt +82 -0
  82. package/src/modules/chat/index.tsx +1908 -0
  83. package/src/modules/chat/types.ts +17 -0
  84. package/src/modules/database/CreateModal.tsx +398 -0
  85. package/src/modules/database/assets/Doris.png +0 -0
  86. package/src/modules/database/assets/PostgreSQL.png +0 -0
  87. package/src/modules/database/assets/SQLServer.png +0 -0
  88. package/src/modules/database/assets/database.svg +11 -0
  89. package/src/modules/database/assets/database_add.svg +53 -0
  90. package/src/modules/database/assets/database_connect.svg +66 -0
  91. package/src/modules/database/assets/database_upload.svg +29 -0
  92. package/src/modules/database/assets/empty.png +0 -0
  93. package/src/modules/database/assets/mysql.svg +14 -0
  94. package/src/modules/database/index.tsx +466 -0
  95. package/src/modules/database/server.ts +196 -0
  96. package/src/modules/databaseId/CustomCom.tsx +156 -0
  97. package/src/modules/databaseId/EditConfig.tsx +268 -0
  98. package/src/modules/databaseId/UploadDrawer.tsx +520 -0
  99. package/src/modules/databaseId/assets/aiOptimize.svg +10 -0
  100. package/src/modules/databaseId/assets/empty.png +0 -0
  101. package/src/modules/databaseId/assets/template.svg +6 -0
  102. package/src/modules/databaseId/assets/upload.svg +9 -0
  103. package/src/modules/databaseId/assets/useTemp.svg +6 -0
  104. package/src/modules/databaseId/index.tsx +734 -0
  105. package/src/modules/databaseId/server.ts +286 -0
  106. package/src/modules/databaseId/style.css +5 -0
  107. package/src/modules/databaseTable/EditRowDrawer.tsx +119 -0
  108. package/src/modules/databaseTable/index.tsx +357 -0
  109. package/src/modules/databaseTable/server.ts +180 -0
  110. package/src/modules/headlessChat/constants.tsx +32 -0
  111. package/src/modules/headlessChat/index.tsx +1065 -0
  112. package/src/modules/headlessChat/types.ts +23 -0
  113. package/src/modules/login/components/Login/LoginBox/index.tsx +102 -0
  114. package/src/modules/login/components/Login/RegisterBox/index.tsx +180 -0
  115. package/src/modules/login/components/Login/index.tsx +100 -0
  116. package/src/modules/login/index.tsx +106 -0
  117. package/src/modules/login/style.css +3 -0
  118. package/src/modules/login/useServices.ts +53 -0
  119. package/src/modules/login/utils.ts +42 -0
  120. package/src/modules/modelManage/ConfigDrawer.tsx +249 -0
  121. package/src/modules/modelManage/assets/empty.png +0 -0
  122. package/src/modules/modelManage/const.ts +50 -0
  123. package/src/modules/modelManage/index.tsx +439 -0
  124. package/src/modules/modelManage/server.ts +185 -0
  125. package/src/modules/nodegraph/index.tsx +1 -0
  126. package/src/modules/search/assets/Icon-history.svg +8 -0
  127. package/src/modules/search/assets/answerAwartar.png +0 -0
  128. package/src/modules/search/assets/doc.png +0 -0
  129. package/src/modules/search/assets/genera.gif +0 -0
  130. package/src/modules/search/assets/icon-robot.svg +9 -0
  131. package/src/modules/search/assets/icon-search-bar.svg +14 -0
  132. package/src/modules/search/assets/icon-sub-title.svg +3 -0
  133. package/src/modules/search/assets/icon-title.svg +9 -0
  134. package/src/modules/search/assets/icon-zoomOut.svg +9 -0
  135. package/src/modules/search/assets/iconAi.svg +9 -0
  136. package/src/modules/search/assets/pdf.png +0 -0
  137. package/src/modules/search/assets/ppt.png +0 -0
  138. package/src/modules/search/assets/search.svg +3 -0
  139. package/src/modules/search/assets/selected.svg +4 -0
  140. package/src/modules/search/assets/txt.png +0 -0
  141. package/src/modules/search/assets/xls.png +0 -0
  142. package/src/modules/search/components/AssisSelect.tsx +137 -0
  143. package/src/modules/search/components/Editor/ChatViewEditor.tsx +261 -0
  144. package/src/modules/search/components/Editor/aichat.css +1 -0
  145. package/src/modules/search/components/Editor/constant.ts +13 -0
  146. package/src/modules/search/components/Editor/index.tsx +113 -0
  147. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +332 -0
  148. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +20 -0
  149. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +38 -0
  150. package/src/modules/search/components/Editor/plugins/displayer.ts +298 -0
  151. package/src/modules/search/components/Editor/plugins/imageClick.tsx +32 -0
  152. package/src/modules/search/components/Editor/plugins/myplugin.tsx +98 -0
  153. package/src/modules/search/components/Editor/ui/avatar.tsx +19 -0
  154. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +21 -0
  155. package/src/modules/search/components/Editor/ui/button.tsx +58 -0
  156. package/src/modules/search/components/Editor/ui/calendar.tsx +68 -0
  157. package/src/modules/search/components/Editor/ui/caption.tsx +46 -0
  158. package/src/modules/search/components/Editor/ui/checkbox.tsx +27 -0
  159. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +188 -0
  160. package/src/modules/search/components/Editor/ui/code-block-element.css +434 -0
  161. package/src/modules/search/components/Editor/ui/code-block-element.tsx +39 -0
  162. package/src/modules/search/components/Editor/ui/code-leaf.tsx +24 -0
  163. package/src/modules/search/components/Editor/ui/code-line-element.tsx +10 -0
  164. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +21 -0
  165. package/src/modules/search/components/Editor/ui/column-element.tsx +30 -0
  166. package/src/modules/search/components/Editor/ui/column-group-element.tsx +94 -0
  167. package/src/modules/search/components/Editor/ui/command.tsx +75 -0
  168. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +22 -0
  169. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +37 -0
  170. package/src/modules/search/components/Editor/ui/comment-item.tsx +74 -0
  171. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +49 -0
  172. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +42 -0
  173. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +22 -0
  174. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +32 -0
  175. package/src/modules/search/components/Editor/ui/comment-value.tsx +34 -0
  176. package/src/modules/search/components/Editor/ui/comments-popover.tsx +63 -0
  177. package/src/modules/search/components/Editor/ui/date-element.tsx +83 -0
  178. package/src/modules/search/components/Editor/ui/dialog.tsx +63 -0
  179. package/src/modules/search/components/Editor/ui/draggable.tsx +177 -0
  180. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +180 -0
  181. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +85 -0
  182. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +28 -0
  183. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +76 -0
  184. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +8 -0
  185. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +51 -0
  186. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +77 -0
  187. package/src/modules/search/components/Editor/ui/heading-element.tsx +48 -0
  188. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +17 -0
  189. package/src/modules/search/components/Editor/ui/hr-element.tsx +30 -0
  190. package/src/modules/search/components/Editor/ui/icons.tsx +267 -0
  191. package/src/modules/search/components/Editor/ui/image-element.tsx +74 -0
  192. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +368 -0
  193. package/src/modules/search/components/Editor/ui/input.tsx +25 -0
  194. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +218 -0
  195. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +20 -0
  196. package/src/modules/search/components/Editor/ui/link-element.tsx +29 -0
  197. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +161 -0
  198. package/src/modules/search/components/Editor/ui/list-element.tsx +30 -0
  199. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +24 -0
  200. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +133 -0
  201. package/src/modules/search/components/Editor/ui/media-popover.tsx +97 -0
  202. package/src/modules/search/components/Editor/ui/mention-element.tsx +43 -0
  203. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +141 -0
  204. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +93 -0
  205. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +67 -0
  206. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +4 -0
  207. package/src/modules/search/components/Editor/ui/placeholder.tsx +52 -0
  208. package/src/modules/search/components/Editor/ui/popover.tsx +32 -0
  209. package/src/modules/search/components/Editor/ui/resizable.tsx +66 -0
  210. package/src/modules/search/components/Editor/ui/separator.tsx +25 -0
  211. package/src/modules/search/components/Editor/ui/style.less +12 -0
  212. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +143 -0
  213. package/src/modules/search/components/Editor/ui/table-element.tsx +243 -0
  214. package/src/modules/search/components/Editor/ui/table-row-element.tsx +22 -0
  215. package/src/modules/search/components/Editor/ui/tableValue.tsx +135 -0
  216. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +43 -0
  217. package/src/modules/search/components/Editor/ui/toggle-element.tsx +31 -0
  218. package/src/modules/search/components/Editor/ui/toolbar.tsx +157 -0
  219. package/src/modules/search/components/Editor/ui/tooltip.tsx +65 -0
  220. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +160 -0
  221. package/src/modules/search/components/Editor/ui/with-draggables.tsx +175 -0
  222. package/src/modules/search/components/FileList.tsx +287 -0
  223. package/src/modules/search/components/ImageGroupView/index.tsx +85 -0
  224. package/src/modules/search/components/ResultContent.tsx +232 -0
  225. package/src/modules/search/components/SearchInput.tsx +232 -0
  226. package/src/modules/search/components/SearchLanding.tsx +74 -0
  227. package/src/modules/search/components/SearchView.tsx +563 -0
  228. package/src/modules/search/components/SimpleEditor.tsx +158 -0
  229. package/src/modules/search/components/SimpleFileList.tsx +215 -0
  230. package/src/modules/search/index.tsx +10 -0
  231. package/src/modules/search/reademe.md +1 -0
  232. package/src/modules/search/servers/apis.tsx +19 -0
  233. package/src/modules/search/servers/index.ts +184 -0
  234. package/src/modules/search/style.less +503 -0
  235. package/src/modules/search/type.ts +22 -0
  236. package/src/modules/search/utils.ts +34 -0
  237. package/src/modules/sensitive/index.tsx +313 -0
  238. package/src/modules/sensitive/server.ts +122 -0
  239. package/src/modules/streamFilesReader/GientechStreamReader.tsx +1555 -0
  240. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  241. package/src/modules/streamFilesReader/components/Header/index.tsx +297 -0
  242. package/src/modules/streamFilesReader/index.tsx +3 -0
  243. package/src/style.css +6 -0
  244. package/src/type.d.ts +0 -0
  245. package/src/utils/commonFn.tsx +111 -0
  246. package/src/utils/gientechCommon/components/AppError.tsx +32 -0
  247. package/src/utils/gientechCommon/components/AppLoading.tsx +75 -0
  248. package/src/utils/gientechCommon/components/DeleteModal.tsx +75 -0
  249. package/src/utils/gientechCommon/components/DisplayError.tsx +33 -0
  250. package/src/utils/gientechCommon/components/DisplayLoading.tsx +38 -0
  251. package/src/utils/gientechCommon/components/FeedBackModal.tsx +310 -0
  252. package/src/utils/gientechCommon/components/FileCardCommon.tsx +82 -0
  253. package/src/utils/gientechCommon/components/FileManager/index.tsx +390 -0
  254. package/src/utils/gientechCommon/components/FileManager/style.css +5 -0
  255. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +296 -0
  256. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +339 -0
  257. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +245 -0
  258. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +209 -0
  259. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  260. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +148 -0
  261. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +14 -0
  262. package/src/utils/gientechCommon/components/RenameModal.tsx +86 -0
  263. package/src/utils/gientechCommon/components/style.less +11 -0
  264. package/src/utils/gientechCommon/configs/commonConfig.ts +2 -0
  265. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  266. package/src/utils/gientechCommon/configs/stylesConfig.ts +142 -0
  267. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +345 -0
  268. package/src/utils/gientechCommon/slate/converters/deserializers.ts +763 -0
  269. package/src/utils/gientechCommon/slate/converters/mockData.ts +232 -0
  270. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +258 -0
  271. package/src/utils/gientechCommon/slate/richElements/index.tsx +499 -0
  272. package/src/utils/gientechCommon/utils/request.ts +37 -0
  273. package/src/utils/gientechCommon/utils/serverFn.ts +172 -0
  274. package/src/utils/index.tsx +126 -0
  275. package/src/utils/testconfigs/demologin/index.tsx +32 -0
  276. package/src/utils/testconfigs/index.ts +53 -0
  277. package/src/vite-env.d.ts +11 -0
  278. package/stats.html +4949 -0
  279. package/tailwind.config.js +170 -0
  280. package/tsconfig.app.json +30 -0
  281. package/tsconfig.app.tsbuildinfo +11 -0
  282. package/tsconfig.json +13 -0
  283. package/tsconfig.node.json +22 -0
  284. package/tsconfig.node.tsbuildinfo +1 -0
  285. package/vite.config.ts +177 -0
  286. package/workflows/release.yml +60 -0
  287. package/assets/style.css +0 -1
  288. package/assets/style3.css +0 -1
  289. package/database.js +0 -20
  290. /package/{assets → dist/assets}/Doris.png +0 -0
  291. /package/{assets → dist/assets}/PostgreSQL.png +0 -0
  292. /package/{assets → dist/assets}/SQLServer.png +0 -0
  293. /package/{assets → dist/assets}/_commonjsHelpers-gnU0ypJ3.js +0 -0
  294. /package/{assets → dist/assets}/circle-alert-g2Y6zAjt.js +0 -0
  295. /package/{assets → dist/assets}/empty.png +0 -0
  296. /package/{assets → dist/assets}/index-CEK88UzR.js +0 -0
  297. /package/{assets → dist/assets}/index-CpW6Dhpp.js +0 -0
  298. /package/{assets → dist/assets}/plus-omCUN0e3.js +0 -0
  299. /package/{assets → dist/assets}/style2.css +0 -0
  300. /package/{assets → dist/assets}/styled-components.browser.esm-DPkS13KC.js +0 -0
  301. /package/{assets → dist/assets}/x-vPcWt3fC.js +0 -0
  302. /package/{chat.d.ts → dist/chat.d.ts} +0 -0
  303. /package/{database.d.ts → dist/database.d.ts} +0 -0
  304. /package/{databaseId.d.ts → dist/databaseId.d.ts} +0 -0
  305. /package/{databaseTable.d.ts → dist/databaseTable.d.ts} +0 -0
  306. /package/{modelManage.d.ts → dist/modelManage.d.ts} +0 -0
  307. /package/{sensitive.d.ts → dist/sensitive.d.ts} +0 -0
  308. /package/{streamFilesReader.d.ts → dist/streamFilesReader.d.ts} +0 -0
  309. /package/{vite.svg → dist/vite.svg} +0 -0
@@ -0,0 +1,177 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+
5
+ import type { ClassNames, TEditor } from '@udecode/plate-common';
6
+ import type { DropTargetMonitor } from 'react-dnd';
7
+
8
+ import { cn, withRef } from '@udecode/cn';
9
+ import {
10
+ type PlateElementProps,
11
+ useEditorRef,
12
+ } from '@udecode/plate-common/react';
13
+ import {
14
+ type DragItemNode,
15
+ useDraggable,
16
+ useDraggableState,
17
+ } from '@udecode/plate-dnd';
18
+ import { BlockSelectionPlugin } from '@udecode/plate-selection/react';
19
+
20
+ import { Icons } from './icons';
21
+
22
+ import {
23
+ Tooltip,
24
+ TooltipContent,
25
+ TooltipPortal,
26
+ TooltipTrigger,
27
+ } from './tooltip';
28
+
29
+ export interface DraggableProps
30
+ extends PlateElementProps,
31
+ ClassNames<{
32
+ /** Block. */
33
+ block: string;
34
+
35
+ /** Block and gutter. */
36
+ blockAndGutter: string;
37
+
38
+ /** Block toolbar in the gutter. */
39
+ blockToolbar: string;
40
+
41
+ /**
42
+ * Block toolbar wrapper in the gutter left. It has the height of a line
43
+ * of the block.
44
+ */
45
+ blockToolbarWrapper: string;
46
+
47
+ blockWrapper: string;
48
+
49
+ /** Button to dnd the block, in the block toolbar. */
50
+ dragHandle: string;
51
+
52
+ /** Icon of the drag button, in the drag icon. */
53
+ dragIcon: string;
54
+
55
+ /** Show a dropline above or below the block when dragging a block. */
56
+ dropLine: string;
57
+
58
+ /** Gutter at the left side of the editor. It has the height of the block */
59
+ gutterLeft: string;
60
+ }> {
61
+ /**
62
+ * Intercepts the drop handling. If `false` is returned, the default drop
63
+ * behavior is called after. If `true` is returned, the default behavior is
64
+ * not called.
65
+ */
66
+ onDropHandler?: (
67
+ editor: TEditor,
68
+ props: {
69
+ dragItem: DragItemNode;
70
+ id: string;
71
+ monitor: DropTargetMonitor<DragItemNode, unknown>;
72
+ nodeRef: any;
73
+ }
74
+ ) => boolean;
75
+ }
76
+
77
+ const DragHandle = () => {
78
+ const editor = useEditorRef();
79
+
80
+ return (
81
+ <Tooltip>
82
+ <TooltipTrigger type="button">
83
+ <Icons.dragHandle
84
+ className="size-4 text-muted-foreground"
85
+ onClick={(event) => {
86
+ event.stopPropagation();
87
+ event.preventDefault();
88
+
89
+ // if (element.id) {
90
+ // editor.getApi(BlockSelectionPlugin).blockSelection.addSelectedRow(element.id as string);
91
+ // api.blockContextMenu.show(editor.id, event as any);
92
+ // }
93
+ }}
94
+ onMouseDown={() => {
95
+ editor
96
+ .getApi(BlockSelectionPlugin)
97
+ .blockSelection.resetSelectedIds();
98
+ }}
99
+ />
100
+ </TooltipTrigger>
101
+ <TooltipPortal>
102
+ <TooltipContent>Drag to move</TooltipContent>
103
+ </TooltipPortal>
104
+ </Tooltip>
105
+ );
106
+ };
107
+
108
+ export const Draggable = withRef<'div', DraggableProps>(
109
+ ({ className, classNames = {}, onDropHandler, ...props }, ref) => {
110
+ const { children, element } = props;
111
+
112
+ const state = useDraggableState({ element, onDropHandler });
113
+ const { dropLine, isDragging, isHovered } = state;
114
+ const {
115
+ droplineProps,
116
+ groupProps,
117
+ gutterLeftProps,
118
+ handleRef,
119
+ previewRef,
120
+ } = useDraggable(state);
121
+
122
+ return (
123
+ <div
124
+ className={cn(
125
+ 'relative',
126
+ isDragging && 'opacity-50',
127
+ 'group',
128
+ className
129
+ )}
130
+ ref={ref}
131
+ {...groupProps}
132
+ >
133
+ <div
134
+ className={cn(
135
+ 'pointer-events-none absolute -top-px z-50 flex h-full -translate-x-full cursor-text opacity-0 group-hover:opacity-100',
136
+ classNames.gutterLeft
137
+ )}
138
+ {...gutterLeftProps}
139
+ >
140
+ <div className={cn('flex h-[1.5em]', classNames.blockToolbarWrapper)}>
141
+ <div
142
+ className={cn(
143
+ 'pointer-events-auto mr-1 flex items-center',
144
+ classNames.blockToolbar
145
+ )}
146
+ >
147
+ <div
148
+ className="size-4"
149
+ data-key={element.id as string}
150
+ ref={handleRef}
151
+ >
152
+ {isHovered && <DragHandle />}
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <div className={classNames.blockWrapper} ref={previewRef}>
159
+ {children}
160
+
161
+ {!!dropLine && (
162
+ <div
163
+ className={cn(
164
+ 'absolute inset-x-0 h-0.5 opacity-100',
165
+ 'bg-ring',
166
+ dropLine === 'top' && '-top-px',
167
+ dropLine === 'bottom' && '-bottom-px',
168
+ classNames.dropLine
169
+ )}
170
+ {...droplineProps}
171
+ />
172
+ )}
173
+ </div>
174
+ </div>
175
+ );
176
+ }
177
+ );
@@ -0,0 +1,180 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { useCallback, useState } from 'react';
5
+
6
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
7
+ import {
8
+ cn,
9
+ createPrimitiveElement,
10
+ withCn,
11
+ withProps,
12
+ withRef,
13
+ withVariants,
14
+ } from '@udecode/cn';
15
+ import { cva } from 'class-variance-authority';
16
+
17
+ import { Icons } from './icons';
18
+
19
+ export const DropdownMenu = DropdownMenuPrimitive.Root;
20
+
21
+ export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
22
+
23
+ export const DropdownMenuGroup = DropdownMenuPrimitive.Group;
24
+
25
+ export const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
26
+
27
+ export const DropdownMenuSub = DropdownMenuPrimitive.Sub;
28
+
29
+ export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
30
+
31
+ export const DropdownMenuSubTrigger = withRef<
32
+ typeof DropdownMenuPrimitive.SubTrigger,
33
+ {
34
+ inset?: boolean;
35
+ }
36
+ >(({ children, className, inset, ...props }, ref) => (
37
+ <DropdownMenuPrimitive.SubTrigger
38
+ className={cn(
39
+ 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent',
40
+ 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
41
+ inset && 'pl-8',
42
+ className
43
+ )}
44
+ ref={ref}
45
+ {...props}
46
+ >
47
+ {children}
48
+ <Icons.chevronRight className="ml-auto size-4" />
49
+ </DropdownMenuPrimitive.SubTrigger>
50
+ ));
51
+
52
+ export const DropdownMenuSubContent = withCn(
53
+ DropdownMenuPrimitive.SubContent,
54
+ 'z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2'
55
+ );
56
+
57
+ const DropdownMenuContentVariants = withProps(DropdownMenuPrimitive.Content, {
58
+ className: cn(
59
+ 'z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2'
60
+ ),
61
+ sideOffset: 4,
62
+ });
63
+
64
+ export const DropdownMenuContent = withRef<
65
+ typeof DropdownMenuPrimitive.Content
66
+ >(({ ...props }, ref) => (
67
+ <DropdownMenuPrimitive.Portal>
68
+ <DropdownMenuContentVariants ref={ref} {...props} />
69
+ </DropdownMenuPrimitive.Portal>
70
+ ));
71
+
72
+ const menuItemVariants = cva(
73
+ cn(
74
+ 'relative flex h-9 cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors',
75
+ 'focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50'
76
+ ),
77
+ {
78
+ variants: {
79
+ inset: {
80
+ true: 'pl-8',
81
+ },
82
+ },
83
+ }
84
+ );
85
+
86
+ export const DropdownMenuItem = withVariants(
87
+ DropdownMenuPrimitive.Item,
88
+ menuItemVariants,
89
+ ['inset']
90
+ );
91
+
92
+ export const DropdownMenuCheckboxItem = withRef<
93
+ typeof DropdownMenuPrimitive.CheckboxItem
94
+ >(({ children, className, ...props }, ref) => (
95
+ <DropdownMenuPrimitive.CheckboxItem
96
+ className={cn(
97
+ 'relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
98
+ 'cursor-pointer',
99
+ className
100
+ )}
101
+ ref={ref}
102
+ {...props}
103
+ >
104
+ <span className="absolute left-2 flex size-3.5 items-center justify-center">
105
+ <DropdownMenuPrimitive.ItemIndicator>
106
+ <Icons.check className="size-4" />
107
+ </DropdownMenuPrimitive.ItemIndicator>
108
+ </span>
109
+ {children}
110
+ </DropdownMenuPrimitive.CheckboxItem>
111
+ ));
112
+
113
+ export const DropdownMenuRadioItem = withRef<
114
+ typeof DropdownMenuPrimitive.RadioItem,
115
+ {
116
+ hideIcon?: boolean;
117
+ }
118
+ >(({ children, className, hideIcon, ...props }, ref) => (
119
+ <DropdownMenuPrimitive.RadioItem
120
+ className={cn(
121
+ 'relative flex select-none items-center rounded-sm pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
122
+ 'h-9 cursor-pointer px-2 data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground',
123
+ className
124
+ )}
125
+ ref={ref}
126
+ {...props}
127
+ >
128
+ {!hideIcon && (
129
+ <span className="absolute right-2 flex size-3.5 items-center justify-center">
130
+ <DropdownMenuPrimitive.ItemIndicator>
131
+ <Icons.check className="size-4" />
132
+ </DropdownMenuPrimitive.ItemIndicator>
133
+ </span>
134
+ )}
135
+ {children}
136
+ </DropdownMenuPrimitive.RadioItem>
137
+ ));
138
+
139
+ const dropdownMenuLabelVariants = cva(
140
+ cn('select-none px-2 py-1.5 text-sm font-semibold'),
141
+ {
142
+ variants: {
143
+ inset: {
144
+ true: 'pl-8',
145
+ },
146
+ },
147
+ }
148
+ );
149
+
150
+ export const DropdownMenuLabel = withVariants(
151
+ DropdownMenuPrimitive.Label,
152
+ dropdownMenuLabelVariants,
153
+ ['inset']
154
+ );
155
+
156
+ export const DropdownMenuSeparator = withCn(
157
+ DropdownMenuPrimitive.Separator,
158
+ '-mx-1 my-1 h-px bg-muted'
159
+ );
160
+
161
+ export const DropdownMenuShortcut = withCn(
162
+ createPrimitiveElement('span'),
163
+ 'ml-auto text-xs tracking-widest opacity-60'
164
+ );
165
+
166
+ export const useOpenState = () => {
167
+ const [open, setOpen] = useState(false);
168
+
169
+ const onOpenChange = useCallback(
170
+ (_value = !open) => {
171
+ setOpen(_value);
172
+ },
173
+ [open]
174
+ );
175
+
176
+ return {
177
+ onOpenChange,
178
+ open,
179
+ };
180
+ };
@@ -0,0 +1,85 @@
1
+ import React, { useMemo, useState } from 'react';
2
+
3
+ import { withRef } from '@udecode/cn';
4
+ import { PlateElement } from '@udecode/plate-common/react';
5
+ import { EmojiInlineIndexSearch, insertEmoji } from '@udecode/plate-emoji';
6
+
7
+ import {
8
+ InlineCombobox,
9
+ InlineComboboxContent,
10
+ InlineComboboxEmpty,
11
+ InlineComboboxInput,
12
+ InlineComboboxItem,
13
+ } from './inline-combobox';
14
+
15
+ export const EmojiInputElement = withRef<typeof PlateElement>(
16
+ ({ className, ...props }, ref) => {
17
+ const { children, editor, element } = props;
18
+ const [value, setValue] = useState('');
19
+ const debouncedValue = useDebounce(value, 100);
20
+ const isPending = value !== debouncedValue;
21
+
22
+ const filteredEmojis = useMemo(() => {
23
+ if (debouncedValue.trim().length === 0) return [];
24
+
25
+ return EmojiInlineIndexSearch.getInstance()
26
+ .search(debouncedValue.replace(/:$/, ''))
27
+ .get();
28
+ }, [debouncedValue]);
29
+
30
+ return (
31
+ <PlateElement
32
+ as="span"
33
+ data-slate-value={element.value}
34
+ ref={ref}
35
+ {...props}
36
+ >
37
+ <InlineCombobox
38
+ element={element}
39
+ filter={false}
40
+ hideWhenNoValue
41
+ setValue={setValue}
42
+ trigger=":"
43
+ value={value}
44
+ >
45
+ <InlineComboboxInput />
46
+
47
+ <InlineComboboxContent>
48
+ {!isPending && (
49
+ <InlineComboboxEmpty>No matching emoji found</InlineComboboxEmpty>
50
+ )}
51
+
52
+ {filteredEmojis.map((emoji) => (
53
+ <InlineComboboxItem
54
+ key={emoji.id}
55
+ onClick={() => insertEmoji(editor, emoji)}
56
+ value={emoji.name}
57
+ >
58
+ {emoji.skins[0].native} {emoji.name}
59
+ </InlineComboboxItem>
60
+ ))}
61
+ </InlineComboboxContent>
62
+ </InlineCombobox>
63
+
64
+ {children}
65
+ </PlateElement>
66
+ );
67
+ }
68
+ );
69
+
70
+ const useDebounce = (value: any, delay = 500) => {
71
+ const [debouncedValue, setDebouncedValue] = React.useState(value);
72
+
73
+ React.useEffect(() => {
74
+ const handler: NodeJS.Timeout = setTimeout(() => {
75
+ setDebouncedValue(value);
76
+ }, delay);
77
+
78
+ // Cancel the timeout if value changes (also on delay change or unmount)
79
+ return () => {
80
+ clearTimeout(handler);
81
+ };
82
+ }, [value, delay]);
83
+
84
+ return debouncedValue;
85
+ };
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+
3
+ import { withRef } from '@udecode/cn';
4
+ import { PlateElement } from '@udecode/plate-common/react';
5
+ import { useExcalidrawElement } from '@udecode/plate-excalidraw/react';
6
+
7
+ export const ExcalidrawElement = withRef<typeof PlateElement>(
8
+ ({ nodeProps, ...props }, ref) => {
9
+ const { children, element } = props;
10
+
11
+ const { Excalidraw, excalidrawProps } = useExcalidrawElement({
12
+ element,
13
+ });
14
+
15
+ return (
16
+ <PlateElement ref={ref} {...props}>
17
+ <div contentEditable={false}>
18
+ <div className="h-[600px]">
19
+ {Excalidraw && (
20
+ <Excalidraw {...nodeProps} {...(excalidrawProps as any)} />
21
+ )}
22
+ </div>
23
+ </div>
24
+ {children}
25
+ </PlateElement>
26
+ );
27
+ }
28
+ );
@@ -0,0 +1,76 @@
1
+ import React from 'react';
2
+
3
+ import {
4
+ BoldPlugin,
5
+ CodePlugin,
6
+ ItalicPlugin,
7
+ StrikethroughPlugin,
8
+ UnderlinePlugin,
9
+ } from '@udecode/plate-basic-marks/react';
10
+ import { useEditorReadOnly } from '@udecode/plate-common/react';
11
+
12
+ import { Icons } from './icons';
13
+
14
+ import { InsertDropdownMenu } from './insert-dropdown-menu';
15
+ import { MarkToolbarButton } from './mark-toolbar-button';
16
+ import { ModeDropdownMenu } from './mode-dropdown-menu';
17
+ import { ToolbarGroup } from './toolbar';
18
+ import { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';
19
+
20
+ export function FixedToolbarButtons() {
21
+ const readOnly = useEditorReadOnly();
22
+
23
+ return (
24
+ <div className="w-full overflow-hidden">
25
+ <div
26
+ className="flex flex-wrap"
27
+ style={{
28
+ transform: 'translateX(calc(-1px))',
29
+ }}
30
+ >
31
+ {!readOnly && (
32
+ <>
33
+ <ToolbarGroup noSeparator>
34
+ <InsertDropdownMenu />
35
+ <TurnIntoDropdownMenu />
36
+ </ToolbarGroup>
37
+
38
+ <ToolbarGroup>
39
+ <MarkToolbarButton nodeType={BoldPlugin.key} tooltip="Bold (⌘+B)">
40
+ <Icons.bold />
41
+ </MarkToolbarButton>
42
+ <MarkToolbarButton
43
+ nodeType={ItalicPlugin.key}
44
+ tooltip="Italic (⌘+I)"
45
+ >
46
+ <Icons.italic />
47
+ </MarkToolbarButton>
48
+ <MarkToolbarButton
49
+ nodeType={UnderlinePlugin.key}
50
+ tooltip="Underline (⌘+U)"
51
+ >
52
+ <Icons.underline />
53
+ </MarkToolbarButton>
54
+
55
+ <MarkToolbarButton
56
+ nodeType={StrikethroughPlugin.key}
57
+ tooltip="Strikethrough (⌘+⇧+M)"
58
+ >
59
+ <Icons.strikethrough />
60
+ </MarkToolbarButton>
61
+ <MarkToolbarButton nodeType={CodePlugin.key} tooltip="Code (⌘+E)">
62
+ <Icons.code />
63
+ </MarkToolbarButton>
64
+ </ToolbarGroup>
65
+ </>
66
+ )}
67
+
68
+ <div className="grow" />
69
+
70
+ <ToolbarGroup noSeparator>
71
+ <ModeDropdownMenu />
72
+ </ToolbarGroup>
73
+ </div>
74
+ </div>
75
+ );
76
+ }
@@ -0,0 +1,8 @@
1
+ import { withCn } from '@udecode/cn';
2
+
3
+ import { Toolbar } from './toolbar';
4
+
5
+ export const FixedToolbar = withCn(
6
+ Toolbar,
7
+ 'supports-backdrop-blur:bg-background/60 sticky left-0 top-0 z-50 w-full justify-between overflow-x-auto rounded-t-lg border-b border-b-border bg-background/95 backdrop-blur'
8
+ );
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+
3
+ import {
4
+ BoldPlugin,
5
+ CodePlugin,
6
+ ItalicPlugin,
7
+ StrikethroughPlugin,
8
+ UnderlinePlugin,
9
+ } from '@udecode/plate-basic-marks/react';
10
+ import { useEditorReadOnly } from '@udecode/plate-common/react';
11
+
12
+ import { Icons } from './icons';
13
+
14
+ import { MarkToolbarButton } from './mark-toolbar-button';
15
+ import { TurnIntoDropdownMenu } from './turn-into-dropdown-menu';
16
+
17
+ export function FloatingToolbarButtons() {
18
+ const readOnly = useEditorReadOnly();
19
+
20
+ return (
21
+ <>
22
+ {!readOnly && (
23
+ <>
24
+ <TurnIntoDropdownMenu />
25
+
26
+ <MarkToolbarButton nodeType={BoldPlugin.key} tooltip="Bold (⌘+B)">
27
+ <Icons.bold />
28
+ </MarkToolbarButton>
29
+ <MarkToolbarButton nodeType={ItalicPlugin.key} tooltip="Italic (⌘+I)">
30
+ <Icons.italic />
31
+ </MarkToolbarButton>
32
+ <MarkToolbarButton
33
+ nodeType={UnderlinePlugin.key}
34
+ tooltip="Underline (⌘+U)"
35
+ >
36
+ <Icons.underline />
37
+ </MarkToolbarButton>
38
+ <MarkToolbarButton
39
+ nodeType={StrikethroughPlugin.key}
40
+ tooltip="Strikethrough (⌘+⇧+M)"
41
+ >
42
+ <Icons.strikethrough />
43
+ </MarkToolbarButton>
44
+ <MarkToolbarButton nodeType={CodePlugin.key} tooltip="Code (⌘+E)">
45
+ <Icons.code />
46
+ </MarkToolbarButton>
47
+ </>
48
+ )}
49
+ </>
50
+ );
51
+ }
@@ -0,0 +1,77 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+
5
+ import { cn, withRef } from '@udecode/cn';
6
+ import {
7
+ PortalBody,
8
+ useComposedRef,
9
+ useEditorId,
10
+ useEventEditorSelectors,
11
+ } from '@udecode/plate-common/react';
12
+ import {
13
+ type FloatingToolbarState,
14
+ flip,
15
+ offset,
16
+ useFloatingToolbar,
17
+ useFloatingToolbarState,
18
+ } from '@udecode/plate-floating';
19
+
20
+ import { Toolbar } from './toolbar';
21
+
22
+ export const FloatingToolbar = withRef<
23
+ typeof Toolbar,
24
+ {
25
+ state?: FloatingToolbarState;
26
+ }
27
+ >(({ children, state, ...props }, componentRef) => {
28
+ const editorId = useEditorId();
29
+ const focusedEditorId = useEventEditorSelectors.focus();
30
+
31
+ const floatingToolbarState = useFloatingToolbarState({
32
+ editorId,
33
+ focusedEditorId,
34
+ ...state,
35
+ floatingOptions: {
36
+ middleware: [
37
+ offset(12),
38
+ flip({
39
+ fallbackPlacements: [
40
+ 'top-start',
41
+ 'top-end',
42
+ 'bottom-start',
43
+ 'bottom-end',
44
+ ],
45
+ padding: 12,
46
+ }),
47
+ ],
48
+ placement: 'top',
49
+ ...state?.floatingOptions,
50
+ },
51
+ });
52
+
53
+ const {
54
+ hidden,
55
+ props: rootProps,
56
+ ref: floatingRef,
57
+ } = useFloatingToolbar(floatingToolbarState);
58
+
59
+ const ref = useComposedRef<HTMLDivElement>(componentRef, floatingRef);
60
+
61
+ if (hidden) return null;
62
+
63
+ return (
64
+ <PortalBody>
65
+ <Toolbar
66
+ className={cn(
67
+ 'absolute z-50 whitespace-nowrap border bg-popover px-1 opacity-100 shadow-md print:hidden'
68
+ )}
69
+ ref={ref}
70
+ {...rootProps}
71
+ {...props}
72
+ >
73
+ {children}
74
+ </Toolbar>
75
+ </PortalBody>
76
+ );
77
+ });