@dxos/plugin-markdown 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (408) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/EditableMarkdownCard-LXBXN3OW.mjs +32 -0
  4. package/dist/lib/neutral/EditableMarkdownCard-LXBXN3OW.mjs.map +7 -0
  5. package/dist/lib/neutral/MarkdownArticle-Z4QRU3WD.mjs +126 -0
  6. package/dist/lib/neutral/MarkdownArticle-Z4QRU3WD.mjs.map +7 -0
  7. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs +102 -0
  8. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs.map +7 -0
  9. package/dist/lib/neutral/MarkdownPlugin.mjs +10 -0
  10. package/dist/lib/neutral/MarkdownPlugin.node.mjs +25 -0
  11. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +7 -0
  12. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs +23 -0
  13. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs.map +7 -0
  14. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs +32 -0
  15. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs.map +7 -0
  16. package/dist/lib/neutral/anchor-sort-L4VCKDO6.mjs +32 -0
  17. package/dist/lib/neutral/anchor-sort-L4VCKDO6.mjs.map +7 -0
  18. package/dist/lib/neutral/app-graph-serializer-YI72EEVM.mjs +55 -0
  19. package/dist/lib/neutral/app-graph-serializer-YI72EEVM.mjs.map +7 -0
  20. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs +15 -0
  21. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs.map +7 -0
  22. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  23. package/dist/lib/neutral/capabilities/index.mjs +25 -0
  24. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  25. package/dist/lib/neutral/capabilities/node.mjs +11 -0
  26. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-5JWFZVBC.mjs +8 -0
  28. package/dist/lib/neutral/chunk-5JWFZVBC.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  30. package/dist/lib/neutral/chunk-KDN4GKG2.mjs +98 -0
  31. package/dist/lib/neutral/chunk-KDN4GKG2.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-LXNSKCPD.mjs +44 -0
  33. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-LYUELXJH.mjs +57 -0
  35. package/dist/lib/neutral/chunk-LYUELXJH.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-SOLAMEK3.mjs +276 -0
  37. package/dist/lib/neutral/chunk-SOLAMEK3.mjs.map +7 -0
  38. package/dist/lib/{browser/chunk-BQTYJOFB.mjs → neutral/chunk-YC2OAUM7.mjs} +3 -9
  39. package/dist/lib/neutral/chunk-YC2OAUM7.mjs.map +7 -0
  40. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs +30 -0
  41. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs.map +7 -0
  42. package/dist/lib/neutral/components/index.mjs +370 -0
  43. package/dist/lib/neutral/components/index.mjs.map +7 -0
  44. package/dist/lib/neutral/containers/index.mjs +13 -0
  45. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  46. package/dist/lib/neutral/create-3PGJ2NEK.mjs +28 -0
  47. package/dist/lib/neutral/create-3PGJ2NEK.mjs.map +7 -0
  48. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs +20 -0
  49. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs.map +7 -0
  50. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs +27 -0
  51. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs.map +7 -0
  52. package/dist/lib/neutral/hooks/index.mjs +321 -0
  53. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  54. package/dist/lib/neutral/index.mjs +42 -0
  55. package/dist/lib/neutral/meta.json +1 -0
  56. package/dist/lib/neutral/meta.mjs +8 -0
  57. package/dist/lib/neutral/open-WCYGBLAG.mjs +20 -0
  58. package/dist/lib/neutral/open-WCYGBLAG.mjs.map +7 -0
  59. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs +13 -0
  60. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs.map +7 -0
  61. package/dist/lib/neutral/operations/index.mjs +8 -0
  62. package/dist/lib/neutral/plugin.mjs +16 -0
  63. package/dist/lib/neutral/plugin.mjs.map +7 -0
  64. package/dist/lib/neutral/react-surface-SCIL76V5.mjs +119 -0
  65. package/dist/lib/neutral/react-surface-SCIL76V5.mjs.map +7 -0
  66. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs +47 -0
  67. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs.map +7 -0
  68. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs +24 -0
  69. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs.map +7 -0
  70. package/dist/lib/neutral/settings-TDGDLCUR.mjs +34 -0
  71. package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +7 -0
  72. package/dist/lib/neutral/state-5COCF5PN.mjs +44 -0
  73. package/dist/lib/neutral/state-5COCF5PN.mjs.map +7 -0
  74. package/dist/lib/neutral/testing.mjs +22 -0
  75. package/dist/lib/neutral/testing.mjs.map +7 -0
  76. package/dist/lib/neutral/translations.mjs +43 -0
  77. package/dist/lib/neutral/translations.mjs.map +7 -0
  78. package/dist/lib/neutral/types/index.mjs +16 -0
  79. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs +44 -0
  80. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs.map +7 -0
  81. package/dist/types/src/MarkdownPlugin.d.ts +3 -1
  82. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  83. package/dist/types/src/MarkdownPlugin.node.d.ts +4 -0
  84. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -0
  85. package/dist/types/src/MarkdownPlugin.test.d.ts +2 -0
  86. package/dist/types/src/MarkdownPlugin.test.d.ts.map +1 -0
  87. package/dist/types/src/MarkdownPlugin.workerd.d.ts +4 -0
  88. package/dist/types/src/MarkdownPlugin.workerd.d.ts.map +1 -0
  89. package/dist/types/src/blueprints/index.d.ts +2 -0
  90. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  91. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  92. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  93. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -4
  94. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  96. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -1
  98. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  100. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/comment-config.d.ts +12 -0
  102. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  104. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/index.d.ts +22 -18
  106. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/node.d.ts +10 -0
  108. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  110. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  112. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/settings.d.ts +4 -2
  114. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/state.d.ts +4 -9
  116. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  117. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +1 -1
  118. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  119. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +34 -22
  120. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  121. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -3
  122. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +21 -14
  124. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  125. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +6 -5
  126. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  127. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  128. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  129. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +94 -0
  130. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  131. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  132. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  133. package/dist/types/src/components/index.d.ts +3 -5
  134. package/dist/types/src/components/index.d.ts.map +1 -1
  135. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts +15 -0
  136. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts.map +1 -0
  137. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts +3 -0
  138. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts.map +1 -0
  139. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +36 -0
  140. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -0
  141. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts +97 -0
  142. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -0
  143. package/dist/types/src/containers/MarkdownArticle/index.d.ts +3 -0
  144. package/dist/types/src/containers/MarkdownArticle/index.d.ts.map +1 -0
  145. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  146. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  147. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  148. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  149. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  150. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  151. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +17 -0
  152. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  153. package/dist/types/src/containers/index.d.ts +6 -0
  154. package/dist/types/src/containers/index.d.ts.map +1 -0
  155. package/dist/types/src/hooks/index.d.ts +1 -2
  156. package/dist/types/src/hooks/index.d.ts.map +1 -1
  157. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  158. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  159. package/dist/types/src/hooks/useExtensions.d.ts +12 -8
  160. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  161. package/dist/types/src/hooks/useLinkQuery.d.ts +3 -3
  162. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +2 -3
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/meta.d.ts +2 -2
  166. package/dist/types/src/meta.d.ts.map +1 -1
  167. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  168. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  169. package/dist/types/src/operations/create.d.ts +5 -0
  170. package/dist/types/src/operations/create.d.ts.map +1 -0
  171. package/dist/types/src/operations/create.test.d.ts +2 -0
  172. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  173. package/dist/types/src/operations/index.d.ts +3 -0
  174. package/dist/types/src/operations/index.d.ts.map +1 -0
  175. package/dist/types/src/operations/open.d.ts +5 -0
  176. package/dist/types/src/operations/open.d.ts.map +1 -0
  177. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  178. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  179. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  180. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  181. package/dist/types/src/operations/update-markdown.d.ts +5 -0
  182. package/dist/types/src/operations/update-markdown.d.ts.map +1 -0
  183. package/dist/types/src/operations/update.test.d.ts +2 -0
  184. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  185. package/dist/types/src/plugin.d.ts +4 -0
  186. package/dist/types/src/plugin.d.ts.map +1 -0
  187. package/dist/types/src/testing.d.ts +7 -0
  188. package/dist/types/src/testing.d.ts.map +1 -0
  189. package/dist/types/src/translations.d.ts +74 -36
  190. package/dist/types/src/translations.d.ts.map +1 -1
  191. package/dist/types/src/types/Markdown.d.ts +31 -31
  192. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  193. package/dist/types/src/types/MarkdownCapabilities.d.ts +32 -0
  194. package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -0
  195. package/dist/types/src/types/MarkdownEvents.d.ts +3 -0
  196. package/dist/types/src/types/MarkdownEvents.d.ts.map +1 -0
  197. package/dist/types/src/types/MarkdownOperation.d.ts +64 -0
  198. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -0
  199. package/dist/types/src/types/Settings.d.ts +17 -0
  200. package/dist/types/src/types/Settings.d.ts.map +1 -0
  201. package/dist/types/src/types/index.d.ts +5 -2
  202. package/dist/types/src/types/index.d.ts.map +1 -1
  203. package/dist/types/src/types/types.d.ts +3 -2
  204. package/dist/types/src/types/types.d.ts.map +1 -1
  205. package/dist/types/src/util.d.ts +8 -5
  206. package/dist/types/src/util.d.ts.map +1 -1
  207. package/dist/types/src/util.test.d.ts +2 -0
  208. package/dist/types/src/util.test.d.ts.map +1 -0
  209. package/dist/types/tsconfig.tsbuildinfo +1 -1
  210. package/package.json +152 -75
  211. package/src/MarkdownPlugin.node.ts +20 -0
  212. package/src/MarkdownPlugin.test.ts +26 -0
  213. package/src/MarkdownPlugin.tsx +34 -104
  214. package/src/MarkdownPlugin.workerd.ts +19 -0
  215. package/src/blueprints/index.ts +5 -0
  216. package/src/blueprints/markdown-blueprint.ts +43 -0
  217. package/src/capabilities/anchor-sort.ts +29 -22
  218. package/src/capabilities/app-graph-serializer.ts +52 -43
  219. package/src/capabilities/artifact-definition.ts +83 -86
  220. package/src/capabilities/blueprint-definition.ts +11 -31
  221. package/src/capabilities/comment-config.ts +32 -0
  222. package/src/capabilities/create-object.ts +30 -0
  223. package/src/capabilities/index.ts +15 -12
  224. package/src/capabilities/node.ts +13 -0
  225. package/src/capabilities/operation-handler.ts +16 -0
  226. package/src/capabilities/react-surface.tsx +102 -68
  227. package/src/capabilities/settings.ts +30 -18
  228. package/src/capabilities/state.ts +41 -25
  229. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  230. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +49 -46
  231. package/src/components/MarkdownEditor/MarkdownEditor.tsx +150 -107
  232. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +72 -37
  233. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +37 -53
  234. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +40 -0
  235. package/src/components/MarkdownSettings/MarkdownSettings.tsx +23 -96
  236. package/src/components/MarkdownSettings/index.ts +1 -1
  237. package/src/components/index.ts +4 -7
  238. package/src/containers/EditableMarkdownCard/EditableMarkdownCard.tsx +42 -0
  239. package/src/containers/EditableMarkdownCard/index.ts +6 -0
  240. package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +135 -0
  241. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +146 -0
  242. package/src/containers/MarkdownArticle/index.ts +6 -0
  243. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +68 -0
  244. package/src/containers/MarkdownCard/MarkdownCard.tsx +67 -0
  245. package/src/containers/MarkdownCard/index.ts +5 -0
  246. package/src/containers/MarkdownCard/snippet.ts +54 -0
  247. package/src/containers/index.ts +11 -0
  248. package/src/hooks/index.ts +1 -2
  249. package/src/hooks/{usePopoverMenuOptions.ts → useEditorMenuOptions.ts} +20 -23
  250. package/src/hooks/useExtensions.tsx +106 -114
  251. package/src/hooks/useLinkQuery.ts +50 -41
  252. package/src/index.ts +2 -5
  253. package/src/meta.ts +7 -4
  254. package/src/operations/create-markdown.ts +19 -0
  255. package/src/operations/create.conversations.json +1 -0
  256. package/src/operations/create.test.ts +96 -0
  257. package/src/operations/create.ts +26 -0
  258. package/src/operations/index.ts +14 -0
  259. package/src/operations/open.ts +25 -0
  260. package/src/operations/scroll-to-anchor.ts +38 -0
  261. package/src/operations/set-view-mode.ts +23 -0
  262. package/src/operations/update-markdown.ts +51 -0
  263. package/src/operations/update.conversations.json +1 -0
  264. package/src/operations/update.test.ts +213 -0
  265. package/src/plugin.ts +11 -0
  266. package/src/testing.ts +29 -0
  267. package/src/translations.ts +26 -35
  268. package/src/types/Markdown.ts +28 -31
  269. package/src/types/MarkdownCapabilities.ts +51 -0
  270. package/src/types/MarkdownEvents.ts +14 -0
  271. package/src/types/MarkdownOperation.ts +122 -0
  272. package/src/types/Settings.ts +65 -0
  273. package/src/types/index.ts +6 -2
  274. package/src/types/types.ts +7 -3
  275. package/src/util.test.ts +44 -0
  276. package/src/util.tsx +81 -13
  277. package/dist/lib/browser/MarkdownCard-SLM6QZYC.mjs +0 -12
  278. package/dist/lib/browser/MarkdownContainer-UZFQC6XY.mjs +0 -15
  279. package/dist/lib/browser/anchor-sort-4XPPLMZS.mjs +0 -32
  280. package/dist/lib/browser/anchor-sort-4XPPLMZS.mjs.map +0 -7
  281. package/dist/lib/browser/app-graph-serializer-QQFV4K6P.mjs +0 -51
  282. package/dist/lib/browser/app-graph-serializer-QQFV4K6P.mjs.map +0 -7
  283. package/dist/lib/browser/blueprint-definition-BC5R3T72.mjs +0 -11
  284. package/dist/lib/browser/chunk-2LLVTQCK.mjs +0 -51
  285. package/dist/lib/browser/chunk-2LLVTQCK.mjs.map +0 -7
  286. package/dist/lib/browser/chunk-3VILQLA4.mjs +0 -95
  287. package/dist/lib/browser/chunk-3VILQLA4.mjs.map +0 -7
  288. package/dist/lib/browser/chunk-5AYTOIUF.mjs +0 -822
  289. package/dist/lib/browser/chunk-5AYTOIUF.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-A3CQYGCN.mjs +0 -56
  291. package/dist/lib/browser/chunk-A3CQYGCN.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +0 -7
  293. package/dist/lib/browser/chunk-GLEYXJX3.mjs +0 -22
  294. package/dist/lib/browser/chunk-GLEYXJX3.mjs.map +0 -7
  295. package/dist/lib/browser/chunk-IBCHVMZW.mjs +0 -16
  296. package/dist/lib/browser/chunk-IBCHVMZW.mjs.map +0 -7
  297. package/dist/lib/browser/chunk-JAETS5LE.mjs +0 -106
  298. package/dist/lib/browser/chunk-JAETS5LE.mjs.map +0 -7
  299. package/dist/lib/browser/chunk-UKTCPHLI.mjs +0 -79
  300. package/dist/lib/browser/chunk-UKTCPHLI.mjs.map +0 -7
  301. package/dist/lib/browser/index.mjs +0 -174
  302. package/dist/lib/browser/index.mjs.map +0 -7
  303. package/dist/lib/browser/intent-resolver-VQGMBNXZ.mjs +0 -62
  304. package/dist/lib/browser/intent-resolver-VQGMBNXZ.mjs.map +0 -7
  305. package/dist/lib/browser/meta.json +0 -1
  306. package/dist/lib/browser/react-surface-WOMJOPJE.mjs +0 -217
  307. package/dist/lib/browser/react-surface-WOMJOPJE.mjs.map +0 -7
  308. package/dist/lib/browser/settings-LBXJHVBU.mjs +0 -28
  309. package/dist/lib/browser/settings-LBXJHVBU.mjs.map +0 -7
  310. package/dist/lib/browser/state-BTUKVZHY.mjs +0 -37
  311. package/dist/lib/browser/state-BTUKVZHY.mjs.map +0 -7
  312. package/dist/lib/browser/toolkit-YPIVDB4A.mjs +0 -66
  313. package/dist/lib/browser/toolkit-YPIVDB4A.mjs.map +0 -7
  314. package/dist/lib/browser/types/index.mjs +0 -10
  315. package/dist/lib/node-esm/MarkdownCard-MCWEFW4F.mjs +0 -13
  316. package/dist/lib/node-esm/MarkdownContainer-KAQOK7K5.mjs +0 -16
  317. package/dist/lib/node-esm/anchor-sort-4SXYVYXT.mjs +0 -33
  318. package/dist/lib/node-esm/anchor-sort-4SXYVYXT.mjs.map +0 -7
  319. package/dist/lib/node-esm/app-graph-serializer-KBVRLQN2.mjs +0 -52
  320. package/dist/lib/node-esm/app-graph-serializer-KBVRLQN2.mjs.map +0 -7
  321. package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs +0 -12
  322. package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs +0 -823
  324. package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-DOB2MJAX.mjs +0 -107
  326. package/dist/lib/node-esm/chunk-DOB2MJAX.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-GGKPPGWA.mjs +0 -24
  328. package/dist/lib/node-esm/chunk-GGKPPGWA.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs +0 -17
  330. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-JELROKGD.mjs +0 -80
  332. package/dist/lib/node-esm/chunk-JELROKGD.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-QH4MC5BE.mjs +0 -52
  334. package/dist/lib/node-esm/chunk-QH4MC5BE.mjs.map +0 -7
  335. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs +0 -29
  336. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-SJ2QRGPM.mjs +0 -57
  338. package/dist/lib/node-esm/chunk-SJ2QRGPM.mjs.map +0 -7
  339. package/dist/lib/node-esm/chunk-YYSASY7X.mjs +0 -96
  340. package/dist/lib/node-esm/chunk-YYSASY7X.mjs.map +0 -7
  341. package/dist/lib/node-esm/index.mjs +0 -175
  342. package/dist/lib/node-esm/index.mjs.map +0 -7
  343. package/dist/lib/node-esm/intent-resolver-Q4XVI5EX.mjs +0 -63
  344. package/dist/lib/node-esm/intent-resolver-Q4XVI5EX.mjs.map +0 -7
  345. package/dist/lib/node-esm/meta.json +0 -1
  346. package/dist/lib/node-esm/react-surface-FAMZTAXK.mjs +0 -218
  347. package/dist/lib/node-esm/react-surface-FAMZTAXK.mjs.map +0 -7
  348. package/dist/lib/node-esm/settings-2YRA67H6.mjs +0 -29
  349. package/dist/lib/node-esm/settings-2YRA67H6.mjs.map +0 -7
  350. package/dist/lib/node-esm/state-K6EH7SRZ.mjs +0 -38
  351. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +0 -7
  352. package/dist/lib/node-esm/toolkit-36BFLIR3.mjs +0 -67
  353. package/dist/lib/node-esm/toolkit-36BFLIR3.mjs.map +0 -7
  354. package/dist/lib/node-esm/types/index.mjs +0 -11
  355. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  356. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  357. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  358. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  359. package/dist/types/src/capabilities/toolkit.d.ts +0 -20
  360. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  361. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  362. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  363. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  364. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  365. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  366. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  367. package/dist/types/src/components/MarkdownContainer.d.ts +0 -14
  368. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  369. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -58
  370. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  371. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  372. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  373. package/dist/types/src/events.d.ts +0 -4
  374. package/dist/types/src/events.d.ts.map +0 -1
  375. package/dist/types/src/functions/diff.d.ts +0 -6
  376. package/dist/types/src/functions/diff.d.ts.map +0 -1
  377. package/dist/types/src/functions/index.d.ts +0 -3
  378. package/dist/types/src/functions/index.d.ts.map +0 -1
  379. package/dist/types/src/functions/open.d.ts +0 -7
  380. package/dist/types/src/functions/open.d.ts.map +0 -1
  381. package/dist/types/src/hooks/usePopoverMenuOptions.d.ts +0 -9
  382. package/dist/types/src/hooks/usePopoverMenuOptions.d.ts.map +0 -1
  383. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  384. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  385. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  386. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  387. package/src/capabilities/capabilities.ts +0 -22
  388. package/src/capabilities/intent-resolver.ts +0 -58
  389. package/src/capabilities/toolkit.ts +0 -53
  390. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  391. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -85
  392. package/src/components/MarkdownCard/index.ts +0 -9
  393. package/src/components/MarkdownContainer.stories.tsx +0 -137
  394. package/src/components/MarkdownContainer.tsx +0 -121
  395. package/src/components/Suggestions.stories.tsx +0 -219
  396. package/src/events.ts +0 -11
  397. package/src/functions/diff.ts +0 -37
  398. package/src/functions/index.ts +0 -6
  399. package/src/functions/open.ts +0 -32
  400. package/src/hooks/useSelectCurrentThread.tsx +0 -56
  401. package/src/types/MarkdownAction.ts +0 -29
  402. /package/dist/lib/{browser/MarkdownCard-SLM6QZYC.mjs.map → neutral/MarkdownPlugin.mjs.map} +0 -0
  403. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  404. /package/dist/lib/{browser/MarkdownContainer-UZFQC6XY.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  405. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  406. /package/dist/lib/{browser/blueprint-definition-BC5R3T72.mjs.map → neutral/meta.mjs.map} +0 -0
  407. /package/dist/lib/{node-esm/MarkdownCard-MCWEFW4F.mjs.map → neutral/operations/index.mjs.map} +0 -0
  408. /package/dist/lib/{node-esm/MarkdownContainer-KAQOK7K5.mjs.map → neutral/types/index.mjs.map} +0 -0
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorState } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+
8
+ export type SnippetOptions = {
9
+ /** Maximum height of the editor in pixels. Overflowing content is hidden. */
10
+ height: number;
11
+ /** Zoom factor applied to the editor (e.g. 0.5 renders at 50%). @default 1 */
12
+ scale?: number;
13
+ };
14
+
15
+ /**
16
+ * CodeMirror extension for rendering a non-scrollable snippet of editor content.
17
+ * Constrains the editor to the given height via CSS `max-height`, wraps long
18
+ * lines (`pre-wrap`), and disables scrolling entirely.
19
+ *
20
+ * NOTE: Uses CSS `zoom` rather than `transform: scale` because `zoom` affects
21
+ * layout, so line wrapping fills the full visual width of the container.
22
+ * `transform: scale` only scales paint output, leaving empty space on the right.
23
+ */
24
+ export const snippet = ({ height, scale = 1 }: SnippetOptions) => {
25
+ return [
26
+ EditorState.readOnly.of(true),
27
+ EditorView.editable.of(false),
28
+ EditorState.transactionFilter.of((tr) => {
29
+ if (tr.selection) {
30
+ return [];
31
+ } // Drop any selection changes.
32
+ return tr;
33
+ }),
34
+ EditorView.theme({
35
+ // Outer editor element: clip to the caller-specified height.
36
+ '&': {
37
+ maxHeight: `${height}px`,
38
+ overflow: 'hidden',
39
+ },
40
+ '.cm-scroller': {
41
+ // Prevent scroll; scale up the inner clip so the final pixel height matches `height`.
42
+ maxHeight: `${height / scale}px`,
43
+ overflow: 'hidden !important',
44
+ padding: '0',
45
+ },
46
+ '.cm-content': {
47
+ // zoom (unlike transform: scale) affects layout, so line-wrapping fills the full visual width of the container.
48
+ zoom: scale,
49
+ margin: '0',
50
+ padding: '0',
51
+ },
52
+ }),
53
+ ];
54
+ };
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export type { MarkdownArticleProps } from './MarkdownArticle';
8
+
9
+ export const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));
10
+ export const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));
11
+ export const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));
@@ -2,7 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './useEditorMenuOptions';
5
6
  export * from './useExtensions';
