@dxos/plugin-markdown 0.9.1-main.c7dcc2e112 → 0.9.1-staging.ee54ba693a

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 (215) hide show
  1. package/dist/lib/neutral/{MarkdownArticle-I4UMD7AA.mjs → MarkdownArticle-ZHBXH7YF.mjs} +3 -5
  2. package/dist/lib/neutral/{MarkdownArticle-I4UMD7AA.mjs.map → MarkdownArticle-ZHBXH7YF.mjs.map} +2 -2
  3. package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs → MarkdownCard-2HUXCGZP.mjs} +2 -2
  4. package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs.map → MarkdownCard-2HUXCGZP.mjs.map} +1 -1
  5. package/dist/lib/neutral/MarkdownPlugin.mjs +3 -7
  6. package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
  7. package/dist/lib/neutral/MarkdownPlugin.node.mjs +4 -2
  8. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +3 -3
  9. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs +6 -17
  10. package/dist/lib/neutral/MarkdownPlugin.workerd.mjs.map +4 -4
  11. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs +43 -0
  12. package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs.map +7 -0
  13. package/dist/lib/neutral/{anchor-sort-UXN4RHFX.mjs → anchor-sort-QF7UDG2A.mjs} +4 -3
  14. package/dist/lib/neutral/anchor-sort-QF7UDG2A.mjs.map +7 -0
  15. package/dist/lib/neutral/capabilities/index.mjs +9 -13
  16. package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
  17. package/dist/lib/neutral/capabilities/node.mjs +5 -3
  18. package/dist/lib/neutral/capabilities/node.mjs.map +3 -3
  19. package/dist/lib/neutral/chunk-2V6A5NDQ.mjs +8 -0
  20. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs → chunk-ANHHOTCD.mjs} +3 -4
  21. package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs.map → chunk-ANHHOTCD.mjs.map} +1 -1
  22. package/dist/lib/neutral/chunk-CNYFGIDS.mjs +32 -0
  23. package/dist/lib/neutral/chunk-CNYFGIDS.mjs.map +7 -0
  24. package/dist/lib/neutral/{chunk-LXNSKCPD.mjs → chunk-EV4ZOL4P.mjs} +12 -11
  25. package/dist/lib/neutral/chunk-EV4ZOL4P.mjs.map +7 -0
  26. package/dist/lib/neutral/{chunk-GUXWFDD4.mjs → chunk-OC3JD73N.mjs} +2 -2
  27. package/dist/lib/neutral/{chunk-GUXWFDD4.mjs.map → chunk-OC3JD73N.mjs.map} +1 -1
  28. package/dist/lib/neutral/chunk-YJF6XOXX.mjs +175 -0
  29. package/dist/lib/neutral/chunk-YJF6XOXX.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-YMBC62S7.mjs +14 -0
  31. package/dist/lib/neutral/chunk-YMBC62S7.mjs.map +7 -0
  32. package/dist/lib/neutral/{chunk-CRKAIDRD.mjs → chunk-ZJ3GWRUJ.mjs} +15 -14
  33. package/dist/lib/neutral/chunk-ZJ3GWRUJ.mjs.map +7 -0
  34. package/dist/lib/neutral/{comment-config-EGY7RPPW.mjs → comment-config-M5OGFULS.mjs} +6 -4
  35. package/dist/lib/neutral/comment-config-M5OGFULS.mjs.map +7 -0
  36. package/dist/lib/neutral/components/index.mjs +13 -52
  37. package/dist/lib/neutral/components/index.mjs.map +4 -4
  38. package/dist/lib/neutral/containers/index.mjs +5 -3
  39. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  40. package/dist/lib/neutral/{create-XW2FQNLK.mjs → create-OQUMKL5I.mjs} +2 -2
  41. package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs → create-markdown-4O5FDA77.mjs} +2 -2
  42. package/dist/lib/neutral/{create-object-3WMEQJ2C.mjs → create-object-RSEWTCMM.mjs} +2 -6
  43. package/dist/lib/neutral/create-object-RSEWTCMM.mjs.map +7 -0
  44. package/dist/lib/neutral/hooks/index.mjs +41 -15
  45. package/dist/lib/neutral/hooks/index.mjs.map +3 -3
  46. package/dist/lib/neutral/index.mjs +10 -16
  47. package/dist/lib/neutral/meta.json +1 -1
  48. package/dist/lib/neutral/meta.mjs +1 -1
  49. package/dist/lib/neutral/{open-F7KLNKVN.mjs → open-BAZIRXII.mjs} +2 -2
  50. package/dist/lib/neutral/operation-handler-SDCXGMGK.mjs +8 -0
  51. package/dist/lib/neutral/operations/index.mjs +1 -1
  52. package/dist/lib/neutral/plugin.mjs +2 -2
  53. package/dist/lib/neutral/plugin.workerd.mjs +12 -0
  54. package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
  55. package/dist/lib/neutral/{react-surface-6LX4ZQ2H.mjs → react-surface-37GL3UVG.mjs} +4 -4
  56. package/dist/lib/neutral/react-surface-37GL3UVG.mjs.map +7 -0
  57. package/dist/lib/neutral/{scroll-to-anchor-ACND3WJU.mjs → scroll-to-anchor-I6HFE5AH.mjs} +2 -2
  58. package/dist/lib/neutral/{set-view-mode-WDC7CAEC.mjs → set-view-mode-NY5OYYIM.mjs} +2 -2
  59. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs +8 -0
  60. package/dist/lib/neutral/skill-definition-ET7BYY47.mjs.map +7 -0
  61. package/dist/lib/neutral/skills/index.mjs +8 -0
  62. package/dist/lib/neutral/skills/index.mjs.map +7 -0
  63. package/dist/lib/neutral/{state-ZYT3JRWT.mjs → state-3BR7L6CW.mjs} +1 -1
  64. package/dist/lib/neutral/{state-ZYT3JRWT.mjs.map → state-3BR7L6CW.mjs.map} +2 -2
  65. package/dist/lib/neutral/types/index.mjs +1 -1
  66. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs +24 -0
  67. package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs.map +7 -0
  68. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  69. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -1
  70. package/dist/types/src/MarkdownPlugin.workerd.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/anchor-sort.d.ts +1 -2
  72. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/comment-config.d.ts +1 -2
  74. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/create-object.d.ts +1 -7
  76. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/index.d.ts +1 -3
  79. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/node.d.ts +1 -0
  81. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  83. package/dist/types/src/capabilities/settings.d.ts +1 -2
  84. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  86. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/state.d.ts +1 -2
  88. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  89. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +3 -4
  90. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -2
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts +17 -0
  94. package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts.map +1 -0
  95. package/dist/types/src/components/PreviewComponent/index.d.ts +2 -0
  96. package/dist/types/src/components/PreviewComponent/index.d.ts.map +1 -0
  97. package/dist/types/src/components/index.d.ts +1 -2
  98. package/dist/types/src/components/index.d.ts.map +1 -1
  99. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +2 -13
  100. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
  101. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts +1 -1
  102. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  103. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -1
  104. package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts.map +1 -1
  105. package/dist/types/src/containers/index.d.ts +1 -0
  106. package/dist/types/src/containers/index.d.ts.map +1 -1
  107. package/dist/types/src/hooks/useExtensions.d.ts +3 -3
  108. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  110. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  111. package/dist/types/src/index.d.ts +1 -2
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +4 -0
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/operations/update-markdown.d.ts.map +1 -1
  116. package/dist/types/src/plugin.workerd.d.ts +2 -0
  117. package/dist/types/src/plugin.workerd.d.ts.map +1 -0
  118. package/dist/types/src/skills/index.d.ts +2 -0
  119. package/dist/types/src/skills/index.d.ts.map +1 -0
  120. package/dist/types/src/skills/markdown-skill.d.ts +4 -0
  121. package/dist/types/src/skills/markdown-skill.d.ts.map +1 -0
  122. package/dist/types/src/types/Markdown.d.ts +12 -20
  123. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  124. package/dist/types/src/types/MarkdownOperation.d.ts +5 -28
  125. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -1
  126. package/dist/types/src/types/types.d.ts +2 -0
  127. package/dist/types/src/types/types.d.ts.map +1 -1
  128. package/dist/types/tsconfig.tsbuildinfo +1 -1
  129. package/dx.config.ts +1 -1
  130. package/package.json +66 -59
  131. package/src/MarkdownPlugin.node.ts +2 -1
  132. package/src/MarkdownPlugin.tsx +2 -6
  133. package/src/MarkdownPlugin.workerd.ts +5 -2
  134. package/src/capabilities/anchor-sort.ts +3 -2
  135. package/src/capabilities/comment-config.ts +6 -9
  136. package/src/capabilities/create-object.ts +1 -4
  137. package/src/capabilities/editor-view-state.ts +1 -1
  138. package/src/capabilities/index.ts +1 -3
  139. package/src/capabilities/node.ts +1 -0
  140. package/src/capabilities/react-surface.tsx +9 -3
  141. package/src/capabilities/skill-definition.ts +14 -0
  142. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +72 -30
  143. package/src/components/MarkdownEditor/MarkdownEditor.tsx +11 -37
  144. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +3 -3
  145. package/src/components/PreviewComponent/PreviewComponent.tsx +195 -0
  146. package/src/components/PreviewComponent/index.ts +5 -0
  147. package/src/components/index.ts +1 -4
  148. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +3 -3
  149. package/src/containers/MarkdownCard/MarkdownCard.tsx +1 -1
  150. package/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.tsx +1 -1
  151. package/src/containers/MarkdownSettings/MarkdownSettings.tsx +54 -0
  152. package/src/containers/index.ts +1 -0
  153. package/src/hooks/useEditorMenuOptions.ts +1 -1
  154. package/src/hooks/useExtensions.tsx +32 -12
  155. package/src/hooks/useLinkQuery.ts +5 -3
  156. package/src/index.ts +1 -2
  157. package/src/operations/create.conversations.json +1 -1
  158. package/src/operations/create.test.ts +5 -12
  159. package/src/operations/update-markdown.ts +7 -27
  160. package/src/operations/update.conversations.json +1 -1
  161. package/src/operations/update.test.ts +86 -16
  162. package/src/plugin.workerd.ts +5 -0
  163. package/src/skills/index.ts +5 -0
  164. package/src/{blueprints/markdown-blueprint.ts → skills/markdown-skill.ts} +8 -7
  165. package/src/types/Markdown.ts +19 -18
  166. package/src/types/MarkdownOperation.ts +11 -5
  167. package/src/types/types.ts +2 -7
  168. package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs +0 -32
  169. package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs.map +0 -7
  170. package/dist/lib/neutral/anchor-sort-UXN4RHFX.mjs.map +0 -7
  171. package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs +0 -66
  172. package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs.map +0 -7
  173. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs +0 -15
  174. package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs.map +0 -7
  175. package/dist/lib/neutral/blueprints/index.mjs +0 -8
  176. package/dist/lib/neutral/chunk-4ULSRZRL.mjs +0 -10
  177. package/dist/lib/neutral/chunk-4ULSRZRL.mjs.map +0 -7
  178. package/dist/lib/neutral/chunk-BL46CERY.mjs +0 -8
  179. package/dist/lib/neutral/chunk-CRKAIDRD.mjs.map +0 -7
  180. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +0 -7
  181. package/dist/lib/neutral/comment-config-EGY7RPPW.mjs.map +0 -7
  182. package/dist/lib/neutral/create-object-3WMEQJ2C.mjs.map +0 -7
  183. package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs +0 -14
  184. package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs.map +0 -7
  185. package/dist/lib/neutral/react-surface-6LX4ZQ2H.mjs.map +0 -7
  186. package/dist/lib/neutral/update-markdown-FGVN3LD4.mjs +0 -44
  187. package/dist/lib/neutral/update-markdown-FGVN3LD4.mjs.map +0 -7
  188. package/dist/types/src/blueprints/index.d.ts +0 -2
  189. package/dist/types/src/blueprints/index.d.ts.map +0 -1
  190. package/dist/types/src/blueprints/markdown-blueprint.d.ts +0 -4
  191. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +0 -1
  192. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
  193. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  194. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
  195. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  196. package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -6
  197. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
  198. package/dist/types/src/paths.d.ts +0 -3
  199. package/dist/types/src/paths.d.ts.map +0 -1
  200. package/src/blueprints/index.ts +0 -5
  201. package/src/capabilities/app-graph-builder.ts +0 -61
  202. package/src/capabilities/blueprint-definition.ts +0 -19
  203. package/src/capabilities/navigation-resolver.ts +0 -19
  204. package/src/components/MarkdownSettings/MarkdownSettings.tsx +0 -35
  205. package/src/paths.ts +0 -13
  206. /package/dist/lib/neutral/{chunk-BL46CERY.mjs.map → chunk-2V6A5NDQ.mjs.map} +0 -0
  207. /package/dist/lib/neutral/{create-XW2FQNLK.mjs.map → create-OQUMKL5I.mjs.map} +0 -0
  208. /package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs.map → create-markdown-4O5FDA77.mjs.map} +0 -0
  209. /package/dist/lib/neutral/{open-F7KLNKVN.mjs.map → open-BAZIRXII.mjs.map} +0 -0
  210. /package/dist/lib/neutral/{blueprints/index.mjs.map → operation-handler-SDCXGMGK.mjs.map} +0 -0
  211. /package/dist/lib/neutral/{scroll-to-anchor-ACND3WJU.mjs.map → scroll-to-anchor-I6HFE5AH.mjs.map} +0 -0
  212. /package/dist/lib/neutral/{set-view-mode-WDC7CAEC.mjs.map → set-view-mode-NY5OYYIM.mjs.map} +0 -0
  213. /package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts +0 -0
  214. /package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts +0 -0
  215. /package/src/{components → containers}/MarkdownSettings/index.ts +0 -0
