@dxos/plugin-markdown 0.8.2 → 0.8.3-main.7f5a14c

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 (143) hide show
  1. package/dist/lib/browser/{MarkdownContainer-5IEINNQB.mjs → MarkdownContainer-3KTC7Q4C.mjs} +132 -18
  2. package/dist/lib/browser/MarkdownContainer-3KTC7Q4C.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownPreview-YW5CS3ID.mjs → MarkdownPreview-F4PYFW5L.mjs} +15 -22
  4. package/dist/lib/browser/MarkdownPreview-F4PYFW5L.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-VS4OZVPP.mjs → anchor-sort-BMAN2ABT.mjs} +4 -4
  6. package/dist/lib/browser/anchor-sort-BMAN2ABT.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-V6RLEHVY.mjs → app-graph-serializer-FLQI6GFL.mjs} +3 -3
  8. package/dist/lib/browser/{artifact-definition-5NAODQLG.mjs → artifact-definition-FQ2R6KPT.mjs} +6 -6
  9. package/dist/lib/browser/artifact-definition-FQ2R6KPT.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-C5RABVIX.mjs → chunk-CX5GYZYO.mjs} +2 -2
  11. package/dist/lib/browser/{chunk-ACAID3XF.mjs → chunk-LCMXUTQB.mjs} +7 -7
  12. package/dist/lib/browser/{chunk-77NGW7EO.mjs → chunk-LXSRQPEP.mjs} +9 -9
  13. package/dist/lib/browser/chunk-LXSRQPEP.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-ECSM56YC.mjs → chunk-N2D26K6W.mjs} +4 -5
  15. package/dist/lib/browser/chunk-N2D26K6W.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +7 -8
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/{intent-resolver-4GDYST4Y.mjs → intent-resolver-6ZOABX2J.mjs} +6 -7
  19. package/dist/lib/browser/intent-resolver-6ZOABX2J.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-surface-QE4SKXBT.mjs → react-surface-RJQKYJJQ.mjs} +8 -8
  22. package/dist/lib/browser/react-surface-RJQKYJJQ.mjs.map +7 -0
  23. package/dist/lib/browser/{settings-W5CK4PXP.mjs → settings-PLH54VC7.mjs} +4 -4
  24. package/dist/lib/browser/settings-PLH54VC7.mjs.map +7 -0
  25. package/dist/lib/browser/types/index.mjs +1 -1
  26. package/dist/lib/node/{MarkdownContainer-LSNNPNRB.cjs → MarkdownContainer-NG4H6AZJ.cjs} +181 -67
  27. package/dist/lib/node/MarkdownContainer-NG4H6AZJ.cjs.map +7 -0
  28. package/dist/lib/node/{MarkdownPreview-G34HSQEB.cjs → MarkdownPreview-GCJJCXY6.cjs} +24 -31
  29. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs.map +7 -0
  30. package/dist/lib/node/{anchor-sort-NHVF23EU.cjs → anchor-sort-V3T4SFFI.cjs} +12 -12
  31. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs.map +7 -0
  32. package/dist/lib/node/{app-graph-serializer-CLALIYN3.cjs → app-graph-serializer-BZPM7HHJ.cjs} +9 -9
  33. package/dist/lib/node/{artifact-definition-VEAHK7BX.cjs → artifact-definition-U27MH5SC.cjs} +16 -16
  34. package/dist/lib/node/artifact-definition-U27MH5SC.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-RQS4KBMG.cjs → chunk-3HHV4MM6.cjs} +6 -7
  36. package/dist/lib/node/chunk-3HHV4MM6.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-C4HR7UXE.cjs → chunk-4DYNEQG3.cjs} +10 -10
  38. package/dist/lib/node/{chunk-G7RBJX22.cjs → chunk-CJLYFGPI.cjs} +12 -12
  39. package/dist/lib/node/chunk-CJLYFGPI.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-ZDTL47I7.cjs → chunk-SYEFGLXN.cjs} +6 -6
  41. package/dist/lib/node/index.cjs +26 -27
  42. package/dist/lib/node/index.cjs.map +3 -3
  43. package/dist/lib/node/{intent-resolver-AUZVK3NZ.cjs → intent-resolver-OEFLRNEJ.cjs} +14 -15
  44. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs.map +7 -0
  45. package/dist/lib/node/meta.json +1 -1
  46. package/dist/lib/node/{react-surface-WJZTEBYO.cjs → react-surface-5RKEWAXS.cjs} +15 -15
  47. package/dist/lib/node/react-surface-5RKEWAXS.cjs.map +7 -0
  48. package/dist/lib/node/{settings-IRKU3WPM.cjs → settings-E3NUTXJ4.cjs} +7 -7
  49. package/dist/lib/node/settings-E3NUTXJ4.cjs.map +7 -0
  50. package/dist/lib/node/types/index.cjs +7 -7
  51. package/dist/lib/node/types/index.cjs.map +1 -1
  52. package/dist/lib/node-esm/{MarkdownContainer-UZSLXMWO.mjs → MarkdownContainer-DZPXCA6J.mjs} +132 -18
  53. package/dist/lib/node-esm/MarkdownContainer-DZPXCA6J.mjs.map +7 -0
  54. package/dist/lib/node-esm/{MarkdownPreview-TCV7BI32.mjs → MarkdownPreview-KFDRV4GC.mjs} +15 -22
  55. package/dist/lib/node-esm/MarkdownPreview-KFDRV4GC.mjs.map +7 -0
  56. package/dist/lib/node-esm/{anchor-sort-G2HLCYFK.mjs → anchor-sort-BXL7BE67.mjs} +4 -4
  57. package/dist/lib/node-esm/anchor-sort-BXL7BE67.mjs.map +7 -0
  58. package/dist/lib/node-esm/{app-graph-serializer-C3RNTQGM.mjs → app-graph-serializer-EBH54X6Z.mjs} +3 -3
  59. package/dist/lib/node-esm/{artifact-definition-7TIJW2CO.mjs → artifact-definition-NQOHB6S5.mjs} +6 -6
  60. package/dist/lib/node-esm/artifact-definition-NQOHB6S5.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-6RPARLIK.mjs → chunk-K26TX5V4.mjs} +9 -9
  62. package/dist/lib/node-esm/chunk-K26TX5V4.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-TCFJNUAE.mjs → chunk-Q7WUBLL3.mjs} +2 -2
  64. package/dist/lib/node-esm/{chunk-NCMPVEXO.mjs → chunk-T2Y2BT53.mjs} +4 -5
  65. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-EIUTPXGL.mjs → chunk-WANCCPU7.mjs} +7 -7
  67. package/dist/lib/node-esm/index.mjs +7 -8
  68. package/dist/lib/node-esm/index.mjs.map +3 -3
  69. package/dist/lib/node-esm/{intent-resolver-FTNXUNI2.mjs → intent-resolver-CLMSVF2K.mjs} +6 -7
  70. package/dist/lib/node-esm/intent-resolver-CLMSVF2K.mjs.map +7 -0
  71. package/dist/lib/node-esm/meta.json +1 -1
  72. package/dist/lib/node-esm/{react-surface-XNM3YDFB.mjs → react-surface-Z3DX37JV.mjs} +8 -8
  73. package/dist/lib/node-esm/react-surface-Z3DX37JV.mjs.map +7 -0
  74. package/dist/lib/node-esm/{settings-MK7D7LHQ.mjs → settings-SIY33P3F.mjs} +4 -4
  75. package/dist/lib/node-esm/settings-SIY33P3F.mjs.map +7 -0
  76. package/dist/lib/node-esm/types/index.mjs +1 -1
  77. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  79. package/dist/types/src/components/MarkdownContainer.d.ts +1 -1
  80. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  81. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +4 -2
  82. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  83. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +1 -1
  84. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +1 -1
  85. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +2 -6
  86. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/index.d.ts +1 -1
  89. package/dist/types/src/components/index.d.ts.map +1 -1
  90. package/dist/types/src/types/schema.d.ts.map +1 -1
  91. package/dist/types/src/util.d.ts.map +1 -1
  92. package/package.json +38 -39
  93. package/src/MarkdownPlugin.tsx +3 -5
  94. package/src/capabilities/anchor-sort.ts +2 -2
  95. package/src/capabilities/artifact-definition.ts +3 -3
  96. package/src/capabilities/intent-resolver.ts +4 -5
  97. package/src/capabilities/react-surface.tsx +4 -4
  98. package/src/capabilities/settings.ts +2 -2
  99. package/src/components/MarkdownContainer.tsx +61 -7
  100. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +3 -3
  101. package/src/components/MarkdownEditor/MarkdownEditor.tsx +196 -144
  102. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +8 -7
  103. package/src/components/MarkdownPreview/MarkdownPreview.tsx +14 -28
  104. package/src/components/Suggestions.stories.tsx +8 -9
  105. package/src/components/Toolbar.stories.tsx +3 -3
  106. package/src/types/schema.ts +2 -3
  107. package/src/util.tsx +5 -7
  108. package/dist/lib/browser/MarkdownContainer-5IEINNQB.mjs.map +0 -7
  109. package/dist/lib/browser/MarkdownPreview-YW5CS3ID.mjs.map +0 -7
  110. package/dist/lib/browser/anchor-sort-VS4OZVPP.mjs.map +0 -7
  111. package/dist/lib/browser/artifact-definition-5NAODQLG.mjs.map +0 -7
  112. package/dist/lib/browser/chunk-77NGW7EO.mjs.map +0 -7
  113. package/dist/lib/browser/chunk-ECSM56YC.mjs.map +0 -7
  114. package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs.map +0 -7
  115. package/dist/lib/browser/react-surface-QE4SKXBT.mjs.map +0 -7
  116. package/dist/lib/browser/settings-W5CK4PXP.mjs.map +0 -7
  117. package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs.map +0 -7
  118. package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs.map +0 -7
  119. package/dist/lib/node/anchor-sort-NHVF23EU.cjs.map +0 -7
  120. package/dist/lib/node/artifact-definition-VEAHK7BX.cjs.map +0 -7
  121. package/dist/lib/node/chunk-G7RBJX22.cjs.map +0 -7
  122. package/dist/lib/node/chunk-RQS4KBMG.cjs.map +0 -7
  123. package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs.map +0 -7
  124. package/dist/lib/node/react-surface-WJZTEBYO.cjs.map +0 -7
  125. package/dist/lib/node/settings-IRKU3WPM.cjs.map +0 -7
  126. package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs.map +0 -7
  127. package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs.map +0 -7
  128. package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs.map +0 -7
  129. package/dist/lib/node-esm/artifact-definition-7TIJW2CO.mjs.map +0 -7
  130. package/dist/lib/node-esm/chunk-6RPARLIK.mjs.map +0 -7
  131. package/dist/lib/node-esm/chunk-NCMPVEXO.mjs.map +0 -7
  132. package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs.map +0 -7
  133. package/dist/lib/node-esm/react-surface-XNM3YDFB.mjs.map +0 -7
  134. package/dist/lib/node-esm/settings-MK7D7LHQ.mjs.map +0 -7
  135. /package/dist/lib/browser/{app-graph-serializer-V6RLEHVY.mjs.map → app-graph-serializer-FLQI6GFL.mjs.map} +0 -0
  136. /package/dist/lib/browser/{chunk-C5RABVIX.mjs.map → chunk-CX5GYZYO.mjs.map} +0 -0
  137. /package/dist/lib/browser/{chunk-ACAID3XF.mjs.map → chunk-LCMXUTQB.mjs.map} +0 -0
  138. /package/dist/lib/node/{app-graph-serializer-CLALIYN3.cjs.map → app-graph-serializer-BZPM7HHJ.cjs.map} +0 -0
  139. /package/dist/lib/node/{chunk-C4HR7UXE.cjs.map → chunk-4DYNEQG3.cjs.map} +0 -0
  140. /package/dist/lib/node/{chunk-ZDTL47I7.cjs.map → chunk-SYEFGLXN.cjs.map} +0 -0
  141. /package/dist/lib/node-esm/{app-graph-serializer-C3RNTQGM.mjs.map → app-graph-serializer-EBH54X6Z.mjs.map} +0 -0
  142. /package/dist/lib/node-esm/{chunk-TCFJNUAE.mjs.map → chunk-Q7WUBLL3.mjs.map} +0 -0
  143. /package/dist/lib/node-esm/{chunk-EIUTPXGL.mjs.map → chunk-WANCCPU7.mjs.map} +0 -0
