@dxos/plugin-markdown 0.8.1-staging.391c573 → 0.8.1-staging.5be625a

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 (164) hide show
  1. package/dist/lib/browser/{MarkdownContainer-2AGDY3W4.mjs → MarkdownContainer-J7EWEIBF.mjs} +59 -29
  2. package/dist/lib/browser/MarkdownContainer-J7EWEIBF.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-DDOMJ5MS.mjs → app-graph-serializer-6YRDBK5N.mjs} +7 -8
  4. package/dist/lib/browser/app-graph-serializer-6YRDBK5N.mjs.map +7 -0
  5. package/dist/lib/browser/{artifact-definition-I4ORYVKB.mjs → artifact-definition-ZNSIJUHH.mjs} +12 -25
  6. package/dist/lib/browser/artifact-definition-ZNSIJUHH.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-4MCFUAMZ.mjs → chunk-GFYBHQIV.mjs} +7 -8
  8. package/dist/lib/browser/chunk-GFYBHQIV.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-JX6XNEHE.mjs +22 -0
  10. package/dist/lib/browser/chunk-JX6XNEHE.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-XBAPFNQG.mjs → chunk-NAGMSX77.mjs} +2 -2
  12. package/dist/lib/browser/chunk-NAGMSX77.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-3C24B23M.mjs → chunk-UNNHN7UG.mjs} +13 -9
  14. package/dist/lib/browser/chunk-UNNHN7UG.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-PTLVK34A.mjs → chunk-Z63IZKXQ.mjs} +9 -9
  16. package/dist/lib/browser/index.mjs +7 -12
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/{intent-resolver-KP6SYFFL.mjs → intent-resolver-FM4R4I3J.mjs} +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-QLM3CQQP.mjs → react-surface-HDAAIELR.mjs} +36 -12
  21. package/dist/lib/browser/react-surface-HDAAIELR.mjs.map +7 -0
  22. package/dist/lib/browser/{settings-BD3J7QXE.mjs → settings-UVZP6ONT.mjs} +3 -3
  23. package/dist/lib/browser/{state-M5HI645K.mjs → state-O7P5JDIH.mjs} +7 -12
  24. package/dist/lib/browser/state-O7P5JDIH.mjs.map +7 -0
  25. package/dist/lib/browser/{thread-ZGBGNMEM.mjs → thread-JRICWX5O.mjs} +5 -4
  26. package/dist/lib/browser/thread-JRICWX5O.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +4 -2
  28. package/dist/lib/node/{MarkdownContainer-ESPH2MCH.cjs → MarkdownContainer-TR3OKWAG.cjs} +69 -39
  29. package/dist/lib/node/MarkdownContainer-TR3OKWAG.cjs.map +7 -0
  30. package/dist/lib/node/{app-graph-serializer-EIHJDGDZ.cjs → app-graph-serializer-5AE4W7O5.cjs} +11 -10
  31. package/dist/lib/node/app-graph-serializer-5AE4W7O5.cjs.map +7 -0
  32. package/dist/lib/node/{artifact-definition-G2RX42OI.cjs → artifact-definition-N3NPL2J5.cjs} +19 -32
  33. package/dist/lib/node/artifact-definition-N3NPL2J5.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-4N7RTNIG.cjs → chunk-2CTFHOTK.cjs} +13 -13
  35. package/dist/lib/node/{chunk-VYAJIYUI.cjs → chunk-55TBVSYQ.cjs} +17 -12
  36. package/dist/lib/node/chunk-55TBVSYQ.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-4LG6SPXW.cjs → chunk-DZXTXSXX.cjs} +7 -7
  38. package/dist/lib/node/chunk-DZXTXSXX.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-DEUESZ5O.cjs → chunk-MW3N4QBR.cjs} +11 -12
  40. package/dist/lib/node/chunk-MW3N4QBR.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-QZ4XQYNC.cjs → chunk-ZU5OIHCY.cjs} +9 -9
  42. package/dist/lib/node/chunk-ZU5OIHCY.cjs.map +7 -0
  43. package/dist/lib/node/index.cjs +39 -44
  44. package/dist/lib/node/index.cjs.map +3 -3
  45. package/dist/lib/node/{intent-resolver-K44M5GLB.cjs → intent-resolver-FHF3PJVF.cjs} +11 -11
  46. package/dist/lib/node/meta.json +1 -1
  47. package/dist/lib/node/{react-surface-C74TD4AV.cjs → react-surface-T7W4CK3I.cjs} +47 -23
  48. package/dist/lib/node/react-surface-T7W4CK3I.cjs.map +7 -0
  49. package/dist/lib/node/{settings-SBFMJ556.cjs → settings-YPFQLBAM.cjs} +8 -8
  50. package/dist/lib/node/{state-GCSY2G53.cjs → state-L44SG3ZM.cjs} +13 -18
  51. package/dist/lib/node/state-L44SG3ZM.cjs.map +7 -0
  52. package/dist/lib/node/{thread-CPYL6QVD.cjs → thread-6FNQTR27.cjs} +8 -7
  53. package/dist/lib/node/thread-6FNQTR27.cjs.map +7 -0
  54. package/dist/lib/node/types/index.cjs +8 -6
  55. package/dist/lib/node/types/index.cjs.map +2 -2
  56. package/dist/lib/node-esm/{MarkdownContainer-VYZZDI4J.mjs → MarkdownContainer-ARQ3FQMJ.mjs} +59 -29
  57. package/dist/lib/node-esm/MarkdownContainer-ARQ3FQMJ.mjs.map +7 -0
  58. package/dist/lib/node-esm/{app-graph-serializer-BFZXPQBL.mjs → app-graph-serializer-NYKTCXLB.mjs} +7 -8
  59. package/dist/lib/node-esm/app-graph-serializer-NYKTCXLB.mjs.map +7 -0
  60. package/dist/lib/node-esm/{artifact-definition-JIGMPEVI.mjs → artifact-definition-FSAFPZH5.mjs} +12 -25
  61. package/dist/lib/node-esm/artifact-definition-FSAFPZH5.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-GUZZJ4H4.mjs → chunk-ETXPC5VP.mjs} +2 -2
  63. package/dist/lib/node-esm/chunk-ETXPC5VP.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-L2TANXTY.mjs → chunk-HCVUH5S2.mjs} +7 -8
  65. package/dist/lib/node-esm/chunk-HCVUH5S2.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-3SDMSQOB.mjs → chunk-LIQ5K2QO.mjs} +13 -9
  67. package/dist/lib/node-esm/chunk-LIQ5K2QO.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-RX63ZNML.mjs +24 -0
  69. package/dist/lib/node-esm/chunk-RX63ZNML.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-PQDVRE2Y.mjs → chunk-TW643QUG.mjs} +9 -9
  71. package/dist/lib/node-esm/index.mjs +7 -12
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-WWIMRDGG.mjs → intent-resolver-CH2R7TC4.mjs} +4 -4
  74. package/dist/lib/node-esm/meta.json +1 -1
  75. package/dist/lib/node-esm/{react-surface-T6FT3OZ7.mjs → react-surface-KFYARYUX.mjs} +36 -12
  76. package/dist/lib/node-esm/react-surface-KFYARYUX.mjs.map +7 -0
  77. package/dist/lib/node-esm/{settings-2K63TOOA.mjs → settings-DGRDN5KL.mjs} +3 -3
  78. package/dist/lib/node-esm/{state-2SECKIMF.mjs → state-DWPOKLEY.mjs} +7 -12
  79. package/dist/lib/node-esm/state-DWPOKLEY.mjs.map +7 -0
  80. package/dist/lib/node-esm/{thread-GHLHBZSM.mjs → thread-Q3BB7DIQ.mjs} +5 -4
  81. package/dist/lib/node-esm/thread-Q3BB7DIQ.mjs.map +7 -0
  82. package/dist/lib/node-esm/types/index.mjs +4 -2
  83. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/capabilities.d.ts +2 -1
  86. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/index.d.ts +1 -0
  88. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/state.d.ts +1 -0
  91. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/thread.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownContainer.d.ts +5 -7
  94. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor.d.ts +5 -3
  96. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  97. package/dist/types/src/components/index.d.ts +1 -1
  98. package/dist/types/src/components/index.d.ts.map +1 -1
  99. package/dist/types/src/extensions.d.ts +6 -4
  100. package/dist/types/src/extensions.d.ts.map +1 -1
  101. package/dist/types/src/meta.d.ts +2 -8
  102. package/dist/types/src/meta.d.ts.map +1 -1
  103. package/dist/types/src/translations.d.ts +2 -9
  104. package/dist/types/src/translations.d.ts.map +1 -1
  105. package/dist/types/src/types/schema.d.ts +92 -33
  106. package/dist/types/src/types/schema.d.ts.map +1 -1
  107. package/dist/types/src/types/types.d.ts +63 -4
  108. package/dist/types/src/types/types.d.ts.map +1 -1
  109. package/package.json +31 -31
  110. package/src/MarkdownPlugin.tsx +4 -4
  111. package/src/capabilities/app-graph-serializer.ts +4 -3
  112. package/src/capabilities/artifact-definition.ts +6 -13
  113. package/src/capabilities/capabilities.ts +2 -1
  114. package/src/capabilities/react-surface.tsx +31 -7
  115. package/src/capabilities/state.ts +8 -17
  116. package/src/capabilities/thread.ts +2 -1
  117. package/src/components/MarkdownContainer.tsx +25 -16
  118. package/src/components/MarkdownEditor.tsx +13 -6
  119. package/src/extensions.tsx +32 -13
  120. package/src/meta.ts +7 -7
  121. package/src/translations.ts +4 -4
  122. package/src/types/schema.ts +9 -3
  123. package/src/types/types.ts +1 -13
  124. package/dist/lib/browser/MarkdownContainer-2AGDY3W4.mjs.map +0 -7
  125. package/dist/lib/browser/app-graph-serializer-DDOMJ5MS.mjs.map +0 -7
  126. package/dist/lib/browser/artifact-definition-I4ORYVKB.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-3C24B23M.mjs.map +0 -7
  128. package/dist/lib/browser/chunk-4MCFUAMZ.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-XBAPFNQG.mjs.map +0 -7
  130. package/dist/lib/browser/chunk-YTHIPV5Q.mjs +0 -22
  131. package/dist/lib/browser/chunk-YTHIPV5Q.mjs.map +0 -7
  132. package/dist/lib/browser/react-surface-QLM3CQQP.mjs.map +0 -7
  133. package/dist/lib/browser/state-M5HI645K.mjs.map +0 -7
  134. package/dist/lib/browser/thread-ZGBGNMEM.mjs.map +0 -7
  135. package/dist/lib/node/MarkdownContainer-ESPH2MCH.cjs.map +0 -7
  136. package/dist/lib/node/app-graph-serializer-EIHJDGDZ.cjs.map +0 -7
  137. package/dist/lib/node/artifact-definition-G2RX42OI.cjs.map +0 -7
  138. package/dist/lib/node/chunk-4LG6SPXW.cjs.map +0 -7
  139. package/dist/lib/node/chunk-DEUESZ5O.cjs.map +0 -7
  140. package/dist/lib/node/chunk-QZ4XQYNC.cjs.map +0 -7
  141. package/dist/lib/node/chunk-VYAJIYUI.cjs.map +0 -7
  142. package/dist/lib/node/react-surface-C74TD4AV.cjs.map +0 -7
  143. package/dist/lib/node/state-GCSY2G53.cjs.map +0 -7
  144. package/dist/lib/node/thread-CPYL6QVD.cjs.map +0 -7
  145. package/dist/lib/node-esm/MarkdownContainer-VYZZDI4J.mjs.map +0 -7
  146. package/dist/lib/node-esm/app-graph-serializer-BFZXPQBL.mjs.map +0 -7
  147. package/dist/lib/node-esm/artifact-definition-JIGMPEVI.mjs.map +0 -7
  148. package/dist/lib/node-esm/chunk-3SDMSQOB.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-BBVPC53M.mjs +0 -24
  150. package/dist/lib/node-esm/chunk-BBVPC53M.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-GUZZJ4H4.mjs.map +0 -7
  152. package/dist/lib/node-esm/chunk-L2TANXTY.mjs.map +0 -7
  153. package/dist/lib/node-esm/react-surface-T6FT3OZ7.mjs.map +0 -7
  154. package/dist/lib/node-esm/state-2SECKIMF.mjs.map +0 -7
  155. package/dist/lib/node-esm/thread-GHLHBZSM.mjs.map +0 -7
  156. /package/dist/lib/browser/{chunk-PTLVK34A.mjs.map → chunk-Z63IZKXQ.mjs.map} +0 -0
  157. /package/dist/lib/browser/{intent-resolver-KP6SYFFL.mjs.map → intent-resolver-FM4R4I3J.mjs.map} +0 -0
  158. /package/dist/lib/browser/{settings-BD3J7QXE.mjs.map → settings-UVZP6ONT.mjs.map} +0 -0
  159. /package/dist/lib/node/{chunk-4N7RTNIG.cjs.map → chunk-2CTFHOTK.cjs.map} +0 -0
  160. /package/dist/lib/node/{intent-resolver-K44M5GLB.cjs.map → intent-resolver-FHF3PJVF.cjs.map} +0 -0
  161. /package/dist/lib/node/{settings-SBFMJ556.cjs.map → settings-YPFQLBAM.cjs.map} +0 -0
  162. /package/dist/lib/node-esm/{chunk-PQDVRE2Y.mjs.map → chunk-TW643QUG.mjs.map} +0 -0
  163. /package/dist/lib/node-esm/{intent-resolver-WWIMRDGG.mjs.map → intent-resolver-CH2R7TC4.mjs.map} +0 -0
  164. /package/dist/lib/node-esm/{settings-2K63TOOA.mjs.map → settings-DGRDN5KL.mjs.map} +0 -0
