@fuma-content/studio 0.1.0

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 (413) hide show
  1. package/dist/bin.d.mts +1 -0
  2. package/dist/bin.mjs +90 -0
  3. package/dist/index.d.mts +13 -0
  4. package/dist/index.mjs +66 -0
  5. package/dist/mdx/actions.mjs +34 -0
  6. package/dist/mdx/client.mjs +167 -0
  7. package/dist/package.mjs +6 -0
  8. package/dist/src/components/code-editor/mdx.lazy.mjs +19 -0
  9. package/dist/src/components/code-editor/mdx.mjs +44 -0
  10. package/dist/src/components/code-editor/yaml.lazy.mjs +22 -0
  11. package/dist/src/components/code-editor/yaml.mjs +63 -0
  12. package/dist/src/components/editor/editor-base-kit.mjs +41 -0
  13. package/dist/src/components/editor/editor-kit.mjs +73 -0
  14. package/dist/src/components/editor/md.mjs +42 -0
  15. package/dist/src/components/editor/plugins/ai-kit.mjs +68 -0
  16. package/dist/src/components/editor/plugins/align-base-kit.mjs +28 -0
  17. package/dist/src/components/editor/plugins/align-kit.mjs +30 -0
  18. package/dist/src/components/editor/plugins/autoformat-kit.mjs +214 -0
  19. package/dist/src/components/editor/plugins/basic-blocks-base-kit.mjs +22 -0
  20. package/dist/src/components/editor/plugins/basic-blocks-kit.mjs +51 -0
  21. package/dist/src/components/editor/plugins/basic-marks-base-kit.mjs +20 -0
  22. package/dist/src/components/editor/plugins/basic-marks-kit.mjs +28 -0
  23. package/dist/src/components/editor/plugins/block-menu-kit.mjs +11 -0
  24. package/dist/src/components/editor/plugins/block-placeholder-kit.mjs +14 -0
  25. package/dist/src/components/editor/plugins/block-selection-kit.mjs +48 -0
  26. package/dist/src/components/editor/plugins/callout-base-kit.mjs +8 -0
  27. package/dist/src/components/editor/plugins/callout-kit.mjs +10 -0
  28. package/dist/src/components/editor/plugins/code-block-base-kit.mjs +16 -0
  29. package/dist/src/components/editor/plugins/code-block-kit.mjs +19 -0
  30. package/dist/src/components/editor/plugins/column-base-kit.mjs +8 -0
  31. package/dist/src/components/editor/plugins/column-kit.mjs +10 -0
  32. package/dist/src/components/editor/plugins/comment-base-kit.mjs +8 -0
  33. package/dist/src/components/editor/plugins/comment-kit.mjs +53 -0
  34. package/dist/src/components/editor/plugins/copilot-kit.mjs +49 -0
  35. package/dist/src/components/editor/plugins/cursor-overlay-kit.mjs +11 -0
  36. package/dist/src/components/editor/plugins/date-base-kit.mjs +8 -0
  37. package/dist/src/components/editor/plugins/date-kit.mjs +10 -0
  38. package/dist/src/components/editor/plugins/discussion-kit.mjs +94 -0
  39. package/dist/src/components/editor/plugins/dnd-kit.mjs +31 -0
  40. package/dist/src/components/editor/plugins/emoji-kit.mjs +11 -0
  41. package/dist/src/components/editor/plugins/exit-break-kit.mjs +12 -0
  42. package/dist/src/components/editor/plugins/fixed-toolbar-kit.mjs +15 -0
  43. package/dist/src/components/editor/plugins/floating-toolbar-kit.mjs +15 -0
  44. package/dist/src/components/editor/plugins/font-base-kit.mjs +14 -0
  45. package/dist/src/components/editor/plugins/font-kit.mjs +19 -0
  46. package/dist/src/components/editor/plugins/indent-base-kit.mjs +17 -0
  47. package/dist/src/components/editor/plugins/indent-kit.mjs +20 -0
  48. package/dist/src/components/editor/plugins/line-height-base-kit.mjs +20 -0
  49. package/dist/src/components/editor/plugins/line-height-kit.mjs +22 -0
  50. package/dist/src/components/editor/plugins/link-base-kit.mjs +8 -0
  51. package/dist/src/components/editor/plugins/link-kit.mjs +15 -0
  52. package/dist/src/components/editor/plugins/list-base-kit.mjs +19 -0
  53. package/dist/src/components/editor/plugins/list-kit.mjs +22 -0
  54. package/dist/src/components/editor/plugins/markdown-kit.mjs +17 -0
  55. package/dist/src/components/editor/plugins/math-base-kit.mjs +8 -0
  56. package/dist/src/components/editor/plugins/math-kit.mjs +10 -0
  57. package/dist/src/components/editor/plugins/media-base-kit.mjs +23 -0
  58. package/dist/src/components/editor/plugins/media-kit.mjs +37 -0
  59. package/dist/src/components/editor/plugins/slash-kit.mjs +11 -0
  60. package/dist/src/components/editor/plugins/suggestion-base-kit.mjs +8 -0
  61. package/dist/src/components/editor/plugins/suggestion-kit.mjs +50 -0
  62. package/dist/src/components/editor/plugins/table-base-kit.mjs +13 -0
  63. package/dist/src/components/editor/plugins/table-kit.mjs +15 -0
  64. package/dist/src/components/editor/transforms.mjs +125 -0
  65. package/dist/src/components/editor/ui/ai-chat-editor.mjs +21 -0
  66. package/dist/src/components/editor/ui/ai-menu.mjs +488 -0
  67. package/dist/src/components/editor/ui/ai-node.mjs +24 -0
  68. package/dist/src/components/editor/ui/ai-toolbar-button.mjs +23 -0
  69. package/dist/src/components/editor/ui/align-toolbar-button.mjs +71 -0
  70. package/dist/src/components/editor/ui/block-context-menu.mjs +130 -0
  71. package/dist/src/components/editor/ui/block-discussion.mjs +200 -0
  72. package/dist/src/components/editor/ui/block-draggable.mjs +265 -0
  73. package/dist/src/components/editor/ui/block-list-static.mjs +48 -0
  74. package/dist/src/components/editor/ui/block-list.mjs +47 -0
  75. package/dist/src/components/editor/ui/block-selection.mjs +28 -0
  76. package/dist/src/components/editor/ui/block-suggestion.mjs +319 -0
  77. package/dist/src/components/editor/ui/blockquote-node-static.mjs +14 -0
  78. package/dist/src/components/editor/ui/blockquote-node.mjs +16 -0
  79. package/dist/src/components/editor/ui/callout-node-static.mjs +29 -0
  80. package/dist/src/components/editor/ui/callout-node.mjs +50 -0
  81. package/dist/src/components/editor/ui/caption.mjs +39 -0
  82. package/dist/src/components/editor/ui/code-block-node-static.mjs +30 -0
  83. package/dist/src/components/editor/ui/code-block-node.mjs +121 -0
  84. package/dist/src/components/editor/ui/code-node-static.mjs +15 -0
  85. package/dist/src/components/editor/ui/code-node.mjs +17 -0
  86. package/dist/src/components/editor/ui/column-node-static.mjs +32 -0
  87. package/dist/src/components/editor/ui/column-node.mjs +229 -0
  88. package/dist/src/components/editor/ui/comment-node-static.mjs +14 -0
  89. package/dist/src/components/editor/ui/comment-node.mjs +33 -0
  90. package/dist/src/components/editor/ui/comment-toolbar-button.mjs +23 -0
  91. package/dist/src/components/editor/ui/comment.mjs +422 -0
  92. package/dist/src/components/editor/ui/cursor-overlay.mjs +36 -0
  93. package/dist/src/components/editor/ui/date-node-static.mjs +32 -0
  94. package/dist/src/components/editor/ui/date-node.mjs +60 -0
  95. package/dist/src/components/editor/ui/editor-static.mjs +31 -0
  96. package/dist/src/components/editor/ui/editor.mjs +60 -0
  97. package/dist/src/components/editor/ui/emoji-node.mjs +46 -0
  98. package/dist/src/components/editor/ui/emoji-toolbar-button.mjs +415 -0
  99. package/dist/src/components/editor/ui/equation-node-static.mjs +65 -0
  100. package/dist/src/components/editor/ui/equation-node.mjs +159 -0
  101. package/dist/src/components/editor/ui/equation-toolbar-button.mjs +23 -0
  102. package/dist/src/components/editor/ui/fixed-toolbar-buttons.mjs +109 -0
  103. package/dist/src/components/editor/ui/fixed-toolbar.mjs +16 -0
  104. package/dist/src/components/editor/ui/floating-toolbar-buttons.mjs +54 -0
  105. package/dist/src/components/editor/ui/floating-toolbar.mjs +51 -0
  106. package/dist/src/components/editor/ui/font-color-toolbar-button.mjs +637 -0
  107. package/dist/src/components/editor/ui/font-size-toolbar-button.mjs +83 -0
  108. package/dist/src/components/editor/ui/ghost-text.mjs +22 -0
  109. package/dist/src/components/editor/ui/heading-node-static.mjs +60 -0
  110. package/dist/src/components/editor/ui/heading-node.mjs +62 -0
  111. package/dist/src/components/editor/ui/highlight-node-static.mjs +15 -0
  112. package/dist/src/components/editor/ui/highlight-node.mjs +17 -0
  113. package/dist/src/components/editor/ui/history-toolbar-button.mjs +35 -0
  114. package/dist/src/components/editor/ui/hr-node-static.mjs +18 -0
  115. package/dist/src/components/editor/ui/hr-node.mjs +23 -0
  116. package/dist/src/components/editor/ui/indent-toolbar-button.mjs +29 -0
  117. package/dist/src/components/editor/ui/inline-combobox.mjs +148 -0
  118. package/dist/src/components/editor/ui/insert-toolbar-button.mjs +199 -0
  119. package/dist/src/components/editor/ui/kbd-node-static.mjs +15 -0
  120. package/dist/src/components/editor/ui/kbd-node.mjs +17 -0
  121. package/dist/src/components/editor/ui/line-height-toolbar-button.mjs +56 -0
  122. package/dist/src/components/editor/ui/link-node-static.mjs +20 -0
  123. package/dist/src/components/editor/ui/link-node.mjs +28 -0
  124. package/dist/src/components/editor/ui/link-toolbar-button.mjs +21 -0
  125. package/dist/src/components/editor/ui/link-toolbar.mjs +141 -0
  126. package/dist/src/components/editor/ui/list-toolbar-button.mjs +131 -0
  127. package/dist/src/components/editor/ui/mark-toolbar-button.mjs +20 -0
  128. package/dist/src/components/editor/ui/media-image-node-static.mjs +32 -0
  129. package/dist/src/components/editor/ui/media-image-node.mjs +64 -0
  130. package/dist/src/components/editor/ui/media-placeholder-node.mjs +184 -0
  131. package/dist/src/components/editor/ui/media-preview-dialog.mjs +113 -0
  132. package/dist/src/components/editor/ui/media-toolbar-button.mjs +156 -0
  133. package/dist/src/components/editor/ui/media-toolbar.mjs +80 -0
  134. package/dist/src/components/editor/ui/media-upload-toast.mjs +39 -0
  135. package/dist/src/components/editor/ui/media-video-node-static.mjs +27 -0
  136. package/dist/src/components/editor/ui/mode-toolbar-button.mjs +112 -0
  137. package/dist/src/components/editor/ui/paragraph-node-static.mjs +15 -0
  138. package/dist/src/components/editor/ui/paragraph-node.mjs +17 -0
  139. package/dist/src/components/editor/ui/resize-handle.mjs +43 -0
  140. package/dist/src/components/editor/ui/slash-node.mjs +228 -0
  141. package/dist/src/components/editor/ui/suggestion-node-static.mjs +24 -0
  142. package/dist/src/components/editor/ui/suggestion-node.mjs +111 -0
  143. package/dist/src/components/editor/ui/suggestion-toolbar-button.mjs +24 -0
  144. package/dist/src/components/editor/ui/table-icons.mjs +1310 -0
  145. package/dist/src/components/editor/ui/table-node-static.mjs +68 -0
  146. package/dist/src/components/editor/ui/table-node.mjs +375 -0
  147. package/dist/src/components/editor/ui/table-toolbar-button.mjs +190 -0
  148. package/dist/src/components/editor/ui/turn-into-toolbar-button.mjs +168 -0
  149. package/dist/src/components/editor/use-chat.mjs +80 -0
  150. package/dist/src/components/json-schema-editor/client.mjs +46 -0
  151. package/dist/src/components/json-schema-editor/components/inputs.mjs +438 -0
  152. package/dist/src/components/json-schema-editor/get-default-values.mjs +23 -0
  153. package/dist/src/components/json-schema-editor/schema.mjs +131 -0
  154. package/dist/src/components/json-schema-editor/utils/merge-schema.mjs +134 -0
  155. package/dist/src/components/json-schema-editor/utils/schema-to-string.mjs +53 -0
  156. package/dist/src/components/ui/alert-dialog.mjs +90 -0
  157. package/dist/src/components/ui/avatar.mjs +32 -0
  158. package/dist/src/components/ui/button.mjs +48 -0
  159. package/dist/src/components/ui/calendar.mjs +108 -0
  160. package/dist/src/components/ui/checkbox.mjs +23 -0
  161. package/dist/src/components/ui/combobox.mjs +53 -0
  162. package/dist/src/components/ui/command.mjs +42 -0
  163. package/dist/src/components/ui/context-menu.mjs +67 -0
  164. package/dist/src/components/ui/dialog.mjs +9 -0
  165. package/dist/src/components/ui/dropdown-menu.mjs +122 -0
  166. package/dist/src/components/ui/input-group.mjs +31 -0
  167. package/dist/src/components/ui/input.mjs +15 -0
  168. package/dist/src/components/ui/label.mjs +19 -0
  169. package/dist/src/components/ui/popover.mjs +37 -0
  170. package/dist/src/components/ui/select.mjs +80 -0
  171. package/dist/src/components/ui/separator.mjs +19 -0
  172. package/dist/src/components/ui/spinner.mjs +16 -0
  173. package/dist/src/components/ui/tabs.mjs +39 -0
  174. package/dist/src/components/ui/textarea.mjs +14 -0
  175. package/dist/src/components/ui/toolbar.mjs +183 -0
  176. package/dist/src/components/ui/tooltip.mjs +38 -0
  177. package/dist/src/hooks/editor/use-is-creator.mjs +19 -0
  178. package/dist/src/hooks/use-upload-file.mjs +73 -0
  179. package/dist/src/lib/config.mjs +38 -0
  180. package/dist/src/lib/data/store.d.mts +15 -0
  181. package/dist/src/lib/lowlight.mjs +7 -0
  182. package/dist/src/lib/utils/deep-equal.mjs +18 -0
  183. package/dist/src/lib/utils/remove-undefined.mjs +18 -0
  184. package/dist/src/lib/utils.mjs +10 -0
  185. package/dist/types.d.mts +50 -0
  186. package/next.config.ts +23 -0
  187. package/package.json +131 -0
  188. package/postcss.config.mjs +7 -0
  189. package/src/app/(dashboard)/collection/[name]/[...slug]/page.client.tsx +26 -0
  190. package/src/app/(dashboard)/collection/[name]/[...slug]/page.tsx +17 -0
  191. package/src/app/(dashboard)/collection/[name]/page.client.tsx +82 -0
  192. package/src/app/(dashboard)/collection/[name]/page.tsx +11 -0
  193. package/src/app/(dashboard)/layout.tsx +34 -0
  194. package/src/app/(dashboard)/page.tsx +38 -0
  195. package/src/app/api/ai/command/prompts.ts +313 -0
  196. package/src/app/api/ai/command/route.ts +203 -0
  197. package/src/app/api/ai/command/utils.ts +242 -0
  198. package/src/app/api/ai/copilot/route.ts +33 -0
  199. package/src/app/api/uploadthing/route.ts +5 -0
  200. package/src/app/codeblock/LICENSE +21 -0
  201. package/src/app/codeblock/styles.css +289 -0
  202. package/src/app/favicon.ico +0 -0
  203. package/src/app/globals.css +223 -0
  204. package/src/app/layout.client.tsx +15 -0
  205. package/src/app/layout.tsx +30 -0
  206. package/src/components/app-sidebar.tsx +162 -0
  207. package/src/components/code-editor/mdx.lazy.tsx +18 -0
  208. package/src/components/code-editor/mdx.tsx +48 -0
  209. package/src/components/code-editor/yaml.lazy.tsx +20 -0
  210. package/src/components/code-editor/yaml.tsx +71 -0
  211. package/src/components/collection/actions.tsx +41 -0
  212. package/src/components/collection/client.tsx +63 -0
  213. package/src/components/collection/context.tsx +24 -0
  214. package/src/components/collection/document/actions.tsx +83 -0
  215. package/src/components/editor/editor-base-kit.tsx +37 -0
  216. package/src/components/editor/editor-kit.tsx +87 -0
  217. package/src/components/editor/md.tsx +60 -0
  218. package/src/components/editor/plugins/ai-kit.tsx +102 -0
  219. package/src/components/editor/plugins/align-base-kit.tsx +16 -0
  220. package/src/components/editor/plugins/align-kit.tsx +18 -0
  221. package/src/components/editor/plugins/autoformat-kit.tsx +236 -0
  222. package/src/components/editor/plugins/basic-blocks-base-kit.tsx +34 -0
  223. package/src/components/editor/plugins/basic-blocks-kit.tsx +87 -0
  224. package/src/components/editor/plugins/basic-marks-base-kit.tsx +26 -0
  225. package/src/components/editor/plugins/basic-marks-kit.tsx +40 -0
  226. package/src/components/editor/plugins/basic-nodes-kit.tsx +6 -0
  227. package/src/components/editor/plugins/block-menu-kit.tsx +14 -0
  228. package/src/components/editor/plugins/block-placeholder-kit.tsx +17 -0
  229. package/src/components/editor/plugins/block-selection-kit.tsx +54 -0
  230. package/src/components/editor/plugins/callout-base-kit.tsx +5 -0
  231. package/src/components/editor/plugins/callout-kit.tsx +7 -0
  232. package/src/components/editor/plugins/code-block-base-kit.tsx +16 -0
  233. package/src/components/editor/plugins/code-block-kit.tsx +19 -0
  234. package/src/components/editor/plugins/column-base-kit.tsx +11 -0
  235. package/src/components/editor/plugins/column-kit.tsx +10 -0
  236. package/src/components/editor/plugins/comment-base-kit.tsx +5 -0
  237. package/src/components/editor/plugins/comment-kit.tsx +92 -0
  238. package/src/components/editor/plugins/copilot-kit.tsx +70 -0
  239. package/src/components/editor/plugins/cursor-overlay-kit.tsx +13 -0
  240. package/src/components/editor/plugins/date-base-kit.tsx +5 -0
  241. package/src/components/editor/plugins/date-kit.tsx +7 -0
  242. package/src/components/editor/plugins/discussion-kit.tsx +142 -0
  243. package/src/components/editor/plugins/dnd-kit.tsx +25 -0
  244. package/src/components/editor/plugins/emoji-kit.tsx +13 -0
  245. package/src/components/editor/plugins/exit-break-kit.tsx +12 -0
  246. package/src/components/editor/plugins/fixed-toolbar-kit.tsx +19 -0
  247. package/src/components/editor/plugins/floating-toolbar-kit.tsx +19 -0
  248. package/src/components/editor/plugins/font-base-kit.tsx +20 -0
  249. package/src/components/editor/plugins/font-kit.tsx +29 -0
  250. package/src/components/editor/plugins/indent-base-kit.tsx +13 -0
  251. package/src/components/editor/plugins/indent-kit.tsx +22 -0
  252. package/src/components/editor/plugins/line-height-base-kit.tsx +14 -0
  253. package/src/components/editor/plugins/line-height-kit.tsx +16 -0
  254. package/src/components/editor/plugins/link-base-kit.tsx +5 -0
  255. package/src/components/editor/plugins/link-kit.tsx +15 -0
  256. package/src/components/editor/plugins/list-base-kit.tsx +17 -0
  257. package/src/components/editor/plugins/list-kit.tsx +26 -0
  258. package/src/components/editor/plugins/markdown-kit.tsx +13 -0
  259. package/src/components/editor/plugins/math-base-kit.tsx +11 -0
  260. package/src/components/editor/plugins/math-kit.tsx +10 -0
  261. package/src/components/editor/plugins/media-base-kit.tsx +25 -0
  262. package/src/components/editor/plugins/media-kit.tsx +28 -0
  263. package/src/components/editor/plugins/slash-kit.tsx +18 -0
  264. package/src/components/editor/plugins/suggestion-base-kit.tsx +5 -0
  265. package/src/components/editor/plugins/suggestion-kit.tsx +83 -0
  266. package/src/components/editor/plugins/table-base-kit.tsx +20 -0
  267. package/src/components/editor/plugins/table-kit.tsx +22 -0
  268. package/src/components/editor/settings-dialog.tsx +418 -0
  269. package/src/components/editor/transforms.ts +193 -0
  270. package/src/components/editor/types.ts +149 -0
  271. package/src/components/editor/ui/ai-chat-editor.tsx +20 -0
  272. package/src/components/editor/ui/ai-menu.tsx +663 -0
  273. package/src/components/editor/ui/ai-node.tsx +40 -0
  274. package/src/components/editor/ui/ai-toolbar-button.tsx +23 -0
  275. package/src/components/editor/ui/align-toolbar-button.tsx +78 -0
  276. package/src/components/editor/ui/block-context-menu.tsx +154 -0
  277. package/src/components/editor/ui/block-discussion.tsx +318 -0
  278. package/src/components/editor/ui/block-draggable.tsx +464 -0
  279. package/src/components/editor/ui/block-list-static.tsx +75 -0
  280. package/src/components/editor/ui/block-list.tsx +72 -0
  281. package/src/components/editor/ui/block-selection.tsx +37 -0
  282. package/src/components/editor/ui/block-suggestion.tsx +438 -0
  283. package/src/components/editor/ui/blockquote-node-static.tsx +5 -0
  284. package/src/components/editor/ui/blockquote-node.tsx +7 -0
  285. package/src/components/editor/ui/callout-node-static.tsx +30 -0
  286. package/src/components/editor/ui/callout-node.tsx +64 -0
  287. package/src/components/editor/ui/caption.tsx +55 -0
  288. package/src/components/editor/ui/code-block-node-static.tsx +33 -0
  289. package/src/components/editor/ui/code-block-node.tsx +161 -0
  290. package/src/components/editor/ui/code-node-static.tsx +15 -0
  291. package/src/components/editor/ui/code-node.tsx +17 -0
  292. package/src/components/editor/ui/column-node-static.tsx +27 -0
  293. package/src/components/editor/ui/column-node.tsx +285 -0
  294. package/src/components/editor/ui/comment-node-static.tsx +12 -0
  295. package/src/components/editor/ui/comment-node.tsx +43 -0
  296. package/src/components/editor/ui/comment-toolbar-button.tsx +24 -0
  297. package/src/components/editor/ui/comment.tsx +577 -0
  298. package/src/components/editor/ui/cursor-overlay.tsx +66 -0
  299. package/src/components/editor/ui/date-node-static.tsx +45 -0
  300. package/src/components/editor/ui/date-node.tsx +86 -0
  301. package/src/components/editor/ui/editor-static.tsx +47 -0
  302. package/src/components/editor/ui/editor.tsx +120 -0
  303. package/src/components/editor/ui/emoji-node.tsx +65 -0
  304. package/src/components/editor/ui/emoji-toolbar-button.tsx +582 -0
  305. package/src/components/editor/ui/equation-node-static.tsx +94 -0
  306. package/src/components/editor/ui/equation-node.tsx +218 -0
  307. package/src/components/editor/ui/equation-toolbar-button.tsx +24 -0
  308. package/src/components/editor/ui/fixed-toolbar-buttons.tsx +135 -0
  309. package/src/components/editor/ui/fixed-toolbar.tsx +17 -0
  310. package/src/components/editor/ui/floating-toolbar-buttons.tsx +72 -0
  311. package/src/components/editor/ui/floating-toolbar.tsx +76 -0
  312. package/src/components/editor/ui/font-color-toolbar-button.tsx +804 -0
  313. package/src/components/editor/ui/font-size-toolbar-button.tsx +102 -0
  314. package/src/components/editor/ui/ghost-text.tsx +27 -0
  315. package/src/components/editor/ui/heading-node-static.tsx +54 -0
  316. package/src/components/editor/ui/heading-node.tsx +54 -0
  317. package/src/components/editor/ui/highlight-node-static.tsx +11 -0
  318. package/src/components/editor/ui/highlight-node.tsx +13 -0
  319. package/src/components/editor/ui/history-toolbar-button.tsx +41 -0
  320. package/src/components/editor/ui/hr-node-static.tsx +16 -0
  321. package/src/components/editor/ui/hr-node.tsx +28 -0
  322. package/src/components/editor/ui/indent-toolbar-button.tsx +27 -0
  323. package/src/components/editor/ui/inline-combobox.tsx +251 -0
  324. package/src/components/editor/ui/insert-toolbar-button.tsx +242 -0
  325. package/src/components/editor/ui/kbd-node-static.tsx +15 -0
  326. package/src/components/editor/ui/kbd-node.tsx +17 -0
  327. package/src/components/editor/ui/line-height-toolbar-button.tsx +66 -0
  328. package/src/components/editor/ui/link-node-static.tsx +21 -0
  329. package/src/components/editor/ui/link-node.tsx +37 -0
  330. package/src/components/editor/ui/link-toolbar-button.tsx +18 -0
  331. package/src/components/editor/ui/link-toolbar.tsx +196 -0
  332. package/src/components/editor/ui/list-toolbar-button.tsx +195 -0
  333. package/src/components/editor/ui/mark-toolbar-button.tsx +20 -0
  334. package/src/components/editor/ui/media-image-node-static.tsx +33 -0
  335. package/src/components/editor/ui/media-image-node.tsx +75 -0
  336. package/src/components/editor/ui/media-placeholder-node.tsx +235 -0
  337. package/src/components/editor/ui/media-preview-dialog.tsx +145 -0
  338. package/src/components/editor/ui/media-toolbar-button.tsx +202 -0
  339. package/src/components/editor/ui/media-toolbar.tsx +100 -0
  340. package/src/components/editor/ui/media-upload-toast.tsx +59 -0
  341. package/src/components/editor/ui/media-video-node-static.tsx +23 -0
  342. package/src/components/editor/ui/mode-toolbar-button.tsx +121 -0
  343. package/src/components/editor/ui/paragraph-node-static.tsx +13 -0
  344. package/src/components/editor/ui/paragraph-node.tsx +15 -0
  345. package/src/components/editor/ui/resize-handle.tsx +79 -0
  346. package/src/components/editor/ui/slash-node.tsx +274 -0
  347. package/src/components/editor/ui/suggestion-node-static.tsx +30 -0
  348. package/src/components/editor/ui/suggestion-node.tsx +157 -0
  349. package/src/components/editor/ui/suggestion-toolbar-button.tsx +25 -0
  350. package/src/components/editor/ui/table-icons.tsx +685 -0
  351. package/src/components/editor/ui/table-node-static.tsx +86 -0
  352. package/src/components/editor/ui/table-node.tsx +569 -0
  353. package/src/components/editor/ui/table-toolbar-button.tsx +260 -0
  354. package/src/components/editor/ui/turn-into-toolbar-button.tsx +176 -0
  355. package/src/components/editor/use-chat.ts +120 -0
  356. package/src/components/icons/logo.tsx +37 -0
  357. package/src/components/json-schema-editor/client.tsx +55 -0
  358. package/src/components/json-schema-editor/components/inputs.tsx +612 -0
  359. package/src/components/json-schema-editor/get-default-values.ts +29 -0
  360. package/src/components/json-schema-editor/schema.tsx +206 -0
  361. package/src/components/json-schema-editor/utils/merge-schema.ts +167 -0
  362. package/src/components/json-schema-editor/utils/schema-to-string.ts +87 -0
  363. package/src/components/nav-user.tsx +102 -0
  364. package/src/components/site-header.tsx +13 -0
  365. package/src/components/ui/alert-dialog.tsx +182 -0
  366. package/src/components/ui/avatar.tsx +96 -0
  367. package/src/components/ui/badge.tsx +46 -0
  368. package/src/components/ui/button.tsx +65 -0
  369. package/src/components/ui/calendar.tsx +186 -0
  370. package/src/components/ui/checkbox.tsx +29 -0
  371. package/src/components/ui/combobox.tsx +267 -0
  372. package/src/components/ui/command.tsx +180 -0
  373. package/src/components/ui/context-menu.tsx +161 -0
  374. package/src/components/ui/dialog.tsx +142 -0
  375. package/src/components/ui/drawer.tsx +120 -0
  376. package/src/components/ui/dropdown-menu.tsx +239 -0
  377. package/src/components/ui/field.tsx +224 -0
  378. package/src/components/ui/input-group.tsx +144 -0
  379. package/src/components/ui/input.tsx +19 -0
  380. package/src/components/ui/label.tsx +18 -0
  381. package/src/components/ui/popover.tsx +76 -0
  382. package/src/components/ui/select.tsx +182 -0
  383. package/src/components/ui/separator.tsx +28 -0
  384. package/src/components/ui/sheet.tsx +130 -0
  385. package/src/components/ui/sidebar.tsx +608 -0
  386. package/src/components/ui/sonner.tsx +45 -0
  387. package/src/components/ui/spinner.tsx +15 -0
  388. package/src/components/ui/table.tsx +89 -0
  389. package/src/components/ui/tabs.tsx +60 -0
  390. package/src/components/ui/textarea.tsx +18 -0
  391. package/src/components/ui/toggle-group.tsx +86 -0
  392. package/src/components/ui/toggle.tsx +45 -0
  393. package/src/components/ui/toolbar.tsx +365 -0
  394. package/src/components/ui/tooltip.tsx +57 -0
  395. package/src/hooks/editor/use-is-creator.ts +21 -0
  396. package/src/hooks/use-mobile.ts +19 -0
  397. package/src/hooks/use-mounted.ts +11 -0
  398. package/src/hooks/use-upload-file.ts +121 -0
  399. package/src/lib/ai/markdown-joiner-transform.ts +235 -0
  400. package/src/lib/config.ts +60 -0
  401. package/src/lib/data/actions.ts +51 -0
  402. package/src/lib/data/boundary.client.tsx +22 -0
  403. package/src/lib/data/boundary.tsx +22 -0
  404. package/src/lib/data/query.ts +9 -0
  405. package/src/lib/data/store.ts +52 -0
  406. package/src/lib/lowlight.ts +3 -0
  407. package/src/lib/uploadthing.ts +19 -0
  408. package/src/lib/utils/deep-equal.ts +37 -0
  409. package/src/lib/utils/remove-undefined.ts +21 -0
  410. package/src/lib/utils/urls.ts +6 -0
  411. package/src/lib/utils.ts +6 -0
  412. package/tsconfig.build.json +24 -0
  413. package/tsconfig.json +37 -0