@@ -26,30 +26,33 @@ 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_LSNNPNRB_exports = {};
30
- __export(MarkdownContainer_LSNNPNRB_exports, {
29
+ var MarkdownContainer_NG4H6AZJ_exports = {};
30
+ __export(MarkdownContainer_NG4H6AZJ_exports, {
31
31
  DocumentEditor: () => DocumentEditor,
32
32
  default: () => MarkdownContainer_default
33
33
  });
34
- module.exports = __toCommonJS(MarkdownContainer_LSNNPNRB_exports);
35
- var import_chunk_C4HR7UXE = require("./chunk-C4HR7UXE.cjs");
34
+ module.exports = __toCommonJS(MarkdownContainer_NG4H6AZJ_exports);
35
+ var import_chunk_4DYNEQG3 = require("./chunk-4DYNEQG3.cjs");
36
36
  var import_chunk_IFYSBQE5 = require("./chunk-IFYSBQE5.cjs");
37
- var import_chunk_G7RBJX22 = require("./chunk-G7RBJX22.cjs");
38
- var import_chunk_RQS4KBMG = require("./chunk-RQS4KBMG.cjs");
37
+ var import_chunk_CJLYFGPI = require("./chunk-CJLYFGPI.cjs");
38
+ var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
39
39
  var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
40
40
  var import_tracking = require("@preact-signals/safe-react/tracking");
41
41
  var import_rx_react = require("@effect-rx/rx-react");
42
42
  var import_react = __toESM(require("react"));
43
43
  var import_app_framework = require("@dxos/app-framework");
44
- var import_echo_schema = require("@dxos/echo-schema");
45
- var import_echo = require("@dxos/react-client/echo");
44
+ var import_echo = require("@dxos/echo");
45
+ var import_plugin_space = require("@dxos/plugin-space");
46
+ var import_echo2 = require("@dxos/react-client/echo");
47
+ var import_react_ui = require("@dxos/react-ui");
48
+ var import_react_ui_editor = require("@dxos/react-ui-editor");
46
49
  var import_schema = require("@dxos/schema");
47
50
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
48
51
  var import_react2 = __toESM(require("react"));
49
52
  var import_react_dropzone = require("react-dropzone");
50
53
  var import_invariant = require("@dxos/invariant");
51
- var import_react_ui = require("@dxos/react-ui");
52
- var import_react_ui_editor = require("@dxos/react-ui-editor");
54
+ var import_react_ui2 = require("@dxos/react-ui");
55
+ var import_react_ui_editor2 = require("@dxos/react-ui-editor");
53
56
  var import_react_ui_stack = require("@dxos/react-ui-stack");
54
57
  var import_util = require("@dxos/util");
55
58
  var import_view = require("@codemirror/view");
@@ -57,15 +60,15 @@ var import_effect = require("effect");
57
60
  var import_react3 = require("react");
58
61
  var import_app_framework2 = require("@dxos/app-framework");
59
62
  var import_invariant2 = require("@dxos/invariant");
60
- var import_react_ui_editor2 = require("@dxos/react-ui-editor");
63
+ var import_react_ui_editor3 = require("@dxos/react-ui-editor");
61
64
  var import_react4 = __toESM(require("react"));
62
65
  var import_client = require("react-dom/client");
63
66
  var import_app_framework3 = require("@dxos/app-framework");
64
67
  var import_invariant3 = require("@dxos/invariant");
65
- var import_echo2 = require("@dxos/react-client/echo");
68
+ var import_echo3 = require("@dxos/react-client/echo");
66
69
  var import_halo = require("@dxos/react-client/halo");
67
- var import_react_ui2 = require("@dxos/react-ui");
68
- var import_react_ui_editor3 = require("@dxos/react-ui-editor");
70
+ var import_react_ui3 = require("@dxos/react-ui");
71
+ var import_react_ui_editor4 = require("@dxos/react-ui-editor");
69
72
  var import_react_ui_theme = require("@dxos/react-ui-theme");
70
73
  var import_util2 = require("@dxos/util");
71
74
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
@@ -89,7 +92,7 @@ var useSelectCurrentThread = (editorView, documentId2) => {
89
92
  "'Editor view is not defined.'"
90
93
  ]
91
94
  });
