@dxos/plugin-markdown 0.8.2-main.fbd8ed0 → 0.8.2-staging.42af850

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 (171) hide show
  1. package/dist/lib/browser/{MarkdownContainer-KKWICAKV.mjs → MarkdownContainer-5IEINNQB.mjs} +299 -262
  2. package/dist/lib/browser/MarkdownContainer-5IEINNQB.mjs.map +7 -0
  3. package/dist/lib/browser/MarkdownPreview-YW5CS3ID.mjs +87 -0
  4. package/dist/lib/{node-esm/MarkdownPreview-KYWRMBRM.mjs.map → browser/MarkdownPreview-YW5CS3ID.mjs.map} +1 -1
  5. package/dist/lib/browser/anchor-sort-VS4OZVPP.mjs +32 -0
  6. package/dist/lib/browser/anchor-sort-VS4OZVPP.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-MPJQUYTQ.mjs → app-graph-serializer-V6RLEHVY.mjs} +3 -3
  8. package/dist/lib/browser/{artifact-definition-DAF3YCVL.mjs → artifact-definition-5NAODQLG.mjs} +61 -14
  9. package/dist/lib/browser/artifact-definition-5NAODQLG.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-S42YXFZ7.mjs → chunk-77NGW7EO.mjs} +5 -6
  11. package/dist/lib/browser/chunk-77NGW7EO.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-ACAID3XF.mjs +20 -0
  13. package/dist/lib/browser/chunk-ACAID3XF.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-TUCSFCS5.mjs → chunk-C5RABVIX.mjs} +2 -2
  15. package/dist/lib/browser/{chunk-XP2ZPCLI.mjs → chunk-ECSM56YC.mjs} +15 -22
  16. package/dist/lib/browser/chunk-ECSM56YC.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-NAGMSX77.mjs → chunk-QVJETNGS.mjs} +2 -2
  18. package/dist/lib/{node-esm/chunk-ETXPC5VP.mjs.map → browser/chunk-QVJETNGS.mjs.map} +1 -1
  19. package/dist/lib/browser/index.mjs +29 -17
  20. package/dist/lib/browser/index.mjs.map +3 -3
  21. package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs +65 -0
  22. package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/{react-surface-EMQV3GVI.mjs → react-surface-QE4SKXBT.mjs} +75 -62
  25. package/dist/lib/browser/react-surface-QE4SKXBT.mjs.map +7 -0
  26. package/dist/lib/browser/{settings-GPB6WOIU.mjs → settings-W5CK4PXP.mjs} +2 -2
  27. package/dist/lib/browser/{state-XTP5IP3W.mjs → state-KI6PJ6DT.mjs} +2 -2
  28. package/dist/lib/browser/types/index.mjs +1 -1
  29. package/dist/lib/node/{MarkdownContainer-LBI6ZESS.cjs → MarkdownContainer-LSNNPNRB.cjs} +304 -267
  30. package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs.map +7 -0
  31. package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs +110 -0
  32. package/dist/lib/node/{MarkdownPreview-O3BR4PZW.cjs.map → MarkdownPreview-G34HSQEB.cjs.map} +1 -1
  33. package/dist/lib/node/{thread-NWBGBGOR.cjs → anchor-sort-NHVF23EU.cjs} +15 -20
  34. package/dist/lib/node/anchor-sort-NHVF23EU.cjs.map +7 -0
  35. package/dist/lib/node/{app-graph-serializer-Z7UJYSSL.cjs → app-graph-serializer-CLALIYN3.cjs} +9 -9
  36. package/dist/lib/node/{artifact-definition-UIZSL2AL.cjs → artifact-definition-VEAHK7BX.cjs} +65 -19
  37. package/dist/lib/node/artifact-definition-VEAHK7BX.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-AJHB57YQ.cjs → chunk-C4HR7UXE.cjs} +15 -15
  39. package/dist/lib/node/chunk-C4HR7UXE.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-BWRBWEKN.cjs → chunk-G7RBJX22.cjs} +8 -9
  41. package/dist/lib/node/chunk-G7RBJX22.cjs.map +7 -0
  42. package/dist/lib/node/{chunk-DZXTXSXX.cjs → chunk-IFYSBQE5.cjs} +5 -5
  43. package/dist/lib/node/{chunk-DZXTXSXX.cjs.map → chunk-IFYSBQE5.cjs.map} +1 -1
  44. package/dist/lib/node/{chunk-EO5H4OZJ.cjs → chunk-RQS4KBMG.cjs} +13 -20
  45. package/dist/lib/node/chunk-RQS4KBMG.cjs.map +7 -0
  46. package/dist/lib/node/{chunk-4525YF72.cjs → chunk-ZDTL47I7.cjs} +6 -6
  47. package/dist/lib/node/index.cjs +41 -29
  48. package/dist/lib/node/index.cjs.map +3 -3
  49. package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs +78 -0
  50. package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs.map +7 -0
  51. package/dist/lib/node/meta.json +1 -1
  52. package/dist/lib/node/{react-surface-REHX3ABQ.cjs → react-surface-WJZTEBYO.cjs} +84 -71
  53. package/dist/lib/node/react-surface-WJZTEBYO.cjs.map +7 -0
  54. package/dist/lib/node/{settings-SF6JDJG6.cjs → settings-IRKU3WPM.cjs} +6 -6
  55. package/dist/lib/node/{state-K4IPZTRO.cjs → state-KKDRAG7X.cjs} +6 -6
  56. package/dist/lib/node/types/index.cjs +7 -7
  57. package/dist/lib/node/types/index.cjs.map +1 -1
  58. package/dist/lib/node-esm/{MarkdownContainer-62XZY5EP.mjs → MarkdownContainer-UZSLXMWO.mjs} +299 -262
  59. package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs.map +7 -0
  60. package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs +88 -0
  61. package/dist/lib/{browser/MarkdownPreview-FVSYVJGN.mjs.map → node-esm/MarkdownPreview-TCV7BI32.mjs.map} +1 -1
  62. package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs +33 -0
  63. package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs.map +7 -0
  64. package/dist/lib/node-esm/{app-graph-serializer-DDMFMNYI.mjs → app-graph-serializer-C3RNTQGM.mjs} +3 -3
  65. package/dist/lib/node-esm/{artifact-definition-ER3446S7.mjs → artifact-definition-7TIJW2CO.mjs} +61 -14
  66. package/dist/lib/node-esm/artifact-definition-7TIJW2CO.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-PDD5B7EO.mjs → chunk-6RPARLIK.mjs} +5 -6
  68. package/dist/lib/node-esm/chunk-6RPARLIK.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-T5Z5BIOF.mjs → chunk-EIUTPXGL.mjs} +10 -10
  70. package/dist/lib/node-esm/chunk-EIUTPXGL.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-ETXPC5VP.mjs → chunk-JXXDCSMW.mjs} +2 -2
  72. package/dist/lib/{browser/chunk-NAGMSX77.mjs.map → node-esm/chunk-JXXDCSMW.mjs.map} +1 -1
  73. package/dist/lib/node-esm/{chunk-66XM3JMR.mjs → chunk-NCMPVEXO.mjs} +15 -22
  74. package/dist/lib/node-esm/chunk-NCMPVEXO.mjs.map +7 -0
  75. package/dist/lib/node-esm/{chunk-CXTVDT5U.mjs → chunk-TCFJNUAE.mjs} +2 -2
  76. package/dist/lib/node-esm/index.mjs +29 -17
  77. package/dist/lib/node-esm/index.mjs.map +3 -3
  78. package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs +66 -0
  79. package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs.map +7 -0
  80. package/dist/lib/node-esm/meta.json +1 -1
  81. package/dist/lib/node-esm/{react-surface-FA7JYF2A.mjs → react-surface-XNM3YDFB.mjs} +75 -62
  82. package/dist/lib/node-esm/react-surface-XNM3YDFB.mjs.map +7 -0
  83. package/dist/lib/node-esm/{settings-2DT2C4RA.mjs → settings-MK7D7LHQ.mjs} +2 -2
  84. package/dist/lib/node-esm/{state-7VFYPF6Z.mjs → state-LLGVRYKL.mjs} +2 -2
  85. package/dist/lib/node-esm/types/index.mjs +1 -1
  86. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  88. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/index.d.ts +4 -4
  91. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  94. package/dist/types/src/components/MarkdownContainer.d.ts +3 -1
  95. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +3 -3
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  98. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -104
  99. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/index.d.ts +1 -1
  102. package/dist/types/src/components/index.d.ts.map +1 -1
  103. package/dist/types/src/extensions.d.ts +4 -1
  104. package/dist/types/src/extensions.d.ts.map +1 -1
  105. package/dist/types/src/types/schema.d.ts +1 -314
  106. package/dist/types/src/types/schema.d.ts.map +1 -1
  107. package/dist/types/src/types/types.d.ts +7 -109
  108. package/dist/types/src/types/types.d.ts.map +1 -1
  109. package/package.json +47 -40
  110. package/src/MarkdownPlugin.tsx +17 -7
  111. package/src/capabilities/anchor-sort.ts +30 -0
  112. package/src/capabilities/artifact-definition.ts +43 -7
  113. package/src/capabilities/index.ts +1 -1
  114. package/src/capabilities/intent-resolver.ts +23 -28
  115. package/src/capabilities/react-surface.tsx +7 -0
  116. package/src/components/MarkdownContainer.tsx +16 -3
  117. package/src/components/MarkdownEditor/MarkdownEditor.tsx +8 -29
  118. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +0 -1
  119. package/src/components/Suggestions.stories.tsx +40 -15
  120. package/src/components/Toolbar.stories.tsx +2 -2
  121. package/src/extensions.tsx +40 -11
  122. package/src/types/schema.ts +7 -13
  123. package/src/util.tsx +2 -2
  124. package/dist/lib/browser/MarkdownContainer-KKWICAKV.mjs.map +0 -7
  125. package/dist/lib/browser/MarkdownPreview-FVSYVJGN.mjs +0 -81
  126. package/dist/lib/browser/artifact-definition-DAF3YCVL.mjs.map +0 -7
  127. package/dist/lib/browser/chunk-JJY5LKZS.mjs +0 -20
  128. package/dist/lib/browser/chunk-JJY5LKZS.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-S42YXFZ7.mjs.map +0 -7
  130. package/dist/lib/browser/chunk-XP2ZPCLI.mjs.map +0 -7
  131. package/dist/lib/browser/intent-resolver-PVKVTAFF.mjs +0 -81
  132. package/dist/lib/browser/intent-resolver-PVKVTAFF.mjs.map +0 -7
  133. package/dist/lib/browser/react-surface-EMQV3GVI.mjs.map +0 -7
  134. package/dist/lib/browser/thread-KW43PJ53.mjs +0 -37
  135. package/dist/lib/browser/thread-KW43PJ53.mjs.map +0 -7
  136. package/dist/lib/node/MarkdownContainer-LBI6ZESS.cjs.map +0 -7
  137. package/dist/lib/node/MarkdownPreview-O3BR4PZW.cjs +0 -104
  138. package/dist/lib/node/artifact-definition-UIZSL2AL.cjs.map +0 -7
  139. package/dist/lib/node/chunk-AJHB57YQ.cjs.map +0 -7
  140. package/dist/lib/node/chunk-BWRBWEKN.cjs.map +0 -7
  141. package/dist/lib/node/chunk-EO5H4OZJ.cjs.map +0 -7
  142. package/dist/lib/node/intent-resolver-ND7PSRJX.cjs +0 -94
  143. package/dist/lib/node/intent-resolver-ND7PSRJX.cjs.map +0 -7
  144. package/dist/lib/node/react-surface-REHX3ABQ.cjs.map +0 -7
  145. package/dist/lib/node/thread-NWBGBGOR.cjs.map +0 -7
  146. package/dist/lib/node-esm/MarkdownContainer-62XZY5EP.mjs.map +0 -7
  147. package/dist/lib/node-esm/MarkdownPreview-KYWRMBRM.mjs +0 -82
  148. package/dist/lib/node-esm/artifact-definition-ER3446S7.mjs.map +0 -7
  149. package/dist/lib/node-esm/chunk-66XM3JMR.mjs.map +0 -7
  150. package/dist/lib/node-esm/chunk-PDD5B7EO.mjs.map +0 -7
  151. package/dist/lib/node-esm/chunk-T5Z5BIOF.mjs.map +0 -7
  152. package/dist/lib/node-esm/intent-resolver-5BF5PLSN.mjs +0 -82
  153. package/dist/lib/node-esm/intent-resolver-5BF5PLSN.mjs.map +0 -7
  154. package/dist/lib/node-esm/react-surface-FA7JYF2A.mjs.map +0 -7
  155. package/dist/lib/node-esm/thread-D2E6W44K.mjs +0 -38
  156. package/dist/lib/node-esm/thread-D2E6W44K.mjs.map +0 -7
  157. package/dist/types/src/capabilities/thread.d.ts +0 -6
  158. package/dist/types/src/capabilities/thread.d.ts.map +0 -1
  159. package/src/capabilities/thread.ts +0 -35
  160. /package/dist/lib/browser/{app-graph-serializer-MPJQUYTQ.mjs.map → app-graph-serializer-V6RLEHVY.mjs.map} +0 -0
  161. /package/dist/lib/browser/{chunk-TUCSFCS5.mjs.map → chunk-C5RABVIX.mjs.map} +0 -0
  162. /package/dist/lib/browser/{settings-GPB6WOIU.mjs.map → settings-W5CK4PXP.mjs.map} +0 -0
  163. /package/dist/lib/browser/{state-XTP5IP3W.mjs.map → state-KI6PJ6DT.mjs.map} +0 -0
  164. /package/dist/lib/node/{app-graph-serializer-Z7UJYSSL.cjs.map → app-graph-serializer-CLALIYN3.cjs.map} +0 -0
  165. /package/dist/lib/node/{chunk-4525YF72.cjs.map → chunk-ZDTL47I7.cjs.map} +0 -0
  166. /package/dist/lib/node/{settings-SF6JDJG6.cjs.map → settings-IRKU3WPM.cjs.map} +0 -0
  167. /package/dist/lib/node/{state-K4IPZTRO.cjs.map → state-KKDRAG7X.cjs.map} +0 -0
  168. /package/dist/lib/node-esm/{app-graph-serializer-DDMFMNYI.mjs.map → app-graph-serializer-C3RNTQGM.mjs.map} +0 -0
  169. /package/dist/lib/node-esm/{chunk-CXTVDT5U.mjs.map → chunk-TCFJNUAE.mjs.map} +0 -0
  170. /package/dist/lib/node-esm/{settings-2DT2C4RA.mjs.map → settings-MK7D7LHQ.mjs.map} +0 -0
  171. /package/dist/lib/node-esm/{state-7VFYPF6Z.mjs.map → state-LLGVRYKL.mjs.map} +0 -0
