@dxos/plugin-markdown 0.8.4-main.c1de068 → 0.8.4-main.f5c0578

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 (195) hide show
  1. package/dist/lib/browser/{MarkdownPreview-S3C7CGAV.mjs → MarkdownCard-IMCR4A4V.mjs} +16 -16
  2. package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownContainer-F3WEEIBX.mjs → MarkdownContainer-VGJPHMVG.mjs} +262 -260
  4. package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-UKJJ7ZNP.mjs → anchor-sort-AJKRIWFD.mjs} +5 -5
  6. package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-ICLAF662.mjs → app-graph-serializer-OIS3MZX2.mjs} +10 -10
  8. package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-IKPZHFTW.mjs +30 -0
  10. package/dist/lib/browser/chunk-IKPZHFTW.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-JHH7VL52.mjs +18 -0
  12. package/dist/lib/browser/chunk-JHH7VL52.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-LFML7LC6.mjs → chunk-JMBQG2ZC.mjs} +8 -9
  14. package/dist/lib/browser/chunk-JMBQG2ZC.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-JTIGSUMB.mjs +80 -0
  16. package/dist/lib/browser/chunk-JTIGSUMB.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-LMJPXTPL.mjs +16 -0
  18. package/dist/lib/browser/chunk-LMJPXTPL.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-LHDCHDBW.mjs → chunk-MVL4K3OD.mjs} +5 -5
  20. package/dist/lib/browser/chunk-MVL4K3OD.mjs.map +7 -0
  21. package/dist/lib/browser/index.mjs +20 -22
  22. package/dist/lib/browser/index.mjs.map +3 -3
  23. package/dist/lib/browser/{intent-resolver-3MXYO3MW.mjs → intent-resolver-BLLHRSTQ.mjs} +14 -18
  24. package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs.map +7 -0
  25. package/dist/lib/browser/meta.json +1 -1
  26. package/dist/lib/browser/{react-surface-C3Z423TV.mjs → react-surface-NL3BZR6H.mjs} +24 -22
  27. package/dist/lib/browser/react-surface-NL3BZR6H.mjs.map +7 -0
  28. package/dist/lib/browser/{settings-KN75ZQY6.mjs → settings-Z7ZV7SLC.mjs} +5 -5
  29. package/dist/lib/browser/settings-Z7ZV7SLC.mjs.map +7 -0
  30. package/dist/lib/browser/{state-LZWTAS65.mjs → state-ORTZIEJU.mjs} +7 -7
  31. package/dist/lib/browser/state-ORTZIEJU.mjs.map +7 -0
  32. package/dist/lib/browser/types/index.mjs +6 -14
  33. package/dist/lib/node-esm/{MarkdownPreview-77UFEWXT.mjs → MarkdownCard-JV2YDV3M.mjs} +16 -16
  34. package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs.map +7 -0
  35. package/dist/lib/node-esm/{MarkdownContainer-VOUHL6IU.mjs → MarkdownContainer-BJRNCXJZ.mjs} +262 -260
  36. package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs.map +7 -0
  37. package/dist/lib/node-esm/{anchor-sort-IPIS5D5B.mjs → anchor-sort-N7WEA5E3.mjs} +5 -5
  38. package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs.map +7 -0
  39. package/dist/lib/node-esm/{app-graph-serializer-FLBXQKKR.mjs → app-graph-serializer-Q3B44VFB.mjs} +10 -10
  40. package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs.map +7 -0
  41. package/dist/lib/node-esm/{chunk-ACFGXH2K.mjs → chunk-AYWAYBAY.mjs} +5 -5
  42. package/dist/lib/node-esm/chunk-AYWAYBAY.mjs.map +7 -0
  43. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs +31 -0
  44. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-H6TITL7A.mjs +20 -0
  46. package/dist/lib/node-esm/chunk-H6TITL7A.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-CWTFQSN7.mjs → chunk-JDMMLOB6.mjs} +8 -9
  48. package/dist/lib/node-esm/chunk-JDMMLOB6.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs +81 -0
  50. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-VIR2ABYE.mjs → chunk-Z4XQ6C3D.mjs} +5 -5
  52. package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs.map +7 -0
  53. package/dist/lib/node-esm/index.mjs +20 -22
  54. package/dist/lib/node-esm/index.mjs.map +3 -3
  55. package/dist/lib/node-esm/{intent-resolver-BZYWV53A.mjs → intent-resolver-NHPUPSWK.mjs} +14 -18
  56. package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs.map +7 -0
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{react-surface-TTTBYNI2.mjs → react-surface-XJ6ODCBE.mjs} +24 -22
  59. package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs.map +7 -0
  60. package/dist/lib/node-esm/{settings-KVP7TVX7.mjs → settings-UCXEWBCT.mjs} +5 -5
  61. package/dist/lib/node-esm/settings-UCXEWBCT.mjs.map +7 -0
  62. package/dist/lib/node-esm/{state-NW3W4JCQ.mjs → state-47WSZG54.mjs} +7 -7
  63. package/dist/lib/node-esm/state-47WSZG54.mjs.map +7 -0
  64. package/dist/lib/node-esm/types/index.mjs +6 -14
  65. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  68. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  70. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/index.d.ts +1 -2
  72. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  76. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
  77. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  78. package/dist/types/src/components/{MarkdownPreview/MarkdownPreview.stories.d.ts → MarkdownCard/MarkdownCard.stories.d.ts} +8 -8
  79. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  80. package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
  81. package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
  82. package/dist/types/src/components/MarkdownContainer.d.ts +5 -5
  83. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  84. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
  86. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  87. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +2 -2
  89. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  90. package/dist/types/src/components/Suggestions.stories.d.ts +2 -2
  91. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/index.d.ts +1 -1
  94. package/dist/types/src/components/index.d.ts.map +1 -1
  95. package/dist/types/src/events.d.ts.map +1 -1
  96. package/dist/types/src/extensions.d.ts +4 -4
  97. package/dist/types/src/extensions.d.ts.map +1 -1
  98. package/dist/types/src/index.d.ts +2 -1
  99. package/dist/types/src/index.d.ts.map +1 -1
  100. package/dist/types/src/meta.d.ts +1 -1
  101. package/dist/types/src/meta.d.ts.map +1 -1
  102. package/dist/types/src/translations.d.ts +2 -2
  103. package/dist/types/src/translations.d.ts.map +1 -1
  104. package/dist/types/src/types/Markdown.d.ts +43 -0
  105. package/dist/types/src/types/Markdown.d.ts.map +1 -0
  106. package/dist/types/src/types/MarkdownAction.d.ts +42 -0
  107. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
  108. package/dist/types/src/types/index.d.ts +2 -1
  109. package/dist/types/src/types/index.d.ts.map +1 -1
  110. package/dist/types/src/types/types.d.ts +3 -59
  111. package/dist/types/src/types/types.d.ts.map +1 -1
  112. package/dist/types/src/util.d.ts +12 -3
  113. package/dist/types/src/util.d.ts.map +1 -1
  114. package/dist/types/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +43 -41
  116. package/src/MarkdownPlugin.tsx +8 -14
  117. package/src/capabilities/anchor-sort.ts +3 -3
  118. package/src/capabilities/app-graph-serializer.ts +6 -4
  119. package/src/capabilities/artifact-definition.ts +15 -12
  120. package/src/capabilities/capabilities.ts +5 -4
  121. package/src/capabilities/index.ts +0 -1
  122. package/src/capabilities/intent-resolver.ts +8 -13
  123. package/src/capabilities/react-surface.tsx +21 -19
  124. package/src/capabilities/settings.ts +3 -3
  125. package/src/capabilities/state.ts +8 -8
  126. package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +30 -32
  127. package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +11 -9
  128. package/src/components/MarkdownCard/index.ts +9 -0
  129. package/src/components/MarkdownContainer.stories.tsx +8 -11
  130. package/src/components/MarkdownContainer.tsx +10 -9
  131. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +2 -1
  132. package/src/components/MarkdownEditor/MarkdownEditor.tsx +9 -8
  133. package/src/components/MarkdownSettings/MarkdownSettings.tsx +4 -4
  134. package/src/components/Suggestions.stories.tsx +16 -16
  135. package/src/components/Toolbar.stories.tsx +4 -5
  136. package/src/components/index.ts +1 -1
  137. package/src/events.ts +2 -2
  138. package/src/extensions.tsx +12 -12
  139. package/src/hooks/useSelectCurrentThread.tsx +3 -3
  140. package/src/index.ts +4 -1
  141. package/src/meta.ts +10 -8
  142. package/src/translations.ts +2 -2
  143. package/src/types/Markdown.ts +55 -0
  144. package/src/types/MarkdownAction.ts +31 -0
  145. package/src/types/index.ts +2 -1
  146. package/src/types/types.ts +5 -50
  147. package/src/util.tsx +20 -6
  148. package/dist/lib/browser/MarkdownContainer-F3WEEIBX.mjs.map +0 -7
  149. package/dist/lib/browser/MarkdownPreview-S3C7CGAV.mjs.map +0 -7
  150. package/dist/lib/browser/anchor-sort-UKJJ7ZNP.mjs.map +0 -7
  151. package/dist/lib/browser/app-graph-serializer-ICLAF662.mjs.map +0 -7
  152. package/dist/lib/browser/artifact-definition-R2YYWOPN.mjs +0 -145
  153. package/dist/lib/browser/artifact-definition-R2YYWOPN.mjs.map +0 -7
  154. package/dist/lib/browser/chunk-777RIED6.mjs +0 -16
  155. package/dist/lib/browser/chunk-777RIED6.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-EPTSAJZM.mjs +0 -22
  157. package/dist/lib/browser/chunk-EPTSAJZM.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-LFML7LC6.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-LHDCHDBW.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-PHTD5DTR.mjs +0 -20
  161. package/dist/lib/browser/chunk-PHTD5DTR.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-UANWRJZU.mjs +0 -79
  163. package/dist/lib/browser/chunk-UANWRJZU.mjs.map +0 -7
  164. package/dist/lib/browser/intent-resolver-3MXYO3MW.mjs.map +0 -7
  165. package/dist/lib/browser/react-surface-C3Z423TV.mjs.map +0 -7
  166. package/dist/lib/browser/settings-KN75ZQY6.mjs.map +0 -7
  167. package/dist/lib/browser/state-LZWTAS65.mjs.map +0 -7
  168. package/dist/lib/node-esm/MarkdownContainer-VOUHL6IU.mjs.map +0 -7
  169. package/dist/lib/node-esm/MarkdownPreview-77UFEWXT.mjs.map +0 -7
  170. package/dist/lib/node-esm/anchor-sort-IPIS5D5B.mjs.map +0 -7
  171. package/dist/lib/node-esm/app-graph-serializer-FLBXQKKR.mjs.map +0 -7
  172. package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs +0 -146
  173. package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-7X6TPTJK.mjs +0 -22
  175. package/dist/lib/node-esm/chunk-7X6TPTJK.mjs.map +0 -7
  176. package/dist/lib/node-esm/chunk-ACFGXH2K.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-CWTFQSN7.mjs.map +0 -7
  178. package/dist/lib/node-esm/chunk-CXG7GMYP.mjs +0 -24
  179. package/dist/lib/node-esm/chunk-CXG7GMYP.mjs.map +0 -7
  180. package/dist/lib/node-esm/chunk-JEEQLO7C.mjs +0 -80
  181. package/dist/lib/node-esm/chunk-JEEQLO7C.mjs.map +0 -7
  182. package/dist/lib/node-esm/chunk-VIR2ABYE.mjs.map +0 -7
  183. package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs.map +0 -7
  184. package/dist/lib/node-esm/react-surface-TTTBYNI2.mjs.map +0 -7
  185. package/dist/lib/node-esm/settings-KVP7TVX7.mjs.map +0 -7
  186. package/dist/lib/node-esm/state-NW3W4JCQ.mjs.map +0 -7
  187. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  188. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  189. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  190. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  191. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  192. package/dist/types/src/types/schema.d.ts +0 -35
  193. package/dist/types/src/types/schema.d.ts.map +0 -1
  194. package/src/components/MarkdownPreview/index.ts +0 -9
  195. package/src/types/schema.ts +0 -39