6
7
  export * from './useLinkQuery';
7
- export * from './usePopoverMenuOptions';
8
- export * from './useSelectCurrentThread';
@@ -5,31 +5,32 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
  import { useCallback, useMemo, useRef } from 'react';
7
7
 
8
- import { Domino, toLocalizedString, useTranslation } from '@dxos/react-ui';
8
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
9
9
  import {
10
- type PopoverMenuGroup,
11
- type UsePopoverMenuProps,
10
+ type EditorMenuGroup,
11
+ type UseEditorMenuProps,
12
12
  filterMenuGroups,
13
13
  formattingCommands,
14
14
  linkSlashCommands,
15
15
  } from '@dxos/react-ui-editor';
16
+ import { Domino } from '@dxos/ui';
16
17
 
17
- import { meta } from '../meta';
18
+ import { meta } from '#meta';
18
19
 
19
- export type UsePopoverMenuOptionsProps = {
20
+ export type UseEditorMenuOptionsProps = {
20
21
  editorView?: EditorView;
21
- slashCommandGroups?: PopoverMenuGroup[];
22
- onLinkQuery?: (query?: string) => Promise<PopoverMenuGroup[]>;
22
+ slashCommandGroups?: EditorMenuGroup[];
23
+ onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;
23
24
  };
24
25
 
25
- export const usePopoverMenuOptions = ({
26
+ export const useEditorMenuOptions = ({
26
27
  editorView,
27
28
  slashCommandGroups,
28
29
  onLinkQuery,
29
- }: UsePopoverMenuOptionsProps): UsePopoverMenuProps => {
30
+ }: UseEditorMenuOptionsProps): UseEditorMenuProps => {
30
31
  const { t } = useTranslation(meta.id);
31
32
 
32
- const getMenu = useCallback<NonNullable<UsePopoverMenuProps['getMenu']>>(
33
+ const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
33
34
  ({ text, trigger }) => {
34
35
  switch (trigger) {
35
36
  case '@': {
@@ -48,22 +49,18 @@ export const usePopoverMenuOptions = ({
48
49
  );
49
50
 
50
51
  const viewRef = useRef(editorView);
51
- return useMemo<UsePopoverMenuProps>(() => {
52
+ return useMemo<UseEditorMenuProps>(() => {
52
53
  const trigger = onLinkQuery ? ['/', '@'] : ['/'];
53
54
  const placeholder = {
54
55
  delay: 3_000,
55
- content: () =>
56
- Domino.of('div')
57
- .children(
58
- Domino.of('span').text('Press'),
59
- ...trigger.map((text) =>
60
- Domino.of('span')
61
- .classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm')
62
- .text(text),
63
- ),
64
- Domino.of('span').text('for commands.'),
65
- )
66
- .build(),
56
+ content: () => {
57
+ const pressEl = Domino.of('span').text('Press');
58
+ const triggerEls = trigger.map((text) =>
59
+ Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),
60
+ );
61
+ const forCommandsEl = Domino.of('span').text('for commands.');
62
+ return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;
63
+ },
67
64
  };
68
65
 
69
66
  return { viewRef, getMenu, trigger, placeholder };
@@ -3,27 +3,26 @@
3
3
  //
4
4
 
5
5
  import { type ViewUpdate } from '@codemirror/view';
6
- import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
7
- import { createRoot } from 'react-dom/client';
6
+ import { useMemo } from 'react';
8
7
 
9
- import { LayoutAction, type PromiseIntentDispatcher, createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { fromUrlPath } from '@dxos/app-toolkit';
10
9
  import { debounceAndThrottle } from '@dxos/async';
11
10
  import { Obj } from '@dxos/echo';
11
+ import { createDocAccessor } from '@dxos/echo-db';
12
12
  import { invariant } from '@dxos/invariant';
13
- import { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';
14
- import { getSpace } from '@dxos/react-client/echo';
13
+ import { getSpace, useObject } from '@dxos/react-client/echo';
15
14
  import { useIdentity } from '@dxos/react-client/halo';
16
- import { Icon, ThemeProvider } from '@dxos/react-ui';
15
+ import { useThemeContext } from '@dxos/react-ui';
17
16
  import { type SelectionManager } from '@dxos/react-ui-attention';
17
+ import { Text } from '@dxos/schema';
18
+ import { Domino } from '@dxos/ui';
18
19
  import {
19
20
  Cursor,
20
21
  type EditorStateStore,
21
22
  EditorView,
22
- type EditorViewMode,
23
23
  type Extension,
24
24
  InputModeExtensions,
25
25
  type PreviewOptions,
26
- type RenderCallback,
27
26
  createDataExtensions,
28
27
  decorateMarkdown,
29
28
  documentId,
@@ -32,27 +31,32 @@ import {
32
31
  linkTooltip,
33
32
  listener,
34
33
  preview,
34
+ replacer,
35
35
  selectionState,
36
- typewriter,
37
- } from '@dxos/react-ui-editor';
38
- import { defaultTx } from '@dxos/react-ui-theme';
39
- import { DataType } from '@dxos/schema';
40
- import { isTruthy } from '@dxos/util';
36
+ snippets,
37
+ } from '@dxos/ui-editor';
38
+ import { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';
39
+ import { isTruthy, safeUrl } from '@dxos/util';
40
+
41
+ import { Markdown } from '#types';
41
42
 
42
- import { Markdown } from '../types';
43
43
  import { setFallbackName } from '../util';
44
44
 
45
- export type DocumentType = Markdown.Document | DataType.Text | { id: string; text: string };
45
+ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
46
46
 
47
47
  export type ExtensionsOptions = {
48
48
  id: string;
49
49
  object?: DocumentType;
50
- dispatch?: PromiseIntentDispatcher;
51
50
  settings?: Markdown.Settings;
52
- selectionManager?: SelectionManager;
51
+ compact?: boolean;
53
52
  viewMode?: EditorViewMode;
53
+ editable?: boolean;
54
+ selectionManager?: SelectionManager;
54
55
  editorStateStore?: EditorStateStore;
55
56
  previewOptions?: PreviewOptions;
57
+ platform?: 'mobile' | 'desktop';
58
+ /** Callback when an internal link is clicked. */
59
+ onSelectObject?: (objectId: string) => void;
56
60
  };
57
61
 
58
62
  // TODO(burdon): Merge with createBaseExtensions below.
@@ -60,21 +64,23 @@ export const useExtensions = ({
60
64
  id,
61
65
  object,
62
66
  settings,
63
- selectionManager,
67
+ compact,
64
68
  viewMode,
69
+ selectionManager,
65
70
  editorStateStore,
66
71
  previewOptions,
72
+ onSelectObject,
67
73
  }: ExtensionsOptions): Extension[] => {
68
- const { dispatchPromise: dispatch } = useIntentDispatcher();
74
+ const { platform } = useThemeContext();
69
75
  const identity = useIdentity();
70
76
  const space = getSpace(object);
71
77
 
72
- let target: Obj.Any | undefined;
73
- if (Obj.instanceOf(Markdown.Document, object)) {
74
- target = (object as Markdown.Document).content.target;
75
- } else if (Obj.instanceOf(DataType.Text, object)) {
76
- target = object;
77
- }
78
+ // Get the content reference from Document objects.
79
+ const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;
80
+ // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).
81
+ useObject(contentRef);
82
+ // Get the actual live object target via .target (needed for createDocAccessor).
83
+ const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);
78
84
 
79
85
  // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
80
86
  // TODO(burdon): Unsubscribe.
@@ -87,24 +93,27 @@ export const useExtensions = ({
87
93
  id,
88
94
  object,
89
95
  settings,
90
- selectionManager,
96
+ compact,
91
97
  viewMode,
98
+ selectionManager,
92
99
  previewOptions,
93
- dispatch,
100
+ platform,
101
+ onSelectObject,
94
102
  }),
95
103
  [
96
104
  id,
97
105
  object,
106
+ compact,
98
107
  viewMode,
99
- dispatch,
108
+ selectionManager,
100
109
  previewOptions,
101
110
  settings,
102
111
  settings?.debug,
103
112
  settings?.editorInputMode,
104
113
  settings?.folding,
105
114
  settings?.numberedHeadings,
106
- settings?.typewriter,
107
- selectionManager,
115
+ platform,
116
+ onSelectObject,
108
117
  ],
109
118
  );
110
119
 
@@ -113,7 +122,13 @@ export const useExtensions = ({
113
122
  [
114
123
  // TODO(burdon): Pass this in?
115
124
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
116
- target && createDataExtensions({ id, text: createDocAccessor(target, ['content']), space, identity }),
125
+ target &&
126
+ createDataExtensions({
127
+ id,
128
+ text: createDocAccessor(target, ['content']),
129
+ messenger: space,
130
+ identity,
131
+ }),
117
132
 
118
133
  // TODO(burdon): Reconcile with effect in parent.
119
134
  Obj.instanceOf(Markdown.Document, object) &&
@@ -136,16 +151,18 @@ export const useExtensions = ({
136
151
  const createBaseExtensions = ({
137
152
  id,
138
153
  object,
139
- dispatch,
154
+ onSelectObject,
140
155
  settings,
141
- selectionManager,
156
+ compact,
142
157
  viewMode,
158
+ selectionManager,
143
159
  previewOptions,
160
+ platform,
144
161
  }: ExtensionsOptions): Extension[] => {
145
162
  const extensions: Extension[] = [
146
163
  selectionManager && selectionChange(selectionManager),
147
164
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
148
- settings?.folding && folding(),
165
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
149
166
  ].filter(isTruthy);
150
167
 
151
168
  //
@@ -158,33 +175,20 @@ const createBaseExtensions = ({
158
175
  decorateMarkdown({
159
176
  selectionChangeDelay: 100,
160
177
  numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
161
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
162
- // TODO(burdon): Create dx-tag.
163
- renderLinkButton:
164
- dispatch && (object || id)
165
- ? createLinkRenderer((id: string) => {
166
- void dispatch(
167
- createIntent(LayoutAction.Open, {
168
- part: 'main',
169
- subject: [id],
170
- options: {
171
- pivotId: object ? fullyQualifiedId(object) : id,
172
- },
173
- }),
174
- );
175
- })
176
- : undefined,
178
+ // TODO(wittjosiah): For internal links render the label of the object.
179
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
177
180
  }),
178
181
  linkTooltip(renderLinkTooltip),
179
182
  preview(previewOptions),
183
+ replacer(),
180
184
  ],
181
185
  );
182
186
  }
183
187
 
184
188
  if (settings?.debug) {
185
- const items = settings.typewriter?.split(/[,\n]/) ?? '';
189
+ const items = settings.snippets?.split(/[,\n]/) ?? '';
186
190
  if (items) {
187
- extensions.push(typewriter({ items }));
191
+ extensions.push(snippets({ items }));
188
192
  }
189
193
  }
190
194
 
@@ -192,79 +196,67 @@ const createBaseExtensions = ({
192
196
  };
193
197
 
194
198
  const selectionChange = (selectionManager: SelectionManager) => {
195
- return EditorView.updateListener.of(
196
- debounceAndThrottle((update: ViewUpdate) => {
197
- if (update.selectionSet) {
198
- const id = update.state.facet(documentId);
199
- const cursorConverter = update.state.facet(Cursor.converter);
200
- const selection = update.state.selection;
201
- const ranges = selection.ranges
202
- .map((range) => ({
203
- from: cursorConverter.toCursor(range.from),
204
- to: cursorConverter.toCursor(range.to),
205
- }))
206
- .filter(({ from, to }) => to > from);
199
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
200
+ const id = update.state.facet(documentId);
201
+ const cursorConverter = update.state.facet(Cursor.converter);
202
+ const selection = update.state.selection;
203
+ const ranges = selection.ranges
204
+ .map((range) => ({
205
+ from: cursorConverter.toCursor(range.from),
206
+ to: cursorConverter.toCursor(range.to),
207
+ }))
208
+ .filter(({ from, to }) => to > from);
207
209
 
208
- selectionManager.updateMultiRange(id, ranges);
209
- }
210
- }, 100),
211
- );
212
- };
210
+ selectionManager.updateMultiRange(id, ranges);
211
+ }, 100);
213
212
 
214
- // TODO(burdon): Factor out styles.
215
- const style = {
216
- hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
217
- icon: 'inline-block leading-none mis-1 cursor-pointer',
213
+ return EditorView.updateListener.of((update: ViewUpdate) => {
214
+ if (update.selectionSet) {
215
+ debouncedHandler(update);
216
+ }
217
+ });
218
218
  };
219
219
 
220
- const createLinkRenderer =
220
+ const createRenderLink =
221
221
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
222
222
  (el, { url }) => {
223
223
  // TODO(burdon): Formalize/document internal link format.
224
- const isInternal =
225
- url.startsWith('/') ||
226
- // TODO(wittjosiah): This should probably be parsed out on paste?
227
- url.startsWith(window.location.origin);
224
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
225
+ const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;
226
+ const icon = Domino.of('span')
227
+ .classNames('dx-link ms-1 inline-block align-[-0.125em]')
228
+ .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
228
229
 
229
- const options: AnchorHTMLAttributes<any> = isInternal
230
- ? {
231
- onClick: () => {
232
- const qualifiedId = url.split('/').at(-1);
233
- invariant(qualifiedId, 'Invalid link format.');
234
- onSelectObject(qualifiedId);
235
- },
236
- }
237
- : {
238
- href: url,
239
- rel: 'noreferrer',
240
- target: '_blank',
241
- };
230
+ if (isInternal) {
231
+ invariant(qualifiedId, 'Invalid link format.');
232
+ icon
233
+ .attributes({ role: 'button', tabindex: '0' })
234
+ .on('click', (event) => {
235
+ event.preventDefault();
236
+ event.stopPropagation();
237
+ onSelectObject(qualifiedId);
238
+ })
239
+ .on('keydown', (event) => {
240
+ const keyboardEvent = event as KeyboardEvent;
241
+ if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {
242
+ return;
243
+ }
242
244
 
243
- renderRoot(
244
- el,
245
- <a {...options} className={style.hover}>
246
- <Icon
247
- icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
248
- size={4}
249
- classNames={style.icon}
250
- />
251
- </a>,
252
- );
245
+ keyboardEvent.preventDefault();
246
+ keyboardEvent.stopPropagation();
247
+ onSelectObject(qualifiedId);
248
+ });
249
+ }
250
+
251
+ el.appendChild(icon.root);
253
252
  };
254
253
 
255
254
  const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
256
- const web = new URL(url);
257
- renderRoot(
258
- el,
259
- <a href={url} rel='noreferrer' target='_blank' className={style.hover}>
260
- {web.origin}
261
- <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />
262
- </a>,
255
+ el.appendChild(
256
+ Domino.of('a')
257
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
258
+ .classNames('dx-link flex items-center gap-2')
259
+ .text(safeUrl(url)?.toString() ?? url)
260
+ .append(Domino.svg('ph--arrow-square-out--regular')).root,
263
261
  );
264
262
  };
265
-
266
- // TODO(burdon): REMOVE.
267
- const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
268
- createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
269
- return root;
270
- };
@@ -2,68 +2,56 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import * as Option from 'effect/Option';
5
6
  import { useCallback, useMemo } from 'react';
6
7
 
7
- import { Capabilities, useCapabilities, usePluginManager } from '@dxos/app-framework';
8
- import { Filter, Obj, Query, Type } from '@dxos/echo';
9
- import { ClientCapabilities } from '@dxos/plugin-client';
10
- import { SpaceCapabilities } from '@dxos/plugin-space';
11
- import { type Space } from '@dxos/react-client/echo';
12
- import { toLocalizedString, useTranslation } from '@dxos/react-ui';
13
- import { type PopoverMenuGroup, type PopoverMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
8
+ import { Annotation, type Database, Filter, Obj, Query, Type } from '@dxos/echo';
9
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
10
+ import { type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
+ import { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';
12
+ import { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';
14
13
 
15
- export const useLinkQuery = (space: Space | undefined) => {
16
- const { t } = useTranslation();
14
+ import { Markdown } from '../types';
17
15
 
18
- const manager = usePluginManager();
19
- const resolve = useCallback(
20
- (typename: string) =>
21
- manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
22
- [manager],
23
- );
16
+ export const useLinkQuery = (db: Database.Database | undefined) => {
17
+ const { t } = useTranslation();
24
18
 
25
- const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
26
- const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
27
19
  const filter = useMemo(
28
20
  () =>
29
21
  Filter.or(
30
- ...objectForms.map((form) => Filter.type(form.objectSchema)),
31
- ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema))),
22
+ ...(db?.schemaRegistry.query({ location: ['database', 'runtime'] }).runSync() ?? [])
23
+ .filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation)
24
+ .filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
25
+ .map((schema) => Filter.typename(Type.getTypename(schema))),
32
26
  ),
33
- [objectForms, schemaWhiteList],
27
+ [db],
34
28
  );
35
29
 
36
30
  const handleLinkQuery = useCallback(
37
- async (query?: string): Promise<PopoverMenuGroup[]> => {
31
+ async (query?: string): Promise<EditorMenuGroup[]> => {
32
+ // A second "@" switches the link query into block-embed mode, so "@@foo" searches for "foo".
38
33
  const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
39
- const results = await space?.db.query(Query.select(filter)).run();
34
+ const results = await db?.query(Query.select(filter)).run();
40
35
 
41
- // TODO(wittjosiah): Use `Obj.Any` type.
42
- const getLabel = (object: any) => {
43
- const label = Obj.getLabel(object);
44
- if (label) {
45
- return label;
46
- }
47
-
48
- // TODO(wittjosiah): Remove metadata labels.
36
+ const getLabel = (object: Obj.Unknown): Label => {
49
37
  const type = Obj.getTypename(object)!;
50
- const metadata = resolve(type);
51
- return metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New object' }];
38
+ return Obj.getLabel(object) ?? ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];
52
39
  };
53
40
 
54
41
  const items =
55
- results?.objects
56
- .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
57
- // TODO(wittjosiah): Remove `any` type.
58
- .map((object: any): PopoverMenuItem => {
59
- const metadata = resolve(Obj.getTypename(object)!);
42
+ results
43
+ ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
44
+ .map((object: Obj.Unknown): EditorMenuItem => {
45
+ const schema = Obj.getSchema(object);
46
+ const icon = schema ? Option.getOrUndefined(Annotation.IconAnnotation.get(schema))?.icon : undefined;
60
47
  const label = toLocalizedString(getLabel(object), t);
61
48
  return {
62
49
  id: object.id,
63
50
  label,
64
- icon: metadata.icon,
65
- onSelect: (view, head) => {
51
+ icon,
52
+ onSelect: ({ view, head }) => {
66
53
  const link = `[${label}](${Obj.getDXN(object)})`;
54
+ // "@@" inserts a block embed on its own line instead of an inline link.
67
55
  if (query?.startsWith('@')) {
68
56
  insertAtLineStart(view, head, `!${link}\n`);
69
57
  } else {
@@ -73,9 +61,30 @@ export const useLinkQuery = (space: Space | undefined) => {
73
61
  };
74
62
  }) ?? [];
75
63
 
76
- return [{ id: 'echo', items }];
64
+ // Add "Create new document" option at the end.
65
+ const createItem: EditorMenuItem = {
66
+ id: 'create-document',
67
+ label: ['add-object.label', { ns: Markdown.Document.typename }],
68
+ icon: 'ph--plus--regular',
69
+ onSelect: ({ view, head }) => {
70
+ const doc = Markdown.make({ name: name || undefined });
71
+ db?.add(doc);
72
+ const label = name || t('object-name.placeholder', { ns: Markdown.Document.typename });
73
+ const link = `[${label}](${Obj.getDXN(doc)})`;
74
+ if (query?.startsWith('@')) {
75
+ insertAtLineStart(view, head, `!${link}\n`);
76
+ } else {
77
+ insertAtCursor(view, head, `${link} `);
78
+ }
79
+ },
80
+ };
81
+
82
+ return [
83
+ { id: 'echo', items },
84
+ { id: 'create', items: [createItem] },
85
+ ];
77
86
  },
78
- [space, filter, resolve],
87
+ [db, filter, t],
79
88
  );
80
89
 
81
90
  return handleLinkQuery;
package/src/index.ts CHANGED
@@ -2,11 +2,8 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { MarkdownCapabilities } from './capabilities';
6
- export { MarkdownEvents } from './events';
7
-
5
+ export * from './blueprints';
8
6
  export * from './meta';
7
+ export * from './operations';
9
8
  export * from './types';
10
9
  export * from './util';
11
-
12
- export * from './MarkdownPlugin';