@@ -1,34 +1,35 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import "./chunk-T5Z5BIOF.mjs";
2
+ import "./chunk-EIUTPXGL.mjs";
3
+ import {
4
+ MarkdownCapabilities
5
+ } from "./chunk-JXXDCSMW.mjs";
3
6
  import {
4
7
  getFallbackName,
5
8
  setFallbackName
6
- } from "./chunk-PDD5B7EO.mjs";
7
- import {
8
- MarkdownCapabilities
9
- } from "./chunk-ETXPC5VP.mjs";
9
+ } from "./chunk-6RPARLIK.mjs";
10
10
  import {
11
11
  DocumentType
12
- } from "./chunk-66XM3JMR.mjs";
12
+ } from "./chunk-NCMPVEXO.mjs";
13
13
  import {
14
14
  MARKDOWN_PLUGIN
15
15
  } from "./chunk-RX63ZNML.mjs";
16
16
 
17
17
  // packages/plugins/plugin-markdown/src/components/MarkdownContainer.tsx
18
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
19
+ import { Rx } from "@effect-rx/rx-react";
18
20
  import React3, { useEffect as useEffect2, useMemo as useMemo4 } from "react";
19
- import { Capabilities, useCapabilities as useCapabilities2 } from "@dxos/app-framework";
21
+ import { Capabilities, useAppGraph, useCapabilities as useCapabilities2 } from "@dxos/app-framework";
20
22
  import { isInstanceOf } from "@dxos/echo-schema";