@@ -1,17 +1,17 @@
1
- import "./chunk-PHTD5DTR.mjs";
1
+ import "./chunk-JHH7VL52.mjs";
2
2
  import {
3
3
  MarkdownCapabilities
4
- } from "./chunk-777RIED6.mjs";
4
+ } from "./chunk-LMJPXTPL.mjs";
5
5
  import {
6
6
  getFallbackName,
7
7
  setFallbackName
8
- } from "./chunk-LFML7LC6.mjs";
8
+ } from "./chunk-JMBQG2ZC.mjs";
9
9
  import {
10
- DocumentType
11
- } from "./chunk-UANWRJZU.mjs";
10
+ Markdown_exports
11
+ } from "./chunk-JTIGSUMB.mjs";
12
12
  import {
13
- MARKDOWN_PLUGIN
14
- } from "./chunk-EPTSAJZM.mjs";
13
+ meta
14
+ } from "./chunk-IKPZHFTW.mjs";
15
15
 
16
16
  // src/components/MarkdownContainer.tsx
17
17
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
@@ -27,37 +27,252 @@ import { toLocalizedString as toLocalizedString2, useTranslation as useTranslati
27
27
  import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
28
28
  import { DataType } from "@dxos/schema";
29
29
 
30
+ // src/extensions.tsx
31
+ import React, { useMemo } from "react";
32
+ import { createRoot } from "react-dom/client";
33
+ import { LayoutAction, createIntent, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
34
+ import { debounceAndThrottle } from "@dxos/async";
35
+ import { invariant } from "@dxos/invariant";
36
+ import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
37
+ import { useIdentity } from "@dxos/react-client/halo";
38
+ import { Icon, ThemeProvider } from "@dxos/react-ui";
39
+ import { Cursor, EditorView, InputModeExtensions, autocomplete, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter } from "@dxos/react-ui-editor";
40
+ import { defaultTx } from "@dxos/react-ui-theme";
41
+ import { isNotFalsy } from "@dxos/util";
42
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
43
+ var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
44
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
45
+ const identity = useIdentity();
46
+ const space = getSpace(document) ?? getSpace(text);
47
+ const baseExtensions = useMemo(() => createBaseExtensions({
48
+ document,
49
+ id,
50
+ text,
51
+ settings,
52
+ selectionManager,
53
+ viewMode,
54
+ previewOptions,
55
+ dispatch
56
+ }), [
57
+ document,
58
+ id,
59
+ text,
60
+ viewMode,
61
+ dispatch,
62
+ previewOptions,
63
+ settings,
64
+ settings.editorInputMode,
65
+ settings.folding,
66
+ settings.numberedHeadings,
67
+ settings.debug,
68
+ settings.typewriter,
69
+ selectionManager
70
+ ]);
71
+ const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
72
+ const pluginExtensions = useMemo(() => {
73
+ if (!document) {
74
+ return [];
75
+ }
76
+ return extensionProviders.flat().reduce((acc, provider) => {
77
+ const extension = typeof provider === "function" ? provider({
78
+ document
79
+ }) : provider;
80
+ if (extension) {
81
+ acc.push(extension);
82
+ }
83
+ return acc;
84
+ }, []);
85
+ }, [
86
+ extensionProviders,
87
+ document
88
+ ]);
89
+ return useMemo(() => [
90
+ // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
91
+ document && createDataExtensions({
92
+ id: document.id,
93
+ text: document.content.target && createDocAccessor(document.content.target, [
94
+ "content"
95
+ ]),
96
+ space,
97
+ identity
98
+ }),
99
+ text && id && createDataExtensions({
100
+ id,
101
+ text: createDocAccessor(text, [
102
+ "content"
103
+ ]),
104
+ space,
105
+ identity
106
+ }),
107
+ selectionState(editorStateStore),
108
+ document && listener({
109
+ onChange: (text2) => setFallbackName(document, text2)
110
+ }),
111
+ baseExtensions,
112
+ pluginExtensions
113
+ ].filter(isNotFalsy), [
114
+ baseExtensions,
115
+ pluginExtensions,
116
+ document,
117
+ document?.content?.target,
118
+ text,
119
+ id,
120
+ space,
121
+ identity
122
+ ]);
123
+ };
124
+ var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
125
+ const extensions = [
126
+ selectionManager && selectionChange(selectionManager),
127
+ settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
128
+ settings.folding && folding()
129
+ ].filter(isNotFalsy);
130
+ if (viewMode !== "source") {
131
+ extensions.push(...[
132
+ formattingKeymap(),
133
+ decorateMarkdown({
134
+ selectionChangeDelay: 100,
135
+ numberedHeadings: settings.numberedHeadings ? {
136
+ from: 2
137
+ } : void 0,
138
+ // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
139
+ renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
140
+ void dispatch(createIntent(LayoutAction.Open, {
141
+ part: "main",
142
+ subject: [
143
+ id2
144
+ ],
145
+ options: {
146
+ pivotId: document ? fullyQualifiedId(document) : id2
147
+ }
148
+ }));
149
+ }) : void 0
150
+ }),
151
+ linkTooltip(renderLinkTooltip),
152
+ preview(previewOptions)
153
+ ]);
154
+ }
155
+ if (query) {
156
+ extensions.push(autocomplete({
157
+ onSearch: (text) => {
158
+ return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
159
+ label: object.name,
160
+ // TODO(burdon): Factor out URL builder.
161
+ apply: `[${object.name}](/${fullyQualifiedId(object)})`
162
+ } : void 0).filter(isNotFalsy);
163
+ }
164
+ }));
165
+ }
166
+ if (settings.debug) {
167
+ const items = settings.typewriter?.split(/[,\n]/) ?? "";
168
+ if (items) {
169
+ extensions.push(typewriter({
170
+ items
171
+ }));
172
+ }
173
+ }
174
+ return extensions;
175
+ };
176
+ var selectionChange = (selectionManager) => {
177
+ return EditorView.updateListener.of(debounceAndThrottle((update) => {
178
+ if (update.selectionSet) {
179
+ const id = update.state.facet(documentId);
180
+ const cursorConverter = update.state.facet(Cursor.converter);
181
+ const selection = update.state.selection;
182
+ const ranges = selection.ranges.map((range) => ({
183
+ from: cursorConverter.toCursor(range.from),
184
+ to: cursorConverter.toCursor(range.to)
185
+ })).filter(({ from, to }) => to > from);
186
+ selectionManager.updateMultiRange(id, ranges);
187
+ }
188
+ }, 100));
189
+ };
190
+ var style = {
191
+ hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
192
+ icon: "inline-block leading-none mis-1 cursor-pointer"
193
+ };
194
+ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
195
+ const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
196
+ url.startsWith(window.location.origin);
197
+ const options = isInternal ? {
198
+ onClick: () => {
199
+ const qualifiedId = url.split("/").at(-1);
200
+ invariant(qualifiedId, "Invalid link format.", {
201
+ F: __dxlog_file,
202
+ L: 291,
203
+ S: void 0,
204
+ A: [
205
+ "qualifiedId",
206
+ "'Invalid link format.'"
207
+ ]
208
+ });
209
+ onSelectObject(qualifiedId);
210
+ }
211
+ } : {
212
+ href: url,
213
+ rel: "noreferrer",
214
+ target: "_blank"
215
+ };
216
+ renderRoot(el, /* @__PURE__ */ React.createElement("a", {
217
+ ...options,
218
+ className: style.hover
219
+ }, /* @__PURE__ */ React.createElement(Icon, {
220
+ icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
221
+ size: 4,
222
+ classNames: style.icon
223
+ })));
224
+ };
225
+ var renderLinkTooltip = (el, { url }) => {
226
+ const web = new URL(url);
227
+ renderRoot(el, /* @__PURE__ */ React.createElement("a", {
228
+ href: url,
229
+ rel: "noreferrer",
230
+ target: "_blank",
231
+ className: style.hover
232
+ }, web.origin, /* @__PURE__ */ React.createElement(Icon, {
233
+ icon: "ph--arrow-square-out--bold",
234
+ size: 4,
235
+ classNames: style.icon
236
+ })));
237
+ };
238
+ var renderRoot = (root, node) => {
239
+ createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
240
+ tx: defaultTx
241
+ }, node));
242
+ return root;
243
+ };
244
+
30
245
  // src/components/MarkdownEditor/MarkdownEditor.tsx
