@dxos/plugin-markdown 0.8.2-main.f11618f → 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 (210) hide show
  1. package/dist/lib/browser/MarkdownContainer-5IEINNQB.mjs +588 -0
  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/browser/MarkdownPreview-YW5CS3ID.mjs.map +7 -0
  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-OCXP7PCK.mjs → app-graph-serializer-V6RLEHVY.mjs} +5 -6
  8. package/dist/lib/browser/app-graph-serializer-V6RLEHVY.mjs.map +7 -0
  9. package/dist/lib/browser/{artifact-definition-XTVOUMMI.mjs → artifact-definition-5NAODQLG.mjs} +65 -17
  10. package/dist/lib/browser/artifact-definition-5NAODQLG.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QV6ZIXAD.mjs → chunk-77NGW7EO.mjs} +6 -7
  12. package/dist/lib/browser/chunk-77NGW7EO.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-ACAID3XF.mjs +20 -0
  14. package/dist/lib/browser/chunk-ACAID3XF.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-LJ2UFBJ2.mjs → chunk-C5RABVIX.mjs} +3 -4
  16. package/dist/lib/browser/chunk-C5RABVIX.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-ECSM56YC.mjs +80 -0
  18. package/dist/lib/browser/chunk-ECSM56YC.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-NAGMSX77.mjs → chunk-QVJETNGS.mjs} +2 -2
  20. package/dist/lib/{node-esm/chunk-ETXPC5VP.mjs.map → browser/chunk-QVJETNGS.mjs.map} +1 -1
  21. package/dist/lib/browser/index.mjs +31 -19
  22. package/dist/lib/browser/index.mjs.map +3 -3
  23. package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs +65 -0
  24. package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/{react-surface-LBCMSLJ5.mjs → react-surface-QE4SKXBT.mjs} +80 -66
  27. package/dist/lib/browser/react-surface-QE4SKXBT.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-EQSDBX6O.mjs → settings-W5CK4PXP.mjs} +2 -2
  29. package/dist/lib/browser/{state-AIN4J7N5.mjs → state-KI6PJ6DT.mjs} +3 -3
  30. package/dist/lib/browser/state-KI6PJ6DT.mjs.map +7 -0
  31. package/dist/lib/browser/types/index.mjs +1 -1
  32. package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs +601 -0
  33. package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs.map +7 -0
  34. package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs +110 -0
  35. package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs.map +7 -0
  36. package/dist/lib/node/{thread-MXEGV6HS.cjs → anchor-sort-NHVF23EU.cjs} +15 -20
  37. package/dist/lib/node/anchor-sort-NHVF23EU.cjs.map +7 -0
  38. package/dist/lib/node/{app-graph-serializer-KBDLASRP.cjs → app-graph-serializer-CLALIYN3.cjs} +10 -11
  39. package/dist/lib/node/app-graph-serializer-CLALIYN3.cjs.map +7 -0
  40. package/dist/lib/node/{artifact-definition-ADEN2KD6.cjs → artifact-definition-VEAHK7BX.cjs} +68 -21
  41. package/dist/lib/node/artifact-definition-VEAHK7BX.cjs.map +7 -0
  42. package/dist/lib/node/{chunk-QRE5L6ZC.cjs → chunk-C4HR7UXE.cjs} +15 -15
  43. package/dist/lib/node/chunk-C4HR7UXE.cjs.map +7 -0
  44. package/dist/lib/node/{chunk-WGMVEPB3.cjs → chunk-G7RBJX22.cjs} +8 -9
  45. package/dist/lib/node/chunk-G7RBJX22.cjs.map +7 -0
  46. package/dist/lib/node/{chunk-DZXTXSXX.cjs → chunk-IFYSBQE5.cjs} +5 -5
  47. package/dist/lib/node/{chunk-DZXTXSXX.cjs.map → chunk-IFYSBQE5.cjs.map} +1 -1
  48. package/dist/lib/node/{chunk-YHL4JSA6.cjs → chunk-RQS4KBMG.cjs} +38 -42
  49. package/dist/lib/node/chunk-RQS4KBMG.cjs.map +7 -0
  50. package/dist/lib/node/{chunk-JO4SBK36.cjs → chunk-ZDTL47I7.cjs} +6 -7
  51. package/dist/lib/node/chunk-ZDTL47I7.cjs.map +7 -0
  52. package/dist/lib/node/index.cjs +42 -30
  53. package/dist/lib/node/index.cjs.map +3 -3
  54. package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs +78 -0
  55. package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs.map +7 -0
  56. package/dist/lib/node/meta.json +1 -1
  57. package/dist/lib/node/react-surface-WJZTEBYO.cjs +213 -0
  58. package/dist/lib/node/react-surface-WJZTEBYO.cjs.map +7 -0
  59. package/dist/lib/node/{settings-2JXASSLU.cjs → settings-IRKU3WPM.cjs} +6 -6
  60. package/dist/lib/node/{state-PC7IVXFP.cjs → state-KKDRAG7X.cjs} +7 -7
  61. package/dist/lib/node/state-KKDRAG7X.cjs.map +7 -0
  62. package/dist/lib/node/types/index.cjs +7 -7
  63. package/dist/lib/node/types/index.cjs.map +1 -1
  64. package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs +589 -0
  65. package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs.map +7 -0
  66. package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs +88 -0
  67. package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs.map +7 -0
  68. package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs +33 -0
  69. package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs.map +7 -0
  70. package/dist/lib/node-esm/{app-graph-serializer-67CO7ST3.mjs → app-graph-serializer-C3RNTQGM.mjs} +5 -6
  71. package/dist/lib/node-esm/app-graph-serializer-C3RNTQGM.mjs.map +7 -0
  72. package/dist/lib/node-esm/{artifact-definition-KTS5M2FW.mjs → artifact-definition-7TIJW2CO.mjs} +65 -17
  73. package/dist/lib/node-esm/artifact-definition-7TIJW2CO.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-4U2F4EB7.mjs → chunk-6RPARLIK.mjs} +6 -7
  75. package/dist/lib/node-esm/chunk-6RPARLIK.mjs.map +7 -0
  76. package/dist/lib/node-esm/{chunk-PALFXZBY.mjs → chunk-EIUTPXGL.mjs} +10 -10
  77. package/dist/lib/node-esm/chunk-EIUTPXGL.mjs.map +7 -0
  78. package/dist/lib/node-esm/{chunk-ETXPC5VP.mjs → chunk-JXXDCSMW.mjs} +2 -2
  79. package/dist/lib/{browser/chunk-NAGMSX77.mjs.map → node-esm/chunk-JXXDCSMW.mjs.map} +1 -1
  80. package/dist/lib/node-esm/chunk-NCMPVEXO.mjs +81 -0
  81. package/dist/lib/node-esm/chunk-NCMPVEXO.mjs.map +7 -0
  82. package/dist/lib/node-esm/{chunk-VQA6BQGT.mjs → chunk-TCFJNUAE.mjs} +3 -4
  83. package/dist/lib/node-esm/chunk-TCFJNUAE.mjs.map +7 -0
  84. package/dist/lib/node-esm/index.mjs +31 -19
  85. package/dist/lib/node-esm/index.mjs.map +3 -3
  86. package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs +66 -0
  87. package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs.map +7 -0
  88. package/dist/lib/node-esm/meta.json +1 -1
  89. package/dist/lib/node-esm/{react-surface-737EXAWT.mjs → react-surface-XNM3YDFB.mjs} +80 -66
  90. package/dist/lib/node-esm/react-surface-XNM3YDFB.mjs.map +7 -0
  91. package/dist/lib/node-esm/{settings-67RVIH3N.mjs → settings-MK7D7LHQ.mjs} +2 -2
  92. package/dist/lib/node-esm/{state-PNOPM4TS.mjs → state-LLGVRYKL.mjs} +3 -3
  93. package/dist/lib/node-esm/state-LLGVRYKL.mjs.map +7 -0
  94. package/dist/lib/node-esm/types/index.mjs +1 -1
  95. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  97. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/app-graph-serializer.d.ts +2 -2
  99. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/index.d.ts +7 -7
  102. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  104. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  106. package/dist/types/src/capabilities/state.d.ts +2 -2
  107. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  108. package/dist/types/src/components/MarkdownContainer.d.ts +5 -3
  109. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  110. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +3 -18
  111. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  112. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +2 -2
  113. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +1 -1
  114. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +4 -172
  115. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  117. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/index.d.ts +2 -2
  120. package/dist/types/src/components/index.d.ts.map +1 -1
  121. package/dist/types/src/extensions.d.ts +8 -5
  122. package/dist/types/src/extensions.d.ts.map +1 -1
  123. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  124. package/dist/types/src/translations.d.ts +2 -46
  125. package/dist/types/src/translations.d.ts.map +1 -1
  126. package/dist/types/src/types/schema.d.ts +21 -525
  127. package/dist/types/src/types/schema.d.ts.map +1 -1
  128. package/dist/types/src/types/types.d.ts +40 -200
  129. package/dist/types/src/types/types.d.ts.map +1 -1
  130. package/dist/types/src/util.d.ts.map +1 -1
  131. package/dist/types/tsconfig.tsbuildinfo +1 -1
  132. package/package.json +48 -39
  133. package/src/MarkdownPlugin.tsx +19 -9
  134. package/src/capabilities/anchor-sort.ts +30 -0
  135. package/src/capabilities/app-graph-serializer.ts +4 -5
  136. package/src/capabilities/artifact-definition.ts +48 -10
  137. package/src/capabilities/index.ts +1 -1
  138. package/src/capabilities/intent-resolver.ts +29 -34
  139. package/src/capabilities/react-surface.tsx +14 -6
  140. package/src/capabilities/state.ts +3 -3
  141. package/src/components/MarkdownContainer.tsx +19 -7
  142. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +1 -1
  143. package/src/components/MarkdownEditor/MarkdownEditor.tsx +29 -71
  144. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +9 -4
  145. package/src/components/MarkdownPreview/MarkdownPreview.tsx +8 -8
  146. package/src/components/Suggestions.stories.tsx +53 -21
  147. package/src/components/Toolbar.stories.tsx +16 -16
  148. package/src/extensions.tsx +45 -16
  149. package/src/hooks/useSelectCurrentThread.tsx +2 -2
  150. package/src/translations.ts +1 -3
  151. package/src/types/schema.ts +19 -17
  152. package/src/types/types.ts +23 -21
  153. package/src/util.tsx +4 -4
  154. package/dist/lib/browser/MarkdownContainer-5XV7K2NX.mjs +0 -567
  155. package/dist/lib/browser/MarkdownContainer-5XV7K2NX.mjs.map +0 -7
  156. package/dist/lib/browser/MarkdownPreview-DX5U5LCX.mjs +0 -81
  157. package/dist/lib/browser/MarkdownPreview-DX5U5LCX.mjs.map +0 -7
  158. package/dist/lib/browser/app-graph-serializer-OCXP7PCK.mjs.map +0 -7
  159. package/dist/lib/browser/artifact-definition-XTVOUMMI.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-5QXYEKSX.mjs +0 -20
  161. package/dist/lib/browser/chunk-5QXYEKSX.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-GVOEHF7E.mjs +0 -84
  163. package/dist/lib/browser/chunk-GVOEHF7E.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-LJ2UFBJ2.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-QV6ZIXAD.mjs.map +0 -7
  166. package/dist/lib/browser/intent-resolver-H37L3DBD.mjs +0 -86
  167. package/dist/lib/browser/intent-resolver-H37L3DBD.mjs.map +0 -7
  168. package/dist/lib/browser/react-surface-LBCMSLJ5.mjs.map +0 -7
  169. package/dist/lib/browser/state-AIN4J7N5.mjs.map +0 -7
  170. package/dist/lib/browser/thread-MFKBUVCB.mjs +0 -37
  171. package/dist/lib/browser/thread-MFKBUVCB.mjs.map +0 -7
  172. package/dist/lib/node/MarkdownContainer-5EQTBXV3.cjs +0 -580
  173. package/dist/lib/node/MarkdownContainer-5EQTBXV3.cjs.map +0 -7
  174. package/dist/lib/node/MarkdownPreview-W7QIN2KJ.cjs +0 -104
  175. package/dist/lib/node/MarkdownPreview-W7QIN2KJ.cjs.map +0 -7
  176. package/dist/lib/node/app-graph-serializer-KBDLASRP.cjs.map +0 -7
  177. package/dist/lib/node/artifact-definition-ADEN2KD6.cjs.map +0 -7
  178. package/dist/lib/node/chunk-JO4SBK36.cjs.map +0 -7
  179. package/dist/lib/node/chunk-QRE5L6ZC.cjs.map +0 -7
  180. package/dist/lib/node/chunk-WGMVEPB3.cjs.map +0 -7
  181. package/dist/lib/node/chunk-YHL4JSA6.cjs.map +0 -7
  182. package/dist/lib/node/intent-resolver-NX5QNRYF.cjs +0 -99
  183. package/dist/lib/node/intent-resolver-NX5QNRYF.cjs.map +0 -7
  184. package/dist/lib/node/react-surface-DJIZSVMN.cjs +0 -199
  185. package/dist/lib/node/react-surface-DJIZSVMN.cjs.map +0 -7
  186. package/dist/lib/node/state-PC7IVXFP.cjs.map +0 -7
  187. package/dist/lib/node/thread-MXEGV6HS.cjs.map +0 -7
  188. package/dist/lib/node-esm/MarkdownContainer-LONZOJJX.mjs +0 -568
  189. package/dist/lib/node-esm/MarkdownContainer-LONZOJJX.mjs.map +0 -7
  190. package/dist/lib/node-esm/MarkdownPreview-T3OW2EN4.mjs +0 -82
  191. package/dist/lib/node-esm/MarkdownPreview-T3OW2EN4.mjs.map +0 -7
  192. package/dist/lib/node-esm/app-graph-serializer-67CO7ST3.mjs.map +0 -7
  193. package/dist/lib/node-esm/artifact-definition-KTS5M2FW.mjs.map +0 -7
  194. package/dist/lib/node-esm/chunk-4U2F4EB7.mjs.map +0 -7
  195. package/dist/lib/node-esm/chunk-NUZHKZSZ.mjs +0 -85
  196. package/dist/lib/node-esm/chunk-NUZHKZSZ.mjs.map +0 -7
  197. package/dist/lib/node-esm/chunk-PALFXZBY.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-VQA6BQGT.mjs.map +0 -7
  199. package/dist/lib/node-esm/intent-resolver-XES4ZCA6.mjs +0 -87
  200. package/dist/lib/node-esm/intent-resolver-XES4ZCA6.mjs.map +0 -7
  201. package/dist/lib/node-esm/react-surface-737EXAWT.mjs.map +0 -7
  202. package/dist/lib/node-esm/state-PNOPM4TS.mjs.map +0 -7
  203. package/dist/lib/node-esm/thread-5U4KSBED.mjs +0 -38
  204. package/dist/lib/node-esm/thread-5U4KSBED.mjs.map +0 -7
  205. package/dist/types/src/capabilities/thread.d.ts +0 -6
  206. package/dist/types/src/capabilities/thread.d.ts.map +0 -1
  207. package/src/capabilities/thread.ts +0 -35
  208. /package/dist/lib/browser/{settings-EQSDBX6O.mjs.map → settings-W5CK4PXP.mjs.map} +0 -0
  209. /package/dist/lib/node/{settings-2JXASSLU.cjs.map → settings-IRKU3WPM.cjs.map} +0 -0
  210. /package/dist/lib/node-esm/{settings-67RVIH3N.mjs.map → settings-MK7D7LHQ.mjs.map} +0 -0