92
- const range = import_react_ui_editor2.Cursor.getRangeFromCursor(editorView.state, cursor);
95
+ const range = import_react_ui_editor3.Cursor.getRangeFromCursor(editorView.state, cursor);
93
96
  if (range) {
94
97
  const selection = editorView.state.selection.main.from !== range.from ? {
95
98
  anchor: range.from
@@ -102,7 +105,7 @@ var useSelectCurrentThread = (editorView, documentId2) => {
102
105
  })
103
106
  ];
104
107
  if (selection) {
105
- effects.push(import_react_ui_editor2.setSelection.of({
108
+ effects.push(import_react_ui_editor3.setSelection.of({
106
109
  current: documentId2
107
110
  }));
108
111
  }
@@ -121,15 +124,67 @@ var useSelectCurrentThread = (editorView, documentId2) => {
121
124
  (0, import_app_framework2.useIntentResolver)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN, scrollIntoViewResolver);
122
125
  };
123
126
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
124
- var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, customActions, viewMode, editorStateStore, onFileUpload, onViewModeChange }) => {
127
+ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery, ...props }) => {
125
128
  var _effect = (0, import_tracking2.useSignals)();
126
129
  try {
127
- const { t } = (0, import_react_ui.useTranslation)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN);
128
- const { themeMode } = (0, import_react_ui.useThemeContext)();
129
- const toolbarState = (0, import_react_ui_editor.useEditorToolbarState)({
130
+ const { t } = (0, import_react_ui2.useTranslation)();
131
+ const viewRef = (0, import_react2.useRef)();
132
+ const getGroups = (0, import_react2.useCallback)((trigger, query) => {
133
+ switch (trigger) {
134
+ case "@":
135
+ return onLinkQuery?.(query) ?? [];
136
+ case "/":
137
+ default:
138
+ return (0, import_react_ui_editor2.filterItems)([
139
+ import_react_ui_editor2.coreSlashCommands,
140
+ import_react_ui_editor2.linkSlashCommands,
141
+ ...slashCommandGroups ?? []
142
+ ], (item) => query ? (0, import_react_ui2.toLocalizedString)(item.label, t).toLowerCase().includes(query.toLowerCase()) : true);
143
+ }
144
+ }, [
145
+ onLinkQuery,
146
+ slashCommandGroups
147
+ ]);
148
+ const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = (0, import_react_ui_editor2.useCommandMenu)({
149
+ viewRef,
150
+ getGroups,
151
+ trigger: onLinkQuery ? [
152
+ "/",
153
+ "@"
154
+ ] : "/"
155
+ });
156
+ const extensions = (0, import_react2.useMemo)(() => [
157
+ _extensions,
158
+ commandMenu
159
+ ].filter(import_util.isNotFalsy), [
160
+ _extensions,
161
+ commandMenu
162
+ ]);
163
+ return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.RefPopover, {
164
+ modal: false,
165
+ ...refPopoverProps
166
+ }, /* @__PURE__ */ import_react2.default.createElement(MarkdownEditorImpl, {
167
+ ref: viewRef,
168
+ ...props,
169
+ extensions
170
+ }), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.CommandMenu, {
171
+ groups: groupsRef.current,
172
+ currentItem,
173
+ onSelect
174
+ }));
175
+ } finally {
176
+ _effect.f();
177
+ }
178
+ };
179
+ var MarkdownEditorImpl = /* @__PURE__ */ (0, import_react2.forwardRef)(({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, customActions, viewMode, editorStateStore, onFileUpload, onViewModeChange }, forwardedRef) => {
180
+ var _effect = (0, import_tracking2.useSignals)();
181
+ try {
182
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN);
183
+ const { themeMode } = (0, import_react_ui2.useThemeContext)();
184
+ const toolbarState = (0, import_react_ui_editor2.useEditorToolbarState)({
130
185
  viewMode
131
186
  });
132
- const formattingObserver = (0, import_react_ui_editor.useFormattingState)(toolbarState);
187
+ const formattingObserver = (0, import_react_ui_editor2.useFormattingState)(toolbarState);
133
188
  const { scrollTo, selection } = (0, import_react2.useMemo)(() => editorStateStore?.getState(id) ?? {}, [
134
189
  id
135
190
  ]);
@@ -140,31 +195,31 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
140
195
  const file = files[0];
141
196
  const info = file && onFileUpload ? await onFileUpload(file) : void 0;
142
197
  if (info) {
143
- (0, import_react_ui_editor.processEditorPayload)(view, {
198
+ (0, import_react_ui_editor2.processEditorPayload)(view, {
144
199
  type: "image",
145
200
  data: info.url
146
201
  });
147
202
  }
148
203
  };
149
- const { parentRef, view: editorView, focusAttributes } = (0, import_react_ui_editor.useTextEditor)(() => ({
204
+ const { parentRef, view: editorView, focusAttributes } = (0, import_react_ui_editor2.useTextEditor)(() => ({
150
205
  initialValue,
151
206
  extensions: [
152
207
  formattingObserver,
153
- (0, import_react_ui_editor.createBasicExtensions)({
208
+ (0, import_react_ui_editor2.createBasicExtensions)({
154
209
  readOnly: viewMode === "readonly",
155
210
  placeholder: t("editor placeholder"),
156
211
  scrollPastEnd: role === "section" ? false : scrollPastEnd
157
212
  }),
158
- (0, import_react_ui_editor.createMarkdownExtensions)({
213
+ (0, import_react_ui_editor2.createMarkdownExtensions)({
159
214
  themeMode
160
215
  }),
161
- (0, import_react_ui_editor.createThemeExtensions)({
216
+ (0, import_react_ui_editor2.createThemeExtensions)({
162
217
  themeMode,
163
218
  syntaxHighlighting: true,
164
- slots: import_react_ui_editor.editorSlots
219
+ slots: import_react_ui_editor2.editorSlots
165
220
  }),
166
- import_react_ui_editor.editorGutter,
167
- role !== "section" && onFileUpload && (0, import_react_ui_editor.dropFile)({
221
+ import_react_ui_editor2.editorGutter,
222
+ role !== "section" && onFileUpload && (0, import_react_ui_editor2.dropFile)({
168
223
  onDrop: handleDrop
169
224
  }),
170
225
  providerExtensions,
@@ -186,6 +241,9 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
186
241
  extensions,
187
242
  providerExtensions
188
243
  ]);
244
+ (0, import_react2.useImperativeHandle)(forwardedRef, () => editorView, [
245
+ editorView
246
+ ]);
189
247
  useTest(editorView);
190
248
  useSelectCurrentThread(editorView, id);
191
249
  const { acceptedFiles, getInputProps, open } = (0, import_react_dropzone.useDropzone)({
@@ -212,7 +270,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
212
270
  });
213
271
  const info = await onFileUpload(file);
214
272
  if (info) {
215
- (0, import_react_ui_editor.addLink)({
273
+ (0, import_react_ui_editor2.addLink)({
216
274
  url: info.url,
217
275
  image: true
218
276
  })(editorView);
@@ -227,7 +285,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
227
285
  const getView = (0, import_react2.useCallback)(() => {
228
286
  (0, import_invariant.invariant)(editorView, void 0, {
229
287
  F: __dxlog_file2,
230
- L: 165,
288
+ L: 216,
231
289
  S: void 0,
232
290
  A: [
233
291
  "editorView",
@@ -251,7 +309,7 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
251
309
  ]);
252
310
  return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_stack.StackItem.Content, {
253
311
  toolbar: !!toolbar
254
- }, toolbar && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor.EditorToolbar, {
312
+ }, toolbar && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.EditorToolbar, {
255
313
  attendableId: id,
256
314
  role,
257
315
  state: toolbarState,
@@ -264,14 +322,14 @@ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensio
264
322
  ref: parentRef,
265
323
  "data-testid": "composer.markdownRoot",
266
324
  "data-toolbar": toolbar ? "enabled" : "disabled",
267
- className: (0, import_react_ui_editor.stackItemContentEditorClassNames)(role),
325
+ className: (0, import_react_ui_editor2.stackItemContentEditorClassNames)(role),
268
326
  "data-popover-collision-boundary": true,
269
327
  ...focusAttributes
270
328
  }));
271
329
  } finally {
272
330
  _effect.f();
273
331
  }
274
- };
332
+ });
275
333
  var useTest = (view) => {
276
334
  (0, import_react2.useEffect)(() => {
277
335
  const composer = window.composer;
@@ -286,7 +344,7 @@ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdow
286
344
  var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore }) => {
287
345
  const { dispatchPromise: dispatch } = (0, import_app_framework3.useIntentDispatcher)();
288
346
  const identity = (0, import_halo.useIdentity)();
289
- const space = (0, import_echo2.getSpace)(document) ?? (0, import_echo2.getSpace)(text);
347
+ const space = (0, import_echo3.getSpace)(document) ?? (0, import_echo3.getSpace)(text);
290
348
  const baseExtensions = (0, import_react4.useMemo)(() => createBaseExtensions({
291
349
  document,
292
350
  id,
@@ -329,25 +387,25 @@ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode,
329
387
  ]);
330
388
  return (0, import_react4.useMemo)(() => [
331
389
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
332
- document && (0, import_react_ui_editor3.createDataExtensions)({
390
+ document && (0, import_react_ui_editor4.createDataExtensions)({
333
391
  id: document.id,
334
- text: document.content.target && (0, import_echo2.createDocAccessor)(document.content.target, [
392
+ text: document.content.target && (0, import_echo3.createDocAccessor)(document.content.target, [
335
393
  "content"
336
394
  ]),
337
395
  space,
338
396
  identity
339
397
  }),
340
- text && id && (0, import_react_ui_editor3.createDataExtensions)({
398
+ text && id && (0, import_react_ui_editor4.createDataExtensions)({
341
399
  id,
342
- text: (0, import_echo2.createDocAccessor)(text, [
400
+ text: (0, import_echo3.createDocAccessor)(text, [
343
401
  "content"
344
402
  ]),
345
403
  space,
346
404
  identity
347
405
  }),
348
- (0, import_react_ui_editor3.selectionState)(editorStateStore),
349
- document && (0, import_react_ui_editor3.listener)({
350
- onChange: (text2) => (0, import_chunk_G7RBJX22.setFallbackName)(document, text2)
406
+ (0, import_react_ui_editor4.selectionState)(editorStateStore),
407
+ document && (0, import_react_ui_editor4.listener)({
408
+ onChange: (text2) => (0, import_chunk_CJLYFGPI.setFallbackName)(document, text2)
351
409
  }),
352
410
  baseExtensions,
353
411
  pluginExtensions
@@ -365,13 +423,13 @@ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode,
365
423
  var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode }) => {
366
424
  const extensions = [
367
425
  selectionManager && selectionChange(selectionManager),
368
- settings.editorInputMode && import_react_ui_editor3.InputModeExtensions[settings.editorInputMode],
369
- settings.folding && (0, import_react_ui_editor3.folding)()
426
+ settings.editorInputMode && import_react_ui_editor4.InputModeExtensions[settings.editorInputMode],
427
+ settings.folding && (0, import_react_ui_editor4.folding)()
370
428
  ].filter(import_util2.isNotFalsy);
371
429
  if (viewMode !== "source") {
372
430
  extensions.push(...[
373
- (0, import_react_ui_editor3.formattingKeymap)(),
374
- (0, import_react_ui_editor3.decorateMarkdown)({
431
+ (0, import_react_ui_editor4.formattingKeymap)(),
432
+ (0, import_react_ui_editor4.decorateMarkdown)({
375
433
  selectionChangeDelay: 100,
376
434
  numberedHeadings: settings.numberedHeadings ? {
377
435
  from: 2
@@ -384,22 +442,22 @@ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager
384
442
  id2
385
443
  ],
386
444
  options: {
387
- pivotId: document ? (0, import_echo2.fullyQualifiedId)(document) : id2
445
+ pivotId: document ? (0, import_echo3.fullyQualifiedId)(document) : id2
388
446
  }
389
447
  }));
390
448
  }) : void 0
391
449
  }),
392
- (0, import_react_ui_editor3.linkTooltip)(renderLinkTooltip),
393
- (0, import_react_ui_editor3.preview)()
450
+ (0, import_react_ui_editor4.linkTooltip)(renderLinkTooltip),
451
+ (0, import_react_ui_editor4.preview)()
394
452
  ]);
395
453
  }
396
454
  if (query) {
397
- extensions.push((0, import_react_ui_editor3.autocomplete)({
455
+ extensions.push((0, import_react_ui_editor4.autocomplete)({
398
456
  onSearch: (text) => {
399
457
  return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
400
458
  label: object.name,
401
459
  // TODO(burdon): Factor out URL builder.
402
- apply: `[${object.name}](/${(0, import_echo2.fullyQualifiedId)(object)})`
460
+ apply: `[${object.name}](/${(0, import_echo3.fullyQualifiedId)(object)})`
403
461
  } : void 0).filter(import_util2.isNotFalsy);
404
462
  }
405
463
  }));
@@ -407,7 +465,7 @@ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager
407
465
  if (settings.debug) {
408
466
  const items = settings.typewriter?.split(/[,\n]/) ?? "";
409
467
  if (items) {
410
- extensions.push((0, import_react_ui_editor3.typewriter)({
468
+ extensions.push((0, import_react_ui_editor4.typewriter)({
411
469
  items
412
470
  }));
413
471
  }
@@ -415,10 +473,10 @@ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager
415
473
  return extensions;
416
474
  };
417
475
  var selectionChange = (selectionManager) => {
418
- return import_react_ui_editor3.EditorView.updateListener.of((update) => {
476
+ return import_react_ui_editor4.EditorView.updateListener.of((update) => {
419
477
  if (update.selectionSet) {
420
- const id = update.state.facet(import_react_ui_editor3.documentId);
421
- const cursorConverter = update.state.facet(import_react_ui_editor3.Cursor.converter);
478
+ const id = update.state.facet(import_react_ui_editor4.documentId);
479
+ const cursorConverter = update.state.facet(import_react_ui_editor4.Cursor.converter);
422
480
  const selection = update.state.selection;
423
481
  const ranges = selection.ranges.map((range) => ({
424
482
  from: cursorConverter.toCursor(range.from),
@@ -457,7 +515,7 @@ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
457
515
  renderRoot(el, /* @__PURE__ */ import_react4.default.createElement("a", {
458
516
  ...options,
459
517
  className: style.hover
460
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Icon, {
518
+ }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
461
519
  icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
462
520
  size: 4,
463
521
  classNames: style.icon
@@ -470,14 +528,14 @@ var renderLinkTooltip = (el, { url }) => {
470
528
  rel: "noreferrer",
471
529
  target: "_blank",
472
530
  className: style.hover
473
- }, web.origin, /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.Icon, {
531
+ }, web.origin, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
474
532
  icon: "ph--arrow-square-out--bold",
475
533
  size: 4,
476
534
  classNames: style.icon
477
535
  })));
478
536
  };
479
537
  var renderRoot = (root, node) => {
480
- (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react4.default.createElement(import_react_ui2.ThemeProvider, {
538
+ (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react4.default.createElement(import_react_ui3.ThemeProvider, {
481
539
  tx: import_react_ui_theme.defaultTx
482
540
  }, node));
483
541
  return root;
@@ -485,9 +543,10 @@ var renderRoot = (root, node) => {
485
543
  var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
486
544
  var _effect = (0, import_tracking.useSignals)();
487
545
  try {
546
+ const { t } = (0, import_react_ui.useTranslation)();
488
547
  const scrollPastEnd = role === "article";
489
- const doc = (0, import_echo_schema.isInstanceOf)(import_chunk_RQS4KBMG.DocumentType, object) ? object : void 0;
490
- const text = (0, import_echo_schema.isInstanceOf)(import_schema.DataType.Text, object) ? object : void 0;
548
+ const doc = import_echo.Obj.instanceOf(import_chunk_3HHV4MM6.DocumentType, object) ? object : void 0;
549
+ const text = import_echo.Obj.instanceOf(import_schema.DataType.Text, object) ? object : void 0;
491
550
  const extensions = useExtensions({
492
551
  document: doc,
493
552
  text,
@@ -497,16 +556,69 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
497
556
  viewMode,
498
557
  editorStateStore
499
558
  });
559
+ const manager = (0, import_app_framework.usePluginManager)();
560
+ const resolve = (0, import_react.useCallback)((typename) => manager.context.getCapabilities(import_app_framework.Capabilities.Metadata).find(({ id: id2 }) => id2 === typename)?.metadata ?? {}, [
561
+ manager
562
+ ]);
563
+ const space = (0, import_echo2.getSpace)(object);
564
+ const objectForms = (0, import_app_framework.useCapabilities)(import_plugin_space.SpaceCapabilities.ObjectForm);
565
+ const filter = (0, import_react.useMemo)(() => import_echo.Filter.or(...objectForms.map((form) => import_echo.Filter.type(form.objectSchema))), [
566
+ objectForms
567
+ ]);
568
+ const onLinkQuery = (0, import_react.useCallback)(async (query) => {
569
+ const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
570
+ const results = await space?.db.query(import_echo.Query.select(filter)).run();
571
+ const getLabel = (object2) => {
572
+ const type = import_echo.Obj.getTypename(object2);
573
+ const metadata = resolve(type);
574
+ return metadata.label?.(object2) || object2.name || [
575
+ "object name placeholder",
576
+ {
577
+ ns: type,
578
+ default: "New object"
579
+ }
580
+ ];
581
+ };
582
+ const items = results?.objects.filter((object2) => (0, import_react_ui.toLocalizedString)(getLabel(object2), t).toLowerCase().includes(name)).map((object2) => {
583
+ const metadata = resolve(import_echo.Obj.getTypename(object2));
584
+ const label = (0, import_react_ui.toLocalizedString)(getLabel(object2), t);
585
+ return {
586
+ id: object2.id,
587
+ label,
588
+ icon: metadata.icon,
589
+ onSelect: (view, head) => {
590
+ const link = `[${label}][${import_echo.Obj.getDXN(object2)}]`;
591
+ if (query?.startsWith("@")) {
592
+ (0, import_react_ui_editor.insertAtLineStart)(view, head, `!${link}
593
+ `);
594
+ } else {
595
+ (0, import_react_ui_editor.insertAtCursor)(view, head, `${link} `);
596
+ }
597
+ }
598
+ };
599
+ }) ?? [];
600
+ return [
601
+ {
602
+ id: "echo",
603
+ items
604
+ }
605
+ ];
606
+ }, [
607
+ filter,
608
+ resolve,
609
+ space
610
+ ]);
500
611
  if (doc) {
501
612
  return /* @__PURE__ */ import_react.default.createElement(DocumentEditor, {
502
- id: (0, import_echo.fullyQualifiedId)(object),
613
+ id: (0, import_echo2.fullyQualifiedId)(object),
503
614
  role,
504
615
  document: doc,
505
616
  extensions,
506
617
  viewMode,
507
618
  settings,
508
619
  scrollPastEnd,
509
- onViewModeChange
620
+ onViewModeChange,
621
+ onLinkQuery: space ? onLinkQuery : void 0
510
622
  });
511
623
  } else if (text) {
512
624
  return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
@@ -518,7 +630,8 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
518
630
  toolbar: settings.toolbar,
519
631
  inputMode: settings.editorInputMode,
520
632
  scrollPastEnd,
521
- onViewModeChange
633
+ onViewModeChange,
634
+ onLinkQuery: space ? onLinkQuery : void 0
522
635
  });
523
636
  } else {
524
637
  return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
@@ -530,7 +643,8 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
530
643
  toolbar: settings.toolbar,
531
644
  inputMode: settings.editorInputMode,
532
645
  scrollPastEnd,
533
- onViewModeChange
646
+ onViewModeChange,
647
+ onLinkQuery: space ? onLinkQuery : void 0
534
648
  });
535
649
  }
536
650
  } finally {
@@ -540,12 +654,12 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
540
654
  var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
541
655
  var _effect = (0, import_tracking.useSignals)();
542
656
  try {
543
- const space = (0, import_echo.getSpace)(doc);
657
+ const space = (0, import_echo2.getSpace)(doc);
544
658
  (0, import_react.useEffect)(() => {
545
659
  if (typeof doc.fallbackName === "string") {
546
660
  return;
547
661
  }
548
- const fallbackName = doc.content?.target?.content ? (0, import_chunk_G7RBJX22.getFallbackName)(doc.content.target.content) : void 0;
662
+ const fallbackName = doc.content?.target?.content ? (0, import_chunk_CJLYFGPI.getFallbackName)(doc.content.target.content) : void 0;
549
663
  if (fallbackName) {
550
664
  doc.fallbackName = fallbackName;
551
665
  }
@@ -598,4 +712,4 @@ var MarkdownContainer_default = MarkdownContainer;
598
712
  0 && (module.exports = {
599
713
  DocumentEditor
600
714
  });
601
- //# sourceMappingURL=MarkdownContainer-LSNNPNRB.cjs.map
715
+ //# sourceMappingURL=MarkdownContainer-NG4H6AZJ.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/MarkdownContainer.tsx", "../../../src/components/MarkdownEditor/MarkdownEditor.tsx", "../../../src/hooks/useSelectCurrentThread.tsx", "../../../src/extensions.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { useCallback, useEffect, useMemo } from 'react';\n\nimport { Capabilities, useAppGraph, useCapabilities, usePluginManager } from '@dxos/app-framework';\nimport { Filter, Obj, Query } from '@dxos/echo';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\nimport { toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { type SelectionManager } from '@dxos/react-ui-attention';\nimport { type CommandMenuGroup, type CommandMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';\nimport { DataType } 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 | DataType.Text | any;\n settings: MarkdownSettingsProps;\n selectionManager?: SelectionManager;\n};\n\nconst MarkdownContainer = ({\n id,\n role,\n object,\n settings,\n selectionManager,\n viewMode,\n editorStateStore,\n onViewModeChange,\n}: MarkdownContainerProps) => {\n const { t } = useTranslation();\n const scrollPastEnd = role === 'article';\n const doc = Obj.instanceOf(DocumentType, object) ? object : undefined;\n const text = Obj.instanceOf(DataType.Text, object) ? object : undefined;\n const extensions = useExtensions({ document: doc, text, id, settings, selectionManager, viewMode, editorStateStore });\n\n // TODO(wittjosiah): Factor out.\n const manager = usePluginManager();\n const resolve = useCallback(\n (typename: string) =>\n manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},\n [manager],\n );\n const space = getSpace(object);\n const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);\n const filter = useMemo(() => Filter.or(...objectForms.map((form) => Filter.type(form.objectSchema))), [objectForms]);\n const onLinkQuery = useCallback(\n async (query?: string): Promise<CommandMenuGroup[]> => {\n const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? '';\n const results = await space?.db.query(Query.select(filter)).run();\n // TODO(wittjosiah): Use `Obj.Any` type.\n const getLabel = (object: any) => {\n const type = Obj.getTypename(object)!;\n const metadata = resolve(type);\n return (\n metadata.label?.(object) || object.name || ['object name placeholder', { ns: type, default: 'New object' }]\n );\n };\n const items =\n results?.objects\n .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))\n // TODO(wittjosiah): Remove `any` type.\n .map((object: any): CommandMenuItem => {\n const metadata = resolve(Obj.getTypename(object)!);\n const label = toLocalizedString(getLabel(object), t);\n return {\n id: object.id,\n label,\n icon: metadata.icon,\n onSelect: (view, head) => {\n const link = `[${label}][${Obj.getDXN(object)}]`;\n if (query?.startsWith('@')) {\n insertAtLineStart(view, head, `!${link}\\n`);\n } else {\n insertAtCursor(view, head, `${link} `);\n }\n },\n };\n }) ?? [];\n return [{ id: 'echo', items }];\n },\n [filter, resolve, space],\n );\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 onLinkQuery={space ? onLinkQuery : undefined}\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 inputMode={settings.editorInputMode}\n scrollPastEnd={scrollPastEnd}\n onViewModeChange={onViewModeChange}\n onLinkQuery={space ? onLinkQuery : undefined}\n />\n );\n } else {\n // TODO(burdon): Normalize with above.\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 onLinkQuery={space ? onLinkQuery : undefined}\n />\n );\n }\n};\n\ntype DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &\n Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions' | 'onLinkQuery'> & {\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 const { graph } = useAppGraph();\n const customActions = useMemo(() => {\n return Rx.make((get) => {\n const actions = get(graph.actions(id));\n const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');\n return { nodes, edges: nodes.map((node) => ({ source: 'root', target: node.id })) };\n });\n }, [graph]);\n\n return (\n <MarkdownEditor\n id={id}\n initialValue={doc.content?.target?.content}\n viewMode={viewMode}\n toolbar={settings.toolbar}\n customActions={customActions}\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 { type EditorView } from '@codemirror/view';\nimport React, { useMemo, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } from 'react';\nimport { useDropzone } from 'react-dropzone';\n\nimport { type FileInfo } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { toLocalizedString, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n addLink,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n editorGutter,\n editorSlots,\n EditorToolbar,\n processEditorPayload,\n RefPopover,\n stackItemContentEditorClassNames,\n type DNDOptions,\n type EditorInputMode,\n type EditorSelectionState,\n type EditorStateStore,\n type EditorToolbarActionGraphProps,\n type EditorViewMode,\n type CommandMenuGroup,\n type UseTextEditorProps,\n useEditorToolbarState,\n useFormattingState,\n useCommandMenu,\n useTextEditor,\n filterItems,\n coreSlashCommands,\n CommandMenu,\n linkSlashCommands,\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 slashCommandGroups?: CommandMenuGroup[];\n toolbar?: boolean;\n customActions?: EditorToolbarActionGraphProps['customActions'];\n // TODO(wittjosiah): Generalize custom toolbar actions (e.g. comment, upload, etc.)\n viewMode?: EditorViewMode;\n editorStateStore?: EditorStateStore;\n onViewModeChange?: (id: string, mode: EditorViewMode) => void;\n onLinkQuery?: (query?: string) => Promise<CommandMenuGroup[]>;\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 extensions: _extensions,\n slashCommandGroups,\n onLinkQuery,\n ...props\n}: MarkdownEditorProps) => {\n const { t } = useTranslation();\n const viewRef = useRef<EditorView>();\n const getGroups = useCallback(\n (trigger: string, query?: string) => {\n switch (trigger) {\n case '@':\n return onLinkQuery?.(query) ?? [];\n case '/':\n default:\n return filterItems([coreSlashCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>\n query ? toLocalizedString(item.label, t).toLowerCase().includes(query.toLowerCase()) : true,\n );\n }\n },\n [onLinkQuery, slashCommandGroups],\n );\n const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu({\n viewRef,\n getGroups,\n trigger: onLinkQuery ? ['/', '@'] : '/',\n });\n const extensions = useMemo(() => [_extensions, commandMenu].filter(isNotFalsy), [_extensions, commandMenu]);\n\n return (\n <RefPopover modal={false} {...refPopoverProps}>\n <MarkdownEditorImpl ref={viewRef} {...props} extensions={extensions} />\n <CommandMenu groups={groupsRef.current} currentItem={currentItem} onSelect={onSelect} />\n </RefPopover>\n );\n};\n\nconst MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProps>(\n (\n {\n id,\n role = 'article',\n initialValue,\n extensions,\n extensionProviders,\n scrollPastEnd,\n toolbar,\n customActions,\n viewMode,\n editorStateStore,\n onFileUpload,\n onViewModeChange,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(MARKDOWN_PLUGIN);\n const { themeMode } = useThemeContext();\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(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 createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor placeholder'),\n scrollPastEnd: role === 'section' ? false : scrollPastEnd,\n }),\n createMarkdownExtensions({ themeMode }),\n createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),\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, viewMode, themeMode, extensions, providerExtensions],\n );\n\n useImperativeHandle(forwardedRef, () => editorView, [editorView]);\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 addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [acceptedFiles, editorView, onFileUpload]);\n\n const getView = useCallback(() => {\n invariant(editorView);\n return editorView;\n }, [editorView]);\n\n const handleViewModeChange = useCallback(\n (mode: EditorViewMode) => onViewModeChange?.(id, mode),\n [id, onViewModeChange],\n );\n\n const handleImageUpload = useCallback(() => {\n if (onFileUpload) {\n open();\n }\n }, [onFileUpload]);\n\n return (\n <StackItem.Content toolbar={!!toolbar}>\n {toolbar && (\n <>\n <EditorToolbar\n attendableId={id}\n role={role}\n state={toolbarState}\n customActions={customActions}\n getView={getView}\n image={handleImageUpload}\n viewMode={handleViewModeChange}\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 data-popover-collision-boundary={true}\n {...focusAttributes}\n />\n </StackItem.Content>\n );\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", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport { Schema } from 'effect';\nimport { useMemo } from 'react';\n\nimport { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';\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 (!Schema.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 QueryResult } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ThemeProvider } from '@dxos/react-ui';\nimport { type SelectionManager } from '@dxos/react-ui-attention';\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 preview,\n selectionState,\n typewriter,\n type RenderCallback,\n EditorView,\n documentId,\n Cursor,\n} from '@dxos/react-ui-editor';\nimport { defaultTx } from '@dxos/react-ui-theme';\nimport { type DataType } 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?: DataType.Text;\n dispatch?: PromiseIntentDispatcher;\n query?: QueryResult<DocumentType>;\n settings: MarkdownSettingsProps;\n selectionManager?: SelectionManager;\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 selectionManager,\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.type(DocumentType));\n // query?.subscribe();\n const baseExtensions = useMemo(\n () =>\n createBaseExtensions({\n document,\n id,\n text,\n settings,\n selectionManager,\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 selectionManager,\n ],\n );\n\n const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);\n\n //\n // External extensions from other plugins.\n //\n const pluginExtensions = useMemo<Extension[]>(() => {\n if (!document) {\n return [];\n }\n\n return 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 // 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 selectionManager,\n query,\n viewMode,\n}: ExtensionsOptions): Extension[] => {\n const extensions: Extension[] = [\n selectionManager && selectionChange(selectionManager),\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 ? createLinkRenderer((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 preview(),\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\nexport const selectionChange = (selectionManager: SelectionManager) => {\n return EditorView.updateListener.of((update) => {\n if (update.selectionSet) {\n const id = update.state.facet(documentId);\n const cursorConverter = update.state.facet(Cursor.converter);\n const selection = update.state.selection;\n const ranges = selection.ranges\n .map((range) => ({\n from: cursorConverter.toCursor(range.from),\n to: cursorConverter.toCursor(range.to),\n }))\n .filter(({ from, to }) => to > from);\n selectionManager.updateMultiRange(id, ranges);\n }\n });\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 createLinkRenderer =\n (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>\n (el, { url }) => {\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: RenderCallback<{ url: string }> = (el, { url }) => {\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_echo", "import_react", "import_react_ui", "import_react_ui_editor", "import_app_framework", "import_invariant", "import_util", "useSelectCurrentThread", "editorView", "documentId", "scrollIntoViewResolver", "useMemo", "createResolver", "intent", "LayoutAction", "UpdateLayout", "position", "filter", "data", "Schema", "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", "extensions", "_extensions", "slashCommandGroups", "onLinkQuery", "props", "t", "useTranslation", "viewRef", "useRef", "getGroups", "useCallback", "trigger", "query", "filterItems", "coreSlashCommands", "linkSlashCommands", "item", "toLocalizedString", "label", "toLowerCase", "includes", "commandMenu", "groupsRef", "currentItem", "onSelect", "refPopoverProps", "useCommandMenu", "isNotFalsy", "React", "RefPopover", "modal", "MarkdownEditorImpl", "ref", "CommandMenu", "groups", "forwardRef", "id", "role", "initialValue", "extensionProviders", "scrollPastEnd", "toolbar", "customActions", "viewMode", "editorStateStore", "onFileUpload", "onViewModeChange", "forwardedRef", "themeMode", "useThemeContext", "toolbarState", "useEditorToolbarState", "formattingObserver", "useFormattingState", "scrollTo", "getState", "providerExtensions", "flatMap", "provider", "isNonNullable", "handleDrop", "view", "files", "file", "info", "processEditorPayload", "type", "url", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "readOnly", "placeholder", "createMarkdownExtensions", "createThemeExtensions", "syntaxHighlighting", "slots", "editorSlots", "editorGutter", "dropFile", "onDrop", "moveToEndOfLine", "useImperativeHandle", "useTest", "acceptedFiles", "getInputProps", "open", "useDropzone", "multiple", "noDrag", "accept", "useEffect", "length", "requestAnimationFrame", "f", "File", "name", "lastModified", "addLink", "image", "getView", "handleViewModeChange", "mode", "handleImageUpload", "StackItem", "Content", "EditorToolbar", "attendableId", "div", "data-testid", "data-toolbar", "className", "stackItemContentEditorClassNames", "data-popover-collision-boundary", "composer", "window", "useExtensions", "document", "text", "settings", "selectionManager", "dispatchPromise", "useIntentDispatcher", "identity", "useIdentity", "space", "getSpace", "baseExtensions", "createBaseExtensions", "editorInputMode", "folding", "numberedHeadings", "debug", "typewriter", "useCapabilities", "MarkdownCapabilities", "Extensions", "pluginExtensions", "flat", "reduce", "acc", "extension", "createDataExtensions", "content", "target", "createDocAccessor", "selectionState", "listener", "onChange", "setFallbackName", "selectionChange", "InputModeExtensions", "formattingKeymap", "decorateMarkdown", "selectionChangeDelay", "renderLinkButton", "createLinkRenderer", "createIntent", "Open", "part", "pivotId", "fullyQualifiedId", "linkTooltip", "renderLinkTooltip", "preview", "autocomplete", "onSearch", "objects", "map", "object", "apply", "items", "split", "updateListener", "update", "selectionSet", "facet", "cursorConverter", "converter", "ranges", "toCursor", "to", "updateMultiRange", "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", "Obj", "instanceOf", "DocumentType", "DataType", "Text", "manager", "usePluginManager", "typename", "context", "getCapabilities", "Capabilities", "Metadata", "find", "metadata", "objectForms", "SpaceCapabilities", "ObjectForm", "Filter", "or", "form", "objectSchema", "slice", "results", "db", "Query", "select", "run", "getLabel", "getTypename", "ns", "default", "head", "link", "getDXN", "insertAtLineStart", "insertAtCursor", "DocumentEditor", "inputMode", "fallbackName", "getFallbackName", "upload", "FileUploader", "handleFileUpload", "graph", "useAppGraph", "Rx", "make", "get", "actions", "nodes", "action", "properties", "disposition", "edges", "source"]
7
+ }