@@ -0,0 +1,582 @@
1
+ "use client";
2
+
3
+ /* eslint-disable react-hooks/refs */
4
+
5
+ import type { Emoji } from "@emoji-mart/data";
6
+ import {
7
+ type EmojiCategoryList,
8
+ type EmojiIconList,
9
+ EmojiSettings,
10
+ type GridRow,
11
+ } from "@platejs/emoji";
12
+ import {
13
+ type EmojiDropdownMenuOptions,
14
+ type UseEmojiPickerType,
15
+ useEmojiDropdownMenuState,
16
+ } from "@platejs/emoji/react";
17
+ import {
18
+ AppleIcon,
19
+ ClockIcon,
20
+ CompassIcon,
21
+ FlagIcon,
22
+ LeafIcon,
23
+ LightbulbIcon,
24
+ MusicIcon,
25
+ SearchIcon,
26
+ SmileIcon,
27
+ StarIcon,
28
+ XIcon,
29
+ } from "lucide-react";
30
+ import { Popover } from "radix-ui";
31
+ import * as React from "react";
32
+
33
+ import { Button } from "@/components/ui/button";
34
+ import { ToolbarButton } from "@/components/ui/toolbar";
35
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
36
+ import { cn } from "@/lib/utils";
37
+
38
+ export function EmojiToolbarButton({
39
+ options,
40
+ ...props
41
+ }: {
42
+ options?: EmojiDropdownMenuOptions;
43
+ } & React.ComponentPropsWithoutRef<typeof ToolbarButton>) {
44
+ const { emojiPickerState, isOpen, setIsOpen } = useEmojiDropdownMenuState(options);
45
+
46
+ return (
47
+ <EmojiPopover
48
+ control={
49
+ <ToolbarButton pressed={isOpen} tooltip="Emoji" isDropdown {...props}>
50
+ <SmileIcon />
51
+ </ToolbarButton>
52
+ }
53
+ isOpen={isOpen}
54
+ setIsOpen={setIsOpen}
55
+ >
56
+ <EmojiPicker
57
+ {...emojiPickerState}
58
+ isOpen={isOpen}
59
+ setIsOpen={setIsOpen}
60
+ settings={options?.settings}
61
+ />
62
+ </EmojiPopover>
63
+ );
64
+ }
65
+
66
+ export function EmojiPopover({
67
+ children,
68
+ control,
69
+ isOpen,
70
+ setIsOpen,
71
+ }: {
72
+ children: React.ReactNode;
73
+ control: React.ReactNode;
74
+ isOpen: boolean;
75
+ setIsOpen: (open: boolean) => void;
76
+ }) {
77
+ return (
78
+ <Popover.Root open={isOpen} onOpenChange={setIsOpen}>
79
+ <Popover.Trigger asChild>{control}</Popover.Trigger>
80
+
81
+ <Popover.Portal>
82
+ <Popover.Content className="z-100">{children}</Popover.Content>
83
+ </Popover.Portal>
84
+ </Popover.Root>
85
+ );
86
+ }
87
+
88
+ export function EmojiPicker({
89
+ clearSearch,
90
+ emoji,
91
+ emojiLibrary,
92
+ focusedCategory,
93
+ hasFound,
94
+ i18n,
95
+ icons = {
96
+ categories: emojiCategoryIcons,
97
+ search: emojiSearchIcons,
98
+ },
99
+ isSearching,
100
+ refs,
101
+ searchResult,
102
+ searchValue,
103
+ setSearch,
104
+ settings = EmojiSettings,
105
+ visibleCategories,
106
+ handleCategoryClick,
107
+ onMouseOver,
108
+ onSelectEmoji,
109
+ }: Omit<UseEmojiPickerType, "icons"> & {
110
+ icons?: EmojiIconList<React.ReactElement>;
111
+ }) {
112
+ return (
113
+ <div
114
+ className={cn(
115
+ "flex flex-col rounded-xl bg-popover text-popover-foreground",
116
+ "h-[23rem] w-80 border shadow-md",
117
+ )}
118
+ >
119
+ <EmojiPickerNavigation
120
+ onClick={handleCategoryClick}
121
+ emojiLibrary={emojiLibrary}
122
+ focusedCategory={focusedCategory}
123
+ i18n={i18n}
124
+ icons={icons}
125
+ />
126
+ <EmojiPickerSearchBar i18n={i18n} searchValue={searchValue} setSearch={setSearch}>
127
+ <EmojiPickerSearchAndClear
128
+ clearSearch={clearSearch}
129
+ i18n={i18n}
130
+ searchValue={searchValue}
131
+ />
132
+ </EmojiPickerSearchBar>
133
+ <EmojiPickerContent
134
+ onMouseOver={onMouseOver}
135
+ onSelectEmoji={onSelectEmoji}
136
+ emojiLibrary={emojiLibrary}
137
+ i18n={i18n}
138
+ isSearching={isSearching}
139
+ refs={refs}
140
+ searchResult={searchResult}
141
+ settings={settings}
142
+ visibleCategories={visibleCategories}
143
+ />
144
+ <EmojiPickerPreview emoji={emoji} hasFound={hasFound} i18n={i18n} isSearching={isSearching} />
145
+ </div>
146
+ );
147
+ }
148
+
149
+ const EmojiButton = React.memo(function EmojiButton({
150
+ emoji,
151
+ index,
152
+ onMouseOver,
153
+ onSelect,
154
+ }: {
155
+ emoji: Emoji;
156
+ index: number;
157
+ onMouseOver: (emoji?: Emoji) => void;
158
+ onSelect: (emoji: Emoji) => void;
159
+ }) {
160
+ return (
161
+ <button
162
+ className="group relative flex size-9 cursor-pointer items-center justify-center border-none bg-transparent text-2xl leading-none"
163
+ onClick={() => onSelect(emoji)}
164
+ onMouseEnter={() => onMouseOver(emoji)}
165
+ onMouseLeave={() => onMouseOver()}
166
+ aria-label={emoji.skins[0].native}
167
+ data-index={index}
168
+ tabIndex={-1}
169
+ type="button"
170
+ >
171
+ <div
172
+ className="absolute inset-0 rounded-full opacity-0 group-hover:opacity-100"
173
+ aria-hidden="true"
174
+ />
175
+ <span
176
+ className="relative"
177
+ style={{
178
+ fontFamily:
179
+ '"Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Noto Color Emoji", "Segoe UI Symbol", "Android Emoji", EmojiSymbols',
180
+ }}
181
+ data-emoji-set="native"
182
+ >
183
+ {emoji.skins[0].native}
184
+ </span>
185
+ </button>
186
+ );
187
+ });
188
+
189
+ const RowOfButtons = React.memo(function RowOfButtons({
190
+ emojiLibrary,
191
+ row,
192
+ onMouseOver,
193
+ onSelectEmoji,
194
+ }: {
195
+ row: GridRow;
196
+ } & Pick<UseEmojiPickerType, "emojiLibrary" | "onMouseOver" | "onSelectEmoji">) {
197
+ return (
198
+ <div key={row.id} className="flex" data-index={row.id}>
199
+ {row.elements.map((emojiId, index) => (
200
+ <EmojiButton
201
+ key={emojiId}
202
+ onMouseOver={onMouseOver}
203
+ onSelect={onSelectEmoji}
204
+ emoji={emojiLibrary.getEmoji(emojiId)}
205
+ index={index}
206
+ />
207
+ ))}
208
+ </div>
209
+ );
210
+ });
211
+
212
+ function EmojiPickerContent({
213
+ emojiLibrary,
214
+ i18n,
215
+ isSearching = false,
216
+ refs,
217
+ searchResult,
218
+ settings = EmojiSettings,
219
+ visibleCategories,
220
+ onMouseOver,
221
+ onSelectEmoji,
222
+ }: Pick<
223
+ UseEmojiPickerType,
224
+ | "emojiLibrary"
225
+ | "i18n"
226
+ | "isSearching"
227
+ | "onMouseOver"
228
+ | "onSelectEmoji"
229
+ | "refs"
230
+ | "searchResult"
231
+ | "settings"
232
+ | "visibleCategories"
233
+ >) {
234
+ const getRowWidth = settings.perLine.value * settings.buttonSize.value;
235
+
236
+ const isCategoryVisible = React.useCallback(
237
+ (categoryId: any) =>
238
+ visibleCategories.has(categoryId) ? visibleCategories.get(categoryId) : false,
239
+ [visibleCategories],
240
+ );
241
+
242
+ const EmojiList = React.useCallback(
243
+ () =>
244
+ emojiLibrary
245
+ .getGrid()
246
+ .sections()
247
+ .map(({ id: categoryId }) => {
248
+ const section = emojiLibrary.getGrid().section(categoryId);
249
+ const { buttonSize } = settings;
250
+
251
+ return (
252
+ <div
253
+ key={categoryId}
254
+ ref={section.root}
255
+ style={{ width: getRowWidth }}
256
+ data-id={categoryId}
257
+ >
258
+ <div className="-top-px sticky z-1 bg-popover/90 p-1 py-2 font-semibold text-sm backdrop-blur-xs">
259
+ {i18n.categories[categoryId]}
260
+ </div>
261
+ <div
262
+ className="relative flex flex-wrap"
263
+ style={{ height: section.getRows().length * buttonSize.value }}
264
+ >
265
+ {isCategoryVisible(categoryId) &&
266
+ section
267
+ .getRows()
268
+ .map((row: GridRow) => (
269
+ <RowOfButtons
270
+ key={row.id}
271
+ onMouseOver={onMouseOver}
272
+ onSelectEmoji={onSelectEmoji}
273
+ emojiLibrary={emojiLibrary}
274
+ row={row}
275
+ />
276
+ ))}
277
+ </div>
278
+ </div>
279
+ );
280
+ }),
281
+ [
282
+ emojiLibrary,
283
+ getRowWidth,
284
+ i18n.categories,
285
+ isCategoryVisible,
286
+ onSelectEmoji,
287
+ onMouseOver,
288
+ settings,
289
+ ],
290
+ );
291
+
292
+ const SearchList = React.useCallback(
293
+ () => (
294
+ <div style={{ width: getRowWidth }} data-id="search">
295
+ <div className="-top-px sticky z-1 bg-popover/90 p-1 py-2 font-semibold text-card-foreground text-sm backdrop-blur-xs">
296
+ {i18n.searchResult}
297
+ </div>
298
+ <div className="relative flex flex-wrap">
299
+ {searchResult.map((emoji: Emoji, index: number) => (
300
+ <EmojiButton
301
+ key={emoji.id}
302
+ onMouseOver={onMouseOver}
303
+ onSelect={onSelectEmoji}
304
+ emoji={emojiLibrary.getEmoji(emoji.id)}
305
+ index={index}
306
+ />
307
+ ))}
308
+ </div>
309
+ </div>
310
+ ),
311
+ [emojiLibrary, getRowWidth, i18n.searchResult, searchResult, onSelectEmoji, onMouseOver],
312
+ );
313
+
314
+ return (
315
+ <div
316
+ ref={refs.current.contentRoot}
317
+ className="h-full min-h-[50%] overflow-y-auto overflow-x-hidden px-2"
318
+ data-id="scroll"
319
+ >
320
+ <div ref={refs.current.content} className="h-full">
321
+ {isSearching ? SearchList() : EmojiList()}
322
+ </div>
323
+ </div>
324
+ );
325
+ }
326
+
327
+ function EmojiPickerSearchBar({
328
+ children,
329
+ i18n,
330
+ searchValue,
331
+ setSearch,
332
+ }: {
333
+ children: React.ReactNode;
334
+ } & Pick<UseEmojiPickerType, "i18n" | "searchValue" | "setSearch">) {
335
+ return (
336
+ <div className="flex items-center px-2">
337
+ <div className="relative flex grow items-center">
338
+ <input
339
+ className="block w-full appearance-none rounded-full border-0 bg-muted px-10 py-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:outline-none"
340
+ value={searchValue}
341
+ onChange={(event) => setSearch(event.target.value)}
342
+ placeholder={i18n.search}
343
+ aria-label="Search"
344
+ autoComplete="off"
345
+ type="text"
346
+ autoFocus
347
+ />
348
+ {children}
349
+ </div>
350
+ </div>
351
+ );
352
+ }
353
+
354
+ function EmojiPickerSearchAndClear({
355
+ clearSearch,
356
+ i18n,
357
+ searchValue,
358
+ }: Pick<UseEmojiPickerType, "clearSearch" | "i18n" | "searchValue">) {
359
+ return (
360
+ <div className="flex items-center text-foreground">
361
+ <div
362
+ className={cn(
363
+ "-translate-y-1/2 absolute top-1/2 left-2.5 z-10 flex size-5 items-center justify-center text-foreground",
364
+ )}
365
+ >
366
+ {emojiSearchIcons.loupe}
367
+ </div>
368
+ {searchValue && (
369
+ <Button
370
+ size="icon"
371
+ variant="ghost"
372
+ className={cn(
373
+ "-translate-y-1/2 absolute top-1/2 right-0.5 flex size-8 cursor-pointer items-center justify-center rounded-full border-none bg-transparent text-popover-foreground hover:bg-transparent",
374
+ )}
375
+ onClick={clearSearch}
376
+ title={i18n.clear}
377
+ aria-label="Clear"
378
+ type="button"
379
+ >
380
+ {emojiSearchIcons.delete}
381
+ </Button>
382
+ )}
383
+ </div>
384
+ );
385
+ }
386
+
387
+ function EmojiPreview({ emoji }: Pick<UseEmojiPickerType, "emoji">) {
388
+ return (
389
+ <div className="flex h-14 max-h-14 min-h-14 items-center border-muted border-t p-2">
390
+ <div className="flex items-center justify-center text-2xl">{emoji?.skins[0].native}</div>
391
+ <div className="overflow-hidden pl-2">
392
+ <div className="truncate font-semibold text-sm">{emoji?.name}</div>
393
+ <div className="truncate text-sm">{`:${emoji?.id}:`}</div>
394
+ </div>
395
+ </div>
396
+ );
397
+ }
398
+
399
+ function NoEmoji({ i18n }: Pick<UseEmojiPickerType, "i18n">) {
400
+ return (
401
+ <div className="flex h-14 max-h-14 min-h-14 items-center border-muted border-t p-2">
402
+ <div className="flex items-center justify-center text-2xl">😢</div>
403
+ <div className="overflow-hidden pl-2">
404
+ <div className="truncate font-bold text-sm">{i18n.searchNoResultsTitle}</div>
405
+ <div className="truncate text-sm">{i18n.searchNoResultsSubtitle}</div>
406
+ </div>
407
+ </div>
408
+ );
409
+ }
410
+
411
+ function PickAnEmoji({ i18n }: Pick<UseEmojiPickerType, "i18n">) {
412
+ return (
413
+ <div className="flex h-14 max-h-14 min-h-14 items-center border-muted border-t p-2">
414
+ <div className="flex items-center justify-center text-2xl">☝️</div>
415
+ <div className="overflow-hidden pl-2">
416
+ <div className="truncate font-semibold text-sm">{i18n.pick}</div>
417
+ </div>
418
+ </div>
419
+ );
420
+ }
421
+
422
+ function EmojiPickerPreview({
423
+ emoji,
424
+ hasFound = true,
425
+ i18n,
426
+ isSearching = false,
427
+ ...props
428
+ }: Pick<UseEmojiPickerType, "emoji" | "hasFound" | "i18n" | "isSearching">) {
429
+ const showPickEmoji = !emoji && (!isSearching || hasFound);
430
+ const showNoEmoji = isSearching && !hasFound;
431
+ const showPreview = emoji && !showNoEmoji && !showNoEmoji;
432
+
433
+ return (
434
+ <>
435
+ {showPreview && <EmojiPreview emoji={emoji} {...props} />}
436
+ {showPickEmoji && <PickAnEmoji i18n={i18n} {...props} />}
437
+ {showNoEmoji && <NoEmoji i18n={i18n} {...props} />}
438
+ </>
439
+ );
440
+ }
441
+
442
+ function EmojiPickerNavigation({
443
+ emojiLibrary,
444
+ focusedCategory,
445
+ i18n,
446
+ icons,
447
+ onClick,
448
+ }: {
449
+ onClick: (id: EmojiCategoryList) => void;
450
+ } & Pick<UseEmojiPickerType, "emojiLibrary" | "focusedCategory" | "i18n" | "icons">) {
451
+ return (
452
+ <TooltipProvider delayDuration={500}>
453
+ <nav id="emoji-nav" className="mb-2.5 border-0 border-b border-b-border border-solid p-1.5">
454
+ <div className="relative flex items-center justify-evenly">
455
+ {emojiLibrary
456
+ .getGrid()
457
+ .sections()
458
+ .map(({ id }) => (
459
+ <Tooltip key={id}>
460
+ <TooltipTrigger asChild>
461
+ <Button
462
+ size="sm"
463
+ variant="ghost"
464
+ className={cn(
465
+ "h-fit rounded-full fill-current p-1.5 text-muted-foreground hover:bg-muted hover:text-muted-foreground",
466
+ id === focusedCategory &&
467
+ "pointer-events-none bg-accent fill-current text-accent-foreground",
468
+ )}
469
+ onClick={() => {
470
+ onClick(id);
471
+ }}
472
+ aria-label={i18n.categories[id]}
473
+ type="button"
474
+ >
475
+ <span className="inline-flex size-5 items-center justify-center">
476
+ {icons.categories[id].outline}
477
+ </span>
478
+ </Button>
479
+ </TooltipTrigger>
480
+ <TooltipContent side="bottom">{i18n.categories[id]}</TooltipContent>
481
+ </Tooltip>
482
+ ))}
483
+ </div>
484
+ </nav>
485
+ </TooltipProvider>
486
+ );
487
+ }
488
+
489
+ const emojiCategoryIcons: Record<
490
+ EmojiCategoryList,
491
+ {
492
+ outline: React.ReactElement;
493
+ solid: React.ReactElement; // Needed to add another solid variant - outline will be used for now
494
+ }
495
+ > = {
496
+ activity: {
497
+ outline: (
498
+ <svg
499
+ className="size-full"
500
+ fill="none"
501
+ stroke="currentColor"
502
+ strokeLinecap="round"
503
+ strokeLinejoin="round"
504
+ strokeWidth="2"
505
+ viewBox="0 0 24 24"
506
+ xmlns="http://www.w3.org/2000/svg"
507
+ >
508
+ <circle cx="12" cy="12" r="10" />
509
+ <path d="M2.1 13.4A10.1 10.1 0 0 0 13.4 2.1" />
510
+ <path d="m5 4.9 14 14.2" />
511
+ <path d="M21.9 10.6a10.1 10.1 0 0 0-11.3 11.3" />
512
+ </svg>
513
+ ),
514
+ solid: (
515
+ <svg
516
+ className="size-full"
517
+ fill="none"
518
+ stroke="currentColor"
519
+ strokeLinecap="round"
520
+ strokeLinejoin="round"
521
+ strokeWidth="2"
522
+ viewBox="0 0 24 24"
523
+ xmlns="http://www.w3.org/2000/svg"
524
+ >
525
+ <circle cx="12" cy="12" r="10" />
526
+ <path d="M2.1 13.4A10.1 10.1 0 0 0 13.4 2.1" />
527
+ <path d="m5 4.9 14 14.2" />
528
+ <path d="M21.9 10.6a10.1 10.1 0 0 0-11.3 11.3" />
529
+ </svg>
530
+ ),
531
+ },
532
+
533
+ custom: {
534
+ outline: <StarIcon className="size-full" />,
535
+ solid: <StarIcon className="size-full" />,
536
+ },
537
+
538
+ flags: {
539
+ outline: <FlagIcon className="size-full" />,
540
+ solid: <FlagIcon className="size-full" />,
541
+ },
542
+
543
+ foods: {
544
+ outline: <AppleIcon className="size-full" />,
545
+ solid: <AppleIcon className="size-full" />,
546
+ },
547
+
548
+ frequent: {
549
+ outline: <ClockIcon className="size-full" />,
550
+ solid: <ClockIcon className="size-full" />,
551
+ },
552
+
553
+ nature: {
554
+ outline: <LeafIcon className="size-full" />,
555
+ solid: <LeafIcon className="size-full" />,
556
+ },
557
+
558
+ objects: {
559
+ outline: <LightbulbIcon className="size-full" />,
560
+ solid: <LightbulbIcon className="size-full" />,
561
+ },
562
+
563
+ people: {
564
+ outline: <SmileIcon className="size-full" />,
565
+ solid: <SmileIcon className="size-full" />,
566
+ },
567
+
568
+ places: {
569
+ outline: <CompassIcon className="size-full" />,
570
+ solid: <CompassIcon className="size-full" />,
571
+ },
572
+
573
+ symbols: {
574
+ outline: <MusicIcon className="size-full" />,
575
+ solid: <MusicIcon className="size-full" />,
576
+ },
577
+ };
578
+
579
+ const emojiSearchIcons = {
580
+ delete: <XIcon className="size-4 text-current" />,
581
+ loupe: <SearchIcon className="size-4 text-current" />,
582
+ };
@@ -0,0 +1,94 @@
1
+ import type { TEquationElement } from "platejs";
2
+ import type { SlateElementProps } from "platejs/static";
3
+
4
+ import { getEquationHtml } from "@platejs/math";
5
+ import { RadicalIcon } from "lucide-react";
6
+ import { SlateElement } from "platejs/static";
7
+
8
+ import { cn } from "@/lib/utils";
9
+
10
+ export function EquationElementStatic(props: SlateElementProps<TEquationElement>) {
11
+ const { element } = props;
12
+
13
+ const html = getEquationHtml({
14
+ element,
15
+ options: {
16
+ displayMode: true,
17
+ errorColor: "#cc0000",
18
+ fleqn: false,
19
+ leqno: false,
20
+ macros: { "\\f": "#1f(#2)" },
21
+ output: "htmlAndMathml",
22
+ strict: "warn",
23
+ throwOnError: false,
24
+ trust: false,
25
+ },
26
+ });
27
+
28
+ return (
29
+ <SlateElement className="my-1" {...props}>
30
+ <div
31
+ className={cn(
32
+ "group flex select-none items-center justify-center rounded-sm hover:bg-primary/10 data-[selected=true]:bg-primary/10",
33
+ element.texExpression.length === 0 ? "bg-muted p-3 pr-9" : "px-2 py-1",
34
+ )}
35
+ >
36
+ {element.texExpression.length > 0 ? (
37
+ <span
38
+ dangerouslySetInnerHTML={{
39
+ __html: html,
40
+ }}
41
+ />
42
+ ) : (
43
+ <div className="flex h-7 w-full items-center gap-2 whitespace-nowrap text-muted-foreground text-sm">
44
+ <RadicalIcon className="size-6 text-muted-foreground/80" />
45
+ <div>Add a Tex equation</div>
46
+ </div>
47
+ )}
48
+ </div>
49
+ {props.children}
50
+ </SlateElement>
51
+ );
52
+ }
53
+
54
+ export function InlineEquationElementStatic(props: SlateElementProps<TEquationElement>) {
55
+ const html = getEquationHtml({
56
+ element: props.element,
57
+ options: {
58
+ displayMode: true,
59
+ errorColor: "#cc0000",
60
+ fleqn: false,
61
+ leqno: false,
62
+ macros: { "\\f": "#1f(#2)" },
63
+ output: "htmlAndMathml",
64
+ strict: "warn",
65
+ throwOnError: false,
66
+ trust: false,
67
+ },
68
+ });
69
+
70
+ return (
71
+ <SlateElement
72
+ {...props}
73
+ className="inline-block select-none rounded-sm [&_.katex-display]:my-0"
74
+ >
75
+ <div
76
+ className={cn(
77
+ 'after:-top-0.5 after:-left-1 after:absolute after:inset-0 after:z-1 after:h-[calc(100%)+4px] after:w-[calc(100%+8px)] after:rounded-sm after:content-[""]',
78
+ "h-6",
79
+ props.element.texExpression.length === 0 &&
80
+ "text-muted-foreground after:bg-neutral-500/10",
81
+ )}
82
+ >
83
+ <span
84
+ className={cn(
85
+ props.element.texExpression.length === 0 && "hidden",
86
+ "font-mono leading-none",
87
+ )}
88
+ dangerouslySetInnerHTML={{ __html: html }}
89
+ />
90
+ </div>
91
+ {props.children}
92
+ </SlateElement>
93
+ );
94
+ }