@dxos/plugin-markdown 0.8.3 → 0.8.4-main.f9ba587

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 (139) hide show
  1. package/dist/lib/browser/{MarkdownContainer-EFWQ6DHD.mjs → MarkdownContainer-BO5MZWA4.mjs} +19 -18
  2. package/dist/lib/browser/{MarkdownContainer-EFWQ6DHD.mjs.map → MarkdownContainer-BO5MZWA4.mjs.map} +3 -3
  3. package/dist/lib/browser/{MarkdownPreview-F4PYFW5L.mjs → MarkdownPreview-XYP2VXI2.mjs} +7 -7
  4. package/dist/lib/browser/{MarkdownPreview-F4PYFW5L.mjs.map → MarkdownPreview-XYP2VXI2.mjs.map} +3 -3
  5. package/dist/lib/browser/{anchor-sort-BMAN2ABT.mjs → anchor-sort-UKJJ7ZNP.mjs} +4 -4
  6. package/dist/lib/browser/{app-graph-serializer-EI6TEHRQ.mjs → app-graph-serializer-7DKUUZSJ.mjs} +9 -9
  7. package/dist/lib/browser/app-graph-serializer-7DKUUZSJ.mjs.map +7 -0
  8. package/dist/lib/browser/{artifact-definition-FQ2R6KPT.mjs → artifact-definition-JSUG6XPF.mjs} +5 -5
  9. package/dist/lib/browser/{chunk-D767LUGU.mjs → chunk-5JRBJCZM.mjs} +9 -10
  10. package/dist/lib/browser/chunk-5JRBJCZM.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QVJETNGS.mjs → chunk-777RIED6.mjs} +3 -3
  12. package/dist/lib/browser/{chunk-JX6XNEHE.mjs → chunk-EPTSAJZM.mjs} +2 -2
  13. package/dist/lib/browser/chunk-IZLATPXQ.mjs +20 -0
  14. package/dist/lib/browser/{chunk-LXSRQPEP.mjs → chunk-LFML7LC6.mjs} +3 -3
  15. package/dist/lib/browser/{chunk-N2D26K6W.mjs → chunk-UANWRJZU.mjs} +5 -5
  16. package/dist/lib/browser/chunk-UANWRJZU.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +10 -10
  18. package/dist/lib/browser/index.mjs.map +1 -1
  19. package/dist/lib/browser/{intent-resolver-6ZOABX2J.mjs → intent-resolver-3MXYO3MW.mjs} +5 -5
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-surface-4B5ELMEW.mjs → react-surface-NAXBGUR3.mjs} +11 -11
  22. package/dist/lib/browser/{settings-PLH54VC7.mjs → settings-KN75ZQY6.mjs} +4 -4
  23. package/dist/lib/browser/{state-KI6PJ6DT.mjs → state-LZWTAS65.mjs} +4 -4
  24. package/dist/lib/browser/types/index.mjs +2 -2
  25. package/dist/lib/node-esm/{MarkdownContainer-O3SGMH4G.mjs → MarkdownContainer-J2NVCX2H.mjs} +19 -18
  26. package/dist/lib/node-esm/{MarkdownContainer-O3SGMH4G.mjs.map → MarkdownContainer-J2NVCX2H.mjs.map} +3 -3
  27. package/dist/lib/node-esm/{MarkdownPreview-KFDRV4GC.mjs → MarkdownPreview-JEXD3KSQ.mjs} +7 -7
  28. package/dist/lib/node-esm/{MarkdownPreview-KFDRV4GC.mjs.map → MarkdownPreview-JEXD3KSQ.mjs.map} +3 -3
  29. package/dist/lib/node-esm/{anchor-sort-BXL7BE67.mjs → anchor-sort-IPIS5D5B.mjs} +4 -4
  30. package/dist/lib/node-esm/{app-graph-serializer-F7DGNF3G.mjs → app-graph-serializer-YRMRPW7A.mjs} +9 -9
  31. package/dist/lib/node-esm/app-graph-serializer-YRMRPW7A.mjs.map +7 -0
  32. package/dist/lib/node-esm/{artifact-definition-NQOHB6S5.mjs → artifact-definition-6C2MOHGP.mjs} +5 -5
  33. package/dist/lib/node-esm/{chunk-JXXDCSMW.mjs → chunk-ACFGXH2K.mjs} +3 -3
  34. package/dist/lib/node-esm/{chunk-K26TX5V4.mjs → chunk-CWTFQSN7.mjs} +3 -3
  35. package/dist/lib/node-esm/{chunk-RX63ZNML.mjs → chunk-CXG7GMYP.mjs} +2 -2
  36. package/dist/lib/node-esm/chunk-FWKOJW6J.mjs +22 -0
  37. package/dist/lib/node-esm/{chunk-T2Y2BT53.mjs → chunk-JEEQLO7C.mjs} +5 -5
  38. package/dist/lib/{browser/chunk-N2D26K6W.mjs.map → node-esm/chunk-JEEQLO7C.mjs.map} +2 -2
  39. package/dist/lib/node-esm/{chunk-BWDDFDJY.mjs → chunk-Q5DIKLN5.mjs} +9 -10
  40. package/dist/lib/node-esm/chunk-Q5DIKLN5.mjs.map +7 -0
  41. package/dist/lib/node-esm/index.mjs +10 -10
  42. package/dist/lib/node-esm/index.mjs.map +1 -1
  43. package/dist/lib/node-esm/{intent-resolver-CLMSVF2K.mjs → intent-resolver-BZYWV53A.mjs} +5 -5
  44. package/dist/lib/node-esm/meta.json +1 -1
  45. package/dist/lib/node-esm/{react-surface-YHFOQTVO.mjs → react-surface-BSAGEIN6.mjs} +11 -11
  46. package/dist/lib/node-esm/{settings-SIY33P3F.mjs → settings-KVP7TVX7.mjs} +4 -4
  47. package/dist/lib/node-esm/{state-LLGVRYKL.mjs → state-NW3W4JCQ.mjs} +4 -4
  48. package/dist/lib/node-esm/types/index.mjs +2 -2
  49. package/dist/types/src/components/MarkdownContainer.stories.d.ts +1 -1
  50. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  51. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +1 -1
  52. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +1 -1
  54. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  55. package/dist/types/src/components/Suggestions.stories.d.ts +1 -1
  56. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/Toolbar.stories.d.ts +1 -1
  58. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  59. package/dist/types/src/extensions.d.ts.map +1 -1
  60. package/dist/types/src/translations.d.ts +33 -80
  61. package/dist/types/src/translations.d.ts.map +1 -1
  62. package/dist/types/src/types/schema.d.ts +2 -2
  63. package/dist/types/src/types/types.d.ts +4 -3
  64. package/dist/types/src/types/types.d.ts.map +1 -1
  65. package/dist/types/tsconfig.tsbuildinfo +1 -1
  66. package/package.json +43 -45
  67. package/src/MarkdownPlugin.tsx +1 -1
  68. package/src/capabilities/app-graph-serializer.ts +3 -3
  69. package/src/components/MarkdownContainer.stories.tsx +2 -2
  70. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +2 -2
  71. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +2 -2
  72. package/src/components/MarkdownPreview/MarkdownPreview.tsx +2 -2
  73. package/src/components/Suggestions.stories.tsx +2 -2
  74. package/src/components/Toolbar.stories.tsx +1 -1
  75. package/src/extensions.tsx +18 -14
  76. package/src/translations.ts +6 -6
  77. package/src/types/types.ts +2 -2
  78. package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +0 -7
  79. package/dist/lib/browser/chunk-354IBM5X.mjs +0 -20
  80. package/dist/lib/browser/chunk-D767LUGU.mjs.map +0 -7
  81. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs +0 -783
  82. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +0 -7
  83. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs +0 -103
  84. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs.map +0 -7
  85. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs +0 -48
  86. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs.map +0 -7
  87. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs +0 -65
  88. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +0 -7
  89. package/dist/lib/node/artifact-definition-U27MH5SC.cjs +0 -158
  90. package/dist/lib/node/artifact-definition-U27MH5SC.cjs.map +0 -7
  91. package/dist/lib/node/chunk-3HHV4MM6.cjs +0 -101
  92. package/dist/lib/node/chunk-3HHV4MM6.cjs.map +0 -7
  93. package/dist/lib/node/chunk-CJLYFGPI.cjs +0 -74
  94. package/dist/lib/node/chunk-CJLYFGPI.cjs.map +0 -7
  95. package/dist/lib/node/chunk-FU3XZZCO.cjs +0 -58
  96. package/dist/lib/node/chunk-FU3XZZCO.cjs.map +0 -7
  97. package/dist/lib/node/chunk-IFYSBQE5.cjs +0 -35
  98. package/dist/lib/node/chunk-IFYSBQE5.cjs.map +0 -7
  99. package/dist/lib/node/chunk-LQAC5HL7.cjs +0 -68
  100. package/dist/lib/node/chunk-LQAC5HL7.cjs.map +0 -7
  101. package/dist/lib/node/chunk-ZU5OIHCY.cjs +0 -45
  102. package/dist/lib/node/chunk-ZU5OIHCY.cjs.map +0 -7
  103. package/dist/lib/node/index.cjs +0 -165
  104. package/dist/lib/node/index.cjs.map +0 -7
  105. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs +0 -77
  106. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs.map +0 -7
  107. package/dist/lib/node/meta.json +0 -1
  108. package/dist/lib/node/react-surface-456HQ4KZ.cjs +0 -218
  109. package/dist/lib/node/react-surface-456HQ4KZ.cjs.map +0 -7
  110. package/dist/lib/node/settings-E3NUTXJ4.cjs +0 -42
  111. package/dist/lib/node/settings-E3NUTXJ4.cjs.map +0 -7
  112. package/dist/lib/node/state-KKDRAG7X.cjs +0 -51
  113. package/dist/lib/node/state-KKDRAG7X.cjs.map +0 -7
  114. package/dist/lib/node/types/index.cjs +0 -40
  115. package/dist/lib/node/types/index.cjs.map +0 -7
  116. package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +0 -7
  117. package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +0 -7
  118. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs.map +0 -7
  119. package/dist/lib/node-esm/chunk-YOABAQ7A.mjs +0 -22
  120. /package/dist/lib/browser/{anchor-sort-BMAN2ABT.mjs.map → anchor-sort-UKJJ7ZNP.mjs.map} +0 -0
  121. /package/dist/lib/browser/{artifact-definition-FQ2R6KPT.mjs.map → artifact-definition-JSUG6XPF.mjs.map} +0 -0
  122. /package/dist/lib/browser/{chunk-QVJETNGS.mjs.map → chunk-777RIED6.mjs.map} +0 -0
  123. /package/dist/lib/browser/{chunk-JX6XNEHE.mjs.map → chunk-EPTSAJZM.mjs.map} +0 -0
  124. /package/dist/lib/browser/{chunk-354IBM5X.mjs.map → chunk-IZLATPXQ.mjs.map} +0 -0
  125. /package/dist/lib/browser/{chunk-LXSRQPEP.mjs.map → chunk-LFML7LC6.mjs.map} +0 -0
  126. /package/dist/lib/browser/{intent-resolver-6ZOABX2J.mjs.map → intent-resolver-3MXYO3MW.mjs.map} +0 -0
  127. /package/dist/lib/browser/{react-surface-4B5ELMEW.mjs.map → react-surface-NAXBGUR3.mjs.map} +0 -0
  128. /package/dist/lib/browser/{settings-PLH54VC7.mjs.map → settings-KN75ZQY6.mjs.map} +0 -0
  129. /package/dist/lib/browser/{state-KI6PJ6DT.mjs.map → state-LZWTAS65.mjs.map} +0 -0
  130. /package/dist/lib/node-esm/{anchor-sort-BXL7BE67.mjs.map → anchor-sort-IPIS5D5B.mjs.map} +0 -0
  131. /package/dist/lib/node-esm/{artifact-definition-NQOHB6S5.mjs.map → artifact-definition-6C2MOHGP.mjs.map} +0 -0
  132. /package/dist/lib/node-esm/{chunk-JXXDCSMW.mjs.map → chunk-ACFGXH2K.mjs.map} +0 -0
  133. /package/dist/lib/node-esm/{chunk-K26TX5V4.mjs.map → chunk-CWTFQSN7.mjs.map} +0 -0
  134. /package/dist/lib/node-esm/{chunk-RX63ZNML.mjs.map → chunk-CXG7GMYP.mjs.map} +0 -0
  135. /package/dist/lib/node-esm/{chunk-YOABAQ7A.mjs.map → chunk-FWKOJW6J.mjs.map} +0 -0
  136. /package/dist/lib/node-esm/{intent-resolver-CLMSVF2K.mjs.map → intent-resolver-BZYWV53A.mjs.map} +0 -0
  137. /package/dist/lib/node-esm/{react-surface-YHFOQTVO.mjs.map → react-surface-BSAGEIN6.mjs.map} +0 -0
  138. /package/dist/lib/node-esm/{settings-SIY33P3F.mjs.map → settings-KVP7TVX7.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{state-LLGVRYKL.mjs.map → state-NW3W4JCQ.mjs.map} +0 -0
@@ -1,783 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var MarkdownContainer_KYGUEZIL_exports = {};
30
- __export(MarkdownContainer_KYGUEZIL_exports, {
31
- DocumentEditor: () => DocumentEditor,
32
- default: () => MarkdownContainer_default
33
- });
34
- module.exports = __toCommonJS(MarkdownContainer_KYGUEZIL_exports);
35
- var import_chunk_FU3XZZCO = require("./chunk-FU3XZZCO.cjs");
36
- var import_chunk_IFYSBQE5 = require("./chunk-IFYSBQE5.cjs");
37
- var import_chunk_CJLYFGPI = require("./chunk-CJLYFGPI.cjs");
38
- var import_chunk_3HHV4MM6 = require("./chunk-3HHV4MM6.cjs");
39
- var import_chunk_ZU5OIHCY = require("./chunk-ZU5OIHCY.cjs");
40
- var import_tracking = require("@preact-signals/safe-react/tracking");
41
- var import_rx_react = require("@effect-rx/rx-react");
42
- var import_react = __toESM(require("react"));
43
- var import_react_dom = require("react-dom");
44
- var import_app_framework = require("@dxos/app-framework");
45
- var import_echo = require("@dxos/echo");
46
- var import_plugin_space = require("@dxos/plugin-space");
47
- var import_echo2 = require("@dxos/react-client/echo");
48
- var import_react_ui = require("@dxos/react-ui");
49
- var import_react_ui_editor = require("@dxos/react-ui-editor");
50
- var import_schema = require("@dxos/schema");
51
- var import_tracking2 = require("@preact-signals/safe-react/tracking");
52
- var import_react2 = __toESM(require("react"));
53
- var import_react_dropzone = require("react-dropzone");
54
- var import_invariant = require("@dxos/invariant");
55
- var import_react_ui2 = require("@dxos/react-ui");
56
- var import_react_ui_editor2 = require("@dxos/react-ui-editor");
57
- var import_react_ui_stack = require("@dxos/react-ui-stack");
58
- var import_util = require("@dxos/util");
59
- var import_view = require("@codemirror/view");
60
- var import_effect = require("effect");
61
- var import_react3 = require("react");
62
- var import_app_framework2 = require("@dxos/app-framework");
63
- var import_invariant2 = require("@dxos/invariant");
64
- var import_react_ui_editor3 = require("@dxos/react-ui-editor");
65
- var import_react4 = __toESM(require("react"));
66
- var import_client = require("react-dom/client");
67
- var import_app_framework3 = require("@dxos/app-framework");
68
- var import_invariant3 = require("@dxos/invariant");
69
- var import_echo3 = require("@dxos/react-client/echo");
70
- var import_halo = require("@dxos/react-client/halo");
71
- var import_react_ui3 = require("@dxos/react-ui");
72
- var import_react_ui_editor4 = require("@dxos/react-ui-editor");
73
- var import_react_ui_theme = require("@dxos/react-ui-theme");
74
- var import_util2 = require("@dxos/util");
75
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
76
- var useSelectCurrentThread = (editorView, documentId2) => {
77
- const scrollIntoViewResolver = (0, import_react3.useMemo)(() => (0, import_app_framework2.createResolver)({
78
- intent: import_app_framework2.LayoutAction.UpdateLayout,
79
- position: "hoist",
80
- filter: (data) => {
81
- if (!import_effect.Schema.is(import_app_framework2.LayoutAction.ScrollIntoView.fields.input)(data)) {
82
- return false;
83
- }
84
- return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
85
- },
86
- resolve: ({ options: { cursor } }) => {
87
- (0, import_invariant2.invariant)(editorView, "Editor view is not defined.", {
88
- F: __dxlog_file,
89
- L: 32,
90
- S: void 0,
91
- A: [
92
- "editorView",
93
- "'Editor view is not defined.'"
94
- ]
95
- });
96
- const range = import_react_ui_editor3.Cursor.getRangeFromCursor(editorView.state, cursor);
97
- if (range) {
98
- const selection = editorView.state.selection.main.from !== range.from ? {
99
- anchor: range.from
100
- } : void 0;
101
- const effects = [
102
- // NOTE: This does not use the DOM scrollIntoView function.
103
- import_view.EditorView.scrollIntoView(range.from, {
104
- y: "start",
105
- yMargin: 96
106
- })
107
- ];
108
- if (selection) {
109
- effects.push(import_react_ui_editor3.setSelection.of({
110
- current: documentId2
111
- }));
112
- }
113
- editorView.dispatch({
114
- effects,
115
- selection: selection ? {
116
- anchor: range.from
117
- } : void 0
118
- });
119
- }
120
- }
121
- }), [
122
- documentId2,
123
- editorView
124
- ]);
125
- (0, import_app_framework2.useIntentResolver)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN, scrollIntoViewResolver);
126
- };
127
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
128
- var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery, ...props }) => {
129
- var _effect = (0, import_tracking2.useSignals)();
130
- try {
131
- const { t } = (0, import_react_ui2.useTranslation)();
132
- const viewRef = (0, import_react2.useRef)();
133
- const getMenu = (0, import_react2.useCallback)((trigger, query) => {
134
- switch (trigger) {
135
- case "@":
136
- return onLinkQuery?.(query) ?? [];
137
- case "/":
138
- default:
139
- return (0, import_react_ui_editor2.filterItems)([
140
- import_react_ui_editor2.coreSlashCommands,
141
- import_react_ui_editor2.linkSlashCommands,
142
- ...slashCommandGroups ?? []
143
- ], (item) => query ? (0, import_react_ui2.toLocalizedString)(item.label, t).toLowerCase().includes(query.toLowerCase()) : true);
144
- }
145
- }, [
146
- onLinkQuery,
147
- slashCommandGroups
148
- ]);
149
- const options = (0, import_react2.useMemo)(() => {
150
- const trigger = onLinkQuery ? [
151
- "/",
152
- "@"
153
- ] : [
154
- "/"
155
- ];
156
- return {
157
- viewRef,
158
- trigger,
159
- placeholder: {
160
- delay: 3e3,
161
- content: () => {
162
- return (0, import_react_ui_editor2.createElement)("div", void 0, [
163
- (0, import_react_ui_editor2.createElement)("span", {
164
- text: "Press"
165
- }),
166
- ...trigger.map((text) => (0, import_react_ui_editor2.createElement)("span", {
167
- className: "border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]",
168
- text
169
- })),
170
- (0, import_react_ui_editor2.createElement)("span", {
171
- text: "for commands."
172
- })
173
- ]);
174
- }
175
- },
176
- getMenu
177
- };
178
- }, [
179
- getMenu
180
- ]);
181
- const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = (0, import_react_ui_editor2.useCommandMenu)(options);
182
- const extensions = (0, import_react2.useMemo)(() => [
183
- _extensions,
184
- commandMenu
185
- ].filter(import_util.isNotFalsy), [
186
- _extensions,
187
- commandMenu
188
- ]);
189
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.RefPopover, {
190
- modal: false,
191
- ...refPopoverProps
192
- }, /* @__PURE__ */ import_react2.default.createElement(MarkdownEditorImpl, {
193
- ref: viewRef,
194
- ...props,
195
- extensions
196
- }), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.CommandMenu, {
197
- groups: groupsRef.current,
198
- currentItem,
199
- onSelect
200
- }));
201
- } finally {
202
- _effect.f();
203
- }
204
- };
205
- var MarkdownEditorImpl = /* @__PURE__ */ (0, import_react2.forwardRef)(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
206
- var _effect = (0, import_tracking2.useSignals)();
207
- try {
208
- const { t } = (0, import_react_ui2.useTranslation)(import_chunk_ZU5OIHCY.MARKDOWN_PLUGIN);
209
- const { themeMode } = (0, import_react_ui2.useThemeContext)();
210
- const toolbarState = (0, import_react_ui_editor2.useEditorToolbarState)({
211
- viewMode
212
- });
213
- const formattingObserver = (0, import_react_ui_editor2.useFormattingState)(toolbarState);
214
- const { scrollTo, selection } = (0, import_react2.useMemo)(() => editorStateStore?.getState(id) ?? {}, [
215
- id
216
- ]);
217
- const providerExtensions = (0, import_react2.useMemo)(() => extensionProviders?.flatMap((provider) => provider({})).filter(import_util.isNonNullable), [
218
- extensionProviders
219
- ]);
220
- const handleDrop = async (view, { files }) => {
221
- const file = files[0];
222
- const info = file && onFileUpload ? await onFileUpload(file) : void 0;
223
- if (info) {
224
- (0, import_react_ui_editor2.processEditorPayload)(view, {
225
- type: "image",
226
- data: info.url
227
- });
228
- }
229
- };
230
- const { parentRef, view: editorView, focusAttributes } = (0, import_react_ui_editor2.useTextEditor)(() => ({
231
- initialValue,
232
- extensions: [
233
- formattingObserver,
234
- (0, import_react_ui_editor2.createBasicExtensions)({
235
- readOnly: viewMode === "readonly",
236
- placeholder: t("editor placeholder"),
237
- scrollPastEnd: role === "section" ? false : scrollPastEnd
238
- }),
239
- (0, import_react_ui_editor2.createMarkdownExtensions)({
240
- themeMode
241
- }),
242
- (0, import_react_ui_editor2.createThemeExtensions)({
243
- themeMode,
244
- syntaxHighlighting: true,
245
- slots: import_react_ui_editor2.editorSlots
246
- }),
247
- import_react_ui_editor2.editorGutter,
248
- role !== "section" && onFileUpload && (0, import_react_ui_editor2.dropFile)({
249
- onDrop: handleDrop
250
- }),
251
- providerExtensions,
252
- extensions
253
- ].filter(import_util.isNotFalsy),
254
- ...role !== "section" && {
255
- id,
256
- scrollTo,
257
- selection,
258
- // TODO(wittjosiah): Autofocus based on layout is racy.
259
- // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
260
- moveToEndOfLine: true
261
- }
262
- }), [
263
- id,
264
- formattingObserver,
265
- viewMode,
266
- themeMode,
267
- extensions,
268
- providerExtensions
269
- ]);
270
- (0, import_react2.useImperativeHandle)(forwardedRef, () => editorView, [
271
- editorView
272
- ]);
273
- useTest(editorView);
274
- useSelectCurrentThread(editorView, id);
275
- const { acceptedFiles, getInputProps, open } = (0, import_react_dropzone.useDropzone)({
276
- multiple: false,
277
- noDrag: true,
278
- accept: {
279
- "image/*": [
280
- ".jpg",
281
- ".jpeg",
282
- ".png",
283
- ".gif"
284
- ]
285
- }
286
- });
287
- (0, import_react2.useEffect)(() => {
288
- if (editorView && onFileUpload && acceptedFiles.length) {
289
- requestAnimationFrame(async () => {
290
- const f = acceptedFiles[0];
291
- const file = new File([
292
- f
293
- ], f.name, {
294
- type: f.type,
295
- lastModified: f.lastModified
296
- });
297
- const info = await onFileUpload(file);
298
- if (info) {
299
- (0, import_react_ui_editor2.addLink)({
300
- url: info.url,
301
- image: true
302
- })(editorView);
303
- }
304
- });
305
- }
306
- }, [
307
- acceptedFiles,
308
- editorView,
309
- onFileUpload
310
- ]);
311
- const getView = (0, import_react2.useCallback)(() => {
312
- (0, import_invariant.invariant)(editorView, void 0, {
313
- F: __dxlog_file2,
314
- L: 240,
315
- S: void 0,
316
- A: [
317
- "editorView",
318
- ""
319
- ]
320
- });
321
- return editorView;
322
- }, [
323
- editorView
324
- ]);
325
- const handleViewModeChange = (0, import_react2.useCallback)((mode) => onViewModeChange?.(id, mode), [
326
- id,
327
- onViewModeChange
328
- ]);
329
- const handleImageUpload = (0, import_react2.useCallback)(() => {
330
- if (onFileUpload) {
331
- open();
332
- }
333
- }, [
334
- onFileUpload
335
- ]);
336
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_stack.StackItem.Content, {
337
- toolbar: !!toolbar
338
- }, toolbar && /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_editor2.EditorToolbar, {
339
- attendableId: id,
340
- role,
341
- state: toolbarState,
342
- customActions,
343
- getView,
344
- image: handleImageUpload,
345
- viewMode: handleViewModeChange
346
- }), /* @__PURE__ */ import_react2.default.createElement("input", getInputProps())), /* @__PURE__ */ import_react2.default.createElement("div", {
347
- role: "none",
348
- ref: parentRef,
349
- "data-testid": "composer.markdownRoot",
350
- "data-toolbar": toolbar ? "enabled" : "disabled",
351
- className: (0, import_react_ui_editor2.stackItemContentEditorClassNames)(role),
352
- "data-popover-collision-boundary": true,
353
- ...focusAttributes
354
- }));
355
- } finally {
356
- _effect.f();
357
- }
358
- });
359
- var useTest = (view) => {
360
- (0, import_react2.useEffect)(() => {
361
- const composer = window.composer;
362
- if (composer) {
363
- composer.editorView = view;
364
- }
365
- }, [
366
- view
367
- ]);
368
- };
369
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
370
- var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
371
- const { dispatchPromise: dispatch } = (0, import_app_framework3.useIntentDispatcher)();
372
- const identity = (0, import_halo.useIdentity)();
373
- const space = (0, import_echo3.getSpace)(document) ?? (0, import_echo3.getSpace)(text);
374
- const baseExtensions = (0, import_react4.useMemo)(() => createBaseExtensions({
375
- document,
376
- id,
377
- text,
378
- settings,
379
- selectionManager,
380
- viewMode,
381
- previewOptions,
382
- dispatch
383
- }), [
384
- document,
385
- id,
386
- text,
387
- viewMode,
388
- dispatch,
389
- previewOptions,
390
- settings,
391
- settings.editorInputMode,
392
- settings.folding,
393
- settings.numberedHeadings,
394
- settings.debug,
395
- settings.typewriter,
396
- selectionManager
397
- ]);
398
- const extensionProviders = (0, import_app_framework3.useCapabilities)(import_chunk_IFYSBQE5.MarkdownCapabilities.Extensions);
399
- const pluginExtensions = (0, import_react4.useMemo)(() => {
400
- if (!document) {
401
- return [];
402
- }
403
- return extensionProviders.flat().reduce((acc, provider) => {
404
- const extension = typeof provider === "function" ? provider({
405
- document
406
- }) : provider;
407
- if (extension) {
408
- acc.push(extension);
409
- }
410
- return acc;
411
- }, []);
412
- }, [
413
- extensionProviders,
414
- document
415
- ]);
416
- return (0, import_react4.useMemo)(() => [
417
- // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
418
- document && (0, import_react_ui_editor4.createDataExtensions)({
419
- id: document.id,
420
- text: document.content.target && (0, import_echo3.createDocAccessor)(document.content.target, [
421
- "content"
422
- ]),
423
- space,
424
- identity
425
- }),
426
- text && id && (0, import_react_ui_editor4.createDataExtensions)({
427
- id,
428
- text: (0, import_echo3.createDocAccessor)(text, [
429
- "content"
430
- ]),
431
- space,
432
- identity
433
- }),
434
- (0, import_react_ui_editor4.selectionState)(editorStateStore),
435
- document && (0, import_react_ui_editor4.listener)({
436
- onChange: (text2) => (0, import_chunk_CJLYFGPI.setFallbackName)(document, text2)
437
- }),
438
- baseExtensions,
439
- pluginExtensions
440
- ].filter(import_util2.isNotFalsy), [
441
- baseExtensions,
442
- pluginExtensions,
443
- document,
444
- document?.content?.target,
445
- text,
446
- id,
447
- space,
448
- identity
449
- ]);
450
- };
451
- var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
452
- const extensions = [
453
- selectionManager && selectionChange(selectionManager),
454
- settings.editorInputMode && import_react_ui_editor4.InputModeExtensions[settings.editorInputMode],
455
- settings.folding && (0, import_react_ui_editor4.folding)()
456
- ].filter(import_util2.isNotFalsy);
457
- if (viewMode !== "source") {
458
- extensions.push(...[
459
- (0, import_react_ui_editor4.formattingKeymap)(),
460
- (0, import_react_ui_editor4.decorateMarkdown)({
461
- selectionChangeDelay: 100,
462
- numberedHeadings: settings.numberedHeadings ? {
463
- from: 2
464
- } : void 0,
465
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
466
- renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
467
- void dispatch((0, import_app_framework3.createIntent)(import_app_framework3.LayoutAction.Open, {
468
- part: "main",
469
- subject: [
470
- id2
471
- ],
472
- options: {
473
- pivotId: document ? (0, import_echo3.fullyQualifiedId)(document) : id2
474
- }
475
- }));
476
- }) : void 0
477
- }),
478
- (0, import_react_ui_editor4.linkTooltip)(renderLinkTooltip),
479
- (0, import_react_ui_editor4.preview)(previewOptions)
480
- ]);
481
- }
482
- if (query) {
483
- extensions.push((0, import_react_ui_editor4.autocomplete)({
484
- onSearch: (text) => {
485
- return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
486
- label: object.name,
487
- // TODO(burdon): Factor out URL builder.
488
- apply: `[${object.name}](/${(0, import_echo3.fullyQualifiedId)(object)})`
489
- } : void 0).filter(import_util2.isNotFalsy);
490
- }
491
- }));
492
- }
493
- if (settings.debug) {
494
- const items = settings.typewriter?.split(/[,\n]/) ?? "";
495
- if (items) {
496
- extensions.push((0, import_react_ui_editor4.typewriter)({
497
- items
498
- }));
499
- }
500
- }
501
- return extensions;
502
- };
503
- var selectionChange = (selectionManager) => {
504
- return import_react_ui_editor4.EditorView.updateListener.of((update) => {
505
- if (update.selectionSet) {
506
- const id = update.state.facet(import_react_ui_editor4.documentId);
507
- const cursorConverter = update.state.facet(import_react_ui_editor4.Cursor.converter);
508
- const selection = update.state.selection;
509
- const ranges = selection.ranges.map((range) => ({
510
- from: cursorConverter.toCursor(range.from),
511
- to: cursorConverter.toCursor(range.to)
512
- })).filter(({ from, to }) => to > from);
513
- selectionManager.updateMultiRange(id, ranges);
514
- }
515
- });
516
- };
517
- var style = {
518
- hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
519
- icon: "inline-block leading-none mis-1 cursor-pointer"
520
- };
521
- var createLinkRenderer = (onSelectObject) => (el, { url }) => {
522
- const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
523
- url.startsWith(window.location.origin);
524
- const options = isInternal ? {
525
- onClick: () => {
526
- const qualifiedId = url.split("/").at(-1);
527
- (0, import_invariant3.invariant)(qualifiedId, "Invalid link format.", {
528
- F: __dxlog_file3,
529
- L: 287,
530
- S: void 0,
531
- A: [
532
- "qualifiedId",
533
- "'Invalid link format.'"
534
- ]
535
- });
536
- onSelectObject(qualifiedId);
537
- }
538
- } : {
539
- href: url,
540
- rel: "noreferrer",
541
- target: "_blank"
542
- };
543
- renderRoot(el, /* @__PURE__ */ import_react4.default.createElement("a", {
544
- ...options,
545
- className: style.hover
546
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
547
- icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
548
- size: 4,
549
- classNames: style.icon
550
- })));
551
- };
552
- var renderLinkTooltip = (el, { url }) => {
553
- const web = new URL(url);
554
- renderRoot(el, /* @__PURE__ */ import_react4.default.createElement("a", {
555
- href: url,
556
- rel: "noreferrer",
557
- target: "_blank",
558
- className: style.hover
559
- }, web.origin, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
560
- icon: "ph--arrow-square-out--bold",
561
- size: 4,
562
- classNames: style.icon
563
- })));
564
- };
565
- var renderRoot = (root, node) => {
566
- (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react4.default.createElement(import_react_ui3.ThemeProvider, {
567
- tx: import_react_ui_theme.defaultTx
568
- }, node));
569
- return root;
570
- };
571
- var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
572
- var _effect = (0, import_tracking.useSignals)();
573
- try {
574
- const { t } = (0, import_react_ui.useTranslation)();
575
- const scrollPastEnd = role === "article";
576
- const doc = import_echo.Obj.instanceOf(import_chunk_3HHV4MM6.DocumentType, object) ? object : void 0;
577
- const text = import_echo.Obj.instanceOf(import_schema.DataType.Text, object) ? object : void 0;
578
- const [previewBlocks, setPreviewBlocks] = (0, import_react.useState)([]);
579
- const previewOptions = (0, import_react.useMemo)(() => ({
580
- addBlockContainer: (link, el) => {
581
- setPreviewBlocks((prev) => [
582
- ...prev,
583
- {
584
- link,
585
- el
586
- }
587
- ]);
588
- },
589
- removeBlockContainer: (link) => {
590
- setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
591
- }
592
- }), []);
593
- const extensions = useExtensions({
594
- document: doc,
595
- text,
596
- id,
597
- settings,
598
- selectionManager,
599
- viewMode,
600
- editorStateStore,
601
- previewOptions
602
- });
603
- const manager = (0, import_app_framework.usePluginManager)();
604
- const resolve = (0, import_react.useCallback)((typename) => manager.context.getCapabilities(import_app_framework.Capabilities.Metadata).find(({ id: id2 }) => id2 === typename)?.metadata ?? {}, [
605
- manager
606
- ]);
607
- const space = (0, import_echo2.getSpace)(object);
608
- const objectForms = (0, import_app_framework.useCapabilities)(import_plugin_space.SpaceCapabilities.ObjectForm);
609
- const filter = (0, import_react.useMemo)(() => import_echo.Filter.or(...objectForms.map((form) => import_echo.Filter.type(form.objectSchema))), [
610
- objectForms
611
- ]);
612
- const onLinkQuery = (0, import_react.useCallback)(async (query) => {
613
- const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
614
- const results = await space?.db.query(import_echo.Query.select(filter)).run();
615
- const getLabel = (object2) => {
616
- const type = import_echo.Obj.getTypename(object2);
617
- const metadata = resolve(type);
618
- return metadata.label?.(object2) || object2.name || [
619
- "object name placeholder",
620
- {
621
- ns: type,
622
- default: "New object"
623
- }
624
- ];
625
- };
626
- const items = results?.objects.filter((object2) => (0, import_react_ui.toLocalizedString)(getLabel(object2), t).toLowerCase().includes(name)).map((object2) => {
627
- const metadata = resolve(import_echo.Obj.getTypename(object2));
628
- const label = (0, import_react_ui.toLocalizedString)(getLabel(object2), t);
629
- return {
630
- id: object2.id,
631
- label,
632
- icon: metadata.icon,
633
- onSelect: (view, head) => {
634
- const link = `[${label}][${import_echo.Obj.getDXN(object2)}]`;
635
- if (query?.startsWith("@")) {
636
- (0, import_react_ui_editor.insertAtLineStart)(view, head, `!${link}
637
- `);
638
- } else {
639
- (0, import_react_ui_editor.insertAtCursor)(view, head, `${link} `);
640
- }
641
- }
642
- };
643
- }) ?? [];
644
- return [
645
- {
646
- id: "echo",
647
- items
648
- }
649
- ];
650
- }, [
651
- filter,
652
- resolve,
653
- space
654
- ]);
655
- const editor = doc ? /* @__PURE__ */ import_react.default.createElement(DocumentEditor, {
656
- id: (0, import_echo2.fullyQualifiedId)(object),
657
- role,
658
- document: doc,
659
- extensions,
660
- viewMode,
661
- settings,
662
- scrollPastEnd,
663
- onViewModeChange,
664
- onLinkQuery: space ? onLinkQuery : void 0
665
- }) : text ? /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
666
- id,
667
- role,
668
- initialValue: text.content,
669
- extensions,
670
- viewMode,
671
- toolbar: settings.toolbar,
672
- inputMode: settings.editorInputMode,
673
- scrollPastEnd,
674
- onViewModeChange,
675
- onLinkQuery: space ? onLinkQuery : void 0
676
- }) : (
677
- // TODO(burdon): Normalize with above.
678
- /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
679
- id,
680
- role,
681
- initialValue: object.text,
682
- extensions,
683
- viewMode,
684
- toolbar: settings.toolbar,
685
- inputMode: settings.editorInputMode,
686
- scrollPastEnd,
687
- onViewModeChange,
688
- onLinkQuery: space ? onLinkQuery : void 0
689
- })
690
- );
691
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, editor, previewBlocks.map(({ link, el }) => /* @__PURE__ */ import_react.default.createElement(PreviewBlock, {
692
- key: link.ref,
693
- link,
694
- el
695
- })));
696
- } finally {
697
- _effect.f();
698
- }
699
- };
700
- var PreviewBlock = ({ link, el }) => {
701
- var _effect = (0, import_tracking.useSignals)();
702
- try {
703
- const echoDXN = (0, import_react.useMemo)(() => import_echo.DXN.parse(link.ref).asEchoDXN(), [
704
- link.ref
705
- ]);
706
- const space = (0, import_echo2.useSpace)(echoDXN?.spaceId);
707
- const [subject] = (0, import_echo2.useQuery)(space, import_echo.Query.select(import_echo.Filter.ids(echoDXN?.echoId ?? "")));
708
- const data = (0, import_react.useMemo)(() => ({
709
- subject
710
- }), [
711
- subject
712
- ]);
713
- return /* @__PURE__ */ (0, import_react_dom.createPortal)(/* @__PURE__ */ import_react.default.createElement(import_app_framework.Surface, {
714
- role: "card--document",
715
- data,
716
- limit: 1
717
- }), el);
718
- } finally {
719
- _effect.f();
720
- }
721
- };
722
- var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
723
- var _effect = (0, import_tracking.useSignals)();
724
- try {
725
- const space = (0, import_echo2.getSpace)(doc);
726
- (0, import_react.useEffect)(() => {
727
- if (typeof doc.fallbackName === "string") {
728
- return;
729
- }
730
- const fallbackName = doc.content?.target?.content ? (0, import_chunk_CJLYFGPI.getFallbackName)(doc.content.target.content) : void 0;
731
- if (fallbackName) {
732
- doc.fallbackName = fallbackName;
733
- }
734
- }, [
735
- doc,
736
- doc.content
737
- ]);
738
- const [upload] = (0, import_app_framework.useCapabilities)(import_app_framework.Capabilities.FileUploader);
739
- const handleFileUpload = (0, import_react.useMemo)(() => {
740
- if (space === void 0 || upload === void 0) {
741
- return void 0;
742
- }
743
- return async (file) => upload(file, space);
744
- }, [
745
- space,
746
- upload
747
- ]);
748
- const { graph } = (0, import_app_framework.useAppGraph)();
749
- const customActions = (0, import_react.useMemo)(() => {
750
- return import_rx_react.Rx.make((get) => {
751
- const actions = get(graph.actions(id));
752
- const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
753
- return {
754
- nodes,
755
- edges: nodes.map((node) => ({
756
- source: "root",
757
- target: node.id
758
- }))
759
- };
760
- });
761
- }, [
762
- graph
763
- ]);
764
- return /* @__PURE__ */ import_react.default.createElement(MarkdownEditor, {
765
- id,
766
- initialValue: doc.content?.target?.content,
767
- viewMode,
768
- toolbar: settings.toolbar,
769
- customActions,
770
- inputMode: settings.editorInputMode,
771
- onFileUpload: handleFileUpload,
772
- ...props
773
- });
774
- } finally {
775
- _effect.f();
776
- }
777
- };
778
- var MarkdownContainer_default = MarkdownContainer;
779
- // Annotate the CommonJS export names for ESM import in node:
780
- 0 && (module.exports = {
781
- DocumentEditor
782
- });
783
- //# sourceMappingURL=MarkdownContainer-KYGUEZIL.cjs.map