21
23
  import { fullyQualifiedId as fullyQualifiedId2, getSpace as getSpace2 } from "@dxos/react-client/echo";
22
24
  import { DataType } from "@dxos/schema";
23
25
 
24
26
  // packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx
27
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
25
28
  import React, { useMemo as useMemo2, useEffect, useCallback } from "react";
26
29
  import { useDropzone } from "react-dropzone";
27
- import { createIntent, useIntentDispatcher } from "@dxos/app-framework";
28
30
  import { invariant as invariant2 } from "@dxos/invariant";
29
- import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from "@dxos/plugin-deck/types";
30
31
  import { useThemeContext, useTranslation } from "@dxos/react-ui";
31
- import { EditorToolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorContent, editorGutter, processEditorPayload, stackItemContentEditorClassNames, useCommentState, useCommentClickListener, useFormattingState, useTextEditor, useEditorToolbarState, addLink } from "@dxos/react-ui-editor";
32
+ import { EditorToolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorSlots, editorGutter, processEditorPayload, stackItemContentEditorClassNames, useFormattingState, useTextEditor, useEditorToolbarState, addLink } from "@dxos/react-ui-editor";
32
33
  import { StackItem } from "@dxos/react-ui-stack";
33
34
  import { isNotFalsy, isNonNullable } from "@dxos/util";