@@ -16,7 +16,7 @@ var dx_config_default = Config2.make({
16
16
 
17
17
  The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.
18
18
 
19
- A built-in blueprint exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.
19
+ A built-in skill exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.
20
20
  `,
21
21
  source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown",
22
22
  icon: {
@@ -40,4 +40,4 @@ var meta = Plugin.getMetaFromConfig(dx_config_default);
40
40
  export {
41
41
  meta
42
42
  };
43
- //# sourceMappingURL=chunk-GUXWFDD4.mjs.map
43
+ //# sourceMappingURL=chunk-OC3JD73N.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/meta.ts", "../../../dx.config.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.markdown',\n name: 'Markdown',\n author: 'DXOS',\n description: trim`\n A full-featured markdown editor for authoring documents in your space. Edits flow through a collaborative CodeMirror surface backed by ECHO Text, so every keystroke replicates to other peers in real time without merge conflicts or lost work.\n\n Documents can be opened in source, preview, or read-only mode and rendered as a full-surface article or as embeddable cards. An optional formatting toolbar exposes headings, lists, links, and other common markdown actions, and dispositional toolbar actions contributed by other plugins are surfaced inline alongside it.\n\n The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.\n\n A built-in blueprint exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.\n `,\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',\n icon: { key: 'ph--text-aa--regular', hue: 'indigo' },\n screenshots: [\n {\n dark: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/cdf2656365bb1fd327c1fc2105d75e5a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Fcdf2656365bb1fd327c1fc2105d75e5a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',\n },\n { dark: 'https://dxos.network/plugin-details-markdown-dark.png' },\n ],\n },\n});\n"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.markdown',\n name: 'Markdown',\n author: 'DXOS',\n description: trim`\n A full-featured markdown editor for authoring documents in your space. Edits flow through a collaborative CodeMirror surface backed by ECHO Text, so every keystroke replicates to other peers in real time without merge conflicts or lost work.\n\n Documents can be opened in source, preview, or read-only mode and rendered as a full-surface article or as embeddable cards. An optional formatting toolbar exposes headings, lists, links, and other common markdown actions, and dispositional toolbar actions contributed by other plugins are surfaced inline alongside it.\n\n The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.\n\n A built-in skill exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.\n `,\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',\n icon: { key: 'ph--text-aa--regular', hue: 'indigo' },\n screenshots: [\n {\n dark: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/cdf2656365bb1fd327c1fc2105d75e5a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Fcdf2656365bb1fd327c1fc2105d75e5a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',\n },\n { dark: 'https://dxos.network/plugin-details-markdown-dark.png' },\n ],\n },\n});\n"],
5
5
  "mappings": ";AAIA,SAASA,cAAc;;;ACAvB,SAASC,eAAe;AACxB,SAASC,YAAY;AAErB,IAAA,oBAAeD,QAAQE,KAAK;EAC1BC,QAAQ;IACNC,KAAK;IACLC,MAAM;IACNC,QAAQ;IACRC,aAAaN;;;;;;;;;IASbO,QAAQ;IACRC,MAAM;MAAEL,KAAK;MAAwBM,KAAK;IAAS;IACnDC,aAAa;MACX;QACEC,MAAM;MACR;MACA;QAAEA,MAAM;MAAwD;;EAEpE;AACF,CAAA;;;ADtBO,IAAMC,OAAOC,OAAOC,kBAAkBC,iBAAAA;",
6
6
  "names": ["Plugin", "Config2", "trim", "make", "plugin", "key", "name", "author", "description", "source", "icon", "hue", "screenshots", "dark", "meta", "Plugin", "getMetaFromConfig", "config"]
7
7
  }
@@ -0,0 +1,175 @@
1
+ // src/components/PreviewComponent/PreviewComponent.tsx
2
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { Surface, useOperationInvoker } from "@dxos/app-framework/ui";
4
+ import { LayoutOperation, Paths } from "@dxos/app-toolkit";
5
+ import { AppSurface } from "@dxos/app-toolkit/ui";
6
+ import { Obj } from "@dxos/echo";
7
+ import { URI } from "@dxos/keys";
8
+ import { useClient } from "@dxos/react-client";
9
+ import { Icon, IconButton } from "@dxos/react-ui";
10
+ import { ResizeHandle, resizeAttributes, sizeStyle } from "@dxos/react-ui-dnd";
11
+ var HEIGHT_PATTERN = /^(.*)\|(\d+)$/;
12
+ var parseEmbedLabel = (alt) => {
13
+ const match = HEIGHT_PATTERN.exec(alt ?? "");
14
+ if (match) {
15
+ const height = Number.parseInt(match[2], 10);
16
+ if (Number.isFinite(height) && height > 0) {
17
+ return {
18
+ baseLabel: match[1],
19
+ height
20
+ };
21
+ }
22
+ }
23
+ return {
24
+ baseLabel: alt ?? ""
25
+ };
26
+ };
27
+ var formatEmbedLabel = (baseLabel, height) => height != null ? `${baseLabel}|${height}` : baseLabel;
28
+ var MIN_SIZE = 6;
29
+ var FALLBACK_SIZE = 320;
30
+ var scrollTopIntoViewIfNeeded = (element) => {
31
+ let parent = element.parentElement;
32
+ while (parent) {
33
+ const { overflowY } = getComputedStyle(parent);
34
+ if ((overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay") && parent.scrollHeight > parent.clientHeight) {
35
+ break;
36
+ }
37
+ parent = parent.parentElement;
38
+ }
39
+ const elementTop = element.getBoundingClientRect().top;
40
+ const viewTop = parent ? parent.getBoundingClientRect().top : 0;
41
+ const viewBottom = parent ? parent.getBoundingClientRect().bottom : window.innerHeight;
42
+ if (elementTop < viewTop || elementTop > viewBottom) {
43
+ element.scrollIntoView({
44
+ block: "start",
45
+ inline: "nearest"
46
+ });
47
+ }
48
+ };
49
+ var PreviewComponent = ({ dxn, label: alt, onOpen, view, range }) => {
50
+ const client = useClient();
51
+ const { invokePromise } = useOperationInvoker();
52
+ const containerRef = useRef(null);
53
+ const uri = dxn ? URI.make(dxn) : void 0;
54
+ const subject = uri ? client.graph.makeRef(uri).target : void 0;
55
+ const remSize = useMemo(() => parseFloat(getComputedStyle(document.documentElement).fontSize) || 16, []);
56
+ const { height } = parseEmbedLabel(alt);
57
+ const [size, setSize] = useState(height != null ? height / remSize : "min-content");
58
+ const extrinsic = size !== "min-content";
59
+ const data = useMemo(() => subject ? {
60
+ subject,
61
+ attendableId: dxn,
62
+ extrinsic
63
+ } : void 0, [
64
+ subject,
65
+ dxn,
66
+ extrinsic
67
+ ]);
68
+ useEffect(() => {
69
+ setSize(height != null ? height / remSize : "min-content");
70
+ }, [
71
+ height,
72
+ remSize
73
+ ]);
74
+ const handleResize = useCallback((next, commit) => {
75
+ setSize(next);
76
+ if (!commit || typeof next !== "number" || !view) {
77
+ return;
78
+ }
79
+ const doc = view.state.doc.toString();
80
+ const marker = `](${dxn})`;
81
+ let open = -1;
82
+ let close = -1;
83
+ for (let at = doc.indexOf(marker); at >= 0; at = doc.indexOf(marker, at + marker.length)) {
84
+ const start = doc.lastIndexOf("![", at);
85
+ if (start >= 0 && (open < 0 || Math.abs(start - range.from) < Math.abs(open - range.from))) {
86
+ open = start;
87
+ close = at;
88
+ }
89
+ }
90
+ if (open < 0) {
91
+ return;
92
+ }
93
+ const { baseLabel: currentBaseLabel } = parseEmbedLabel(doc.slice(open + 2, close));
94
+ const insert = `![${formatEmbedLabel(currentBaseLabel, Math.round(next * remSize))}](${dxn})`;
95
+ view.dispatch({
96
+ changes: {
97
+ from: open,
98
+ to: close + marker.length,
99
+ insert
100
+ }
101
+ });
102
+ requestAnimationFrame(() => {
103
+ if (containerRef.current) {
104
+ scrollTopIntoViewIfNeeded(containerRef.current);
105
+ }
106
+ });
107
+ }, [
108
+ view,
109
+ range,
110
+ dxn,
111
+ remSize
112
+ ]);
113
+ const handleOpen = useCallback(() => {
114
+ if (!uri || !subject) {
115
+ return;
116
+ }
117
+ if (onOpen) {
118
+ onOpen(uri);
119
+ } else {
120
+ void invokePromise?.(LayoutOperation.Open, {
121
+ subject: [
122
+ Paths.getObjectPathFromObject(subject)
123
+ ],
124
+ navigation: "immediate"
125
+ });
126
+ }
127
+ }, [
128
+ uri,
129
+ subject,
130
+ onOpen,
131
+ invokePromise
132
+ ]);
133
+ if (!uri || !subject || !data) {
134
+ return null;
135
+ }
136
+ const objectLabel = Obj.getLabel(subject);
137
+ const objectIcon = Obj.getIcon(subject);
138
+ return /* @__PURE__ */ React.createElement("div", {
139
+ className: "relative grid scroll-mt-16",
140
+ style: sizeStyle(size, "vertical"),
141
+ ...resizeAttributes,
142
+ ref: containerRef
143
+ }, /* @__PURE__ */ React.createElement("div", {
144
+ className: "grid overflow-hidden border border-subdued-separator rounded-md"
145
+ }, /* @__PURE__ */ React.createElement(Surface.Surface, {
146
+ type: AppSurface.Section,
147
+ data,
148
+ limit: 1
149
+ })), /* @__PURE__ */ React.createElement("div", {
150
+ className: "absolute top-1 right-1 flex items-center justify-end gap-1"
151
+ }, /* @__PURE__ */ React.createElement("span", {
152
+ className: "dx-tag dx-tag--neutral flex items-center gap-1"
153
+ }, objectIcon && /* @__PURE__ */ React.createElement(Icon, {
154
+ icon: objectIcon.icon,
155
+ size: 4
156
+ }), objectLabel), /* @__PURE__ */ React.createElement(IconButton, {
157
+ density: "sm",
158
+ icon: "ph--arrow-square-out--regular",
159
+ iconOnly: true,
160
+ label: "Open",
161
+ variant: "ghost",
162
+ onClick: handleOpen
163
+ })), /* @__PURE__ */ React.createElement(ResizeHandle, {
164
+ side: "block-end",
165
+ fallbackSize: FALLBACK_SIZE,
166
+ minSize: MIN_SIZE,
167
+ size,
168
+ onSizeChange: handleResize
169
+ }));
170
+ };
171
+
172
+ export {
173
+ PreviewComponent
174
+ };
175
+ //# sourceMappingURL=chunk-YJF6XOXX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/PreviewComponent/PreviewComponent.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation, Paths } from '@dxos/app-toolkit';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { URI } from '@dxos/keys';\nimport { useClient } from '@dxos/react-client';\nimport { Icon, IconButton } from '@dxos/react-ui';\nimport { ResizeHandle, type Size, resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\n\nexport type PreviewComponentProps = XmlWidgetProps<{\n label: string;\n dxn: string;\n block?: boolean;\n suggest?: boolean;\n onOpen?: (dxn: URI.URI) => void;\n}>;\n\n// Persisted height (px) lives in the image alt text after the label, Obsidian-style: `![label|320](dxn)`.\nconst HEIGHT_PATTERN = /^(.*)\\|(\\d+)$/;\n\nconst parseEmbedLabel = (alt: string): { baseLabel: string; height?: number } => {\n const match = HEIGHT_PATTERN.exec(alt ?? '');\n if (match) {\n const height = Number.parseInt(match[2], 10);\n if (Number.isFinite(height) && height > 0) {\n return { baseLabel: match[1], height };\n }\n }\n return { baseLabel: alt ?? '' };\n};\n\nconst formatEmbedLabel = (baseLabel: string, height?: number): string =>\n height != null ? `${baseLabel}|${height}` : baseLabel;\n\nconst MIN_SIZE = 6;\nconst FALLBACK_SIZE = 320;\n\n/** Scroll the element's top into view (honoring its `scroll-margin`) only if that top is not already visible. */\nconst scrollTopIntoViewIfNeeded = (element: HTMLElement): void => {\n let parent = element.parentElement;\n while (parent) {\n const { overflowY } = getComputedStyle(parent);\n if (\n (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') &&\n parent.scrollHeight > parent.clientHeight\n ) {\n break;\n }\n parent = parent.parentElement;\n }\n const elementTop = element.getBoundingClientRect().top;\n const viewTop = parent ? parent.getBoundingClientRect().top : 0;\n const viewBottom = parent ? parent.getBoundingClientRect().bottom : window.innerHeight;\n if (elementTop < viewTop || elementTop > viewBottom) {\n element.scrollIntoView({ block: 'start', inline: 'nearest' });\n }\n};\n\n/**\n * Registry-backed block widget for URL-scheme preview slots.\n * Replaces the addBlockContainer callback pattern.\n * Used as the Component entry in a urlSchemes XmlWidgetDef.\n */\nexport const PreviewComponent = ({ dxn, label: alt, onOpen, view, range }: PreviewComponentProps) => {\n const client = useClient();\n const { invokePromise } = useOperationInvoker();\n const containerRef = useRef<HTMLDivElement>(null);\n const uri = dxn ? URI.make(dxn) : undefined;\n const subject = uri ? client.graph.makeRef<Obj.Unknown>(uri).target : undefined;\n\n // px per rem; ResizeHandle works in rem while the persisted height is in px.\n const remSize = useMemo(() => parseFloat(getComputedStyle(document.documentElement).fontSize) || 16, []);\n const { height } = parseEmbedLabel(alt);\n\n // `min-content` keeps the embed at its intrinsic height until the user resizes it; the handle then\n // measures the rendered box and switches to an explicit height.\n const [size, setSize] = useState<Size>(height != null ? height / remSize : 'min-content');\n\n // Tell the surface it is sized by its container (vs. intrinsic) so content (e.g. an image) can fit.\n const extrinsic = size !== 'min-content';\n const data = useMemo(\n () => (subject ? { subject, attendableId: dxn, extrinsic } : undefined),\n [subject, dxn, extrinsic],\n );\n useEffect(() => {\n setSize(height != null ? height / remSize : 'min-content');\n }, [height, remSize]);\n\n // Persist the height (px) into the alt text on drop by rewriting the image node in the source. The\n // node bounds and base label are re-derived from the live document (the captured `range`/`label`\n // can lag a prior edit before React re-renders the widget). When the same object is transcluded\n // more than once, the node whose start is NEAREST the widget's range is chosen so a duplicate\n // embed isn't rewritten by mistake.\n const handleResize = useCallback(\n (next: Size, commit?: boolean) => {\n setSize(next);\n if (!commit || typeof next !== 'number' || !view) {\n return;\n }\n const doc = view.state.doc.toString();\n const marker = `](${dxn})`;\n let open = -1;\n let close = -1;\n for (let at = doc.indexOf(marker); at >= 0; at = doc.indexOf(marker, at + marker.length)) {\n const start = doc.lastIndexOf('![', at);\n if (start >= 0 && (open < 0 || Math.abs(start - range.from) < Math.abs(open - range.from))) {\n open = start;\n close = at;\n }\n }\n if (open < 0) {\n return;\n }\n const { baseLabel: currentBaseLabel } = parseEmbedLabel(doc.slice(open + 2, close));\n const insert = `![${formatEmbedLabel(currentBaseLabel, Math.round(next * remSize))}](${dxn})`;\n view.dispatch({ changes: { from: open, to: close + marker.length, insert } });\n // After the resized box has laid out, bring its top into frame — but only if that top scrolled\n // out of view. Scroll the element itself (not the CM view) so it works whichever ancestor\n // actually scrolls (cm-scroller or an outer panel); defer a frame so the new height applies first.\n requestAnimationFrame(() => {\n if (containerRef.current) {\n scrollTopIntoViewIfNeeded(containerRef.current);\n }\n });\n },\n [view, range, dxn, remSize],\n );\n\n // Open the referenced object: defer to the caller's handler when provided, else navigate to it.\n const handleOpen = useCallback(() => {\n if (!uri || !subject) {\n return;\n }\n if (onOpen) {\n onOpen(uri);\n } else {\n void invokePromise?.(LayoutOperation.Open, {\n subject: [Paths.getObjectPathFromObject(subject)],\n navigation: 'immediate',\n });\n }\n }, [uri, subject, onOpen, invokePromise]);\n\n if (!uri || !subject || !data) {\n return null;\n }\n\n const objectLabel = Obj.getLabel(subject);\n const objectIcon = Obj.getIcon(subject);\n\n // Frame transcluded block embeds so they read as a self-contained card within the document flow.\n // The clip/border live on an inner element so they don't clip the resize handle (which straddles the\n // bottom edge); the inner grid stretches the surface to fill the resizable box, overriding any\n // intrinsic aspect.\n return (\n <div\n className='relative grid scroll-mt-16'\n style={sizeStyle(size, 'vertical')}\n {...resizeAttributes}\n ref={containerRef}\n >\n <div className='grid overflow-hidden border border-subdued-separator rounded-md'>\n <Surface.Surface type={AppSurface.Section} data={data} limit={1} />\n </div>\n <div className='absolute top-1 right-1 flex items-center justify-end gap-1'>\n <span className='dx-tag dx-tag--neutral flex items-center gap-1'>\n {objectIcon && <Icon icon={objectIcon.icon} size={4} />}\n {objectLabel}\n </span>\n <IconButton\n density='sm'\n icon='ph--arrow-square-out--regular'\n iconOnly\n label='Open'\n variant='ghost'\n onClick={handleOpen}\n />\n </div>\n <ResizeHandle\n side='block-end'\n fallbackSize={FALLBACK_SIZE}\n minSize={MIN_SIZE}\n size={size}\n onSizeChange={handleResize}\n />\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "useOperationInvoker", "LayoutOperation", "Paths", "AppSurface", "Obj", "URI", "useClient", "Icon", "IconButton", "ResizeHandle", "resizeAttributes", "sizeStyle", "HEIGHT_PATTERN", "parseEmbedLabel", "alt", "match", "exec", "height", "Number", "parseInt", "isFinite", "baseLabel", "formatEmbedLabel", "MIN_SIZE", "FALLBACK_SIZE", "scrollTopIntoViewIfNeeded", "element", "parent", "parentElement", "overflowY", "getComputedStyle", "scrollHeight", "clientHeight", "elementTop", "getBoundingClientRect", "top", "viewTop", "viewBottom", "bottom", "window", "innerHeight", "scrollIntoView", "block", "inline", "PreviewComponent", "dxn", "label", "onOpen", "view", "range", "client", "invokePromise", "containerRef", "uri", "make", "undefined", "subject", "graph", "makeRef", "target", "remSize", "parseFloat", "document", "documentElement", "fontSize", "size", "setSize", "extrinsic", "data", "attendableId", "handleResize", "next", "commit", "doc", "state", "toString", "marker", "open", "close", "at", "indexOf", "length", "start", "lastIndexOf", "Math", "abs", "from", "currentBaseLabel", "slice", "insert", "round", "dispatch", "changes", "to", "requestAnimationFrame", "current", "handleOpen", "Open", "getObjectPathFromObject", "navigation", "objectLabel", "getLabel", "objectIcon", "getIcon", "div", "className", "style", "ref", "type", "Section", "limit", "span", "icon", "density", "iconOnly", "variant", "onClick", "side", "fallbackSize", "minSize", "onSizeChange"]
7
+ }
@@ -0,0 +1,14 @@
1
+ // src/capabilities/skill-definition.ts
2
+ import * as Effect from "effect/Effect";
3
+ import { Capability } from "@dxos/app-framework";
4
+ import { AppCapabilities } from "@dxos/app-toolkit";
5
+ import { MarkdownSkill } from "#skills";
6
+ var skillDefinition = () => Effect.succeed([
7
+ Capability.contributes(AppCapabilities.SkillDefinition, MarkdownSkill)
8
+ ]);
9
+ var skill_definition_default = skillDefinition;
10
+
11
+ export {
12
+ skill_definition_default
13
+ };
14
+ //# sourceMappingURL=chunk-YMBC62S7.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/skill-definition.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n\nimport { MarkdownSkill } from '#skills';\n\nconst skillDefinition = () => Effect.succeed([Capability.contributes(AppCapabilities.SkillDefinition, MarkdownSkill)]);\n\nexport default skillDefinition;\n"],
5
+ "mappings": ";AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAEhC,SAASC,qBAAqB;AAE9B,IAAMC,kBAAkB,MAAaC,eAAQ;EAACJ,WAAWK,YAAYJ,gBAAgBK,iBAAiBJ,aAAAA;CAAe;AAErH,IAAA,2BAAeC;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "MarkdownSkill", "skillDefinition", "succeed", "contributes", "SkillDefinition"]
7
+ }
@@ -5,16 +5,16 @@ import {
5
5
  // src/types/Markdown.ts
6
6
  var Markdown_exports = {};
7
7
  __export(Markdown_exports, {
8
- BLUEPRINT_KEY: () => BLUEPRINT_KEY,
9
8
  Document: () => Document,
9
+ SKILL_KEY: () => SKILL_KEY,
10
10
  Settings: () => Settings2,
11
11
  make: () => make
12
12
  });
13
13
  import * as Schema2 from "effect/Schema";
14
14
  import { AppAnnotation } from "@dxos/app-toolkit";
15
- import { DXN, Annotation, Obj, Ref, Type } from "@dxos/echo";
15
+ import { Annotation, DXN, Obj, Ref, Type } from "@dxos/echo";
16
16
  import { DescriptionAnnotation, FormInputAnnotation, LabelAnnotation } from "@dxos/echo/Annotation";
17
- import { Text } from "@dxos/schema";
17
+ import { CollectionItemAnnotation, Text } from "@dxos/schema";
18
18
 
19
19
  // src/types/Settings.ts
20
20
  var Settings_exports = {};
@@ -65,9 +65,9 @@ var Settings = Schema.mutable(Schema.Struct({
65
65
  }));
66
66
 
67
67
  // src/types/Markdown.ts
68
- var BLUEPRINT_KEY = "org.dxos.blueprint.markdown";
68
+ var SKILL_KEY = "org.dxos.skill.markdown";
69
69
  var Settings2 = Settings;
70
- var Document = Schema2.Struct({
70
+ var Document = class extends Type.makeObject(DXN.make("org.dxos.type.document", "0.1.0"))(Schema2.Struct({
71
71
  name: Schema2.optional(Schema2.String),
72
72
  description: Schema2.optional(Schema2.String),
73
73
  fallbackName: Schema2.String.pipe(FormInputAnnotation.set(false), Schema2.optional),
@@ -78,11 +78,12 @@ var Document = Schema2.Struct({
78
78
  ]), DescriptionAnnotation.set("description"), Annotation.IconAnnotation.set({
79
79
  icon: "ph--text-aa--regular",
80
80
  hue: "indigo"
81
- }), AppAnnotation.BlueprintsAnnotation.set([
82
- BLUEPRINT_KEY
81
+ }), AppAnnotation.SkillsAnnotation.set([
82
+ SKILL_KEY
83
83
  ]), AppAnnotation.GraphPropsAnnotation.set({
84
84
  managesAutofocus: true
85
- }), Type.makeObject(DXN.make("org.dxos.type.document", "0.1.0")));
85
+ }), AppAnnotation.CardAnnotation.set(true), CollectionItemAnnotation.set(true))) {
86
+ };
86
87
  var make = ({ content = "", ...props } = {}) => {
87
88
  const doc = Obj.make(Document, {
88
89
  ...props,
@@ -141,15 +142,15 @@ __export(MarkdownOperation_exports, {
141
142
  import * as Schema4 from "effect/Schema";
142
143
  import { Capability as Capability2 } from "@dxos/app-framework";
143
144
  import { Operation } from "@dxos/compute";
144
- import { Database, Ref as Ref2, Type as Type2, DXN as DXN2 } from "@dxos/echo";
145
+ import { Database, DXN as DXN2, Ref as Ref2, Type as Type2 } from "@dxos/echo";
145
146
  import { EditorViewMode as EditorViewMode2 } from "@dxos/ui-editor/types";
146
147
  import { trim } from "@dxos/util";
147
148
  import { meta as meta3 } from "#meta";
148
149
  var makeKey = (name) => DXN2.make(`${meta3.profile.key}.operation.${name}`);
149
150
  var Edit = Schema4.Struct({
150
- oldString: Schema4.String.annotations({
151
- description: "The text to find in the document."
152
- }),
151
+ oldString: Schema4.optional(Schema4.String.annotations({
152
+ description: "The text to find in the document. Set to undefined to append the newString to the end of the document."
153
+ })),
153
154
  newString: Schema4.String.annotations({
154
155
  description: "The text to replace it with."
155
156
  }),
@@ -264,7 +265,7 @@ var Update = Operation.make({
264
265
  description: "The ID of the markdown document."
265
266
  }),
266
267
  edits: Schema4.Array(Edit).annotations({
267
- description: "The edits to apply to the document. Each edit finds oldString and replaces it with newString."
268
+ description: "The edits to apply to the document. Each edit finds oldString and replaces it with newString; omit oldString to append newString to the end."
268
269
  })
269
270
  }),
270
271
  output: Schema4.Struct({
@@ -282,4 +283,4 @@ export {
282
283
  MarkdownEvents_exports,
283
284
  MarkdownOperation_exports
284
285
  };
285
- //# sourceMappingURL=chunk-CRKAIDRD.mjs.map
286
+ //# sourceMappingURL=chunk-ZJ3GWRUJ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/Markdown.ts", "../../../src/types/Settings.ts", "../../../src/types/MarkdownCapabilities.ts", "../../../src/types/MarkdownEvents.ts", "../../../src/types/MarkdownOperation.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { AppAnnotation } from '@dxos/app-toolkit';\nimport { Annotation, DXN, Obj, Ref, Type } from '@dxos/echo';\nimport { DescriptionAnnotation, FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';\nimport { CollectionItemAnnotation, Text } from '@dxos/schema';\n\nexport const SKILL_KEY = 'org.dxos.skill.markdown';\n\n// Re-export Settings as merged const/type (not as namespace).\nimport * as SettingsModule from './Settings';\nexport const Settings = SettingsModule.Settings;\nexport type Settings = SettingsModule.Settings;\n\n/**\n * Document Item type.\n */\nexport class Document extends Type.makeObject<Document>(DXN.make('org.dxos.type.document', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n fallbackName: Schema.String.pipe(FormInputAnnotation.set(false), Schema.optional),\n content: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),\n }).pipe(\n LabelAnnotation.set(['name', 'fallbackName']),\n DescriptionAnnotation.set('description'),\n Annotation.IconAnnotation.set({ icon: 'ph--text-aa--regular', hue: 'indigo' }),\n AppAnnotation.SkillsAnnotation.set([SKILL_KEY]),\n AppAnnotation.GraphPropsAnnotation.set({ managesAutofocus: true }),\n AppAnnotation.CardAnnotation.set(true),\n CollectionItemAnnotation.set(true),\n ),\n) {}\n\n/**\n * Document factory.\n */\nexport const make = ({\n content = '',\n ...props\n}: Partial<{ name: string; fallbackName: string; content: string }> = {}) => {\n const doc = Obj.make(Document, { ...props, content: Ref.make(Text.make({ content })) });\n // TODO(dmaretskyi): We need a better way to set parents when creating hierarchies.\n Obj.setParent(doc.content.target!, doc);\n return doc;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { EditorInputMode, EditorViewMode } from '@dxos/ui-editor/types';\n\n/**\n * Determines how new comment threads on markdown documents are wired up to\n * the comment-thread AI agent (plugin-thread). The agent's identity (name,\n * DID) is resolved at runtime via the AgentIdentity capability — this\n * setting only controls whether and when the agent fires.\n *\n * - `off`: comments are plain user-only threads (no agent).\n * - `auto`: every user message in a thread triggers an agent response.\n * - `mention`: agent only responds when the message contains `@{agentName}`.\n */\nexport const CommentAgentMode = Schema.Union(Schema.Literal('off'), Schema.Literal('auto'), Schema.Literal('mention'));\nexport type CommentAgentMode = Schema.Schema.Type<typeof CommentAgentMode>;\n\n/**\n * Plugin settings.\n */\nexport const Settings = Schema.mutable(\n Schema.Struct({\n defaultViewMode: EditorViewMode.annotations({\n title: 'Default view mode',\n description: 'Set whether documents open in editing or read-only mode.',\n }),\n commentAgentMode: Schema.optional(\n CommentAgentMode.annotations({\n title: 'Comment agent mode',\n description:\n \"How new comment threads on markdown documents are processed: 'off' (no AI), 'auto' (AI responds to every user message), or 'mention' (AI responds only on @mention).\",\n }),\n ),\n editorInputMode: Schema.optional(\n EditorInputMode.annotations({\n title: 'Editor input mode',\n description: 'Choose keyboard bindings for the editor.',\n }),\n ),\n toolbar: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Show toolbar',\n description: 'Display a formatting toolbar above the editor.',\n }),\n ),\n numberedHeadings: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Numbered headings',\n description: 'Automatically number heading levels in the document.',\n }),\n ),\n folding: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Folding',\n description: 'Allow collapsing and expanding sections by heading.',\n }),\n ),\n experimental: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Enable experimental features',\n description: 'Turn on features that are still in development.',\n }),\n ),\n debug: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Enable debugging features',\n description: 'Show developer tools and diagnostics for the editor.',\n }),\n ),\n snippets: Schema.optional(\n Schema.String.annotations({\n title: 'Snippets',\n description: 'Input snippets to replay for testing purposes.',\n }),\n ),\n }),\n);\n\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type EditorStateStore } from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\n\nimport { meta } from '#meta';\n\nimport type * as Markdown from './Markdown';\nimport { type MarkdownExtensionProvider } from './types';\n\n/** Schema for persisted markdown state. */\nexport const StateSchema = Schema.mutable(\n Schema.Struct({\n viewMode: Schema.Record({ key: Schema.String, value: Schema.String }),\n }),\n);\n\nexport type MarkdownState = {\n viewMode: Record<string, EditorViewMode>;\n};\n\nexport type EditorViewEntry = { view: EditorView; documentId: string };\n\nexport type EditorViewRegistry = {\n register: (attendableId: string, view: EditorView, documentId: string) => void;\n unregister: (attendableId: string) => void;\n get: (attendableId: string) => EditorViewEntry | undefined;\n};\n\nexport const Settings = Capability.make<Atom.Writable<Markdown.Settings>>(`${meta.profile.key}.capability.settings`);\n\n/** Persisted state atom for view mode per document. */\nexport const State = Capability.make<Atom.Writable<MarkdownState>>(`${meta.profile.key}.capability.state`);\n\n/** Editor state store for cursor positions, scroll state, etc. */\nexport const EditorState = Capability.make<EditorStateStore>(`${meta.profile.key}.capability.editor-state`);\n\n/** Registry of active EditorView instances keyed by attendable ID. */\nexport const EditorViews = Capability.make<EditorViewRegistry>(`${meta.profile.key}.capability.editor-views`);\n\n// TODO(burdon): Move to ./types (external API)?\nexport const ExtensionProvider = Capability.make<MarkdownExtensionProvider[]>(\n `${meta.profile.key}.capability.extensions`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type ActivationEvent } from '@dxos/app-framework';\nimport { AppActivationEvents } from '@dxos/app-toolkit';\n\nimport { meta } from '#meta';\n\nexport const SetupExtensions: ActivationEvent.ActivationEvent = AppActivationEvents.createStateEvent(\n `${meta.profile.key}.event.setup-extensions`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Database, DXN, Ref, Type } from '@dxos/echo';\nimport { EditorViewMode } from '@dxos/ui-editor/types';\nimport { trim } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport * as Markdown from './Markdown';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\n// The edit descriptions feed the markdown skill's LLM tool definition (and its memoized\n// fixtures), so the schema stays local and context-tuned; the apply logic is shared via `Text.apply`.\nconst Edit = Schema.Struct({\n oldString: Schema.optional(\n Schema.String.annotations({\n description:\n 'The text to find in the document. Set to undefined to append the newString to the end of the document.',\n }),\n ),\n newString: Schema.String.annotations({\n description: 'The text to replace it with.',\n }),\n replaceAll: Schema.optional(Schema.Boolean).annotations({\n description: 'If true, replaces all occurrences. Defaults to false (first occurrence only).',\n }),\n});\n\nexport const Create = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.create'),\n name: 'Create',\n description: 'Creates a new markdown document and adds it to the space.',\n icon: 'ph--file-text--regular',\n },\n input: Schema.Struct({\n name: Schema.String,\n content: Schema.String,\n }),\n output: Schema.Struct({\n id: Schema.String.annotations({\n description: 'The DXN of the created document.',\n }),\n }),\n services: [Database.Service],\n});\n\nexport const CreateMarkdown = Operation.make({\n meta: {\n key: makeKey('create'),\n name: 'Create Markdown Document',\n icon: 'ph--file-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n content: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Markdown.Document),\n }),\n});\n\nexport const Open = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.open'),\n name: 'Open',\n description: 'Opens and reads the contents of a new markdown document.',\n icon: 'ph--arrow-square-out--regular',\n },\n input: Schema.Struct({\n doc: Ref.Ref(Markdown.Document).annotations({\n description: 'The ID of the markdown document.',\n }),\n }),\n output: Schema.Struct({\n content: Schema.String,\n }),\n services: [Database.Service],\n});\n\nexport const ScrollToAnchor = Operation.make({\n meta: {\n key: makeKey('scrollToAnchor'),\n name: 'Scroll To Anchor',\n icon: 'ph--anchor-simple--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n subject: Schema.String.annotations({ description: 'Attendable ID of the markdown editor.' }),\n cursor: Schema.String.annotations({ description: 'Cursor position to scroll to.' }),\n ref: Schema.optional(Schema.String.annotations({ description: 'Reference ID (e.g. thread ID).' })),\n }),\n output: Schema.Void,\n});\n\n// TODO(wittjosiah): This appears to be unused.\nexport const SetViewMode = Operation.make({\n meta: { key: makeKey('setViewMode'), name: 'Set View Mode', icon: 'ph--layout--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n id: Schema.String,\n viewMode: EditorViewMode,\n }),\n output: Schema.Void,\n});\n\nexport const Update = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.update'),\n name: 'Update',\n description: trim`\n Applies a set of edits to the markdown document.\n `,\n icon: 'ph--pencil-simple--regular',\n },\n input: Schema.Struct({\n doc: Ref.Ref(Markdown.Document).annotations({\n description: 'The ID of the markdown document.',\n }),\n edits: Schema.Array(Edit).annotations({\n description:\n 'The edits to apply to the document. Each edit finds oldString and replaces it with newString; omit oldString to append newString to the end.',\n }),\n }),\n output: Schema.Struct({\n newContent: Schema.String,\n }),\n services: [Database.Service],\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Settings", "Schema", "AppAnnotation", "Annotation", "DXN", "Obj", "Ref", "Type", "DescriptionAnnotation", "FormInputAnnotation", "LabelAnnotation", "CollectionItemAnnotation", "Text", "Schema", "EditorInputMode", "EditorViewMode", "CommentAgentMode", "Union", "Literal", "Settings", "mutable", "Struct", "defaultViewMode", "annotations", "title", "description", "commentAgentMode", "optional", "editorInputMode", "toolbar", "Boolean", "numberedHeadings", "folding", "experimental", "debug", "snippets", "String", "SKILL_KEY", "Settings", "Document", "Type", "makeObject", "DXN", "make", "Struct", "name", "optional", "String", "description", "fallbackName", "pipe", "FormInputAnnotation", "set", "content", "Ref", "Text", "LabelAnnotation", "DescriptionAnnotation", "Annotation", "IconAnnotation", "icon", "hue", "AppAnnotation", "SkillsAnnotation", "GraphPropsAnnotation", "managesAutofocus", "CardAnnotation", "CollectionItemAnnotation", "props", "doc", "Obj", "setParent", "target", "Settings", "Schema", "Capability", "meta", "StateSchema", "mutable", "Struct", "viewMode", "Record", "key", "String", "value", "make", "profile", "State", "EditorState", "EditorViews", "ExtensionProvider", "AppActivationEvents", "meta", "SetupExtensions", "createStateEvent", "profile", "key", "Schema", "Capability", "Operation", "Database", "DXN", "Ref", "Type", "EditorViewMode", "trim", "meta", "makeKey", "name", "DXN", "make", "meta", "profile", "key", "Edit", "Struct", "oldString", "optional", "String", "annotations", "description", "newString", "replaceAll", "Boolean", "Create", "Operation", "icon", "input", "content", "output", "id", "services", "Database", "Service", "CreateMarkdown", "Capability", "object", "Type", "getSchema", "Document", "Open", "doc", "Ref", "ScrollToAnchor", "subject", "cursor", "ref", "Void", "SetViewMode", "viewMode", "EditorViewMode", "Update", "trim", "edits", "Array", "newContent"]
7
+ }
@@ -5,7 +5,8 @@ import * as Effect from "effect/Effect";
5
5
  import { Capability } from "@dxos/app-framework";
6
6
  import { AppCapabilities } from "@dxos/app-toolkit";
7
7
  import { Type } from "@dxos/echo";
8
- import { createDocAccessor, getTextInRange } from "@dxos/echo-client";
8
+ import { getTextInRange } from "@dxos/echo-client";
9
+ import { Doc } from "@dxos/echo-doc";
9
10
  import { MarkdownOperation } from "#types";
10
11
  import { Markdown } from "#types";
11
12
  var activate = Effect.fnUntraced(function* () {
@@ -14,9 +15,10 @@ var activate = Effect.fnUntraced(function* () {
14
15
  comments: "anchored",
15
16
  selectionMode: "multi-range",
16
17
  getAnchorLabel: (doc, anchor) => {
17
- if (doc.content) {
18
+ const target = doc.content?.target;
19
+ if (target) {
18
20
  const [start, end] = anchor.split(":");
19
- return getTextInRange(createDocAccessor(doc.content.target, [
21
+ return getTextInRange(Doc.createAccessor(target, [
20
22
  "content"
21
23
  ]), start, end);
22
24
  }
@@ -29,4 +31,4 @@ var comment_config_default = activate;
29
31
  export {
30
32
  comment_config_default as default
31
33
  };
32
- //# sourceMappingURL=comment-config-EGY7RPPW.mjs.map
34
+ //# sourceMappingURL=comment-config-M5OGFULS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/comment-config.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Type } from '@dxos/echo';\nimport { getTextInRange } from '@dxos/echo-client';\nimport { Doc } from '@dxos/echo-doc';\n\nimport { MarkdownOperation } from '#types';\nimport { Markdown } from '#types';\n\nconst activate = Effect.fnUntraced(function* () {\n const config: AppCapabilities.CommentConfig = {\n id: Type.getTypename(Markdown.Document),\n comments: 'anchored',\n selectionMode: 'multi-range',\n getAnchorLabel: (doc: Markdown.Document, anchor: string): string | undefined => {\n const target = doc.content?.target;\n if (target) {\n const [start, end] = anchor.split(':');\n return getTextInRange(Doc.createAccessor(target, ['content']), start, end);\n }\n },\n scrollToAnchor: MarkdownOperation.ScrollToAnchor,\n };\n return Capability.contributes(AppCapabilities.CommentConfig, config);\n});\n\nexport default activate;\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,WAAW;AAEpB,SAASC,yBAAyB;AAClC,SAASC,gBAAgB;AAEzB,IAAMC,WAAkBC,kBAAW,aAAA;AACjC,QAAMC,SAAwC;IAC5CC,IAAIR,KAAKS,YAAYL,SAASM,QAAQ;IACtCC,UAAU;IACVC,eAAe;IACfC,gBAAgB,CAACC,KAAwBC,WAAAA;AACvC,YAAMC,SAASF,IAAIG,SAASD;AAC5B,UAAIA,QAAQ;AACV,cAAM,CAACE,OAAOC,GAAAA,IAAOJ,OAAOK,MAAM,GAAA;AAClC,eAAOnB,eAAeC,IAAImB,eAAeL,QAAQ;UAAC;SAAU,GAAGE,OAAOC,GAAAA;MACxE;IACF;IACAG,gBAAgBnB,kBAAkBoB;EACpC;AACA,SAAOzB,WAAW0B,YAAYzB,gBAAgB0B,eAAelB,MAAAA;AAC/D,CAAA;AAEA,IAAA,yBAAeF;",
6
+ "names": ["Effect", "Capability", "AppCapabilities", "Type", "getTextInRange", "Doc", "MarkdownOperation", "Markdown", "activate", "fnUntraced", "config", "id", "getTypename", "Document", "comments", "selectionMode", "getAnchorLabel", "doc", "anchor", "target", "content", "start", "end", "split", "createAccessor", "scrollToAnchor", "ScrollToAnchor", "contributes", "CommentConfig"]
7
+ }
@@ -1,17 +1,12 @@
1
+ import {
2
+ PreviewComponent
3
+ } from "../chunk-YJF6XOXX.mjs";
1
4
  import "../chunk-J5LGTIGS.mjs";
2
5
 
3
- // src/components/index.ts
4
- import { lazy } from "react";
5
-
6
6
  // src/components/MarkdownEditor/MarkdownEditor.tsx
7
7
  import { createContext } from "@radix-ui/react-context";
8
8
  import React4, { useCallback as useCallback3, useMemo as useMemo2, useState as useState2 } from "react";
9
9
  import { createPortal as createPortal2 } from "react-dom";
10
- import { Surface } from "@dxos/app-framework/ui";
11
- import { AppSurface as AppSurface2 } from "@dxos/app-toolkit/ui";
12
- import { Obj } from "@dxos/echo";
13
- import { URI } from "@dxos/keys";
14
- import { useClient } from "@dxos/react-client";
15
10
  import { composable as composable2, composableProps as composableProps2 } from "@dxos/react-ui";
16
11
  import { createEditorController, useEditorContext } from "@dxos/react-ui-editor";
17
12
  import { isNonNullable } from "@dxos/util";
@@ -24,7 +19,7 @@ import { useCapabilities } from "@dxos/app-framework/ui";
24
19
  import { AppSurface } from "@dxos/app-toolkit/ui";
25
20
  import { useThemeContext, useTranslation } from "@dxos/react-ui";
26
21
  import { useTextEditor } from "@dxos/react-ui-editor";
27
- import { mobileSlots, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, documentSlots, formattingListener, processEditorPayload, editorClassNames, scrollbarAutohide } from "@dxos/ui-editor";
22
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, documentSlots, dropFile, editorClassNames, formattingListener, mobileSlots, processEditorPayload, scrollbarAutohide } from "@dxos/ui-editor";
28
23
  import { mx } from "@dxos/ui-theme";
29
24
  import { isTruthy } from "@dxos/util";
30
25
  import { meta } from "#meta";
@@ -223,21 +218,7 @@ var MarkdownEditorToolbar = composable(({ id, role, getView, customActions, onAc
223
218
  // src/components/MarkdownEditor/MarkdownEditor.tsx
224
219
  var [MarkdownEditorContextProvider, useMarkdownEditorContext] = createContext("MarkdownEditor.Context");
225
220
  var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, compact, viewMode, viewState, editorStateStore, extensions: extensionsProp, slashCommandGroups, onLinkQuery, onSelectObject, onAction, onFileUpload, onViewModeChange }) => {
226
- const [previewBlocks, setPreviewBlocks] = useState2([]);
227
- const previewOptions = useMemo2(() => ({
228
- db: Obj.isObject(object) ? Obj.getDatabase(object) : void 0,
229
- addBlockContainer: (block) => {
230
- setPreviewBlocks((prev) => [
231
- ...prev,
232
- block
233
- ]);
234
- },
235
- removeBlockContainer: ({ link }) => {
236
- setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== link.dxn));
237
- }
238
- }), [
239
- object
240
- ]);
221
+ const [widgets, setWidgets] = useState2([]);
241
222
  const menuOptions = useEditorMenuOptions({
242
223
  slashCommandGroups,
243
224
  onLinkQuery
@@ -249,7 +230,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
249
230
  viewMode,
250
231
  viewState,
251
232
  editorStateStore,
252
- previewOptions,
233
+ setWidgets,
253
234
  settings,
254
235
  onSelectObject
255
236
  });
@@ -282,7 +263,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
282
263
  attendableId,
283
264
  compact,
284
265
  viewMode,
285
- previewBlocks,
266
+ widgets,
286
267
  onAction,
287
268
  onFileUpload,
288
269
  onViewModeChange
@@ -291,7 +272,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
291
272
  attendableId,
292
273
  compact,
293
274
  viewMode,
294
- previewBlocks,
275
+ widgets,
295
276
  onAction,
296
277
  onFileUpload,
297
278
  onViewModeChange
@@ -340,40 +321,20 @@ var MarkdownEditorToolbar2 = (props) => {
340
321
  MarkdownEditorToolbar2.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;
341
322
  var MARKDOWN_EDITOR_BLOCKS_NAME = "MarkdownEditor.Blocks";
342
323
  var MarkdownEditorBlocks = (_props) => {
343
- const { previewBlocks } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);
344
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, previewBlocks.map(({ link, el }) => /* @__PURE__ */ React4.createElement(PreviewBlock, {
345
- key: link.dxn,
346
- link,
347
- el
348
- })));
324
+ const { widgets } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);
325
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, widgets.map(({ id, root, Component, props }) => /* @__PURE__ */ React4.createElement("div", {
326
+ key: id
327
+ }, /* @__PURE__ */ createPortal2(/* @__PURE__ */ React4.createElement(Component, props), root))));
349
328
  };
350
329
  MarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;
351
- var PreviewBlock = ({ el, link }) => {
352
- const client = useClient();
353
- const dxn = URI.make(link.dxn);
354
- const subject = client.graph.makeRef(dxn).target;
355
- const data = useMemo2(() => ({
356
- subject
357
- }), [
358
- subject
359
- ]);
360
- return /* @__PURE__ */ createPortal2(/* @__PURE__ */ React4.createElement(Surface.Surface, {
361
- type: AppSurface2.CardContent,
362
- data,
363
- limit: 1
364
- }), el);
365
- };
366
330
  var MarkdownEditor = {
367
331
  Content: MarkdownEditorContent2,
368
332
  Toolbar: MarkdownEditorToolbar2,
369
333
  Blocks: MarkdownEditorBlocks
370
334
  };
371
-
372
- // src/components/index.ts
373
- var MarkdownSettings = lazy(() => import("../MarkdownSettings-F5AWRDT3.mjs"));
374
335
  export {
375
336
  MarkdownEditor,
376
337
  MarkdownEditorProvider,
377
- MarkdownSettings
338
+ PreviewComponent
378
339
  };
379
340
  //# sourceMappingURL=index.mjs.map