@@ -0,0 +1,588 @@
1
+ import "./chunk-ACAID3XF.mjs";
2
+ import {
3
+ MarkdownCapabilities
4
+ } from "./chunk-QVJETNGS.mjs";
5
+ import {
6
+ getFallbackName,
7
+ setFallbackName
8
+ } from "./chunk-77NGW7EO.mjs";
9
+ import {
10
+ DocumentType
11
+ } from "./chunk-ECSM56YC.mjs";
12
+ import {
13
+ MARKDOWN_PLUGIN
14
+ } from "./chunk-JX6XNEHE.mjs";
15
+
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";
19
+ import React3, { useEffect as useEffect2, useMemo as useMemo4 } from "react";
20
+ import { Capabilities, useAppGraph, useCapabilities as useCapabilities2 } from "@dxos/app-framework";
21
+ import { isInstanceOf } from "@dxos/echo-schema";
22
+ import { fullyQualifiedId as fullyQualifiedId2, getSpace as getSpace2 } from "@dxos/react-client/echo";
23
+ import { DataType } from "@dxos/schema";
24
+
25
+ // packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx
26
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
27
+ import React, { useMemo as useMemo2, useEffect, useCallback } from "react";
28
+ import { useDropzone } from "react-dropzone";
29
+ import { invariant as invariant2 } from "@dxos/invariant";
30
+ import { useThemeContext, useTranslation } from "@dxos/react-ui";
31
+ import { EditorToolbar, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorSlots, editorGutter, processEditorPayload, stackItemContentEditorClassNames, useFormattingState, useTextEditor, useEditorToolbarState, addLink } from "@dxos/react-ui-editor";
32
+ import { StackItem } from "@dxos/react-ui-stack";
33
+ import { isNotFalsy, isNonNullable } from "@dxos/util";
34
+
35
+ // packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx
36
+ import { EditorView } from "@codemirror/view";
37
+ import { Schema } from "effect";
38
+ import { useMemo } from "react";
39
+ import { createResolver, LayoutAction, useIntentResolver } from "@dxos/app-framework";
40
+ import { invariant } from "@dxos/invariant";
41
+ import { Cursor, setSelection } from "@dxos/react-ui-editor";
42
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
43
+ var useSelectCurrentThread = (editorView, documentId2) => {
44
+ const scrollIntoViewResolver = useMemo(() => createResolver({
45
+ intent: LayoutAction.UpdateLayout,
46
+ position: "hoist",
47
+ filter: (data) => {
48
+ if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
49
+ return false;
50
+ }
51
+ return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
52
+ },
53
+ resolve: ({ options: { cursor } }) => {
54
+ invariant(editorView, "Editor view is not defined.", {
55
+ F: __dxlog_file,
56
+ L: 32,
57
+ S: void 0,
58
+ A: [
59
+ "editorView",
60
+ "'Editor view is not defined.'"
61
+ ]
62
+ });
63
+ const range = Cursor.getRangeFromCursor(editorView.state, cursor);
64
+ if (range) {
65
+ const selection = editorView.state.selection.main.from !== range.from ? {
66
+ anchor: range.from
67
+ } : void 0;
68
+ const effects = [
69
+ // NOTE: This does not use the DOM scrollIntoView function.
70
+ EditorView.scrollIntoView(range.from, {
71
+ y: "start",
72
+ yMargin: 96
73
+ })
74
+ ];
75
+ if (selection) {
76
+ effects.push(setSelection.of({
77
+ current: documentId2
78
+ }));
79
+ }
80
+ editorView.dispatch({
81
+ effects,
82
+ selection: selection ? {
83
+ anchor: range.from
84
+ } : void 0
85
+ });
86
+ }
87
+ }
88
+ }), [
89
+ documentId2,
90
+ editorView
91
+ ]);
92
+ useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);
93
+ };
94
+
95
+ // packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx
96
+ 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, 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,
156
+ formattingObserver,
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);
192
+ }
193
+ });
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
+ ]
209
+ });
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
+ }
247
+ };
248
+ var useTest = (view) => {
249
+ useEffect(() => {
250
+ const composer = window.composer;
251
+ if (composer) {
252
+ composer.editorView = view;
253
+ }
254
+ }, [
255
+ view
256
+ ]);
257
+ };
258
+
259
+ // packages/plugins/plugin-markdown/src/extensions.tsx
260
+ import React2, { useMemo as useMemo3 } from "react";
261
+ import { createRoot } from "react-dom/client";
262
+ import { createIntent, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
263
+ import { invariant as invariant3 } from "@dxos/invariant";
264
+ import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
265
+ import { useIdentity } from "@dxos/react-client/halo";
266
+ import { Icon, ThemeProvider } from "@dxos/react-ui";
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";
268
+ import { defaultTx } from "@dxos/react-ui-theme";
269
+ import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
270
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
271
+ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore }) => {
272
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
273
+ const identity = useIdentity();
274
+ const space = getSpace(document) ?? getSpace(text);
275
+ const baseExtensions = useMemo3(() => createBaseExtensions({
276
+ document,
277
+ id,
278
+ text,
279
+ settings,
280
+ selectionManager,
281
+ viewMode,
282
+ dispatch
283
+ }), [
284
+ document,
285
+ id,
286
+ text,
287
+ viewMode,
288
+ dispatch,
289
+ settings,
290
+ settings.editorInputMode,
291
+ settings.folding,
292
+ settings.numberedHeadings,
293
+ settings.debug,
294
+ settings.typewriter,
295
+ selectionManager
296
+ ]);
297
+ const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
298
+ const pluginExtensions = useMemo3(() => {
299
+ if (!document) {
300
+ return [];
301
+ }
302
+ return 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
+ }, [
312
+ extensionProviders,
313
+ document
314
+ ]);
315
+ return useMemo3(() => [
316
+ // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
317
+ document && createDataExtensions({
318
+ id: document.id,
319
+ text: document.content.target && createDocAccessor(document.content.target, [
320
+ "content"
321
+ ]),
322
+ space,
323
+ identity
324
+ }),
325
+ text && id && createDataExtensions({
326
+ id,
327
+ text: createDocAccessor(text, [
328
+ "content"
329
+ ]),
330
+ space,
331
+ identity
332
+ }),
333
+ selectionState(editorStateStore),
334
+ document && listener({
335
+ onChange: (text2) => setFallbackName(document, text2)
336
+ }),
337
+ baseExtensions,
338
+ pluginExtensions
339
+ ].filter(isNotFalsy2), [
340
+ baseExtensions,
341
+ pluginExtensions,
342
+ document,
343
+ document?.content?.target,
344
+ text,
345
+ id,
346
+ space,
347
+ identity
348
+ ]);
349
+ };
350
+ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode }) => {
351
+ const extensions = [
352
+ selectionManager && selectionChange(selectionManager),
353
+ settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
354
+ settings.folding && folding()
355
+ ].filter(isNotFalsy2);
356
+ if (viewMode !== "source") {
357
+ extensions.push(...[
358
+ formattingKeymap(),
359
+ decorateMarkdown({
360
+ selectionChangeDelay: 100,
361
+ numberedHeadings: settings.numberedHeadings ? {
362
+ from: 2
363
+ } : void 0,
364
+ // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
365
+ renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
366
+ void dispatch(createIntent(LayoutAction2.Open, {
367
+ part: "main",
368
+ subject: [
369
+ id2
370
+ ],
371
+ options: {
372
+ pivotId: document ? fullyQualifiedId(document) : id2
373
+ }
374
+ }));
375
+ }) : void 0
376
+ }),
377
+ linkTooltip(renderLinkTooltip),
378
+ preview()
379
+ ]);
380
+ }
381
+ if (query) {
382
+ extensions.push(autocomplete({
383
+ onSearch: (text) => {
384
+ return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
385
+ label: object.name,
386
+ // TODO(burdon): Factor out URL builder.
387
+ apply: `[${object.name}](/${fullyQualifiedId(object)})`
388
+ } : void 0).filter(isNotFalsy2);
389
+ }
390
+ }));
391
+ }
392
+ if (settings.debug) {
393
+ const items = settings.typewriter?.split(/[,\n]/) ?? "";
394
+ if (items) {
395
+ extensions.push(typewriter({
396
+ items
397
+ }));
398
+ }
399
+ }
400
+ return extensions;
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
+ };
416
+ var style = {
417
+ hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
418
+ icon: "inline-block leading-none mis-1 cursor-pointer"
419
+ };
420
+ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
421
+ const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
422
+ url.startsWith(window.location.origin);
423
+ const options = isInternal ? {
424
+ onClick: () => {
425
+ const qualifiedId = url.split("/").at(-1);
426
+ invariant3(qualifiedId, "Invalid link format.", {
427
+ F: __dxlog_file3,
428
+ L: 281,
429
+ S: void 0,
430
+ A: [
431
+ "qualifiedId",
432
+ "'Invalid link format.'"
433
+ ]
434
+ });
435
+ onSelectObject(qualifiedId);
436
+ }
437
+ } : {
438
+ href: url,
439
+ rel: "noreferrer",
440
+ target: "_blank"
441
+ };
442
+ renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
443
+ ...options,
444
+ className: style.hover
445
+ }, /* @__PURE__ */ React2.createElement(Icon, {
446
+ icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
447
+ size: 4,
448
+ classNames: style.icon
449
+ })));
450
+ };
451
+ var renderLinkTooltip = (el, { url }) => {
452
+ const web = new URL(url);
453
+ renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
454
+ href: url,
455
+ rel: "noreferrer",
456
+ target: "_blank",
457
+ className: style.hover
458
+ }, web.origin, /* @__PURE__ */ React2.createElement(Icon, {
459
+ icon: "ph--arrow-square-out--bold",
460
+ size: 4,
461
+ classNames: style.icon
462
+ })));
463
+ };
464
+ var renderRoot = (root, node) => {
465
+ createRoot(root).render(/* @__PURE__ */ React2.createElement(ThemeProvider, {
466
+ tx: defaultTx
467
+ }, node));
468
+ return root;
469
+ };
470
+
471
+ // packages/plugins/plugin-markdown/src/components/MarkdownContainer.tsx
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({
479
+ document: doc,
480
+ text,
481
+ id,
482
+ settings,
483
+ selectionManager,
484
+ viewMode,
485
+ editorStateStore
486
+ });
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
+ ]);
569
+ return /* @__PURE__ */ React3.createElement(MarkdownEditor, {
570
+ id,
571
+ initialValue: doc.content?.target?.content,
572
+ viewMode,
573
+ toolbar: settings.toolbar,
574
+ customActions,
575
+ inputMode: settings.editorInputMode,
576
+ onFileUpload: handleFileUpload,
577
+ ...props
578
+ });
579
+ } finally {
580
+ _effect.f();
581
+ }
582
+ };
583
+ var MarkdownContainer_default = MarkdownContainer;
584
+ export {
585
+ DocumentEditor,
586
+ MarkdownContainer_default as default
587
+ };
588
+ //# sourceMappingURL=MarkdownContainer-5IEINNQB.mjs.map