34
35
 
@@ -40,7 +41,7 @@ import { createResolver, LayoutAction, useIntentResolver } from "@dxos/app-frame
40
41
  import { invariant } from "@dxos/invariant";
41
42
  import { Cursor, setSelection } from "@dxos/react-ui-editor";
42
43
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
43
- var useSelectCurrentThread = (editorView, documentId) => {
44
+ var useSelectCurrentThread = (editorView, documentId2) => {
44
45
  const scrollIntoViewResolver = useMemo(() => createResolver({
45
46
  intent: LayoutAction.UpdateLayout,
46
47
  position: "hoist",
@@ -48,7 +49,7 @@ var useSelectCurrentThread = (editorView, documentId) => {
48
49
  if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
49
50
  return false;
50
51
  }
51
- return !!editorView && data.subject === documentId && !!data.options?.cursor;
52
+ return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
52
53
  },
53
54
  resolve: ({ options: { cursor } }) => {
54
55
  invariant(editorView, "Editor view is not defined.", {
@@ -74,7 +75,7 @@ var useSelectCurrentThread = (editorView, documentId) => {
74
75
  ];
75
76
  if (selection) {
76
77
  effects.push(setSelection.of({
77
- current: documentId
78
+ current: documentId2
78
79
  }));
79
80
  }
80
81
  editorView.dispatch({
@@ -86,7 +87,7 @@ var useSelectCurrentThread = (editorView, documentId) => {
86
87
  }
87
88
  }
88
89
  }), [
89
- documentId,
90
+ documentId2,
90
91
  editorView
91
92
  ]);
92
93
  useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);
@@ -94,169 +95,156 @@ var useSelectCurrentThread = (editorView, documentId) => {
94
95
 
95
96
  // packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx
96
97
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
97
- var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, comment = true, viewMode, editorStateStore, onFileUpload, onViewModeChange }) => {
98
- const { t } = useTranslation(MARKDOWN_PLUGIN);
99
- const { themeMode } = useThemeContext();
100
- const { dispatchPromise: dispatch } = useIntentDispatcher();
101
- const toolbarState = useEditorToolbarState({
102
- viewMode
103
- });
104
- const formattingObserver = useFormattingState(toolbarState);
105
- const { scrollTo, selection } = useMemo2(() => editorStateStore?.getState(id) ?? {}, [
106
- id
107
- ]);
108
- const providerExtensions = useMemo2(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
109
- extensionProviders
110
- ]);
111
- const commentObserver = useCommentState(toolbarState);
112
- const onCommentClick = useCallback(async () => {
113
- await dispatch(createIntent(DeckAction.ChangeCompanion, {
114
- primary: id,
115
- companion: `${id}${ATTENDABLE_PATH_SEPARATOR}comments`
116
- }));
117
- }, [
118
- dispatch
119
- ]);
120
- const commentClickObserver = useCommentClickListener(onCommentClick);
121
- const handleDrop = async (view, { files }) => {
122
- const file = files[0];
123
- const info = file && onFileUpload ? await onFileUpload(file) : void 0;
124
- if (info) {
125
- processEditorPayload(view, {
126
- type: "image",
127
- data: info.url
128
- });
129
- }
130
- };
131
- const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
132
- initialValue,
133
- extensions: [
98
+ var MarkdownEditor = ({ id, role = "article", initialValue, extensions, extensionProviders, scrollPastEnd, toolbar, customActions, viewMode, editorStateStore, onFileUpload, onViewModeChange }) => {
99
+ var _effect = _useSignals();
100
+ try {
101
+ const { t } = useTranslation(MARKDOWN_PLUGIN);
102
+ const { themeMode } = useThemeContext();
103
+ const toolbarState = useEditorToolbarState({
104
+ viewMode
105
+ });
106
+ const formattingObserver = useFormattingState(toolbarState);
107
+ const { scrollTo, selection } = useMemo2(() => editorStateStore?.getState(id) ?? {}, [
108
+ id
109
+ ]);
110
+ const providerExtensions = useMemo2(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
111
+ extensionProviders
112
+ ]);
113
+ const handleDrop = async (view, { files }) => {
114
+ const file = files[0];
115
+ const info = file && onFileUpload ? await onFileUpload(file) : void 0;
116
+ if (info) {
117
+ processEditorPayload(view, {
118
+ type: "image",
119
+ data: info.url
120
+ });
121
+ }
122
+ };
123
+ const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
124
+ initialValue,
125
+ extensions: [
126
+ formattingObserver,
127
+ createBasicExtensions({
128
+ readOnly: viewMode === "readonly",
129
+ placeholder: t("editor placeholder"),
130
+ scrollPastEnd: role === "section" ? false : scrollPastEnd
131
+ }),
132
+ createMarkdownExtensions({
133
+ themeMode
134
+ }),
135
+ createThemeExtensions({
136
+ themeMode,
137
+ syntaxHighlighting: true,
138
+ slots: editorSlots
139
+ }),
140
+ editorGutter,
141
+ role !== "section" && onFileUpload && dropFile({
142
+ onDrop: handleDrop
143
+ }),
144
+ providerExtensions,
145
+ extensions
146
+ ].filter(isNotFalsy),
147
+ ...role !== "section" && {
148
+ id,
149
+ scrollTo,
150
+ selection,
151
+ // TODO(wittjosiah): Autofocus based on layout is racy.
152
+ // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
153
+ moveToEndOfLine: true
154
+ }
155
+ }), [
156
+ id,
134
157
  formattingObserver,
135
- comment && commentObserver,
136
- comment && commentClickObserver,
137
- createBasicExtensions({
138
- readOnly: viewMode === "readonly",
139
- placeholder: t("editor placeholder"),
140
- scrollPastEnd: role === "section" ? false : scrollPastEnd
141
- }),
142
- createMarkdownExtensions({
143
- themeMode
144
- }),
145
- createThemeExtensions({
146
- themeMode,
147
- syntaxHighlighting: true,
148
- slots: {
149
- content: {
150
- className: editorContent
158
+ viewMode,
159
+ themeMode,
160
+ extensions,
161
+ providerExtensions
162
+ ]);
163
+ useTest(editorView);
164
+ useSelectCurrentThread(editorView, id);
165
+ const { acceptedFiles, getInputProps, open } = useDropzone({
166
+ multiple: false,
167
+ noDrag: true,
168
+ accept: {
169
+ "image/*": [
170
+ ".jpg",
171
+ ".jpeg",
172
+ ".png",
173
+ ".gif"
174
+ ]
175
+ }
176
+ });
177
+ useEffect(() => {
178
+ if (editorView && onFileUpload && acceptedFiles.length) {
179
+ requestAnimationFrame(async () => {
180
+ const f = acceptedFiles[0];
181
+ const file = new File([
182
+ f
183
+ ], f.name, {
184
+ type: f.type,
185
+ lastModified: f.lastModified
186
+ });
187
+ const info = await onFileUpload(file);
188
+ if (info) {
189
+ addLink({
190
+ url: info.url,
191
+ image: true
192
+ })(editorView);
151
193
  }
152
- }
153
- }),
154
- editorGutter,
155
- role !== "section" && onFileUpload && dropFile({
156
- onDrop: handleDrop
157
- }),
158
- providerExtensions,
159
- extensions
160
- ].filter(isNotFalsy),
161
- ...role !== "section" && {
162
- id,
163
- scrollTo,
164
- selection,
165
- // TODO(wittjosiah): Autofocus based on layout is racy.
166
- // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
167
- moveToEndOfLine: true
168
- }
169
- }), [
170
- id,
171
- formattingObserver,
172
- comment,
173
- viewMode,
174
- themeMode,
175
- extensions,
176
- providerExtensions
177
- ]);
178
- useTest(editorView);
179
- useSelectCurrentThread(editorView, id);
180
- const { acceptedFiles, getInputProps, open } = useDropzone({
181
- multiple: false,
182
- noDrag: true,
183
- accept: {
184
- "image/*": [
185
- ".jpg",
186
- ".jpeg",
187
- ".png",
188
- ".gif"
189
- ]
190
- }
191
- });
192
- useEffect(() => {
193
- if (editorView && onFileUpload && acceptedFiles.length) {
194
- requestAnimationFrame(async () => {
195
- const f = acceptedFiles[0];
196
- const file = new File([
197
- f
198
- ], f.name, {
199
- type: f.type,
200
- lastModified: f.lastModified
201
194
  });
202
- const info = await onFileUpload(file);
203
- if (info) {
204
- addLink({
205
- url: info.url,
206
- image: true
207
- })(editorView);
208
- }
195
+ }
196
+ }, [
197
+ acceptedFiles,
198
+ editorView,
199
+ onFileUpload
200
+ ]);
201
+ const getView = useCallback(() => {
202
+ invariant2(editorView, void 0, {
203
+ F: __dxlog_file2,
204
+ L: 165,
205
+ S: void 0,
206
+ A: [
207
+ "editorView",
208
+ ""
209
+ ]
209
210
  });
210
- }
211
- }, [
212
- acceptedFiles,
213
- editorView,
214
- onFileUpload
215
- ]);
216
- const getView = useCallback(() => {
217
- invariant2(editorView, void 0, {
218
- F: __dxlog_file2,
219
- L: 186,
220
- S: void 0,
221
- A: [
222
- "editorView",
223
- ""
224
- ]
225
- });
226
- return editorView;
227
- }, [
228
- editorView
229
- ]);
230
- const handleViewModeChange = useCallback((mode) => onViewModeChange?.(id, mode), [
231
- id,
232
- onViewModeChange
233
- ]);
234
- const handleImageUpload = useCallback(() => {
235
- if (onFileUpload) {
236
- open();
237
- }
238
- }, [
239
- onFileUpload
240
- ]);
241
- return /* @__PURE__ */ React.createElement(StackItem.Content, {
242
- toolbar: !!toolbar
243
- }, toolbar && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(EditorToolbar, {
244
- attendableId: id,
245
- role,
246
- state: toolbarState,
247
- getView,
248
- comment,
249
- image: handleImageUpload,
250
- viewMode: handleViewModeChange
251
- }), /* @__PURE__ */ React.createElement("input", getInputProps())), /* @__PURE__ */ React.createElement("div", {
252
- role: "none",
253
- ref: parentRef,
254
- "data-testid": "composer.markdownRoot",
255
- "data-toolbar": toolbar ? "enabled" : "disabled",
256
- className: stackItemContentEditorClassNames(role),
257
- "data-popover-collision-boundary": true,
258
- ...focusAttributes
259
- }));
211
+ return editorView;
212
+ }, [
213
+ editorView
214
+ ]);
215
+ const handleViewModeChange = useCallback((mode) => onViewModeChange?.(id, mode), [
216
+ id,
217
+ onViewModeChange
218
+ ]);
219
+ const handleImageUpload = useCallback(() => {
220
+ if (onFileUpload) {
221
+ open();
222
+ }
223
+ }, [
224
+ onFileUpload
225
+ ]);
226
+ return /* @__PURE__ */ React.createElement(StackItem.Content, {
227
+ toolbar: !!toolbar
228
+ }, toolbar && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(EditorToolbar, {
229
+ attendableId: id,
230
+ role,
231
+ state: toolbarState,
232
+ customActions,
233
+ getView,
234
+ image: handleImageUpload,
235
+ viewMode: handleViewModeChange
236
+ }), /* @__PURE__ */ React.createElement("input", getInputProps())), /* @__PURE__ */ React.createElement("div", {
237
+ role: "none",
238
+ ref: parentRef,
239
+ "data-testid": "composer.markdownRoot",
240
+ "data-toolbar": toolbar ? "enabled" : "disabled",
241
+ className: stackItemContentEditorClassNames(role),
242
+ "data-popover-collision-boundary": true,
243
+ ...focusAttributes
244
+ }));
245
+ } finally {
246
+ _effect.f();
247
+ }
260
248
  };