@@ -1,30 +1,24 @@
1
1
  import {
2
2
  MarkdownCapabilities
3
- } from "./chunk-XBAPFNQG.mjs";
3
+ } from "./chunk-NAGMSX77.mjs";
4
4
  import {
5
5
  MARKDOWN_PLUGIN
6
- } from "./chunk-YTHIPV5Q.mjs";
6
+ } from "./chunk-JX6XNEHE.mjs";
7
7
 
8
8
  // packages/plugins/plugin-markdown/src/capabilities/state.ts
9
9
  import { Capabilities, contributes } from "@dxos/app-framework";
10
10
  import { LocalStorageStore } from "@dxos/local-storage";
11
+ import { createEditorStateStore } from "@dxos/react-ui-editor";
11
12
  var state_default = (context) => {
12
13
  const state = new LocalStorageStore(MARKDOWN_PLUGIN, {
13
14
  extensionProviders: [],
14
- viewMode: {},
15
- selectionState: {},
16
- foldState: {}
15
+ viewMode: {}
17
16
  });
18
17
  state.prop({
19
18
  key: "viewMode",
20
19
  type: LocalStorageStore.json()
21
- }).prop({
22
- key: "selectionState",
23
- type: LocalStorageStore.json()
24
- }).prop({
25
- key: "foldState",
26
- type: LocalStorageStore.json()
27
20
  });
21
+ const editorState = createEditorStateStore(`${MARKDOWN_PLUGIN}/editor`);
28
22
  const getViewMode = (id) => {
29
23
  const defaultViewMode = context.requestCapability(Capabilities.SettingsStore).getStore(MARKDOWN_PLUGIN).value.defaultViewMode;
30
24
  return id && state.values.viewMode[id] || defaultViewMode;
@@ -32,6 +26,7 @@ var state_default = (context) => {
32
26
  const setViewMode = (id, viewMode) => state.values.viewMode[id] = viewMode;
33
27
  return contributes(MarkdownCapabilities.State, {
34
28
  state: state.values,
29
+ editorState,
35
30
  getViewMode,
36
31
  setViewMode
37
32
  });
@@ -39,4 +34,4 @@ var state_default = (context) => {
39
34
  export {
40
35
  state_default as default
41
36
  };
42
- //# sourceMappingURL=state-M5HI645K.mjs.map
37
+ //# sourceMappingURL=state-O7P5JDIH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/state.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';\nimport { LocalStorageStore } from '@dxos/local-storage';\nimport { type EditorViewMode, createEditorStateStore } from '@dxos/react-ui-editor';\n\nimport { MarkdownCapabilities } from './capabilities';\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport { type MarkdownPluginState, type MarkdownSettingsProps } from '../types';\n\nexport default (context: PluginsContext) => {\n const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });\n\n state.prop({ key: 'viewMode', type: LocalStorageStore.json<{ [key: string]: EditorViewMode }>() });\n\n // TODO(wittjosiah): Fold into state.\n const editorState = createEditorStateStore(`${MARKDOWN_PLUGIN}/editor`);\n\n const getViewMode = (id: string) => {\n const defaultViewMode = context\n .requestCapability(Capabilities.SettingsStore)\n .getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value.defaultViewMode;\n return (id && state.values.viewMode[id]) || defaultViewMode;\n };\n\n const setViewMode = (id: string, viewMode: EditorViewMode) => (state.values.viewMode[id] = viewMode);\n\n return contributes(MarkdownCapabilities.State, { state: state.values, editorState, getViewMode, setViewMode });\n};\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAASA,cAAcC,mBAAwC;AAC/D,SAASC,yBAAyB;AAClC,SAA8BC,8BAA8B;AAM5D,IAAA,gBAAe,CAACC,YAAAA;AACd,QAAMC,QAAQ,IAAIC,kBAAuCC,iBAAiB;IAAEC,oBAAoB,CAAA;IAAIC,UAAU,CAAC;EAAE,CAAA;AAEjHJ,QAAMK,KAAK;IAAEC,KAAK;IAAYC,MAAMN,kBAAkBO,KAAI;EAAsC,CAAA;AAGhG,QAAMC,cAAcC,uBAAuB,GAAGR,eAAAA,SAAwB;AAEtE,QAAMS,cAAc,CAACC,OAAAA;AACnB,UAAMC,kBAAkBd,QACrBe,kBAAkBC,aAAaC,aAAa,EAC5CC,SAAgCf,eAAAA,EAAkBgB,MAAML;AAC3D,WAAQD,MAAMZ,MAAMmB,OAAOf,SAASQ,EAAAA,KAAQC;EAC9C;AAEA,QAAMO,cAAc,CAACR,IAAYR,aAA8BJ,MAAMmB,OAAOf,SAASQ,EAAAA,IAAMR;AAE3F,SAAOiB,YAAYC,qBAAqBC,OAAO;IAAEvB,OAAOA,MAAMmB;IAAQV;IAAaE;IAAaS;EAAY,CAAA;AAC9G;",
6
+ "names": ["Capabilities", "contributes", "LocalStorageStore", "createEditorStateStore", "context", "state", "LocalStorageStore", "MARKDOWN_PLUGIN", "extensionProviders", "viewMode", "prop", "key", "type", "json", "editorState", "createEditorStateStore", "getViewMode", "id", "defaultViewMode", "requestCapability", "Capabilities", "SettingsStore", "getStore", "value", "values", "setViewMode", "contributes", "MarkdownCapabilities", "State"]
7
+ }
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  DocumentType
3
- } from "./chunk-3C24B23M.mjs";
4
- import "./chunk-YTHIPV5Q.mjs";
3
+ } from "./chunk-UNNHN7UG.mjs";
4
+ import "./chunk-JX6XNEHE.mjs";
5
5
 
6
6
  // packages/plugins/plugin-markdown/src/capabilities/thread.ts
7
7
  import { contributes } from "@dxos/app-framework";
8
+ import { isInstanceOf } from "@dxos/echo-schema";
8
9
  import { ThreadCapabilities } from "@dxos/plugin-space";
9
10
  import { createDocAccessor, getRangeFromCursor } from "@dxos/react-client/echo";
10
11
  var thread_default = () => contributes(ThreadCapabilities.Thread, {
11
- predicate: (obj) => obj instanceof DocumentType,
12
+ predicate: (obj) => isInstanceOf(DocumentType, obj),
12
13
  createSort: (doc) => {
13
14
  const accessor = doc.content.target ? createDocAccessor(doc.content.target, [
14
15
  "content"
@@ -33,4 +34,4 @@ var thread_default = () => contributes(ThreadCapabilities.Thread, {
33
34
  export {
34
35
  thread_default as default
35
36
  };
36
- //# sourceMappingURL=thread-ZGBGNMEM.mjs.map
37
+ //# sourceMappingURL=thread-JRICWX5O.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/thread.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes } from '@dxos/app-framework';\nimport { isInstanceOf } from '@dxos/echo-schema';\nimport { ThreadCapabilities } from '@dxos/plugin-space';\nimport { createDocAccessor, getRangeFromCursor } from '@dxos/react-client/echo';\n\nimport { DocumentType } from '../types';\n\nexport default () =>\n contributes(ThreadCapabilities.Thread, {\n predicate: (obj) => isInstanceOf(DocumentType, obj),\n createSort: (doc: DocumentType) => {\n const accessor = doc.content.target ? createDocAccessor(doc.content.target, ['content']) : undefined;\n if (!accessor) {\n return (_) => 0;\n }\n\n const getStartPosition = (cursor: string | undefined) => {\n const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;\n return range?.start ?? Number.MAX_SAFE_INTEGER;\n };\n\n return (anchorA: string | undefined, anchorB: string | undefined): number => {\n if (anchorA === undefined || anchorB === undefined) {\n return 0;\n }\n const posA = getStartPosition(anchorA);\n const posB = getStartPosition(anchorB);\n return posA - posB;\n };\n },\n });\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,mBAAmB;AAC5B,SAASC,oBAAoB;AAC7B,SAASC,0BAA0B;AACnC,SAASC,mBAAmBC,0BAA0B;AAItD,IAAA,iBAAe,MACbC,YAAYC,mBAAmBC,QAAQ;EACrCC,WAAW,CAACC,QAAQC,aAAaC,cAAcF,GAAAA;EAC/CG,YAAY,CAACC,QAAAA;AACX,UAAMC,WAAWD,IAAIE,QAAQC,SAASC,kBAAkBJ,IAAIE,QAAQC,QAAQ;MAAC;KAAU,IAAIE;AAC3F,QAAI,CAACJ,UAAU;AACb,aAAO,CAACK,MAAM;IAChB;AAEA,UAAMC,mBAAmB,CAACC,WAAAA;AACxB,YAAMC,QAAQD,SAASE,mBAAmBT,UAAUO,MAAAA,IAAUH;AAC9D,aAAOI,OAAOE,SAASC,OAAOC;IAChC;AAEA,WAAO,CAACC,SAA6BC,YAAAA;AACnC,UAAID,YAAYT,UAAaU,YAAYV,QAAW;AAClD,eAAO;MACT;AACA,YAAMW,OAAOT,iBAAiBO,OAAAA;AAC9B,YAAMG,OAAOV,iBAAiBQ,OAAAA;AAC9B,aAAOC,OAAOC;IAChB;EACF;AACF,CAAA;",
6
+ "names": ["contributes", "isInstanceOf", "ThreadCapabilities", "createDocAccessor", "getRangeFromCursor", "contributes", "ThreadCapabilities", "Thread", "predicate", "obj", "isInstanceOf", "DocumentType", "createSort", "doc", "accessor", "content", "target", "createDocAccessor", "undefined", "_", "getStartPosition", "cursor", "range", "getRangeFromCursor", "start", "Number", "MAX_SAFE_INTEGER", "anchorA", "anchorB", "posA", "posB"]
7
+ }
@@ -1,11 +1,13 @@
1
1
  import {
2
+ DocumentSchema,
2
3
  DocumentType,
3
4
  MarkdownAction,
4
5
  MarkdownSettingsSchema,
5
6
  isEditorModel
6
- } from "../chunk-3C24B23M.mjs";
7
- import "../chunk-YTHIPV5Q.mjs";
7
+ } from "../chunk-UNNHN7UG.mjs";
8
+ import "../chunk-JX6XNEHE.mjs";
8
9
  export {
10
+ DocumentSchema,
9
11
  DocumentType,
10
12
  MarkdownAction,
11
13
  MarkdownSettingsSchema,
@@ -26,19 +26,21 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var MarkdownContainer_ESPH2MCH_exports = {};
30
- __export(MarkdownContainer_ESPH2MCH_exports, {
29
+ var MarkdownContainer_TR3OKWAG_exports = {};
30
+ __export(MarkdownContainer_TR3OKWAG_exports, {
31
31
  DocumentEditor: () => DocumentEditor,
32
32
  default: () => MarkdownContainer_default
33
33
  });
34
- module.exports = __toCommonJS(MarkdownContainer_ESPH2MCH_exports);
35
- var import_chunk_4N7RTNIG = require("./chunk-4N7RTNIG.cjs");
36
- var import_chunk_4LG6SPXW = require("./chunk-4LG6SPXW.cjs");
37
- var import_chunk_VYAJIYUI = require("./chunk-VYAJIYUI.cjs");
38
- var import_chunk_QZ4XQYNC = require("./chunk-QZ4XQYNC.cjs");
34
+ module.exports = __toCommonJS(MarkdownContainer_TR3OKWAG_exports);
35
+ var import_chunk_2CTFHOTK = require("./chunk-2CTFHOTK.cjs");
36
+ var import_chunk_DZXTXSXX = require("./chunk-DZXTXSXX.cjs");
37
+ var import_chunk_55TBVSYQ = require("./chunk-55TBVSYQ.cjs");
38
+ var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
39
39
  var import_react = __toESM(require("react"));
40
40
  var import_app_framework = require("@dxos/app-framework");
41
+ var import_echo_schema = require("@dxos/echo-schema");
41
42
  var import_echo = require("@dxos/react-client/echo");
43
+ var import_schema = require("@dxos/schema");
42
44
  var import_search = require("@codemirror/search");
43
45
  var import_react2 = __toESM(require("react"));
44
46
  var import_react_dropzone = require("react-dropzone");
@@ -50,7 +52,7 @@ var import_util = require("@dxos/util");
50
52
  var import_view = require("@codemirror/view");
51
53
  var import_react3 = require("react");
52
54
  var import_app_framework3 = require("@dxos/app-framework");
53
- var import_echo_schema = require("@dxos/echo-schema");
55
+ var import_echo_schema2 = require("@dxos/echo-schema");
54
56
  var import_invariant = require("@dxos/invariant");
55
57
  var import_react_ui_editor2 = require("@dxos/react-ui-editor");
56
58
  var import_react4 = __toESM(require("react"));
@@ -69,7 +71,7 @@ var useSelectCurrentThread = (editorView, documentId) => {
69
71
  intent: import_app_framework3.LayoutAction.UpdateLayout,
70
72
  position: "hoist",
71
73
  filter: (data) => {
72
- if (!import_echo_schema.S.is(import_app_framework3.LayoutAction.ScrollIntoView.fields.input)(data)) {
74
+ if (!import_echo_schema2.S.is(import_app_framework3.LayoutAction.ScrollIntoView.fields.input)(data)) {
73
75
  return false;
74
76
  }
75
77
  return !!editorView && data.subject === documentId && !!data.options?.cursor;
@@ -113,16 +115,19 @@ var useSelectCurrentThread = (editorView, documentId) => {
113
115
  documentId,
114
116
  editorView
115
117
  ]);
116
- (0, import_app_framework3.useIntentResolver)(import_chunk_QZ4XQYNC.MARKDOWN_PLUGIN, scrollIntoViewResolver);
118
+ (0, import_app_framework3.useIntentResolver)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN, scrollIntoViewResolver);
117
119
  };
118
- var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, scrollTo, selection, onFileUpload, onViewModeChange }) => {
119
- const { t } = (0, import_react_ui.useTranslation)(import_chunk_QZ4XQYNC.MARKDOWN_PLUGIN);
120
+ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, comment, viewMode, editorStateStore, onFileUpload, onViewModeChange }) => {
121
+ const { t } = (0, import_react_ui.useTranslation)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN);
120
122
  const { themeMode } = (0, import_react_ui.useThemeContext)();
121
123
  const { dispatchPromise: dispatch } = (0, import_app_framework2.useIntentDispatcher)();
122
124
  const toolbarState = (0, import_react_ui_editor.useEditorToolbarState)({
123
125
  viewMode
124
126
  });
125
127
  const formattingObserver = (0, import_react_ui_editor.useFormattingState)(toolbarState);
128
+ const { scrollTo, selection } = (0, import_react2.useMemo)(() => editorStateStore?.getState(id) ?? {}, [
129
+ id
130
+ ]);
126
131
  const providerExtensions = (0, import_react2.useMemo)(() => extensionProviders?.flatMap((provider) => provider({})).filter(import_util.isNonNullable), [
127
132
  extensionProviders
128
133
  ]);
@@ -153,8 +158,8 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
153
158
  initialValue,
154
159
  extensions: [
155
160
  formattingObserver,
156
- commentObserver,
157
- commentClickObserver,
161
+ comment && commentObserver,
162
+ comment && commentClickObserver,
158
163
  (0, import_react_ui_editor.createBasicExtensions)({
159
164
  readonly: viewMode === "readonly",
160
165
  placeholder: t("editor placeholder"),
@@ -190,6 +195,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
190
195
  }), [
191
196
  id,
192
197
  formattingObserver,
198
+ comment,
193
199
  viewMode,
194
200
  themeMode,
195
201
  extensions,
@@ -262,6 +268,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
262
268
  attendableId: id,
263
269
  role,
264
270
  state: toolbarState,
271
+ comment,
265
272
  customActions: onFileUpload ? createUploadAction : void 0,
266
273
  onAction: handleAction
267
274
  }), /* @__PURE__ */ import_react2.default.createElement("input", getInputProps())), /* @__PURE__ */ import_react2.default.createElement("div", {
@@ -291,7 +298,7 @@ var createUploadAction = () => ({
291
298
  }, "ph--image-square--regular", [
292
299
  "upload image label",
293
300
  {
294
- ns: import_chunk_QZ4XQYNC.MARKDOWN_PLUGIN
301
+ ns: import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN
295
302
  }
296
303
  ])
297
304
  ],
@@ -303,18 +310,21 @@ var createUploadAction = () => ({
303
310
  ]
304
311
  });
305
312
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
306
- var useExtensions = ({ document, settings, viewMode, selection, folding: folding2 }) => {
313
+ var useExtensions = ({ document, id, text, settings, viewMode, editorStateStore }) => {
307
314
  const { dispatchPromise: dispatch } = (0, import_app_framework4.useIntentDispatcher)();
308
315
  const identity = (0, import_halo.useIdentity)();
309
- const space = (0, import_echo2.getSpace)(document);
316
+ const space = (0, import_echo2.getSpace)(document) ?? (0, import_echo2.getSpace)(text);
310
317
  const baseExtensions = (0, import_react4.useMemo)(() => createBaseExtensions({
311
318
  document,
319
+ id,
320
+ text,
312
321
  settings,
313
322
  viewMode,
314
- dispatch,
315
- folding: folding2
323
+ dispatch
316
324
  }), [
317
325
  document,
326
+ id,
327
+ text,
318
328
  viewMode,
319
329
  dispatch,
320
330
  settings,
@@ -324,7 +334,7 @@ var useExtensions = ({ document, settings, viewMode, selection, folding: folding
324
334
  settings.debug,
325
335
  settings.typewriter
326
336
  ]);
327
- const extensionProviders = (0, import_app_framework4.useCapabilities)(import_chunk_4LG6SPXW.MarkdownCapabilities.Extensions);
337
+ const extensionProviders = (0, import_app_framework4.useCapabilities)(import_chunk_DZXTXSXX.MarkdownCapabilities.Extensions);
328
338
  const pluginExtensions = (0, import_react4.useMemo)(() => extensionProviders.flat().reduce((acc, provider) => {
329
339
  const extension = typeof provider === "function" ? provider({
330
340
  document
@@ -347,9 +357,17 @@ var useExtensions = ({ document, settings, viewMode, selection, folding: folding
347
357
  space,
348
358
  identity
349
359
  }),
350
- (0, import_react_ui_editor3.selectionState)(selection),
360
+ text && id && (0, import_react_ui_editor3.createDataExtensions)({
361
+ id,
362
+ text: (0, import_echo2.createDocAccessor)(text, [
363
+ "content"
364
+ ]),
365
+ space,
366
+ identity
367
+ }),
368
+ (0, import_react_ui_editor3.selectionState)(editorStateStore),
351
369
  document && (0, import_react_ui_editor3.listener)({
352
- onChange: (text) => (0, import_chunk_4N7RTNIG.setFallbackName)(document, text)
370
+ onChange: (text2) => (0, import_chunk_2CTFHOTK.setFallbackName)(document, text2)
353
371
  }),
354
372
  baseExtensions,
355
373
  pluginExtensions
@@ -358,14 +376,16 @@ var useExtensions = ({ document, settings, viewMode, selection, folding: folding
358
376
  pluginExtensions,
359
377
  document,
360
378
  document?.content?.target,
379
+ text,
380
+ id,
361
381
  space,
362
382
  identity
363
383
  ]);
364
384
  };
365
- var createBaseExtensions = ({ document, dispatch, settings, query, viewMode, folding: foldingState }) => {
385
+ var createBaseExtensions = ({ document, id, dispatch, settings, query, viewMode }) => {
366
386
  const extensions = [
367
387
  settings.editorInputMode && import_react_ui_editor3.InputModeExtensions[settings.editorInputMode],
368
- settings.folding && (0, import_react_ui_editor3.folding)(foldingState)
388
+ settings.folding && (0, import_react_ui_editor3.folding)()
369
389
  ].filter(import_util2.isNotFalsy);
370
390
  if (viewMode !== "source") {
371
391
  extensions.push(...[
@@ -376,14 +396,14 @@ var createBaseExtensions = ({ document, dispatch, settings, query, viewMode, fol
376
396
  from: 2
377
397
  } : void 0,
378
398
  // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
379
- renderLinkButton: dispatch && document ? onRenderLink((id) => {
399
+ renderLinkButton: dispatch && (document || id) ? onRenderLink((id2) => {
380
400
  void dispatch((0, import_app_framework4.createIntent)(import_app_framework4.LayoutAction.Open, {
381
401
  part: "main",
382
402
  subject: [
383
- id
403
+ id2
384
404
  ],
385
405
  options: {
386
- pivotId: (0, import_echo2.fullyQualifiedId)(document)
406
+ pivotId: document ? (0, import_echo2.fullyQualifiedId)(document) : id2
387
407
  }
388
408
  }));
389
409
  }) : void 0
@@ -424,7 +444,7 @@ var onRenderLink = (onSelectObject) => (el, url) => {
424
444
  const qualifiedId = url.split("/").at(-1);
425
445
  (0, import_invariant2.invariant)(qualifiedId, "Invalid link format.", {
426
446
  F: __dxlog_file2,
427
- L: 228,
447
+ L: 247,
428
448
  S: void 0,
429
449
  A: [
430
450
  "qualifiedId",
@@ -466,17 +486,18 @@ var renderRoot = (root, node) => {
466
486
  }, node));
467
487
  return root;
468
488
  };
469
- var MarkdownContainer = ({ id, role, object, settings, viewMode, selection, folding: folding2, onViewModeChange }) => {
489
+ var MarkdownContainer = ({ id, role, object, settings, viewMode, editorStateStore, onViewModeChange }) => {
470
490
  const scrollPastEnd = role === "article";
471
- const doc = object instanceof import_chunk_VYAJIYUI.DocumentType ? object : void 0;
491
+ const doc = (0, import_echo_schema.isInstanceOf)(import_chunk_55TBVSYQ.DocumentType, object) ? object : void 0;
492
+ const text = (0, import_echo_schema.isInstanceOf)(import_schema.TextType, object) ? object : void 0;
472
493
  const extensions = useExtensions({
473
494
  document: doc,
495
+ text,
496
+ id,
474
497
  settings,
475
498
  viewMode,
476
- selection,
477
- folding: folding2
499
+ editorStateStore
478
500
  });
479
- const selectionState2 = selection?.[(0, import_echo.fullyQualifiedId)(object)];
480
501
  if (doc) {
481
502
  return /* @__PURE__ */ import_react.default.createElement(DocumentEditor, {
482
503
  id: (0, import_echo.fullyQualifiedId)(object),
@@ -486,8 +507,19 @@ var MarkdownContainer = ({ id, role, object, settings, viewMode, selection, fold
486
507
  viewMode,
487
508
  settings,
488
509
  scrollPastEnd,
489
- selection: selectionState2?.selection,
490
- scrollTo: selectionState2?.scrollTo,
510
+ onViewModeChange
511
+ });
512
+ } else if (text) {
513
+ return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
514
+ id,
515
+ role,
516
+ initialValue: text.content,
517
+ extensions,
518
+ viewMode,
519
+ toolbar: settings.toolbar,
520
+ comment: false,
521
+ inputMode: settings.editorInputMode,
522
+ scrollPastEnd,
491
523
  onViewModeChange
492
524
  });
493
525
  } else {
@@ -500,8 +532,6 @@ var MarkdownContainer = ({ id, role, object, settings, viewMode, selection, fold
500
532
  toolbar: settings.toolbar,
501
533
  inputMode: settings.editorInputMode,
502
534
  scrollPastEnd,
503
- selection: selectionState2?.selection,
504
- scrollTo: selectionState2?.scrollTo,
505
535
  onViewModeChange
506
536
  });
507
537
  }
@@ -512,7 +542,7 @@ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
512
542
  if (typeof doc.fallbackName === "string") {
513
543
  return;
514
544
  }
515
- const fallbackName = doc.content?.target?.content ? (0, import_chunk_4N7RTNIG.getFallbackName)(doc.content.target.content) : void 0;
545
+ const fallbackName = doc.content?.target?.content ? (0, import_chunk_2CTFHOTK.getFallbackName)(doc.content.target.content) : void 0;
516
546
  if (fallbackName) {
517
547
  doc.fallbackName = fallbackName;
518
548
  }
@@ -545,4 +575,4 @@ var MarkdownContainer_default = MarkdownContainer;
545
575
  0 && (module.exports = {
546
576
  DocumentEditor
547
577
  });
548
- //# sourceMappingURL=MarkdownContainer-ESPH2MCH.cjs.map
578
+ //# sourceMappingURL=MarkdownContainer-TR3OKWAG.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownContainer.tsx", "../../../src/components/MarkdownEditor.tsx", "../../../src/hooks/useSelectCurrentThread.tsx", "../../../src/extensions.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo } from 'react';\n\nimport { Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { isInstanceOf } from '@dxos/echo-schema';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\nimport { TextType } from '@dxos/schema';\n\nimport { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';\nimport { useExtensions } from '../extensions';\nimport { DocumentType, type MarkdownSettingsProps } from '../types';\nimport { getFallbackName } from '../util';\n\nexport type MarkdownContainerProps = Pick<\n MarkdownEditorProps,\n 'role' | 'extensionProviders' | 'viewMode' | 'editorStateStore' | 'onViewModeChange'\n> & {\n id: string;\n object: DocumentType | TextType | any;\n settings: MarkdownSettingsProps;\n};\n\n// TODO(burdon): Move toolbar here.\n// TODO(burdon): Factor out difference for ECHO and non-ECHO objects; i.e., single component.\nconst MarkdownContainer = ({\n id,\n role,\n object,\n settings,\n viewMode,\n editorStateStore,\n onViewModeChange,\n}: MarkdownContainerProps) => {\n const scrollPastEnd = role === 'article';\n const doc = isInstanceOf(DocumentType, object) ? object : undefined;\n const text = isInstanceOf(TextType, object) ? object : undefined;\n const extensions = useExtensions({ document: doc, text, id, settings, viewMode, editorStateStore });\n\n if (doc) {\n return (\n <DocumentEditor\n id={fullyQualifiedId(object)}\n role={role}\n document={doc}\n extensions={extensions}\n viewMode={viewMode}\n settings={settings}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n } else if (text) {\n return (\n <MarkdownEditor\n id={id}\n role={role}\n initialValue={text.content}\n extensions={extensions}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n comment={false}\n inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n } else {\n return (\n <MarkdownEditor\n id={id}\n role={role}\n initialValue={object.text}\n extensions={extensions}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n />\n );\n }\n};\n\ntype DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &\n Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions'> & {\n document: DocumentType;\n };\n\nexport const DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }: DocumentEditorProps) => {\n const space = getSpace(doc);\n\n // Migrate gradually to `fallbackName`.\n useEffect(() => {\n if (typeof doc.fallbackName === 'string') {\n return;\n }\n\n const fallbackName = doc.content?.target?.content ? getFallbackName(doc.content.target.content) : undefined;\n if (fallbackName) {\n doc.fallbackName = fallbackName;\n }\n }, [doc, doc.content]);\n\n // File dragging.\n const [upload] = useCapabilities(Capabilities.FileUploader);\n const handleFileUpload = useMemo(() => {\n if (space === undefined || upload === undefined) {\n return undefined;\n }\n\n // TODO(burdon): Re-order props: space, file.\n return async (file: File) => upload!(file, space);\n }, [space, upload]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={doc.content?.target?.content}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n inputMode={settings.editorInputMode}\n onFileUpload={handleFileUpload}\n {...props}\n />\n );\n};\n\nexport default MarkdownContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { openSearchPanel } from '@codemirror/search';\nimport { type EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { createIntent, type FileInfo, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorAction,\n type DNDOptions,\n type EditorViewMode,\n type EditorInputMode,\n type EditorSelectionState,\n type EditorStateStore,\n EditorToolbar,\n type UseTextEditorProps,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n editorContent,\n editorGutter,\n processEditorPayload,\n useActionHandler,\n useCommentState,\n useCommentClickListener,\n useFormattingState,\n useTextEditor,\n stackItemContentEditorClassNames,\n useEditorToolbarState,\n createEditorAction,\n} from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { isNotFalsy, isNonNullable } from '@dxos/util';\n\nimport { useSelectCurrentThread } from '../hooks';\nimport { MARKDOWN_PLUGIN } from '../meta';\nimport { type MarkdownPluginState } from '../types';\n\nexport type MarkdownEditorProps = {\n id: string;\n role?: string;\n inputMode?: EditorInputMode;\n scrollPastEnd?: boolean;\n toolbar?: boolean;\n // TODO(wittjosiah): Generalize custom toolbar actions (e.g. comment, upload, etc.)\n comment?: boolean;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Partial<Pick<MarkdownPluginState, 'extensionProviders'>>;\n\n/**\n * Base markdown editor component.\n *\n * This component provides all the features of the markdown editor that do no depend on ECHO.\n * This allows it to be used as a common editor for markdown content on arbitrary backends (e.g. files).\n */\nexport const MarkdownEditor = ({\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n toolbar,\n comment,\n viewMode,\n editorStateStore,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProps) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const toolbarState = useEditorToolbarState({ viewMode });\n const formattingObserver = useFormattingState(toolbarState);\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n // Extensions from other plugins.\n // TODO(burdon): Reconcile with DocumentEditor.useExtensions.\n const providerExtensions = useMemo(\n () => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable),\n [extensionProviders],\n );\n\n // TODO(Zan): Factor out to thread plugin.\n const commentObserver = useCommentState(toolbarState);\n const onCommentClick = useCallback(async () => {\n await dispatch(\n createIntent(LayoutAction.UpdateComplementary, {\n part: 'complementary',\n subject: 'comments',\n options: { state: 'expanded' },\n }),\n );\n }, [dispatch]);\n const commentClickObserver = useCommentClickListener(onCommentClick);\n\n // TODO(wittjosiah): Factor out to file uploader plugin.\n // Drag files.\n const handleDrop: DNDOptions['onDrop'] = async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processEditorPayload(view, { type: 'image', data: info.url });\n }\n };\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n initialValue,\n extensions: [\n formattingObserver,\n comment && commentObserver,\n comment && commentClickObserver,\n createBasicExtensions({\n readonly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: { content: { className: editorContent } },\n }),\n editorGutter,\n role !== 'section' && onFileUpload && dropFile({ onDrop: handleDrop }),\n providerExtensions,\n extensions,\n ].filter(isNotFalsy),\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n // TODO(wittjosiah): Autofocus based on layout is racy.\n // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,\n moveToEndOfLine: true,\n }),\n }),\n [id, formattingObserver, comment, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useTest(editorView);\n useSelectCurrentThread(editorView, id);\n\n // https://react-dropzone.js.org/#src\n const { acceptedFiles, getInputProps, open } = useDropzone({\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': ['.jpg', '.jpeg', '.png', '.gif'],\n },\n });\n\n useEffect(() => {\n if (editorView && onFileUpload && acceptedFiles.length) {\n requestAnimationFrame(async () => {\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n const info = await onFileUpload(file);\n if (info) {\n processEditorPayload(editorView, { type: 'image', data: info.url });\n }\n });\n }\n }, [acceptedFiles, editorView]);\n\n // Toolbar handler.\n const handleToolbarAction = useActionHandler(editorView);\n const handleAction = useCallback(\n (action: EditorAction) => {\n switch (action.properties.type) {\n case 'search': {\n if (editorView) {\n openSearchPanel(editorView);\n }\n return;\n }\n case 'view-mode': {\n onViewModeChange?.(id, action.properties.data);\n return;\n }\n case 'image': {\n open();\n return;\n }\n }\n\n handleToolbarAction?.(action);\n },\n [editorView, onViewModeChange, open],\n );\n\n return (\n <StackItem.Content toolbar={!!toolbar}>\n {toolbar && (\n <>\n <EditorToolbar\n attendableId={id}\n role={role}\n state={toolbarState}\n comment={comment}\n customActions={onFileUpload ? createUploadAction : undefined}\n onAction={handleAction}\n />\n <input {...getInputProps()} />\n </>\n )}\n <div\n role='none'\n ref={parentRef}\n data-testid='composer.markdownRoot'\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={stackItemContentEditorClassNames(role)}\n {...focusAttributes}\n />\n </StackItem.Content>\n );\n};\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view?: EditorView) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n\nexport const createUploadAction = () => ({\n nodes: [\n createEditorAction({ type: 'image', testId: 'editor.toolbar.image' }, 'ph--image-square--regular', [\n 'upload image label',\n { ns: MARKDOWN_PLUGIN },\n ]),\n ],\n edges: [{ source: 'root', target: 'image' }],\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { useMemo } from 'react';\n\nimport { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';\nimport { S } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { Cursor, setSelection } from '@dxos/react-ui-editor';\n\nimport { MARKDOWN_PLUGIN } from '../meta';\n\n/**\n * Handle scrolling and selection of the current thread in a markdown editor.\n */\nexport const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver({\n intent: LayoutAction.UpdateLayout,\n position: 'hoist',\n filter: (data): data is { part: 'current'; subject: string; options: { cursor: string } } => {\n if (!S.is(LayoutAction.ScrollIntoView.fields.input)(data)) {\n return false;\n }\n\n return !!editorView && data.subject === documentId && !!data.options?.cursor;\n },\n resolve: ({ options: { cursor } }) => {\n invariant(editorView, 'Editor view is not defined.');\n const range = Cursor.getRangeFromCursor(editorView.state, cursor!);\n if (range) {\n const selection = editorView.state.selection.main.from !== range.from ? { anchor: range.from } : undefined;\n const effects = [\n // NOTE: This does not use the DOM scrollIntoView function.\n EditorView.scrollIntoView(range.from, { y: 'start', yMargin: 96 }),\n ];\n if (selection) {\n // Update the editor selection to get bi-directional highlighting.\n effects.push(setSelection.of({ current: documentId }));\n }\n\n editorView.dispatch({\n effects,\n selection: selection ? { anchor: range.from } : undefined,\n });\n }\n },\n }),\n [documentId, editorView],\n );\n\n useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport {\n createIntent,\n LayoutAction,\n type PromiseIntentDispatcher,\n useCapabilities,\n useIntentDispatcher,\n} from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { createDocAccessor, fullyQualifiedId, getSpace, type Query } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ThemeProvider } from '@dxos/react-ui';\nimport {\n type AutocompleteResult,\n type EditorStateStore,\n type EditorViewMode,\n type Extension,\n InputModeExtensions,\n createDataExtensions,\n autocomplete,\n decorateMarkdown,\n folding,\n formattingKeymap,\n linkTooltip,\n listener,\n selectionState,\n typewriter,\n} from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { type TextType } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { MarkdownCapabilities } from './capabilities';\nimport { type DocumentType, type MarkdownSettingsProps } from './types';\nimport { setFallbackName } from './util';\n\ntype ExtensionsOptions = {\n document?: DocumentType;\n id?: string;\n text?: TextType;\n dispatch?: PromiseIntentDispatcher;\n query?: Query<DocumentType>;\n settings: MarkdownSettingsProps;\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n};\n\n// TODO(burdon): Merge with createBaseExtensions below.\nexport const useExtensions = ({\n document,\n id,\n text,\n settings,\n viewMode,\n editorStateStore,\n}: ExtensionsOptions): Extension[] => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const identity = useIdentity();\n const space = getSpace(document) ?? getSpace(text);\n\n // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.\n // TODO(burdon): Unsubscribe.\n // const query = space?.db.query(Filter.schema(DocumentType));\n // query?.subscribe();\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n document,\n id,\n text,\n settings,\n viewMode,\n dispatch,\n // query,\n }),\n [\n document,\n id,\n text,\n viewMode,\n dispatch,\n settings,\n settings.editorInputMode,\n settings.folding,\n settings.numberedHeadings,\n settings.debug,\n settings.typewriter,\n ],\n );\n\n const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);\n\n //\n // External extensions from other plugins.\n //\n const pluginExtensions = useMemo<Extension[] | undefined>(\n () =>\n extensionProviders.flat().reduce((acc: Extension[], provider) => {\n const extension = typeof provider === 'function' ? provider({ document }) : provider;\n if (extension) {\n acc.push(extension);\n }\n\n return acc;\n }, []),\n [extensionProviders, document],\n );\n\n //\n // Basic plugins.\n //\n return useMemo<Extension[]>(\n () =>\n [\n // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.\n document &&\n createDataExtensions({\n id: document.id,\n text: document.content.target && createDocAccessor(document.content.target, ['content']),\n space,\n identity,\n }),\n text &&\n id &&\n createDataExtensions({\n id,\n text: createDocAccessor(text, ['content']),\n space,\n identity,\n }),\n selectionState(editorStateStore),\n document &&\n listener({\n onChange: (text) => setFallbackName(document, text),\n }),\n baseExtensions,\n pluginExtensions,\n ].filter(isNotFalsy),\n [baseExtensions, pluginExtensions, document, document?.content?.target, text, id, space, identity],\n );\n};\n\n/**\n * Create extension instances for editor.\n */\nconst createBaseExtensions = ({\n document,\n id,\n dispatch,\n settings,\n query,\n viewMode,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n settings.editorInputMode && InputModeExtensions[settings.editorInputMode],\n settings.folding && folding(),\n ].filter(isNotFalsy);\n\n //\n // Markdown\n //\n if (viewMode !== 'source') {\n extensions.push(\n ...[\n formattingKeymap(),\n decorateMarkdown({\n selectionChangeDelay: 100,\n numberedHeadings: settings.numberedHeadings ? { from: 2 } : undefined,\n // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.\n renderLinkButton:\n dispatch && (document || id)\n ? onRenderLink((id: string) => {\n void dispatch(\n createIntent(LayoutAction.Open, {\n part: 'main',\n subject: [id],\n options: {\n pivotId: document ? fullyQualifiedId(document) : id,\n },\n }),\n );\n })\n : undefined,\n }),\n linkTooltip(renderLinkTooltip),\n ],\n );\n }\n\n //\n // Autocomplete object links.\n //\n if (query) {\n extensions.push(\n autocomplete({\n onSearch: (text: string) => {\n // TODO(burdon): Specify filter (e.g., stack).\n return query.objects\n .map<AutocompleteResult | undefined>((object) =>\n object.name?.length && object.id !== document?.id\n ? {\n label: object.name,\n // TODO(burdon): Factor out URL builder.\n apply: `[${object.name}](/${fullyQualifiedId(object)})`,\n }\n : undefined,\n )\n .filter(isNotFalsy);\n },\n }),\n );\n }\n\n if (settings.debug) {\n const items = settings.typewriter?.split(/[,\\n]/) ?? '';\n if (items) {\n extensions.push(typewriter({ items }));\n }\n }\n\n return extensions;\n};\n\n// TODO(burdon): Factor out styles.\nconst style = {\n hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',\n icon: 'inline-block leading-none mis-1 cursor-pointer',\n};\n\nconst onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {\n // TODO(burdon): Formalize/document internal link format.\n const isInternal =\n url.startsWith('/') ||\n // TODO(wittjosiah): This should probably be parsed out on paste?\n url.startsWith(window.location.origin);\n\n const options: AnchorHTMLAttributes<any> = isInternal\n ? {\n onClick: () => {\n const qualifiedId = url.split('/').at(-1);\n invariant(qualifiedId, 'Invalid link format.');\n onSelectObject(qualifiedId);\n },\n }\n : {\n href: url,\n rel: 'noreferrer',\n target: '_blank',\n };\n\n renderRoot(\n el,\n <a {...options} className={style.hover}>\n <Icon\n icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}\n size={4}\n classNames={style.icon}\n />\n </a>,\n );\n};\n\nconst renderLinkTooltip = (el: Element, url: string) => {\n const web = new URL(url);\n renderRoot(\n el,\n <a href={url} rel='noreferrer' target='_blank' className={style.hover}>\n {web.origin}\n <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />\n </a>,\n );\n};\n\n// TODO(burdon): Remove react rendering; use DOM directly.\nexport const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {\n createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);\n return root;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_app_framework", "import_echo_schema", "import_react_ui_editor", "import_invariant", "import_echo", "import_react_ui", "import_util", "useSelectCurrentThread", "editorView", "documentId", "scrollIntoViewResolver", "useMemo", "createResolver", "intent", "LayoutAction", "UpdateLayout", "position", "filter", "data", "S", "is", "ScrollIntoView", "fields", "input", "subject", "options", "cursor", "resolve", "invariant", "range", "Cursor", "getRangeFromCursor", "state", "selection", "main", "from", "anchor", "undefined", "effects", "EditorView", "scrollIntoView", "y", "yMargin", "push", "setSelection", "of", "current", "dispatch", "useIntentResolver", "MARKDOWN_PLUGIN", "MarkdownEditor", "id", "role", "initialValue", "extensions", "extensionProviders", "scrollPastEnd", "toolbar", "comment", "viewMode", "editorStateStore", "onFileUpload", "onViewModeChange", "t", "useTranslation", "themeMode", "useThemeContext", "dispatchPromise", "useIntentDispatcher", "toolbarState", "useEditorToolbarState", "formattingObserver", "useFormattingState", "scrollTo", "getState", "providerExtensions", "flatMap", "provider", "isNonNullable", "commentObserver", "useCommentState", "onCommentClick", "useCallback", "createIntent", "UpdateComplementary", "part", "commentClickObserver", "useCommentClickListener", "handleDrop", "view", "files", "file", "info", "processEditorPayload", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readonly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "className", "editorContent", "editorGutter", "dropFile", "onDrop", "isNotFalsy", "moveToEndOfLine", "useTest", "acceptedFiles", "getInputProps", "open", "useDropzone", "multiple", "noDrag", "accept", "useEffect", "length", "requestAnimationFrame", "f", "File", "name", "lastModified", "handleToolbarAction", "useActionHandler", "handleAction", "action", "properties", "openSearchPanel", "React", "StackItem", "Content", "EditorToolbar", "attendableId", "customActions", "createUploadAction", "onAction", "div", "ref", "data-testid", "data-toolbar", "stackItemContentEditorClassNames", "composer", "window", "nodes", "createEditorAction", "testId", "ns", "edges", "source", "target", "useExtensions", "document", "text", "settings", "identity", "useIdentity", "space", "getSpace", "baseExtensions", "createBaseExtensions", "editorInputMode", "folding", "numberedHeadings", "debug", "typewriter", "useCapabilities", "MarkdownCapabilities", "Extensions", "pluginExtensions", "flat", "reduce", "acc", "extension", "createDataExtensions", "createDocAccessor", "selectionState", "listener", "onChange", "setFallbackName", "query", "InputModeExtensions", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "renderLinkButton", "onRenderLink", "Open", "pivotId", "fullyQualifiedId", "linkTooltip", "renderLinkTooltip", "autocomplete", "onSearch", "objects", "map", "object", "label", "apply", "items", "split", "style", "hover", "icon", "onSelectObject", "el", "isInternal", "startsWith", "location", "origin", "onClick", "qualifiedId", "at", "href", "rel", "renderRoot", "a", "Icon", "size", "classNames", "web", "URL", "root", "node", "createRoot", "render", "ThemeProvider", "tx", "defaultTx", "MarkdownContainer", "doc", "isInstanceOf", "DocumentType", "TextType", "DocumentEditor", "inputMode", "props", "fallbackName", "getFallbackName", "upload", "Capabilities", "FileUploader", "handleFileUpload"]
7
+ }
@@ -16,28 +16,29 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var app_graph_serializer_EIHJDGDZ_exports = {};
20
- __export(app_graph_serializer_EIHJDGDZ_exports, {
19
+ var app_graph_serializer_5AE4W7O5_exports = {};
20
+ __export(app_graph_serializer_5AE4W7O5_exports, {
21
21
  default: () => app_graph_serializer_default
22
22
  });
23
- module.exports = __toCommonJS(app_graph_serializer_EIHJDGDZ_exports);
24
- var import_chunk_DEUESZ5O = require("./chunk-DEUESZ5O.cjs");
25
- var import_chunk_VYAJIYUI = require("./chunk-VYAJIYUI.cjs");
26
- var import_chunk_QZ4XQYNC = require("./chunk-QZ4XQYNC.cjs");
23
+ module.exports = __toCommonJS(app_graph_serializer_5AE4W7O5_exports);
24
+ var import_chunk_MW3N4QBR = require("./chunk-MW3N4QBR.cjs");
25
+ var import_chunk_55TBVSYQ = require("./chunk-55TBVSYQ.cjs");
26
+ var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
27
27
  var import_effect = require("effect");
28
28
  var import_app_framework = require("@dxos/app-framework");
29
+ var import_echo_schema = require("@dxos/echo-schema");
29
30
  var import_types = require("@dxos/plugin-space/types");
30
31
  var import_echo = require("@dxos/react-client/echo");
31
32
  var app_graph_serializer_default = (context) => (0, import_app_framework.contributes)(import_app_framework.Capabilities.AppGraphSerializer, [
32
33
  {
33
- inputType: import_chunk_VYAJIYUI.DocumentType.typename,
34
+ inputType: (0, import_echo_schema.getSchemaTypename)(import_chunk_55TBVSYQ.DocumentType),
34
35
  outputType: "text/markdown",
35
36
  // Reconcile with metadata serializers.
36
37
  serialize: async (node) => {
37
38
  const doc = node.data;
38
39
  const content = await doc.content.load();
39
40
  return {
40
- name: doc.name || doc.fallbackName || import_chunk_DEUESZ5O.translations_default[0]["en-US"][import_chunk_QZ4XQYNC.MARKDOWN_PLUGIN]["document title placeholder"],
41
+ name: doc.name || doc.fallbackName || import_chunk_MW3N4QBR.translations_default[0]["en-US"][import_chunk_55TBVSYQ.DocumentType.typename]["object name placeholder"],
41
42
  data: content.content,
42
43
  type: "text/markdown"
43
44
  };
@@ -49,7 +50,7 @@ var app_graph_serializer_default = (context) => (0, import_app_framework.contrib
49
50
  return;
50
51
  }
51
52
  const { dispatchPromise: dispatch } = context.requestCapability(import_app_framework.Capabilities.IntentDispatcher);
52
- const result = await dispatch((0, import_effect.pipe)((0, import_app_framework.createIntent)(import_chunk_VYAJIYUI.MarkdownAction.Create, {
53
+ const result = await dispatch((0, import_effect.pipe)((0, import_app_framework.createIntent)(import_chunk_55TBVSYQ.MarkdownAction.Create, {
53
54
  name: data.name,
54
55
  content: data.data
55
56
  }), (0, import_app_framework.chain)(import_types.SpaceAction.AddObject, {
@@ -59,4 +60,4 @@ var app_graph_serializer_default = (context) => (0, import_app_framework.contrib
59
60
  }
60
61
  }
61
62
  ]);
62
- //# sourceMappingURL=app-graph-serializer-EIHJDGDZ.cjs.map
63
+ //# sourceMappingURL=app-graph-serializer-5AE4W7O5.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-serializer.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { pipe } from 'effect';\n\nimport { contributes, Capabilities, type PluginsContext, chain, createIntent } from '@dxos/app-framework';\nimport { getSchemaTypename } from '@dxos/echo-schema';\nimport { SpaceAction, CollectionType } from '@dxos/plugin-space/types';\nimport { isSpace } from '@dxos/react-client/echo';\n\nimport translations from '../translations';\nimport { MarkdownAction, DocumentType } from '../types';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphSerializer, [\n {\n inputType: getSchemaTypename(DocumentType)!,\n outputType: 'text/markdown',\n // Reconcile with metadata serializers.\n serialize: async (node) => {\n const doc = node.data;\n const content = await doc.content.load();\n return {\n name:\n doc.name || doc.fallbackName || translations[0]['en-US'][DocumentType.typename]['object name placeholder'],\n data: content.content,\n type: 'text/markdown',\n };\n },\n deserialize: async (data, ancestors) => {\n const space = ancestors.find(isSpace);\n const target =\n ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ??\n space?.properties[CollectionType.typename]?.target;\n if (!space || !target) {\n return;\n }\n\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const result = await dispatch(\n pipe(\n createIntent(MarkdownAction.Create, { name: data.name, content: data.data }),\n chain(SpaceAction.AddObject, { target }),\n ),\n );\n\n return result.data?.object;\n },\n },\n ]);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,oBAAqB;AAErB,2BAAoF;AACpF,yBAAkC;AAClC,mBAA4C;AAC5C,kBAAwB;AAKxB,IAAA,+BAAe,CAACA,gBACdC,kCAAYC,kCAAaC,oBAAoB;EAC3C;IACEC,eAAWC,sCAAkBC,kCAAAA;IAC7BC,YAAY;;IAEZC,WAAW,OAAOC,SAAAA;AAChB,YAAMC,MAAMD,KAAKE;AACjB,YAAMC,UAAU,MAAMF,IAAIE,QAAQC,KAAI;AACtC,aAAO;QACLC,MACEJ,IAAII,QAAQJ,IAAIK,gBAAgBC,2CAAa,CAAA,EAAG,OAAA,EAASV,mCAAaW,QAAQ,EAAE,yBAAA;QAClFN,MAAMC,QAAQA;QACdM,MAAM;MACR;IACF;IACAC,aAAa,OAAOR,MAAMS,cAAAA;AACxB,YAAMC,QAAQD,UAAUE,KAAKC,mBAAAA;AAC7B,YAAMC,SACJJ,UAAUK,SAAS,CAACC,aAAaA,oBAAoBC,2BAAAA,KACrDN,OAAOO,WAAWD,4BAAeV,QAAQ,GAAGO;AAC9C,UAAI,CAACH,SAAS,CAACG,QAAQ;AACrB;MACF;AAEA,YAAM,EAAEK,iBAAiBC,SAAQ,IAAK9B,QAAQ+B,kBAAkB7B,kCAAa8B,gBAAgB;AAC7F,YAAMC,SAAS,MAAMH,aACnBI,wBACEC,mCAAaC,qCAAeC,QAAQ;QAAEvB,MAAMH,KAAKG;QAAMF,SAASD,KAAKA;MAAK,CAAA,OAC1E2B,4BAAMC,yBAAYC,WAAW;QAAEhB;MAAO,CAAA,CAAA,CAAA;AAI1C,aAAOS,OAAOtB,MAAM8B;IACtB;EACF;CACD;",
6
+ "names": ["context", "contributes", "Capabilities", "AppGraphSerializer", "inputType", "getSchemaTypename", "DocumentType", "outputType", "serialize", "node", "doc", "data", "content", "load", "name", "fallbackName", "translations", "typename", "type", "deserialize", "ancestors", "space", "find", "isSpace", "target", "findLast", "ancestor", "CollectionType", "properties", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "result", "pipe", "createIntent", "MarkdownAction", "Create", "chain", "SpaceAction", "AddObject", "object"]
7
+ }