31
246
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
32
- import React, { forwardRef, useMemo as useMemo2, useEffect, useCallback, useImperativeHandle, useRef } from "react";
247
+ import React2, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo as useMemo3, useRef } from "react";
33
248
  import { useDropzone } from "react-dropzone";
34
- import { invariant as invariant2 } from "@dxos/invariant";
249
+ import { invariant as invariant3 } from "@dxos/invariant";
35
250
  import { toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
36
- import { CommandMenu, EditorToolbar, RefPopover, addLink, createElement, coreSlashCommands, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, filterItems, linkSlashCommands, processEditorPayload, stackItemContentEditorClassNames, useEditorToolbarState, useFormattingState, useTextEditor, useCommandMenu } from "@dxos/react-ui-editor";
251
+ import { CommandMenu, EditorToolbar, RefPopover, addLink, coreSlashCommands, createBasicExtensions, createElement, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, filterItems, linkSlashCommands, processEditorPayload, stackItemContentEditorClassNames, useCommandMenu, useEditorToolbarState, useFormattingState, useTextEditor } from "@dxos/react-ui-editor";
37
252
  import { StackItem } from "@dxos/react-ui-stack";
38
- import { isNotFalsy, isNonNullable } from "@dxos/util";
253
+ import { isNonNullable, isNotFalsy as isNotFalsy2 } from "@dxos/util";
39
254
 
40
255
  // src/hooks/useSelectCurrentThread.tsx
41
- import { EditorView } from "@codemirror/view";
256
+ import { EditorView as EditorView2 } from "@codemirror/view";
42
257
  import { Schema } from "effect";
43
- import { useMemo } from "react";
44
- import { createResolver, LayoutAction, useIntentResolver } from "@dxos/app-framework";
45
- import { invariant } from "@dxos/invariant";
46
- import { Cursor, setSelection } from "@dxos/react-ui-editor";
47
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
258
+ import { useMemo as useMemo2 } from "react";
259
+ import { LayoutAction as LayoutAction2, createResolver, useIntentResolver } from "@dxos/app-framework";
260
+ import { invariant as invariant2 } from "@dxos/invariant";
261
+ import { Cursor as Cursor2, setSelection } from "@dxos/react-ui-editor";
262
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
48
263
  var useSelectCurrentThread = (editorView, documentId2) => {
49
- const scrollIntoViewResolver = useMemo(() => createResolver({
50
- intent: LayoutAction.UpdateLayout,
264
+ const scrollIntoViewResolver = useMemo2(() => createResolver({
265
+ intent: LayoutAction2.UpdateLayout,
51
266
  position: "hoist",
52
267
  filter: (data) => {
53
- if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
268
+ if (!Schema.is(LayoutAction2.ScrollIntoView.fields.input)(data)) {
54
269
  return false;
55
270
  }
56
271
  return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
57
272
  },
58
273
  resolve: ({ options: { cursor } }) => {
59
- invariant(editorView, "Editor view is not defined.", {
60
- F: __dxlog_file,
274
+ invariant2(editorView, "Editor view is not defined.", {
275
+ F: __dxlog_file2,
61
276
  L: 32,
62
277
  S: void 0,
63
278
  A: [
@@ -65,14 +280,14 @@ var useSelectCurrentThread = (editorView, documentId2) => {
65
280
  "'Editor view is not defined.'"
66
281
  ]
67
282
  });
68
- const range = Cursor.getRangeFromCursor(editorView.state, cursor);
283
+ const range = Cursor2.getRangeFromCursor(editorView.state, cursor);
69
284
  if (range) {
70
285
  const selection = editorView.state.selection.main.from !== range.from ? {
71
286
  anchor: range.from
72
287
  } : void 0;
73
288
  const effects = [
74
289
  // NOTE: This does not use the DOM scrollIntoView function.
75
- EditorView.scrollIntoView(range.from, {
290
+ EditorView2.scrollIntoView(range.from, {
76
291
  y: "start",
77
292
  yMargin: 96
78
293
  })
@@ -94,11 +309,11 @@ var useSelectCurrentThread = (editorView, documentId2) => {
94
309
  documentId2,
95
310
  editorView
96
311
  ]);
97
- useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);
312
+ useIntentResolver(meta.id, scrollIntoViewResolver);
98
313
  };
99
314
 
100
315
  // src/components/MarkdownEditor/MarkdownEditor.tsx
101
- var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
316
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
102
317
  var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery, ...props }) => {
103
318
  var _effect = _useSignals();
104
319
  try {
@@ -120,7 +335,7 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
120
335
  onLinkQuery,
121
336
  slashCommandGroups
122
337
  ]);
123
- const options = useMemo2(() => {
338
+ const options = useMemo3(() => {
124
339
  const trigger = onLinkQuery ? [
125
340
  "/",
126
341
  "@"
@@ -153,21 +368,21 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
153
368
  getMenu
154
369
  ]);
155
370
  const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu(options);
156
- const extensions = useMemo2(() => [
371
+ const extensions = useMemo3(() => [
157
372
  _extensions,
158
373
  commandMenu
159
- ].filter(isNotFalsy), [
374
+ ].filter(isNotFalsy2), [
160
375
  _extensions,
161
376
  commandMenu
162
377
  ]);
163
- return /* @__PURE__ */ React.createElement(RefPopover, {
378
+ return /* @__PURE__ */ React2.createElement(RefPopover, {
164
379
  modal: false,
165
380
  ...refPopoverProps
166
- }, /* @__PURE__ */ React.createElement(MarkdownEditorImpl, {
381
+ }, /* @__PURE__ */ React2.createElement(MarkdownEditorImpl, {
167
382
  ref: viewRef,
168
383
  ...props,
169
384
  extensions
170
- }), /* @__PURE__ */ React.createElement(CommandMenu, {
385
+ }), /* @__PURE__ */ React2.createElement(CommandMenu, {
171
386
  groups: groupsRef.current,
172
387
  currentItem,
173
388
  onSelect
@@ -179,16 +394,16 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
179
394
  var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
180
395
  var _effect = _useSignals();
181
396
  try {
182
- const { t } = useTranslation(MARKDOWN_PLUGIN);
397
+ const { t } = useTranslation(meta.id);
183
398
  const { themeMode } = useThemeContext();
184
399
  const toolbarState = useEditorToolbarState({
185
400
  viewMode
186
401
  });
187
402
  const formattingObserver = useFormattingState(toolbarState);
188
- const { scrollTo, selection } = useMemo2(() => editorStateStore?.getState(id) ?? {}, [
403
+ const { scrollTo, selection } = useMemo3(() => editorStateStore?.getState(id) ?? {}, [
189
404
  id
190
405
  ]);
191
- const providerExtensions = useMemo2(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
406
+ const providerExtensions = useMemo3(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
192
407
  extensionProviders
193
408
  ]);
194
409
  const handleDrop = async (view, { files }) => {
@@ -208,7 +423,8 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
208
423
  createBasicExtensions({
209
424
  readOnly: viewMode === "readonly",
210
425
  placeholder: t("editor placeholder"),
211
- scrollPastEnd: role === "section" ? false : scrollPastEnd
426
+ scrollPastEnd: role === "section" ? false : scrollPastEnd,
427
+ search: true
212
428
  }),
213
429
  createMarkdownExtensions({
214
430
  themeMode
@@ -224,7 +440,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
224
440
  }),
225
441
  providerExtensions,
226
442
  extensions
227
- ].filter(isNotFalsy),
443
+ ].filter(isNotFalsy2),
228
444
  ...role !== "section" && {
229
445
  id,
230
446
  scrollTo,
@@ -283,9 +499,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
283
499
  onFileUpload
284
500
  ]);
285
501
  const getView = useCallback(() => {
286
- invariant2(editorView, void 0, {
287
- F: __dxlog_file2,
288
- L: 240,
502
+ invariant3(editorView, void 0, {
503
+ F: __dxlog_file3,
504
+ L: 241,
289
505
  S: void 0,
290
506
  A: [
291
507
  "editorView",
@@ -307,9 +523,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
307
523
  }, [
308
524
  onFileUpload
309
525
  ]);
310
- return /* @__PURE__ */ React.createElement(StackItem.Content, {
526
+ return /* @__PURE__ */ React2.createElement(StackItem.Content, {
311
527
  toolbar: !!toolbar
312
- }, toolbar && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(EditorToolbar, {
528
+ }, toolbar && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(EditorToolbar, {
313
529
  attendableId: id,
314
530
  role,
315
531
  state: toolbarState,
@@ -317,7 +533,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
317
533
  getView,
318
534
  image: handleImageUpload,
319
535
  viewMode: handleViewModeChange
320
- }), /* @__PURE__ */ React.createElement("input", getInputProps())), /* @__PURE__ */ React.createElement("div", {
536
+ }), /* @__PURE__ */ React2.createElement("input", getInputProps())), /* @__PURE__ */ React2.createElement("div", {
321
537
  role: "none",
322
538
  ref: parentRef,
323
539
  "data-testid": "composer.markdownRoot",
@@ -341,228 +557,13 @@ var useTest = (view) => {
341
557
  ]);
342
558
  };
343
559
 
344
- // src/extensions.tsx
345
- import React2, { useMemo as useMemo3 } from "react";
346
- import { createRoot } from "react-dom/client";
347
- import { createIntent, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
348
- import { debounceAndThrottle } from "@dxos/async";
349
- import { invariant as invariant3 } from "@dxos/invariant";
350
- import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
351
- import { useIdentity } from "@dxos/react-client/halo";
352
- import { Icon, ThemeProvider } from "@dxos/react-ui";
353
- import { InputModeExtensions, createDataExtensions, autocomplete, decorateMarkdown, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter, EditorView as EditorView2, documentId, Cursor as Cursor2 } from "@dxos/react-ui-editor";
354
- import { defaultTx } from "@dxos/react-ui-theme";
355
- import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
356
- var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
357
- var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
358
- const { dispatchPromise: dispatch } = useIntentDispatcher();
359
- const identity = useIdentity();
360
- const space = getSpace(document) ?? getSpace(text);
361
- const baseExtensions = useMemo3(() => createBaseExtensions({
362
- document,
363
- id,
364
- text,
365
- settings,
366
- selectionManager,
367
- viewMode,
368
- previewOptions,
369
- dispatch
370
- }), [
371
- document,
372
- id,
373
- text,
374
- viewMode,
375
- dispatch,
376
- previewOptions,
377
- settings,
378
- settings.editorInputMode,
379
- settings.folding,
380
- settings.numberedHeadings,
381
- settings.debug,
382
- settings.typewriter,
383
- selectionManager
384
- ]);
385
- const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
386
- const pluginExtensions = useMemo3(() => {
387
- if (!document) {
388
- return [];
389
- }
390
- return extensionProviders.flat().reduce((acc, provider) => {
391
- const extension = typeof provider === "function" ? provider({
392
- document
393
- }) : provider;
394
- if (extension) {
395
- acc.push(extension);
396
- }
397
- return acc;
398
- }, []);
399
- }, [
400
- extensionProviders,
401
- document
402
- ]);
403
- return useMemo3(() => [
404
- // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
405
- document && createDataExtensions({
406
- id: document.id,
407
- text: document.content.target && createDocAccessor(document.content.target, [
408
- "content"
409
- ]),
410
- space,
411
- identity
412
- }),
413
- text && id && createDataExtensions({
414
- id,
415
- text: createDocAccessor(text, [
416
- "content"
417
- ]),
418
- space,
419
- identity
420
- }),
421
- selectionState(editorStateStore),
422
- document && listener({
423
- onChange: (text2) => setFallbackName(document, text2)
424
- }),
425
- baseExtensions,
426
- pluginExtensions
427
- ].filter(isNotFalsy2), [
428
- baseExtensions,
429
- pluginExtensions,
430
- document,
431
- document?.content?.target,
432
- text,
433
- id,
434
- space,
435
- identity
436
- ]);
437
- };
438
- var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
439
- const extensions = [
440
- selectionManager && selectionChange(selectionManager),
441
- settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
442
- settings.folding && folding()
443
- ].filter(isNotFalsy2);
444
- if (viewMode !== "source") {
445
- extensions.push(...[
446
- formattingKeymap(),
447
- decorateMarkdown({
448
- selectionChangeDelay: 100,
449
- numberedHeadings: settings.numberedHeadings ? {
450
- from: 2
451
- } : void 0,
452
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
453
- renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
454
- void dispatch(createIntent(LayoutAction2.Open, {
455
- part: "main",
456
- subject: [
457
- id2
458
- ],
459
- options: {
460
- pivotId: document ? fullyQualifiedId(document) : id2
461
- }
462
- }));
463
- }) : void 0
464
- }),
465
- linkTooltip(renderLinkTooltip),
466
- preview(previewOptions)
467
- ]);
468
- }
469
- if (query) {
470
- extensions.push(autocomplete({
471
- onSearch: (text) => {
472
- return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
473
- label: object.name,
474
- // TODO(burdon): Factor out URL builder.
475
- apply: `[${object.name}](/${fullyQualifiedId(object)})`
476
- } : void 0).filter(isNotFalsy2);
477
- }
478
- }));
479
- }
480
- if (settings.debug) {
481
- const items = settings.typewriter?.split(/[,\n]/) ?? "";
482
- if (items) {
483
- extensions.push(typewriter({
484
- items
485
- }));
486
- }
487
- }
488
- return extensions;
489
- };
490
- var selectionChange = (selectionManager) => {
491
- return EditorView2.updateListener.of(debounceAndThrottle((update) => {
492
- if (update.selectionSet) {
493
- const id = update.state.facet(documentId);
494
- const cursorConverter = update.state.facet(Cursor2.converter);
495
- const selection = update.state.selection;
496
- const ranges = selection.ranges.map((range) => ({
497
- from: cursorConverter.toCursor(range.from),
498
- to: cursorConverter.toCursor(range.to)
499
- })).filter(({ from, to }) => to > from);
500
- selectionManager.updateMultiRange(id, ranges);
501
- }
502
- }, 100));
503
- };
504
- var style = {
505
- hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
506
- icon: "inline-block leading-none mis-1 cursor-pointer"
507
- };
508
- var createLinkRenderer = (onSelectObject) => (el, { url }) => {
509
- const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
510
- url.startsWith(window.location.origin);
511
- const options = isInternal ? {
512
- onClick: () => {
513
- const qualifiedId = url.split("/").at(-1);
514
- invariant3(qualifiedId, "Invalid link format.", {
515
- F: __dxlog_file3,
516
- L: 291,
517
- S: void 0,
518
- A: [
519
- "qualifiedId",
520
- "'Invalid link format.'"
521
- ]
522
- });
523
- onSelectObject(qualifiedId);
524
- }
525
- } : {
526
- href: url,
527
- rel: "noreferrer",
528
- target: "_blank"
529
- };
530
- renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
531
- ...options,
532
- className: style.hover
533
- }, /* @__PURE__ */ React2.createElement(Icon, {
534
- icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
535
- size: 4,
536
- classNames: style.icon
537
- })));
538
- };
539
- var renderLinkTooltip = (el, { url }) => {
540
- const web = new URL(url);
541
- renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
542
- href: url,
543
- rel: "noreferrer",
544
- target: "_blank",
545
- className: style.hover
546
- }, web.origin, /* @__PURE__ */ React2.createElement(Icon, {
547
- icon: "ph--arrow-square-out--bold",
548
- size: 4,
549
- classNames: style.icon
550
- })));
551
- };
552
- var renderRoot = (root, node) => {
553
- createRoot(root).render(/* @__PURE__ */ React2.createElement(ThemeProvider, {
554
- tx: defaultTx
555
- }, node));
556
- return root;
557
- };
558
-
559
560
  // src/components/MarkdownContainer.tsx
560
561
  var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
561
562
  var _effect = _useSignals2();
562
563
  try {
563
564
  const { t } = useTranslation2();
564
565
  const scrollPastEnd = role === "article";
565
- const doc = Obj.instanceOf(DocumentType, object) ? object : void 0;
566
+ const doc = Obj.instanceOf(Markdown_exports.Document, object) ? object : void 0;
566
567
  const text = Obj.instanceOf(DataType.Text, object) ? object : void 0;
567
568
  const [previewBlocks, setPreviewBlocks] = useState([]);
568
569
  const previewOptions = useMemo4(() => ({
@@ -773,6 +774,7 @@ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
773
774
  var MarkdownContainer_default = MarkdownContainer;
774
775
  export {
775
776
  DocumentEditor,
777
+ MarkdownContainer,
776
778
  MarkdownContainer_default as default
777
779
  };
778
- //# sourceMappingURL=MarkdownContainer-F3WEEIBX.mjs.map
780
+ //# sourceMappingURL=MarkdownContainer-VGJPHMVG.mjs.map