261
249
  var useTest = (view) => {
262
250
  useEffect(() => {
@@ -272,17 +260,17 @@ var useTest = (view) => {
272
260
  // packages/plugins/plugin-markdown/src/extensions.tsx
273
261
  import React2, { useMemo as useMemo3 } from "react";
274
262
  import { createRoot } from "react-dom/client";
275
- import { createIntent as createIntent2, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
263
+ import { createIntent, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
276
264
  import { invariant as invariant3 } from "@dxos/invariant";
277
265
  import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
278
266
  import { useIdentity } from "@dxos/react-client/halo";
279
267
  import { Icon, ThemeProvider } from "@dxos/react-ui";
280
- import { InputModeExtensions, createDataExtensions, autocomplete, decorateMarkdown, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter } from "@dxos/react-ui-editor";
268
+ import { InputModeExtensions, createDataExtensions, autocomplete, decorateMarkdown, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter, EditorView as EditorView2, documentId, Cursor as Cursor2 } from "@dxos/react-ui-editor";
281
269
  import { defaultTx } from "@dxos/react-ui-theme";
282
270
  import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
283
271
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
284
- var useExtensions = ({ document, id, text, settings, viewMode, editorStateStore }) => {
285
- const { dispatchPromise: dispatch } = useIntentDispatcher2();
272
+ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore }) => {
273
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
286
274
  const identity = useIdentity();
287
275
  const space = getSpace(document) ?? getSpace(text);
288
276
  const baseExtensions = useMemo3(() => createBaseExtensions({
@@ -290,6 +278,7 @@ var useExtensions = ({ document, id, text, settings, viewMode, editorStateStore
290
278
  id,
291
279
  text,
292
280
  settings,
281
+ selectionManager,
293
282
  viewMode,
294
283
  dispatch
295
284
  }), [
@@ -303,18 +292,24 @@ var useExtensions = ({ document, id, text, settings, viewMode, editorStateStore
303
292
  settings.folding,
304
293
  settings.numberedHeadings,
305
294
  settings.debug,
306
- settings.typewriter
295
+ settings.typewriter,
296
+ selectionManager
307
297
  ]);
308
298
  const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
309
- const pluginExtensions = useMemo3(() => extensionProviders.flat().reduce((acc, provider) => {
310
- const extension = typeof provider === "function" ? provider({
311
- document
312
- }) : provider;
313
- if (extension) {
314
- acc.push(extension);
299
+ const pluginExtensions = useMemo3(() => {
300
+ if (!document) {
301
+ return [];
315
302
  }
316
- return acc;
317
- }, []), [
303
+ return extensionProviders.flat().reduce((acc, provider) => {
304
+ const extension = typeof provider === "function" ? provider({
305
+ document
306
+ }) : provider;
307
+ if (extension) {
308
+ acc.push(extension);
309
+ }
310
+ return acc;
311
+ }, []);
312
+ }, [
318
313
  extensionProviders,
319
314
  document
320
315
  ]);
@@ -353,8 +348,9 @@ var useExtensions = ({ document, id, text, settings, viewMode, editorStateStore
353
348
  identity
354
349
  ]);
355
350
  };
356
- var createBaseExtensions = ({ document, id, dispatch, settings, query, viewMode }) => {
351
+ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode }) => {
357
352
  const extensions = [
353
+ selectionManager && selectionChange(selectionManager),
358
354
  settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
359
355
  settings.folding && folding()
360
356
  ].filter(isNotFalsy2);
@@ -368,7 +364,7 @@ var createBaseExtensions = ({ document, id, dispatch, settings, query, viewMode
368
364
  } : void 0,
369
365
  // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
370
366
  renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
371
- void dispatch(createIntent2(LayoutAction2.Open, {
367
+ void dispatch(createIntent(LayoutAction2.Open, {
372
368
  part: "main",
373
369
  subject: [
374
370
  id2
@@ -404,6 +400,20 @@ var createBaseExtensions = ({ document, id, dispatch, settings, query, viewMode
404
400
  }
405
401
  return extensions;
406
402
  };
403
+ var selectionChange = (selectionManager) => {
404
+ return EditorView2.updateListener.of((update) => {
405
+ if (update.selectionSet) {
406
+ const id = update.state.facet(documentId);
407
+ const cursorConverter = update.state.facet(Cursor2.converter);
408
+ const selection = update.state.selection;
409
+ const ranges = selection.ranges.map((range) => ({
410
+ from: cursorConverter.toCursor(range.from),
411
+ to: cursorConverter.toCursor(range.to)
412
+ })).filter(({ from, to }) => to > from);
413
+ selectionManager.updateMultiRange(id, ranges);
414
+ }
415
+ });
416
+ };
407
417
  var style = {
408
418
  hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
409
419
  icon: "inline-block leading-none mis-1 cursor-pointer"
@@ -416,7 +426,7 @@ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
416
426
  const qualifiedId = url.split("/").at(-1);
417
427
  invariant3(qualifiedId, "Invalid link format.", {
418
428
  F: __dxlog_file3,
419
- L: 252,
429
+ L: 281,
420
430
  S: void 0,
421
431
  A: [
422
432
  "qualifiedId",
@@ -460,93 +470,120 @@ var renderRoot = (root, node) => {
460
470
  };
461
471
 
462
472
  // packages/plugins/plugin-markdown/src/components/MarkdownContainer.tsx
463
- var MarkdownContainer = ({ id, role, object, settings, viewMode, editorStateStore, onViewModeChange }) => {
464
- const scrollPastEnd = role === "article";
465
- const doc = isInstanceOf(DocumentType, object) ? object : void 0;
466
- const text = isInstanceOf(DataType.Text, object) ? object : void 0;
467
- const extensions = useExtensions({
468
- document: doc,
469
- text,
470
- id,
471
- settings,
472
- viewMode,
473
- editorStateStore
474
- });
475
- if (doc) {
476
- return /* @__PURE__ */ React3.createElement(DocumentEditor, {
477
- id: fullyQualifiedId2(object),
478
- role,
473
+ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
474
+ var _effect = _useSignals2();
475
+ try {
476
+ const scrollPastEnd = role === "article";
477
+ const doc = isInstanceOf(DocumentType, object) ? object : void 0;
478
+ const text = isInstanceOf(DataType.Text, object) ? object : void 0;
479
+ const extensions = useExtensions({
479
480
  document: doc,
480
- extensions,
481
- viewMode,
482
- settings,
483
- scrollPastEnd,
484
- onViewModeChange
485
- });
486
- } else if (text) {
487
- return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
481
+ text,
488
482
  id,
489
- role,
490
- initialValue: text.content,
491
- extensions,
483
+ settings,
484
+ selectionManager,
492
485
  viewMode,
493
- toolbar: settings.toolbar,
494
- comment: false,
495
- inputMode: settings.editorInputMode,
496
- scrollPastEnd,
497
- onViewModeChange
486
+ editorStateStore
498
487
  });
499
- } else {
488
+ if (doc) {
489
+ return /* @__PURE__ */ React3.createElement(DocumentEditor, {
490
+ id: fullyQualifiedId2(object),
491
+ role,
492
+ document: doc,
493
+ extensions,
494
+ viewMode,
495
+ settings,
496
+ scrollPastEnd,
497
+ onViewModeChange
498
+ });
499
+ } else if (text) {
500
+ return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
501
+ id,
502
+ role,
503
+ initialValue: text.content,
504
+ extensions,
505
+ viewMode,
506
+ toolbar: settings.toolbar,
507
+ inputMode: settings.editorInputMode,
508
+ scrollPastEnd,
509
+ onViewModeChange
510
+ });
511
+ } else {
512
+ return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
513
+ id,
514
+ role,
515
+ initialValue: object.text,
516
+ extensions,
517
+ viewMode,
518
+ toolbar: settings.toolbar,
519
+ inputMode: settings.editorInputMode,
520
+ scrollPastEnd,
521
+ onViewModeChange
522
+ });
523
+ }
524
+ } finally {
525
+ _effect.f();
526
+ }
527
+ };
528
+ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
529
+ var _effect = _useSignals2();
530
+ try {
531
+ const space = getSpace2(doc);
532
+ useEffect2(() => {
533
+ if (typeof doc.fallbackName === "string") {
534
+ return;
535
+ }
536
+ const fallbackName = doc.content?.target?.content ? getFallbackName(doc.content.target.content) : void 0;
537
+ if (fallbackName) {
538
+ doc.fallbackName = fallbackName;
539
+ }
540
+ }, [
541
+ doc,
542
+ doc.content
543
+ ]);
544
+ const [upload] = useCapabilities2(Capabilities.FileUploader);
545
+ const handleFileUpload = useMemo4(() => {
546
+ if (space === void 0 || upload === void 0) {
547
+ return void 0;
548
+ }
549
+ return async (file) => upload(file, space);
550
+ }, [
551
+ space,
552
+ upload
553
+ ]);
554
+ const { graph } = useAppGraph();
555
+ const customActions = useMemo4(() => {
556
+ return Rx.make((get) => {
557
+ const actions = get(graph.actions(id));
558
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
559
+ return {
560
+ nodes,
561
+ edges: nodes.map((node) => ({
562
+ source: "root",
563
+ target: node.id
564
+ }))
565
+ };
566
+ });
567
+ }, [
568
+ graph
569
+ ]);
500
570
  return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
501
571
  id,
502
- role,
503
- initialValue: object.text,
504
- extensions,
572
+ initialValue: doc.content?.target?.content,
505
573
  viewMode,
506
574
  toolbar: settings.toolbar,
575
+ customActions,
507
576
  inputMode: settings.editorInputMode,
508
- scrollPastEnd,
509
- onViewModeChange
577
+ onFileUpload: handleFileUpload,
578
+ ...props
510
579
  });
580
+ } finally {
581
+ _effect.f();
511
582
  }
512
583
  };
513
- var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
514
- const space = getSpace2(doc);
515
- useEffect2(() => {
516
- if (typeof doc.fallbackName === "string") {
517
- return;
518
- }
519
- const fallbackName = doc.content?.target?.content ? getFallbackName(doc.content.target.content) : void 0;
520
- if (fallbackName) {
521
- doc.fallbackName = fallbackName;
522
- }
523
- }, [
524
- doc,
525
- doc.content
526
- ]);
527
- const [upload] = useCapabilities2(Capabilities.FileUploader);
528
- const handleFileUpload = useMemo4(() => {
529
- if (space === void 0 || upload === void 0) {
530
- return void 0;
531
- }
532
- return async (file) => upload(file, space);
533
- }, [
534
- space,
535
- upload
536
- ]);
537
- return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
538
- id,
539
- initialValue: doc.content?.target?.content,
540
- viewMode,
541
- toolbar: settings.toolbar,
542
- inputMode: settings.editorInputMode,
543
- onFileUpload: handleFileUpload,
544
- ...props
545
- });
546
- };
547
584
  var MarkdownContainer_default = MarkdownContainer;
548
585
  export {
549
586
  DocumentEditor,
550
587
  MarkdownContainer_default as default
551
588
  };
552
- //# sourceMappingURL=MarkdownContainer-62XZY5EP.mjs.map
589
+ //# sourceMappingURL=MarkdownContainer-UZSLXMWO.mjs.map