@dxos/plugin-markdown 0.8.2-main.fbd8ed0 → 0.8.2-staging.4d6ad0f

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