@dxos/react-ui-editor 0.8.1-staging.9eaf14f → 0.8.2-main.12df754

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 (112) hide show
  1. package/dist/lib/browser/index.mjs +499 -371
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/testing/index.mjs +67 -0
  5. package/dist/lib/browser/testing/index.mjs.map +7 -0
  6. package/dist/lib/node/index.cjs +515 -379
  7. package/dist/lib/node/index.cjs.map +4 -4
  8. package/dist/lib/node/meta.json +1 -1
  9. package/dist/lib/node/testing/index.cjs +101 -0
  10. package/dist/lib/node/testing/index.cjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +499 -371
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +69 -0
  15. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  16. package/dist/types/src/components/EditorToolbar/util.d.ts +3 -3
  17. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  18. package/dist/types/src/components/EditorToolbar/{viewMode.d.ts → view-mode.d.ts} +1 -1
  19. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -0
  20. package/dist/types/src/defaults.d.ts +1 -0
  21. package/dist/types/src/defaults.d.ts.map +1 -1
  22. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  23. package/dist/types/src/extensions/command/action.d.ts +17 -0
  24. package/dist/types/src/extensions/command/action.d.ts.map +1 -0
  25. package/dist/types/src/extensions/command/command.d.ts +5 -10
  26. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  27. package/dist/types/src/extensions/command/hint.d.ts +4 -2
  28. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  29. package/dist/types/src/extensions/command/index.d.ts +1 -0
  30. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  31. package/dist/types/src/extensions/command/menu.d.ts +7 -2
  32. package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
  33. package/dist/types/src/extensions/command/state.d.ts +9 -11
  34. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  35. package/dist/types/src/extensions/comments.d.ts +9 -7
  36. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  37. package/dist/types/src/extensions/index.d.ts +1 -0
  38. package/dist/types/src/extensions/index.d.ts.map +1 -1
  39. package/dist/types/src/extensions/markdown/decorate.d.ts +4 -1
  40. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  41. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -2
  42. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  43. package/dist/types/src/extensions/markdown/link.d.ts +4 -1
  44. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  45. package/dist/types/src/extensions/preview/index.d.ts +2 -0
  46. package/dist/types/src/extensions/preview/index.d.ts.map +1 -0
  47. package/dist/types/src/extensions/preview/preview.d.ts +39 -0
  48. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -0
  49. package/dist/types/src/hooks/useTextEditor.d.ts +2 -1
  50. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  51. package/dist/types/src/{InputMode.stories.d.ts → stories/InputMode.stories.d.ts} +1 -1
  52. package/dist/types/src/stories/InputMode.stories.d.ts.map +1 -0
  53. package/dist/types/src/{TextEditor.stories.d.ts → stories/TextEditorBasic.stories.d.ts} +2 -35
  54. package/dist/types/src/stories/TextEditorBasic.stories.d.ts.map +1 -0
  55. package/dist/types/src/stories/TextEditorComments.stories.d.ts +13 -0
  56. package/dist/types/src/stories/TextEditorComments.stories.d.ts.map +1 -0
  57. package/dist/types/src/stories/TextEditorPreview.stories.d.ts +13 -0
  58. package/dist/types/src/stories/TextEditorPreview.stories.d.ts.map +1 -0
  59. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts +19 -0
  60. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts.map +1 -0
  61. package/dist/types/src/stories/story-utils.d.ts +53 -0
  62. package/dist/types/src/stories/story-utils.d.ts.map +1 -0
  63. package/dist/types/src/testing/RefPopover.d.ts +21 -0
  64. package/dist/types/src/testing/RefPopover.d.ts.map +1 -0
  65. package/dist/types/src/testing/index.d.ts +2 -0
  66. package/dist/types/src/testing/index.d.ts.map +1 -0
  67. package/dist/types/src/types.d.ts +5 -0
  68. package/dist/types/src/types.d.ts.map +1 -1
  69. package/dist/types/src/util/react.d.ts +6 -1
  70. package/dist/types/src/util/react.d.ts.map +1 -1
  71. package/package.json +33 -27
  72. package/src/components/EditorToolbar/EditorToolbar.tsx +2 -2
  73. package/src/components/EditorToolbar/util.ts +3 -3
  74. package/src/defaults.ts +5 -3
  75. package/src/extensions/automerge/automerge.stories.tsx +3 -11
  76. package/src/extensions/command/action.ts +49 -0
  77. package/src/extensions/command/command.ts +9 -27
  78. package/src/extensions/command/hint.ts +33 -30
  79. package/src/extensions/command/index.ts +1 -0
  80. package/src/extensions/command/menu.ts +11 -8
  81. package/src/extensions/command/state.ts +41 -61
  82. package/src/extensions/comments.ts +9 -9
  83. package/src/extensions/folding.tsx +1 -1
  84. package/src/extensions/index.ts +1 -0
  85. package/src/extensions/markdown/decorate.ts +4 -3
  86. package/src/extensions/markdown/formatting.ts +2 -2
  87. package/src/extensions/markdown/image.ts +12 -11
  88. package/src/extensions/markdown/link.ts +33 -24
  89. package/src/extensions/preview/index.ts +5 -0
  90. package/src/extensions/preview/preview.ts +271 -0
  91. package/src/hooks/useTextEditor.ts +4 -3
  92. package/src/{InputMode.stories.tsx → stories/InputMode.stories.tsx} +4 -4
  93. package/src/stories/TextEditorBasic.stories.tsx +289 -0
  94. package/src/stories/TextEditorComments.stories.tsx +99 -0
  95. package/src/stories/TextEditorPreview.stories.tsx +239 -0
  96. package/src/stories/TextEditorSpecial.stories.tsx +107 -0
  97. package/src/stories/story-utils.tsx +329 -0
  98. package/src/testing/RefPopover.tsx +74 -0
  99. package/src/testing/index.ts +5 -0
  100. package/src/types.ts +7 -0
  101. package/src/util/react.tsx +20 -2
  102. package/dist/types/src/InputMode.stories.d.ts.map +0 -1
  103. package/dist/types/src/TextEditor.stories.d.ts.map +0 -1
  104. package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +0 -1
  105. package/dist/types/src/extensions/command/preview.d.ts +0 -12
  106. package/dist/types/src/extensions/command/preview.d.ts.map +0 -1
  107. package/dist/types/src/fragments.d.ts +0 -3
  108. package/dist/types/src/fragments.d.ts.map +0 -1
  109. package/src/TextEditor.stories.tsx +0 -856
  110. package/src/extensions/command/preview.ts +0 -79
  111. package/src/fragments.ts +0 -19
  112. /package/src/components/EditorToolbar/{viewMode.ts → view-mode.ts} +0 -0
@@ -55,7 +55,10 @@ __export(node_exports, {
55
55
  blast: () => blast,
56
56
  callbackWrapper: () => callbackWrapper,
57
57
  clientRectsFor: () => clientRectsFor,
58
+ closeCommand: () => closeCommand,
59
+ closeEffect: () => closeEffect,
58
60
  command: () => command,
61
+ commandKeyBindings: () => commandKeyBindings,
59
62
  comments: () => comments,
60
63
  commentsState: () => commentsState,
61
64
  convertTreeToJson: () => convertTreeToJson,
@@ -69,6 +72,7 @@ __export(node_exports, {
69
72
  createElement: () => createElement,
70
73
  createExternalCommentSync: () => createExternalCommentSync,
71
74
  createMarkdownExtensions: () => createMarkdownExtensions,
75
+ createRenderer: () => createRenderer,
72
76
  createThemeExtensions: () => createThemeExtensions,
73
77
  debugDispatcher: () => debugDispatcher,
74
78
  debugNodeLogger: () => debugNodeLogger,
@@ -82,6 +86,7 @@ __export(node_exports, {
82
86
  editorGutter: () => editorGutter,
83
87
  editorInputMode: () => editorInputMode,
84
88
  editorMonospace: () => editorMonospace,
89
+ editorWidth: () => editorWidth,
85
90
  editorWithToolbarLayout: () => editorWithToolbarLayout,
86
91
  flattenRect: () => flattenRect,
87
92
  focus: () => focus,
@@ -100,8 +105,11 @@ __export(node_exports, {
100
105
  markdownTags: () => markdownTags,
101
106
  markdownTagsExtensions: () => markdownTagsExtensions,
102
107
  mention: () => mention,
108
+ openCommand: () => openCommand,
109
+ openEffect: () => openEffect,
103
110
  overlap: () => overlap,
104
111
  preventNewline: () => preventNewline,
112
+ preview: () => preview,
105
113
  processEditorPayload: () => processEditorPayload,
106
114
  removeBlockquote: () => removeBlockquote,
107
115
  removeCodeblock: () => removeCodeblock,
@@ -119,7 +127,7 @@ __export(node_exports, {
119
127
  setStyle: () => setStyle,
120
128
  singleValueFacet: () => singleValueFacet,
121
129
  stackItemContentEditorClassNames: () => stackItemContentEditorClassNames,
122
- stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames2,
130
+ stackItemContentToolbarClassNames: () => stackItemContentToolbarClassNames,
123
131
  table: () => table,
124
132
  tags: () => import_highlight.tags,
125
133
  textRange: () => textRange,
@@ -154,12 +162,11 @@ var import_react_ui_theme = require("@dxos/react-ui-theme");
154
162
  var import_react2 = require("react");
155
163
  var import_live_object = require("@dxos/live-object");
156
164
  var import_react_ui_menu2 = require("@dxos/react-ui-menu");
157
- var import_react_ui_theme2 = require("@dxos/react-ui-theme");
158
165
  var import_view2 = require("@codemirror/view");
166
+ var import_react_ui_theme2 = require("@dxos/react-ui-theme");
159
167
  var import_react_ui_theme3 = require("@dxos/react-ui-theme");
160
- var import_react_ui_theme4 = require("@dxos/react-ui-theme");
161
168
  var import_lodash = __toESM(require("lodash.get"));
162
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
169
+ var import_react_ui_theme4 = require("@dxos/react-ui-theme");
163
170
  var import_state2 = require("@codemirror/state");
164
171
  var import_view3 = require("@codemirror/view");
165
172
  var import_util = require("@dxos/util");
@@ -168,7 +175,7 @@ var import_log = require("@dxos/log");
168
175
  var import_react3 = __toESM(require("react"));
169
176
  var import_client = require("react-dom/client");
170
177
  var import_react_ui2 = require("@dxos/react-ui");
171
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
178
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
172
179
  var import_autocomplete = require("@codemirror/autocomplete");
173
180
  var import_lang_markdown = require("@codemirror/lang-markdown");
174
181
  var import_view4 = require("@codemirror/view");
@@ -192,95 +199,97 @@ var import_log3 = require("@dxos/log");
192
199
  var import_view7 = require("@codemirror/view");
193
200
  var import_lodash2 = __toESM(require("lodash.defaultsdeep"));
194
201
  var import_invariant2 = require("@dxos/invariant");
195
- var import_view8 = require("@codemirror/view");
196
202
  var import_state8 = require("@codemirror/state");
197
- var import_view9 = require("@codemirror/view");
198
203
  var import_state9 = require("@codemirror/state");
204
+ var import_view8 = require("@codemirror/view");
205
+ var import_view9 = require("@codemirror/view");
206
+ var import_state10 = require("@codemirror/state");
199
207
  var import_view10 = require("@codemirror/view");
200
208
  var import_view11 = require("@codemirror/view");
201
- var import_language = require("@codemirror/language");
202
- var import_state10 = require("@codemirror/state");
203
- var import_view12 = require("@codemirror/view");
204
209
  var import_commands = require("@codemirror/commands");
205
210
  var import_state11 = require("@codemirror/state");
206
- var import_view13 = require("@codemirror/view");
211
+ var import_view12 = require("@codemirror/view");
207
212
  var import_lodash3 = __toESM(require("lodash.sortby"));
208
213
  var import_react4 = require("react");
209
214
  var import_async3 = require("@dxos/async");
210
215
  var import_log4 = require("@dxos/log");
211
216
  var import_util2 = require("@dxos/util");
212
217
  var import_state12 = require("@codemirror/state");
213
- var import_view14 = require("@codemirror/view");
218
+ var import_view13 = require("@codemirror/view");
214
219
  var import_async4 = require("@dxos/async");
215
220
  var import_invariant3 = require("@dxos/invariant");
216
221
  var import_util3 = require("@dxos/util");
217
- var import_language2 = require("@codemirror/language");
222
+ var import_language = require("@codemirror/language");
218
223
  var import_state13 = require("@codemirror/state");
219
- var import_view15 = require("@codemirror/view");
224
+ var import_view14 = require("@codemirror/view");
220
225
  var import_autocomplete2 = require("@codemirror/autocomplete");
221
226
  var import_commands2 = require("@codemirror/commands");
222
- var import_language3 = require("@codemirror/language");
227
+ var import_language2 = require("@codemirror/language");
223
228
  var import_search = require("@codemirror/search");
224
229
  var import_state14 = require("@codemirror/state");
225
230
  var import_theme_one_dark = require("@codemirror/theme-one-dark");
226
- var import_view16 = require("@codemirror/view");
231
+ var import_view15 = require("@codemirror/view");
227
232
  var import_lodash4 = __toESM(require("lodash.defaultsdeep"));
228
233
  var import_lodash5 = __toESM(require("lodash.merge"));
229
234
  var import_display_name = require("@dxos/display-name");
230
235
  var import_log5 = require("@dxos/log");
231
236
  var import_util4 = require("@dxos/util");
232
237
  var import_state15 = require("@codemirror/state");
238
+ var import_view16 = require("@codemirror/view");
239
+ var import_language3 = require("@codemirror/language");
233
240
  var import_view17 = require("@codemirror/view");
234
- var import_language4 = require("@codemirror/language");
235
- var import_view18 = require("@codemirror/view");
236
241
  var import_react5 = __toESM(require("react"));
237
242
  var import_react_ui3 = require("@dxos/react-ui");
238
- var import_view19 = require("@codemirror/view");
243
+ var import_view18 = require("@codemirror/view");
239
244
  var import_autocomplete3 = require("@codemirror/autocomplete");
240
- var import_language5 = require("@codemirror/language");
245
+ var import_language4 = require("@codemirror/language");
241
246
  var import_state16 = require("@codemirror/state");
242
- var import_view20 = require("@codemirror/view");
247
+ var import_view19 = require("@codemirror/view");
243
248
  var import_react6 = require("react");
244
249
  var import_autocomplete4 = require("@codemirror/autocomplete");
245
250
  var import_commands3 = require("@codemirror/commands");
246
251
  var import_lang_markdown2 = require("@codemirror/lang-markdown");
247
- var import_language6 = require("@codemirror/language");
252
+ var import_language5 = require("@codemirror/language");
248
253
  var import_language_data = require("@codemirror/language-data");
249
254
  var import_lint = require("@codemirror/lint");
250
- var import_view21 = require("@codemirror/view");
255
+ var import_view20 = require("@codemirror/view");
251
256
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
252
- var import_language7 = require("@codemirror/language");
257
+ var import_language6 = require("@codemirror/language");
253
258
  var import_highlight2 = require("@lezer/highlight");
254
259
  var import_markdown = require("@lezer/markdown");
255
- var import_language8 = require("@codemirror/language");
260
+ var import_language7 = require("@codemirror/language");
256
261
  var import_state17 = require("@codemirror/state");
257
- var import_language9 = require("@codemirror/language");
262
+ var import_language8 = require("@codemirror/language");
258
263
  var import_state18 = require("@codemirror/state");
259
- var import_view22 = require("@codemirror/view");
264
+ var import_view21 = require("@codemirror/view");
260
265
  var import_invariant4 = require("@dxos/invariant");
261
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
262
- var import_language10 = require("@codemirror/language");
266
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
267
+ var import_language9 = require("@codemirror/language");
263
268
  var import_state19 = require("@codemirror/state");
264
- var import_view23 = require("@codemirror/view");
265
- var import_language11 = require("@codemirror/language");
269
+ var import_view22 = require("@codemirror/view");
270
+ var import_language10 = require("@codemirror/language");
266
271
  var import_state20 = require("@codemirror/state");
272
+ var import_view23 = require("@codemirror/view");
267
273
  var import_view24 = require("@codemirror/view");
274
+ var import_language11 = require("@codemirror/language");
275
+ var import_state21 = require("@codemirror/state");
268
276
  var import_view25 = require("@codemirror/view");
269
277
  var import_language12 = require("@codemirror/language");
270
- var import_state21 = require("@codemirror/state");
271
278
  var import_view26 = require("@codemirror/view");
272
- var import_language13 = require("@codemirror/language");
273
- var import_view27 = require("@codemirror/view");
274
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
279
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
275
280
  var import_autocomplete5 = require("@codemirror/autocomplete");
276
281
  var import_log6 = require("@dxos/log");
277
- var import_view28 = require("@codemirror/view");
282
+ var import_view27 = require("@codemirror/view");
278
283
  var import_codemirror_vim = require("@replit/codemirror-vim");
279
284
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
280
285
  var import_echo_schema = require("@dxos/echo-schema");
286
+ var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
287
+ var import_language13 = require("@codemirror/language");
288
+ var import_state22 = require("@codemirror/state");
289
+ var import_view28 = require("@codemirror/view");
281
290
  var import_view29 = require("@codemirror/view");
282
291
  var import_react7 = require("react");
283
- var import_state22 = require("@codemirror/state");
292
+ var import_state23 = require("@codemirror/state");
284
293
  var import_view30 = require("@codemirror/view");
285
294
  var import_react_tabster = require("@fluentui/react-tabster");
286
295
  var import_react8 = require("react");
@@ -320,7 +329,7 @@ var translations_default = [
320
329
  }
321
330
  ];
322
331
  var useEditorToolbarState = (initialState = {}) => {
323
- return (0, import_react2.useMemo)(() => (0, import_live_object.create)(initialState), []);
332
+ return (0, import_react2.useMemo)(() => (0, import_live_object.live)(initialState), []);
324
333
  };
325
334
  var createEditorAction = (payload, icon, label = [
326
335
  `${payload.type} label`,
@@ -568,88 +577,6 @@ var createViewMode = (state) => {
568
577
  ]
569
578
  };
570
579
  };
571
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
572
- var createToolbar = ({ state, customActions, ...features }) => {
573
- const nodes = [];
574
- const edges = [];
575
- if (features.headings ?? true) {
576
- const headings2 = createHeadings(state);
577
- nodes.push(...headings2.nodes);
578
- edges.push(...headings2.edges);
579
- }
580
- if (features.formatting ?? true) {
581
- const formatting = createFormatting(state);
582
- nodes.push(...formatting.nodes);
583
- edges.push(...formatting.edges);
584
- }
585
- if (features.lists ?? true) {
586
- const lists = createLists(state);
587
- nodes.push(...lists.nodes);
588
- edges.push(...lists.edges);
589
- }
590
- if (features.blocks ?? true) {
591
- const blocks = createBlocks(state);
592
- nodes.push(...blocks.nodes);
593
- edges.push(...blocks.edges);
594
- }
595
- if (customActions) {
596
- const custom = customActions();
597
- nodes.push(...custom.nodes);
598
- edges.push(...custom.edges);
599
- }
600
- const editorToolbarGap = (0, import_react_ui_menu.createGapSeparator)();
601
- nodes.push(...editorToolbarGap.nodes);
602
- edges.push(...editorToolbarGap.edges);
603
- if (features.comment ?? true) {
604
- const comment = createComment(state);
605
- nodes.push(...comment.nodes);
606
- edges.push(...comment.edges);
607
- }
608
- if (features.search ?? true) {
609
- nodes.push(editorToolbarSearch);
610
- edges.push({
611
- source: "root",
612
- target: editorToolbarSearch.id
613
- });
614
- }
615
- if (features.viewMode ?? true) {
616
- const viewMode = createViewMode(state);
617
- nodes.push(...viewMode.nodes);
618
- edges.push(...viewMode.edges);
619
- }
620
- return {
621
- nodes,
622
- edges
623
- };
624
- };
625
- var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
626
- const menuCreator = (0, import_react.useCallback)(() => createToolbar(props), [
627
- props
628
- ]);
629
- const { resolveGroupItems } = (0, import_react_ui_menu.useMenuActions)(menuCreator);
630
- return {
631
- resolveGroupItems,
632
- onAction
633
- };
634
- };
635
- var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
636
- const menuProps = useEditorToolbarActionGraph(props);
637
- return /* @__PURE__ */ import_react.default.createElement("div", {
638
- role: "none",
639
- className: stackItemContentToolbarClassNames(role)
640
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
641
- elevation: role === "section" ? "positioned" : "base"
642
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
643
- ...menuProps,
644
- attendableId
645
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
646
- classNames: [
647
- import_react_ui_theme.textBlockWidth,
648
- "!bg-transparent",
649
- classNames
650
- ]
651
- }))));
652
- };
653
580
  var headings = {
654
581
  1: "text-4xl",
655
582
  2: "text-3xl",
@@ -663,11 +590,11 @@ var theme = {
663
590
  codeMark: "font-mono text-primary-500",
664
591
  mark: "opacity-50",
665
592
  heading: (level) => {
666
- return (0, import_react_ui_theme4.mx)(headings[level], "dark:text-primary-400");
593
+ return (0, import_react_ui_theme3.mx)(headings[level], "dark:text-primary-400");
667
594
  }
668
595
  };
669
596
  var getToken = (path, defaultValue) => {
670
- const value = (0, import_lodash.default)(import_react_ui_theme5.tokens, path, defaultValue);
597
+ const value = (0, import_lodash.default)(import_react_ui_theme4.tokens, path, defaultValue);
671
598
  return value?.toString() ?? "";
672
599
  };
673
600
  var fontBody = getToken("fontFamily.body");
@@ -874,8 +801,9 @@ var defaultTheme = {
874
801
  }
875
802
  };
876
803
  var margin = "!mt-[1rem]";
877
- var editorContent = (0, import_react_ui_theme3.mx)(margin, "!mli-auto w-full max-w-[min(50rem,100%-4rem)]");
878
- var editorFullWidth = (0, import_react_ui_theme3.mx)(margin);
804
+ var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
805
+ var editorContent = (0, import_react_ui_theme2.mx)(margin, editorWidth);
806
+ var editorFullWidth = (0, import_react_ui_theme2.mx)(margin);
879
807
  var editorGutter = import_view2.EditorView.theme({
880
808
  // Match margin from content.
881
809
  // Gutter = 2rem + 1rem margin.
@@ -890,8 +818,89 @@ var editorMonospace = import_view2.EditorView.theme({
890
818
  }
891
819
  });
892
820
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
893
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme3.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
894
- var stackItemContentToolbarClassNames2 = (role) => (0, import_react_ui_theme3.mx)("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
821
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2", role === "section" ? "[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24" : "min-bs-0");
822
+ var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme2.mx)("attention-surface is-full border-be !border-separator relative z-[1]", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
823
+ var createToolbar = ({ state, customActions, ...features }) => {
824
+ const nodes = [];
825
+ const edges = [];
826
+ if (features.headings ?? true) {
827
+ const headings2 = createHeadings(state);
828
+ nodes.push(...headings2.nodes);
829
+ edges.push(...headings2.edges);
830
+ }
831
+ if (features.formatting ?? true) {
832
+ const formatting = createFormatting(state);
833
+ nodes.push(...formatting.nodes);
834
+ edges.push(...formatting.edges);
835
+ }
836
+ if (features.lists ?? true) {
837
+ const lists = createLists(state);
838
+ nodes.push(...lists.nodes);
839
+ edges.push(...lists.edges);
840
+ }
841
+ if (features.blocks ?? true) {
842
+ const blocks = createBlocks(state);
843
+ nodes.push(...blocks.nodes);
844
+ edges.push(...blocks.edges);
845
+ }
846
+ if (customActions) {
847
+ const custom = customActions();
848
+ nodes.push(...custom.nodes);
849
+ edges.push(...custom.edges);
850
+ }
851
+ const editorToolbarGap = (0, import_react_ui_menu.createGapSeparator)();
852
+ nodes.push(...editorToolbarGap.nodes);
853
+ edges.push(...editorToolbarGap.edges);
854
+ if (features.comment ?? true) {
855
+ const comment = createComment(state);
856
+ nodes.push(...comment.nodes);
857
+ edges.push(...comment.edges);
858
+ }
859
+ if (features.search ?? true) {
860
+ nodes.push(editorToolbarSearch);
861
+ edges.push({
862
+ source: "root",
863
+ target: editorToolbarSearch.id
864
+ });
865
+ }
866
+ if (features.viewMode ?? true) {
867
+ const viewMode = createViewMode(state);
868
+ nodes.push(...viewMode.nodes);
869
+ edges.push(...viewMode.edges);
870
+ }
871
+ return {
872
+ nodes,
873
+ edges
874
+ };
875
+ };
876
+ var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
877
+ const menuCreator = (0, import_react.useCallback)(() => createToolbar(props), [
878
+ props
879
+ ]);
880
+ const { resolveGroupItems } = (0, import_react_ui_menu.useMenuActions)(menuCreator);
881
+ return {
882
+ resolveGroupItems,
883
+ onAction
884
+ };
885
+ };
886
+ var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
887
+ const menuProps = useEditorToolbarActionGraph(props);
888
+ return /* @__PURE__ */ import_react.default.createElement("div", {
889
+ role: "none",
890
+ className: stackItemContentToolbarClassNames(role)
891
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.ElevationProvider, {
892
+ elevation: role === "section" ? "positioned" : "base"
893
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.MenuProvider, {
894
+ ...menuProps,
895
+ attendableId
896
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui_menu.ToolbarMenu, {
897
+ classNames: [
898
+ import_react_ui_theme.textBlockWidth,
899
+ "!bg-transparent",
900
+ classNames
901
+ ]
902
+ }))));
903
+ };
895
904
  var singleValueFacet = (defaultValue) => import_state3.Facet.define({
896
905
  // Called immediately.
897
906
  combine: (providers) => {
@@ -1027,10 +1036,15 @@ var createElement = (tag, options, children) => {
1027
1036
  };
1028
1037
  var renderRoot = (root, node) => {
1029
1038
  (0, import_client.createRoot)(root).render(/* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
1030
- tx: import_react_ui_theme6.defaultTx
1039
+ tx: import_react_ui_theme5.defaultTx
1031
1040
  }, node));
1032
1041
  return root;
1033
1042
  };
1043
+ var createRenderer = (Component) => (el, props) => {
1044
+ renderRoot(el, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.ThemeProvider, {
1045
+ tx: import_react_ui_theme5.defaultTx
1046
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui2.Tooltip.Provider, null, /* @__PURE__ */ import_react3.default.createElement(Component, props))));
1047
+ };
1034
1048
  var annotationMark = import_view3.Decoration.mark({
1035
1049
  class: "cm-annotation"
1036
1050
  });
@@ -2032,8 +2046,8 @@ var commandState = import_state9.StateField.define({
2032
2046
  if (effect.is(closeEffect)) {
2033
2047
  return {};
2034
2048
  }
2035
- if (effect.is(openEffect)) {
2036
- const options = tr.state.facet(commandConfig);
2049
+ const { renderDialog } = tr.state.facet(commandConfig);
2050
+ if (effect.is(openEffect) && renderDialog) {
2037
2051
  const { pos, fullWidth } = effect.value;
2038
2052
  const tooltip = {
2039
2053
  pos,
@@ -2041,34 +2055,39 @@ var commandState = import_state9.StateField.define({
2041
2055
  arrow: false,
2042
2056
  strictSide: true,
2043
2057
  create: (view) => {
2044
- const dom = document.createElement("div");
2058
+ const root = document.createElement("div");
2045
2059
  const tooltipView = {
2046
- dom,
2060
+ dom: root,
2047
2061
  mount: (view2) => {
2048
2062
  if (fullWidth) {
2049
- const parent = dom.parentElement;
2063
+ const parent = root.parentElement;
2050
2064
  const { paddingLeft, paddingRight } = window.getComputedStyle(parent);
2051
2065
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
2052
- dom.style.width = `${widthWithoutPadding}px`;
2066
+ root.style.width = `${widthWithoutPadding}px`;
2053
2067
  }
2054
- options.onRenderDialog(dom, (action) => {
2055
- view2.dispatch({
2056
- effects: closeEffect.of(null)
2057
- });
2058
- if (action?.insert?.length) {
2059
- const text = action.insert + "\n";
2068
+ renderDialog(root, {
2069
+ onAction: (action) => {
2060
2070
  view2.dispatch({
2061
- changes: {
2062
- from: pos,
2063
- insert: text
2064
- },
2065
- selection: {
2066
- anchor: pos + text.length
2067
- }
2071
+ effects: closeEffect.of(null)
2068
2072
  });
2073
+ switch (action?.type) {
2074
+ case "insert": {
2075
+ const text = action.text + "\n";
2076
+ view2.dispatch({
2077
+ changes: {
2078
+ from: pos,
2079
+ insert: text
2080
+ },
2081
+ selection: {
2082
+ anchor: pos + text.length
2083
+ }
2084
+ });
2085
+ break;
2086
+ }
2087
+ }
2088
+ requestAnimationFrame(() => view2.focus());
2069
2089
  }
2070
- requestAnimationFrame(() => view2.focus());
2071
- });
2090
+ }, view2);
2072
2091
  }
2073
2092
  };
2074
2093
  return tooltipView;
@@ -2082,11 +2101,11 @@ var commandState = import_state9.StateField.define({
2082
2101
  return state;
2083
2102
  },
2084
2103
  provide: (field) => [
2085
- import_view10.showTooltip.from(field, (value) => value.tooltip ?? null)
2104
+ import_view8.showTooltip.from(field, (value) => value.tooltip ?? null)
2086
2105
  ]
2087
2106
  });
2088
- var openEffect = import_state9.StateEffect.define();
2089
- var closeEffect = import_state9.StateEffect.define();
2107
+ var openEffect = import_state8.StateEffect.define();
2108
+ var closeEffect = import_state8.StateEffect.define();
2090
2109
  var openCommand = (view) => {
2091
2110
  if (view.state.field(commandState, false)) {
2092
2111
  const selection = view.state.selection.main;
@@ -2122,7 +2141,33 @@ var commandKeyBindings = [
2122
2141
  run: closeCommand
2123
2142
  }
2124
2143
  ];
2125
- var CommandHint = class extends import_view9.WidgetType {
2144
+ var hintViewPlugin = ({ onHint }) => import_view10.ViewPlugin.fromClass(class {
2145
+ constructor() {
2146
+ this.deco = import_view10.Decoration.none;
2147
+ }
2148
+ update(update2) {
2149
+ const builder = new import_state10.RangeSetBuilder();
2150
+ const cState = update2.view.state.field(commandState, false);
2151
+ if (!cState?.tooltip) {
2152
+ const selection = update2.view.state.selection.main;
2153
+ const line = update2.view.state.doc.lineAt(selection.from);
2154
+ if (selection.from === selection.to && line.from === line.to) {
2155
+ const hint = onHint();
2156
+ if (hint) {
2157
+ builder.add(selection.from, selection.to, import_view10.Decoration.widget({
2158
+ widget: new CommandHint(hint)
2159
+ }));
2160
+ }
2161
+ }
2162
+ }
2163
+ this.deco = builder.finish();
2164
+ }
2165
+ }, {
2166
+ provide: (plugin) => [
2167
+ import_view10.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view10.Decoration.none)
2168
+ ]
2169
+ });
2170
+ var CommandHint = class extends import_view10.WidgetType {
2126
2171
  constructor(content) {
2127
2172
  super();
2128
2173
  this.content = content;
@@ -2161,32 +2206,6 @@ var CommandHint = class extends import_view9.WidgetType {
2161
2206
  return false;
2162
2207
  }
2163
2208
  };
2164
- var hintViewPlugin = ({ onHint }) => import_view9.ViewPlugin.fromClass(class {
2165
- constructor() {
2166
- this.deco = import_view9.Decoration.none;
2167
- }
2168
- update(update2) {
2169
- const builder = new import_state8.RangeSetBuilder();
2170
- const cState = update2.view.state.field(commandState, false);
2171
- if (!cState?.tooltip) {
2172
- const selection = update2.view.state.selection.main;
2173
- const line = update2.view.state.doc.lineAt(selection.from);
2174
- if (selection.from === selection.to && line.from === line.to) {
2175
- const hint = onHint();
2176
- if (hint) {
2177
- builder.add(selection.from, selection.to, import_view9.Decoration.widget({
2178
- widget: new CommandHint(hint)
2179
- }));
2180
- }
2181
- }
2182
- }
2183
- this.deco = builder.finish();
2184
- }
2185
- }, {
2186
- provide: (plugin) => [
2187
- import_view9.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view9.Decoration.none)
2188
- ]
2189
- });
2190
2209
  var floatingMenu = (options) => import_view11.ViewPlugin.fromClass(class {
2191
2210
  constructor(view) {
2192
2211
  this.rafId = null;
@@ -2199,11 +2218,11 @@ var floatingMenu = (options) => import_view11.ViewPlugin.fromClass(class {
2199
2218
  this.button.style.position = "absolute";
2200
2219
  this.button.style.zIndex = "10";
2201
2220
  this.button.style.display = "none";
2202
- options.onRenderMenu(this.button, () => {
2203
- openCommand(view);
2204
- });
2221
+ options.renderMenu(this.button, {
2222
+ onAction: () => openCommand(view)
2223
+ }, view);
2205
2224
  container.appendChild(this.button);
2206
- container.addEventListener("scroll", this.scheduleUpdate);
2225
+ container.addEventListener("scroll", this.scheduleUpdate.bind(this));
2207
2226
  this.scheduleUpdate();
2208
2227
  }
2209
2228
  update(update2) {
@@ -2219,7 +2238,7 @@ var floatingMenu = (options) => import_view11.ViewPlugin.fromClass(class {
2219
2238
  if (this.rafId != null) {
2220
2239
  cancelAnimationFrame(this.rafId);
2221
2240
  }
2222
- this.rafId = requestAnimationFrame(() => this.updateButtonPosition());
2241
+ this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
2223
2242
  }
2224
2243
  updateButtonPosition() {
2225
2244
  const pos = this.view.state.selection.main.head;
@@ -2248,77 +2267,23 @@ var floatingMenu = (options) => import_view11.ViewPlugin.fromClass(class {
2248
2267
  }
2249
2268
  }
2250
2269
  });
2251
- var preview = (options) => {
2252
- return [
2253
- import_state10.StateField.define({
2254
- create: (state) => buildDecorations(state, options),
2255
- update: (_, tr) => buildDecorations(tr.state, options),
2256
- // TODO(burdon): Make atomic.
2257
- provide: (field) => import_view12.EditorView.decorations.from(field)
2258
- })
2259
- ];
2260
- };
2261
- var buildDecorations = (state, options) => {
2262
- const builder = new import_state10.RangeSetBuilder();
2263
- (0, import_language.syntaxTree)(state).iterate({
2264
- enter: (node) => {
2265
- if (node.name === "Link") {
2266
- const urlNode = node.node.getChild("URL");
2267
- if (urlNode) {
2268
- const text = state.sliceDoc(node.from + 1, urlNode.from - 2);
2269
- const url = state.sliceDoc(urlNode.from, urlNode.to);
2270
- builder.add(node.from, node.to, import_view12.Decoration.replace({
2271
- block: true,
2272
- widget: new PreviewWidget(options.onRenderPreview, url, text)
2273
- }));
2274
- }
2275
- }
2276
- }
2277
- });
2278
- return builder.finish();
2279
- };
2280
- var PreviewWidget = class extends import_view12.WidgetType {
2281
- constructor(_onRenderPreview, _url, _text) {
2282
- super();
2283
- this._onRenderPreview = _onRenderPreview;
2284
- this._url = _url;
2285
- this._text = _text;
2286
- }
2287
- eq(other) {
2288
- return this._url === other._url;
2289
- }
2290
- toDOM(view) {
2291
- const root = document.createElement("div");
2292
- root.classList.add("cm-preview");
2293
- this._onRenderPreview(root, {
2294
- url: this._url,
2295
- text: this._text
2296
- });
2297
- return root;
2298
- }
2299
- };
2300
- var command = (options) => {
2270
+ var command = (options = {}) => {
2301
2271
  return [
2272
+ import_view9.keymap.of(commandKeyBindings),
2302
2273
  commandConfig.of(options),
2303
2274
  commandState,
2304
- import_view8.keymap.of(commandKeyBindings),
2305
- preview(options),
2306
- floatingMenu(options),
2307
- hintViewPlugin(options),
2308
- import_view8.EditorView.focusChangeEffect.of((_, focusing) => {
2275
+ options.renderMenu ? floatingMenu({
2276
+ renderMenu: options.renderMenu
2277
+ }) : [],
2278
+ options.onHint ? hintViewPlugin({
2279
+ onHint: options.onHint
2280
+ }) : [],
2281
+ import_view9.EditorView.focusChangeEffect.of((_, focusing) => {
2309
2282
  return focusing ? closeEffect.of(null) : null;
2310
2283
  }),
2311
- import_view8.EditorView.theme({
2284
+ import_view9.EditorView.theme({
2312
2285
  ".cm-tooltip": {
2313
2286
  background: "transparent"
2314
- },
2315
- ".cm-preview": {
2316
- marginLeft: "-1rem",
2317
- marginRight: "-1rem",
2318
- padding: "1rem",
2319
- borderRadius: "1rem",
2320
- background: "var(--dx-modalSurface)",
2321
- border: "1px solid var(--dx-separator)"
2322
2287
  }
2323
2288
  })
2324
2289
  ];
@@ -2330,7 +2295,7 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2330
2295
  return {
2331
2296
  selection,
2332
2297
  scrollIntoView: !scrollTo,
2333
- effects: scrollTo ? import_view14.EditorView.scrollIntoView(scrollTo, {
2298
+ effects: scrollTo ? import_view13.EditorView.scrollIntoView(scrollTo, {
2334
2299
  yMargin: 96
2335
2300
  }) : void 0,
2336
2301
  annotations: import_state12.Transaction.userEvent.of(stateRestoreAnnotation)
@@ -2372,7 +2337,7 @@ var selectionState = ({ getState, setState } = {}) => {
2372
2337
  // setStateDebounced(id, {});
2373
2338
  // },
2374
2339
  // }),
2375
- import_view14.EditorView.updateListener.of(({ view, transactions }) => {
2340
+ import_view13.EditorView.updateListener.of(({ view, transactions }) => {
2376
2341
  const id = view.state.facet(documentId);
2377
2342
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2378
2343
  return;
@@ -2395,7 +2360,7 @@ var selectionState = ({ getState, setState } = {}) => {
2395
2360
  }
2396
2361
  }
2397
2362
  }),
2398
- getState && import_view14.keymap.of([
2363
+ getState && import_view13.keymap.of([
2399
2364
  {
2400
2365
  key: "ctrl-r",
2401
2366
  run: (view) => {
@@ -2451,7 +2416,7 @@ var commentsState = import_state11.StateField.define({
2451
2416
  return value;
2452
2417
  }
2453
2418
  });
2454
- var styles3 = import_view13.EditorView.theme({
2419
+ var styles3 = import_view12.EditorView.theme({
2455
2420
  ".cm-comment, .cm-comment-current": {
2456
2421
  margin: "0 -3px",
2457
2422
  padding: "3px",
@@ -2464,14 +2429,14 @@ var styles3 = import_view13.EditorView.theme({
2464
2429
  textDecoration: "underline"
2465
2430
  }
2466
2431
  });
2467
- var createCommentMark = (id, isCurrent) => import_view13.Decoration.mark({
2432
+ var createCommentMark = (id, isCurrent) => import_view12.Decoration.mark({
2468
2433
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2469
2434
  attributes: {
2470
2435
  "data-testid": "cm-comment",
2471
2436
  "data-comment-id": id
2472
2437
  }
2473
2438
  });
2474
- var commentsDecorations = import_view13.EditorView.decorations.compute([
2439
+ var commentsDecorations = import_view12.EditorView.decorations.compute([
2475
2440
  commentsState
2476
2441
  ], (state) => {
2477
2442
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2491,10 +2456,10 @@ var commentsDecorations = import_view13.EditorView.decorations.compute([
2491
2456
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2492
2457
  return mark.range(range.from, range.to);
2493
2458
  }).filter(import_util2.isNonNullable);
2494
- return import_view13.Decoration.set(decorations);
2459
+ return import_view12.Decoration.set(decorations);
2495
2460
  });
2496
2461
  var commentClickedEffect = import_state11.StateEffect.define();
2497
- var handleCommentClick = import_view13.EditorView.domEventHandlers({
2462
+ var handleCommentClick = import_view12.EditorView.domEventHandlers({
2498
2463
  click: (event, view) => {
2499
2464
  let target = event.target;
2500
2465
  const editorRoot = view.dom;
@@ -2533,7 +2498,7 @@ var trackPastedComments = (onUpdate) => {
2533
2498
  }
2534
2499
  };
2535
2500
  return [
2536
- import_view13.EditorView.domEventHandlers({
2501
+ import_view12.EditorView.domEventHandlers({
2537
2502
  cut: handleTrack,
2538
2503
  copy: handleTrack
2539
2504
  }),
@@ -2555,7 +2520,7 @@ var trackPastedComments = (onUpdate) => {
2555
2520
  return effects;
2556
2521
  }),
2557
2522
  // Handle paste or the undo of comment deletion.
2558
- import_view13.EditorView.updateListener.of((update2) => {
2523
+ import_view12.EditorView.updateListener.of((update2) => {
2559
2524
  const restore = [];
2560
2525
  for (let i = 0; i < update2.transactions.length; i++) {
2561
2526
  const tr = update2.transactions[i];
@@ -2656,7 +2621,7 @@ var comments = (options = {}) => {
2656
2621
  //
2657
2622
  // Keymap.
2658
2623
  //
2659
- options.onCreate && import_view13.keymap.of([
2624
+ options.onCreate && import_view12.keymap.of([
2660
2625
  {
2661
2626
  key: shortcut,
2662
2627
  run: callbackWrapper(createComment2)
@@ -2666,7 +2631,7 @@ var comments = (options = {}) => {
2666
2631
  // Hover tooltip (for key shortcut hints, etc.)
2667
2632
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2668
2633
  //
2669
- options.onHover && (0, import_view13.hoverTooltip)((view, pos) => {
2634
+ options.renderTooltip && (0, import_view12.hoverTooltip)((view, pos) => {
2670
2635
  const selection = view.state.selection.main;
2671
2636
  if (selection && pos >= selection.from && pos <= selection.to) {
2672
2637
  return {
@@ -2675,7 +2640,9 @@ var comments = (options = {}) => {
2675
2640
  above: true,
2676
2641
  create: () => {
2677
2642
  const el = document.createElement("div");
2678
- options.onHover(el, shortcut);
2643
+ options.renderTooltip(el, {
2644
+ shortcut
2645
+ }, view);
2679
2646
  return {
2680
2647
  dom: el,
2681
2648
  offset: {
@@ -2695,7 +2662,7 @@ var comments = (options = {}) => {
2695
2662
  //
2696
2663
  // Track deleted ranges and update ranges for decorations.
2697
2664
  //
2698
- import_view13.EditorView.updateListener.of(({ view, state, changes }) => {
2665
+ import_view12.EditorView.updateListener.of(({ view, state, changes }) => {
2699
2666
  let mod = false;
2700
2667
  const { comments: comments2, ...value } = state.field(commentsState);
2701
2668
  changes.iterChanges((from, to, from2, to2) => {
@@ -2727,7 +2694,7 @@ var comments = (options = {}) => {
2727
2694
  //
2728
2695
  // Track selection/proximity.
2729
2696
  //
2730
- import_view13.EditorView.updateListener.of(({ view, state }) => {
2697
+ import_view12.EditorView.updateListener.of(({ view, state }) => {
2731
2698
  let min = Infinity;
2732
2699
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2733
2700
  const { head } = state.selection.main;
@@ -2781,7 +2748,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2781
2748
  anchor: range.from
2782
2749
  } : void 0,
2783
2750
  effects: [
2784
- needsScroll ? import_view13.EditorView.scrollIntoView(range.from, center ? {
2751
+ needsScroll ? import_view12.EditorView.scrollIntoView(range.from, center ? {
2785
2752
  y: "center"
2786
2753
  } : void 0) : [],
2787
2754
  needsSelectionUpdate ? setSelection.of({
@@ -2827,13 +2794,13 @@ var ExternalCommentSync = class {
2827
2794
  this.unsubscribe = subscribe(updateComments);
2828
2795
  }
2829
2796
  };
2830
- var createExternalCommentSync = (id, subscribe, getComments) => import_view13.ViewPlugin.fromClass(class {
2797
+ var createExternalCommentSync = (id, subscribe, getComments) => import_view12.ViewPlugin.fromClass(class {
2831
2798
  constructor(view) {
2832
2799
  return new ExternalCommentSync(view, id, subscribe, getComments);
2833
2800
  }
2834
2801
  });
2835
2802
  var useCommentState = (state) => {
2836
- return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2803
+ return (0, import_react4.useMemo)(() => import_view12.EditorView.updateListener.of((update2) => {
2837
2804
  if (update2.docChanged || update2.selectionSet) {
2838
2805
  state.comment = selectionOverlapsComment(update2.state);
2839
2806
  state.selection = hasActiveSelection(update2.state);
@@ -2857,7 +2824,7 @@ var useComments = (view, id, comments2) => {
2857
2824
  });
2858
2825
  };
2859
2826
  var useCommentClickListener = (onCommentClick) => {
2860
- return (0, import_react4.useMemo)(() => import_view13.EditorView.updateListener.of((update2) => {
2827
+ return (0, import_react4.useMemo)(() => import_view12.EditorView.updateListener.of((update2) => {
2861
2828
  update2.transactions.forEach((transaction) => {
2862
2829
  transaction.effects.forEach((effect) => {
2863
2830
  if (effect.is(commentClickedEffect)) {
@@ -2870,7 +2837,7 @@ var useCommentClickListener = (onCommentClick) => {
2870
2837
  ]);
2871
2838
  };
2872
2839
  var debugNodeLogger = (log8 = console.log) => {
2873
- const logTokens = (state) => (0, import_language2.syntaxTree)(state).iterate({
2840
+ const logTokens = (state) => (0, import_language.syntaxTree)(state).iterate({
2874
2841
  enter: (node) => log8(node.type)
2875
2842
  });
2876
2843
  return import_state13.StateField.define({
@@ -2878,7 +2845,7 @@ var debugNodeLogger = (log8 = console.log) => {
2878
2845
  update: (_, tr) => logTokens(tr.state)
2879
2846
  });
2880
2847
  };
2881
- var styles4 = import_view15.EditorView.theme({
2848
+ var styles4 = import_view14.EditorView.theme({
2882
2849
  ".cm-dropCursor": {
2883
2850
  borderLeft: "2px solid var(--dx-accentText)",
2884
2851
  color: "var(--dx-accentText)",
@@ -2891,8 +2858,8 @@ var styles4 = import_view15.EditorView.theme({
2891
2858
  var dropFile = (options = {}) => {
2892
2859
  return [
2893
2860
  styles4,
2894
- (0, import_view15.dropCursor)(),
2895
- import_view15.EditorView.domEventHandlers({
2861
+ (0, import_view14.dropCursor)(),
2862
+ import_view14.EditorView.domEventHandlers({
2896
2863
  drop: (event, view) => {
2897
2864
  event.preventDefault();
2898
2865
  const files = event.dataTransfer?.files;
@@ -2925,7 +2892,7 @@ var focusField = import_state15.StateField.define({
2925
2892
  });
2926
2893
  var focus = [
2927
2894
  focusField,
2928
- import_view17.EditorView.domEventHandlers({
2895
+ import_view16.EditorView.domEventHandlers({
2929
2896
  focus: (event, view) => {
2930
2897
  setTimeout(() => view.dispatch({
2931
2898
  effects: focusEffect.of(true)
@@ -2961,7 +2928,7 @@ var createBasicExtensions = (_props) => {
2961
2928
  const props = (0, import_lodash4.default)({}, _props, defaultBasicOptions);
2962
2929
  return [
2963
2930
  // NOTE: Doesn't catch errors in keymap functions.
2964
- import_view16.EditorView.exceptionSink.of((err) => {
2931
+ import_view15.EditorView.exceptionSink.of((err) => {
2965
2932
  import_log5.log.catch(err, void 0, {
2966
2933
  F: __dxlog_file8,
2967
2934
  L: 96,
@@ -2970,24 +2937,24 @@ var createBasicExtensions = (_props) => {
2970
2937
  });
2971
2938
  }),
2972
2939
  props.allowMultipleSelections && import_state14.EditorState.allowMultipleSelections.of(true),
2973
- props.bracketMatching && (0, import_language3.bracketMatching)(),
2940
+ props.bracketMatching && (0, import_language2.bracketMatching)(),
2974
2941
  props.closeBrackets && (0, import_autocomplete2.closeBrackets)(),
2975
- props.dropCursor && (0, import_view16.dropCursor)(),
2976
- props.drawSelection && (0, import_view16.drawSelection)({
2942
+ props.dropCursor && (0, import_view15.dropCursor)(),
2943
+ props.drawSelection && (0, import_view15.drawSelection)({
2977
2944
  cursorBlinkRate: 1200
2978
2945
  }),
2979
- props.editable !== void 0 && import_view16.EditorView.editable.of(props.editable),
2946
+ props.editable !== void 0 && import_view15.EditorView.editable.of(props.editable),
2980
2947
  props.focus && focus,
2981
- props.highlightActiveLine && (0, import_view16.highlightActiveLine)(),
2948
+ props.highlightActiveLine && (0, import_view15.highlightActiveLine)(),
2982
2949
  props.history && (0, import_commands2.history)(),
2983
- props.lineNumbers && (0, import_view16.lineNumbers)(),
2984
- props.lineWrapping && import_view16.EditorView.lineWrapping,
2985
- props.placeholder && (0, import_view16.placeholder)(props.placeholder),
2950
+ props.lineNumbers && (0, import_view15.lineNumbers)(),
2951
+ props.lineWrapping && import_view15.EditorView.lineWrapping,
2952
+ props.placeholder && (0, import_view15.placeholder)(props.placeholder),
2986
2953
  props.readOnly !== void 0 && import_state14.EditorState.readOnly.of(props.readOnly),
2987
- props.scrollPastEnd && (0, import_view16.scrollPastEnd)(),
2954
+ props.scrollPastEnd && (0, import_view15.scrollPastEnd)(),
2988
2955
  props.tabSize && import_state14.EditorState.tabSize.of(props.tabSize),
2989
2956
  // https://codemirror.net/docs/ref/#view.KeyBinding
2990
- import_view16.keymap.of([
2957
+ import_view15.keymap.of([
2991
2958
  ...(props.keymap && keymaps[props.keymap]) ?? [],
2992
2959
  // NOTE: Tabs are also configured by markdown extension.
2993
2960
  // https://codemirror.net/docs/ref/#commands.indentWithTab
@@ -3018,14 +2985,14 @@ var defaultThemeSlots = {
3018
2985
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
3019
2986
  const slots = (0, import_lodash4.default)({}, _slots, defaultThemeSlots);
3020
2987
  return [
3021
- import_view16.EditorView.darkTheme.of(themeMode === "dark"),
3022
- import_view16.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
2988
+ import_view15.EditorView.darkTheme.of(themeMode === "dark"),
2989
+ import_view15.EditorView.baseTheme(styles5 ? (0, import_lodash5.default)({}, defaultTheme, styles5) : defaultTheme),
3023
2990
  // https://github.com/codemirror/theme-one-dark
3024
- _syntaxHighlighting && (themeMode === "dark" ? (0, import_language3.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language3.syntaxHighlighting)(import_language3.defaultHighlightStyle)),
3025
- slots.editor?.className && import_view16.EditorView.editorAttributes.of({
2991
+ _syntaxHighlighting && (themeMode === "dark" ? (0, import_language2.syntaxHighlighting)(import_theme_one_dark.oneDarkHighlightStyle) : (0, import_language2.syntaxHighlighting)(import_language2.defaultHighlightStyle)),
2992
+ slots.editor?.className && import_view15.EditorView.editorAttributes.of({
3026
2993
  class: slots.editor.className
3027
2994
  }),
3028
- slots.content?.className && import_view16.EditorView.contentAttributes.of({
2995
+ slots.content?.className && import_view15.EditorView.contentAttributes.of({
3029
2996
  class: slots.content.className
3030
2997
  })
3031
2998
  ].filter(import_util4.isNotFalsy);
@@ -3052,18 +3019,18 @@ var createDataExtensions = ({ id, text, space, identity }) => {
3052
3019
  return extensions;
3053
3020
  };
3054
3021
  var folding = (_props = {}) => [
3055
- (0, import_language4.codeFolding)({
3022
+ (0, import_language3.codeFolding)({
3056
3023
  placeholderDOM: () => {
3057
3024
  return document.createElement("span");
3058
3025
  }
3059
3026
  }),
3060
- (0, import_language4.foldGutter)({
3027
+ (0, import_language3.foldGutter)({
3061
3028
  markerDOM: (open) => {
3062
3029
  const el = createElement("div", {
3063
3030
  className: "flex h-full items-center"
3064
3031
  });
3065
3032
  return renderRoot(el, /* @__PURE__ */ import_react5.default.createElement(import_react_ui3.Icon, {
3066
- icon: "ph--caret-right--regular",
3033
+ icon: "ph--caret-right--bold",
3067
3034
  size: 3,
3068
3035
  classNames: [
3069
3036
  "mx-3 cursor-pointer",
@@ -3072,7 +3039,7 @@ var folding = (_props = {}) => [
3072
3039
  }));
3073
3040
  }
3074
3041
  }),
3075
- import_view18.EditorView.theme({
3042
+ import_view17.EditorView.theme({
3076
3043
  ".cm-foldGutter": {
3077
3044
  opacity: 0.3,
3078
3045
  transition: "opacity 0.3s",
@@ -3085,11 +3052,11 @@ var folding = (_props = {}) => [
3085
3052
  ];
3086
3053
  var listener = ({ onFocus, onChange }) => {
3087
3054
  const extensions = [];
3088
- onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
3055
+ onFocus && extensions.push(import_view18.EditorView.focusChangeEffect.of((_, focusing) => {
3089
3056
  onFocus(focusing);
3090
3057
  return null;
3091
3058
  }));
3092
- onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
3059
+ onChange && extensions.push(import_view18.EditorView.updateListener.of((update2) => {
3093
3060
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
3094
3061
  }));
3095
3062
  return extensions;
@@ -3115,7 +3082,7 @@ var setHeading = (level) => {
3115
3082
  let prevBlock = -1;
3116
3083
  for (const range of ranges) {
3117
3084
  let sawBlock = false;
3118
- (0, import_language5.syntaxTree)(state).iterate({
3085
+ (0, import_language4.syntaxTree)(state).iterate({
3119
3086
  from: range.from,
3120
3087
  to: range.to,
3121
3088
  enter: (node) => {
@@ -3224,7 +3191,7 @@ var setStyle = (type, enable) => {
3224
3191
  let startCovered = false;
3225
3192
  let endCovered = false;
3226
3193
  let { from, to } = range;
3227
- (0, import_language5.syntaxTree)(state).iterate({
3194
+ (0, import_language4.syntaxTree)(state).iterate({
3228
3195
  from,
3229
3196
  to,
3230
3197
  enter: (node) => {
@@ -3427,7 +3394,7 @@ var insertTable = (view) => {
3427
3394
  snippets.table(view, null, from, from);
3428
3395
  };
3429
3396
  var removeLinkInner = (from, to, changes, state) => {
3430
- (0, import_language5.syntaxTree)(state).iterate({
3397
+ (0, import_language4.syntaxTree)(state).iterate({
3431
3398
  from,
3432
3399
  to,
3433
3400
  enter: (node) => {
@@ -3472,7 +3439,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3472
3439
  let { from, to } = range;
3473
3440
  const cutStyles = [];
3474
3441
  let okay = null;
3475
- (0, import_language5.syntaxTree)(state).iterate({
3442
+ (0, import_language4.syntaxTree)(state).iterate({
3476
3443
  from,
3477
3444
  to,
3478
3445
  enter: (node) => {
@@ -3567,7 +3534,7 @@ var addList = (type) => {
3567
3534
  let parentColumn = null;
3568
3535
  const blocks = [];
3569
3536
  for (const { from, to } of state.selection.ranges) {
3570
- (0, import_language5.syntaxTree)(state).iterate({
3537
+ (0, import_language4.syntaxTree)(state).iterate({
3571
3538
  from,
3572
3539
  to,
3573
3540
  enter: (node) => {
@@ -3702,7 +3669,7 @@ var removeList = (type) => {
3702
3669
  const stack = [];
3703
3670
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3704
3671
  for (const { from, to } of state.selection.ranges) {
3705
- (0, import_language5.syntaxTree)(state).iterate({
3672
+ (0, import_language4.syntaxTree)(state).iterate({
3706
3673
  from,
3707
3674
  to,
3708
3675
  enter: (node) => {
@@ -3789,7 +3756,7 @@ var setBlockquote = (enable) => {
3789
3756
  let lastBlock = -1;
3790
3757
  for (const { from, to } of state.selection.ranges) {
3791
3758
  const sawBlock = false;
3792
- (0, import_language5.syntaxTree)(state).iterate({
3759
+ (0, import_language4.syntaxTree)(state).iterate({
3793
3760
  from,
3794
3761
  to,
3795
3762
  enter: (node) => {
@@ -3879,7 +3846,7 @@ var addCodeblock = (target) => {
3879
3846
  for (const { from, to } of selection.ranges) {
3880
3847
  let blockFrom = from;
3881
3848
  let blockTo = to;
3882
- (0, import_language5.syntaxTree)(state).iterate({
3849
+ (0, import_language4.syntaxTree)(state).iterate({
3883
3850
  from,
3884
3851
  to,
3885
3852
  enter: (node) => {
@@ -3930,7 +3897,7 @@ var removeCodeblock = ({ state, dispatch }) => {
3930
3897
  let lastBlock = -1;
3931
3898
  const changes = [];
3932
3899
  for (const { from, to } of state.selection.ranges) {
3933
- (0, import_language5.syntaxTree)(state).iterate({
3900
+ (0, import_language4.syntaxTree)(state).iterate({
3934
3901
  from,
3935
3902
  to,
3936
3903
  enter: (node) => {
@@ -3980,7 +3947,7 @@ var toggleCodeblock = (target) => {
3980
3947
  };
3981
3948
  var formattingKeymap = (_options = {}) => {
3982
3949
  return [
3983
- import_view20.keymap.of([
3950
+ import_view19.keymap.of([
3984
3951
  {
3985
3952
  key: "meta-b",
3986
3953
  run: toggleStrong
@@ -4092,7 +4059,7 @@ var getFormatting = (state) => {
4092
4059
  }
4093
4060
  }
4094
4061
  }
4095
- (0, import_language5.syntaxTree)(state).iterate({
4062
+ (0, import_language4.syntaxTree)(state).iterate({
4096
4063
  from: range.from,
4097
4064
  to: range.to,
4098
4065
  enter: (node) => {
@@ -4181,7 +4148,7 @@ var getFormatting = (state) => {
4181
4148
  };
4182
4149
  };
4183
4150
  var useFormattingState = (state) => {
4184
- return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
4151
+ return (0, import_react6.useMemo)(() => import_view19.EditorView.updateListener.of((update2) => {
4185
4152
  if (update2.docChanged || update2.selectionSet) {
4186
4153
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4187
4154
  state[key] = active;
@@ -4268,7 +4235,7 @@ var markdownTagsExtensions = [
4268
4235
  }
4269
4236
  ];
4270
4237
  var markdownHighlightStyle = (_options = {}) => {
4271
- return import_language7.HighlightStyle.define([
4238
+ return import_language6.HighlightStyle.define([
4272
4239
  {
4273
4240
  tag: [
4274
4241
  import_highlight2.tags.keyword,
@@ -4432,8 +4399,8 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4432
4399
  ]
4433
4400
  }),
4434
4401
  // Custom styles.
4435
- (0, import_language6.syntaxHighlighting)(markdownHighlightStyle()),
4436
- import_view21.keymap.of([
4402
+ (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4403
+ import_view20.keymap.of([
4437
4404
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4438
4405
  import_commands3.indentWithTab,
4439
4406
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4464,12 +4431,12 @@ var convertTreeToJson = (state) => {
4464
4431
  }
4465
4432
  return node;
4466
4433
  };
4467
- return treeToJson((0, import_language8.syntaxTree)(state).cursor());
4434
+ return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4468
4435
  };
4469
4436
  var adjustChanges = () => {
4470
- return import_view23.ViewPlugin.fromClass(class {
4437
+ return import_view22.ViewPlugin.fromClass(class {
4471
4438
  update(update2) {
4472
- const tree = (0, import_language10.syntaxTree)(update2.state);
4439
+ const tree = (0, import_language9.syntaxTree)(update2.state);
4473
4440
  const adjustments = [];
4474
4441
  for (const tr of update2.transactions) {
4475
4442
  const event = tr.annotation(import_state19.Transaction.userEvent);
@@ -4609,7 +4576,7 @@ var image = (_options = {}) => {
4609
4576
  return [
4610
4577
  import_state20.StateField.define({
4611
4578
  create: (state) => {
4612
- return import_view24.Decoration.set(buildDecorations2(0, state.doc.length, state));
4579
+ return import_view23.Decoration.set(buildDecorations(0, state.doc.length, state));
4613
4580
  },
4614
4581
  update: (value, tr) => {
4615
4582
  if (!tr.docChanged && !tr.selection) {
@@ -4629,25 +4596,17 @@ var image = (_options = {}) => {
4629
4596
  filterFrom: from,
4630
4597
  filterTo: to,
4631
4598
  filter: () => false,
4632
- add: buildDecorations2(from, to, tr.state)
4599
+ add: buildDecorations(from, to, tr.state)
4633
4600
  });
4634
4601
  },
4635
- provide: (field) => import_view24.EditorView.decorations.from(field)
4602
+ provide: (field) => import_view23.EditorView.decorations.from(field)
4636
4603
  })
4637
4604
  ];
4638
4605
  };
4639
- var preloaded = /* @__PURE__ */ new Set();
4640
- var preloadImage = (url) => {
4641
- if (!preloaded.has(url)) {
4642
- const img = document.createElement("img");
4643
- img.src = url;
4644
- preloaded.add(url);
4645
- }
4646
- };
4647
- var buildDecorations2 = (from, to, state) => {
4606
+ var buildDecorations = (from, to, state) => {
4648
4607
  const decorations = [];
4649
4608
  const cursor = state.selection.main.head;
4650
- (0, import_language11.syntaxTree)(state).iterate({
4609
+ (0, import_language10.syntaxTree)(state).iterate({
4651
4610
  enter: (node) => {
4652
4611
  if (node.name === "Image") {
4653
4612
  const urlNode = node.node.getChild("URL");
@@ -4658,7 +4617,7 @@ var buildDecorations2 = (from, to, state) => {
4658
4617
  return;
4659
4618
  }
4660
4619
  preloadImage(url);
4661
- decorations.push(import_view24.Decoration.replace({
4620
+ decorations.push(import_view23.Decoration.replace({
4662
4621
  block: true,
4663
4622
  widget: new ImageWidget(url)
4664
4623
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4670,7 +4629,15 @@ var buildDecorations2 = (from, to, state) => {
4670
4629
  });
4671
4630
  return decorations;
4672
4631
  };
4673
- var ImageWidget = class extends import_view24.WidgetType {
4632
+ var preloaded = /* @__PURE__ */ new Set();
4633
+ var preloadImage = (url) => {
4634
+ if (!preloaded.has(url)) {
4635
+ const img = document.createElement("img");
4636
+ img.src = url;
4637
+ preloaded.add(url);
4638
+ }
4639
+ };
4640
+ var ImageWidget = class extends import_view23.WidgetType {
4674
4641
  constructor(_url) {
4675
4642
  super();
4676
4643
  this._url = _url;
@@ -4692,7 +4659,7 @@ var ImageWidget = class extends import_view24.WidgetType {
4692
4659
  };
4693
4660
  var bulletListIndentationWidth = 24;
4694
4661
  var orderedListIndentationWidth = 36;
4695
- var formattingStyles = import_view25.EditorView.theme({
4662
+ var formattingStyles = import_view24.EditorView.theme({
4696
4663
  /**
4697
4664
  * Horizontal rule.
4698
4665
  */
@@ -4813,7 +4780,7 @@ var table = (options = {}) => {
4813
4780
  return import_state21.StateField.define({
4814
4781
  create: (state) => update(state, options),
4815
4782
  update: (_, tr) => update(tr.state, options),
4816
- provide: (field) => import_view26.EditorView.decorations.from(field)
4783
+ provide: (field) => import_view25.EditorView.decorations.from(field)
4817
4784
  });
4818
4785
  };
4819
4786
  var update = (state, _options) => {
@@ -4825,7 +4792,7 @@ var update = (state, _options) => {
4825
4792
  const table2 = getTable();
4826
4793
  return table2.rows?.[table2.rows.length - 1];
4827
4794
  };
4828
- (0, import_language12.syntaxTree)(state).iterate({
4795
+ (0, import_language11.syntaxTree)(state).iterate({
4829
4796
  enter: (node) => {
4830
4797
  switch (node.name) {
4831
4798
  case "Table": {
@@ -4858,19 +4825,19 @@ var update = (state, _options) => {
4858
4825
  tables.forEach((table2) => {
4859
4826
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4860
4827
  if (replace) {
4861
- builder.add(table2.from, table2.to, import_view26.Decoration.replace({
4828
+ builder.add(table2.from, table2.to, import_view25.Decoration.replace({
4862
4829
  block: true,
4863
4830
  widget: new TableWidget(table2)
4864
4831
  }));
4865
4832
  } else {
4866
- builder.add(table2.from, table2.to, import_view26.Decoration.mark({
4833
+ builder.add(table2.from, table2.to, import_view25.Decoration.mark({
4867
4834
  class: "cm-table"
4868
4835
  }));
4869
4836
  }
4870
4837
  });
4871
4838
  return builder.finish();
4872
4839
  };
4873
- var TableWidget = class extends import_view26.WidgetType {
4840
+ var TableWidget = class extends import_view25.WidgetType {
4874
4841
  constructor(_table) {
4875
4842
  super();
4876
4843
  this._table = _table;
@@ -4910,14 +4877,14 @@ var Unicode = {
4910
4877
  bulletSmall: "\u2219",
4911
4878
  bulletSquare: "\u2B1D"
4912
4879
  };
4913
- var HorizontalRuleWidget = class extends import_view22.WidgetType {
4880
+ var HorizontalRuleWidget = class extends import_view21.WidgetType {
4914
4881
  toDOM() {
4915
4882
  const el = document.createElement("span");
4916
4883
  el.className = "cm-hr";
4917
4884
  return el;
4918
4885
  }
4919
4886
  };
4920
- var LinkButton = class extends import_view22.WidgetType {
4887
+ var LinkButton = class extends import_view21.WidgetType {
4921
4888
  constructor(url, render) {
4922
4889
  super();
4923
4890
  this.url = url;
@@ -4929,11 +4896,13 @@ var LinkButton = class extends import_view22.WidgetType {
4929
4896
  // TODO(burdon): Create icon and link directly without react?
4930
4897
  toDOM(view) {
4931
4898
  const el = document.createElement("span");
4932
- this.render(el, this.url);
4899
+ this.render(el, {
4900
+ url: this.url
4901
+ }, view);
4933
4902
  return el;
4934
4903
  }
4935
4904
  };
4936
- var CheckboxWidget = class extends import_view22.WidgetType {
4905
+ var CheckboxWidget = class extends import_view21.WidgetType {
4937
4906
  constructor(_checked) {
4938
4907
  super();
4939
4908
  this._checked = _checked;
@@ -4978,7 +4947,7 @@ var CheckboxWidget = class extends import_view22.WidgetType {
4978
4947
  return false;
4979
4948
  }
4980
4949
  };
4981
- var TextWidget = class extends import_view22.WidgetType {
4950
+ var TextWidget = class extends import_view21.WidgetType {
4982
4951
  constructor(text, className) {
4983
4952
  super();
4984
4953
  this.text = text;
@@ -4993,29 +4962,29 @@ var TextWidget = class extends import_view22.WidgetType {
4993
4962
  return el;
4994
4963
  }
4995
4964
  };
4996
- var hide = import_view22.Decoration.replace({});
4997
- var blockQuote = import_view22.Decoration.line({
4998
- class: (0, import_react_ui_theme7.mx)("cm-blockquote")
4965
+ var hide = import_view21.Decoration.replace({});
4966
+ var blockQuote = import_view21.Decoration.line({
4967
+ class: (0, import_react_ui_theme6.mx)("cm-blockquote")
4999
4968
  });
5000
- var fencedCodeLine = import_view22.Decoration.line({
5001
- class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line")
4969
+ var fencedCodeLine = import_view21.Decoration.line({
4970
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line")
5002
4971
  });
5003
- var fencedCodeLineFirst = import_view22.Decoration.line({
5004
- class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
4972
+ var fencedCodeLineFirst = import_view21.Decoration.line({
4973
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-first")
5005
4974
  });
5006
- var fencedCodeLineLast = import_view22.Decoration.line({
5007
- class: (0, import_react_ui_theme7.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
4975
+ var fencedCodeLineLast = import_view21.Decoration.line({
4976
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-last")
5008
4977
  });
5009
4978
  var commentBlockLine = fencedCodeLine;
5010
4979
  var commentBlockLineFirst = fencedCodeLineFirst;
5011
4980
  var commentBlockLineLast = fencedCodeLineLast;
5012
- var horizontalRule = import_view22.Decoration.replace({
4981
+ var horizontalRule = import_view21.Decoration.replace({
5013
4982
  widget: new HorizontalRuleWidget()
5014
4983
  });
5015
- var checkedTask = import_view22.Decoration.replace({
4984
+ var checkedTask = import_view21.Decoration.replace({
5016
4985
  widget: new CheckboxWidget(true)
5017
4986
  });
5018
- var uncheckedTask = import_view22.Decoration.replace({
4987
+ var uncheckedTask = import_view21.Decoration.replace({
5019
4988
  widget: new CheckboxWidget(false)
5020
4989
  });
5021
4990
  var editingRange = (state, range, focus2) => {
@@ -5030,7 +4999,7 @@ var autoHideTags = /* @__PURE__ */ new Set([
5030
4999
  "SubscriptMark",
5031
5000
  "SuperscriptMark"
5032
5001
  ]);
5033
- var buildDecorations3 = (view, options, focus2) => {
5002
+ var buildDecorations2 = (view, options, focus2) => {
5034
5003
  const deco = new import_state18.RangeSetBuilder();
5035
5004
  const atomicDeco = new import_state18.RangeSetBuilder();
5036
5005
  const { state } = view;
@@ -5038,7 +5007,7 @@ var buildDecorations3 = (view, options, focus2) => {
5038
5007
  const getHeaderLevels = (node, level) => {
5039
5008
  (0, import_invariant4.invariant)(level > 0, void 0, {
5040
5009
  F: __dxlog_file9,
5041
- L: 178,
5010
+ L: 179,
5042
5011
  S: void 0,
5043
5012
  A: [
5044
5013
  "level > 0",
@@ -5077,7 +5046,7 @@ var buildDecorations3 = (view, options, focus2) => {
5077
5046
  const getCurrentListLevel = () => {
5078
5047
  (0, import_invariant4.invariant)(listLevels.length, void 0, {
5079
5048
  F: __dxlog_file9,
5080
- L: 200,
5049
+ L: 201,
5081
5050
  S: void 0,
5082
5051
  A: [
5083
5052
  "listLevels.length",
@@ -5119,7 +5088,7 @@ var buildDecorations3 = (view, options, focus2) => {
5119
5088
  } else {
5120
5089
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
5121
5090
  if (num.length) {
5122
- atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
5091
+ atomicDeco.add(mark.from, mark.from + len, import_view21.Decoration.replace({
5123
5092
  widget: new TextWidget(num, theme.heading(level))
5124
5093
  }));
5125
5094
  }
@@ -5144,7 +5113,7 @@ var buildDecorations3 = (view, options, focus2) => {
5144
5113
  if (node.from === line.to - 1) {
5145
5114
  return false;
5146
5115
  }
5147
- deco.add(line.from, line.from, import_view22.Decoration.line({
5116
+ deco.add(line.from, line.from, import_view21.Decoration.line({
5148
5117
  class: "cm-list-item",
5149
5118
  attributes: {
5150
5119
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5161,7 +5130,7 @@ var buildDecorations3 = (view, options, focus2) => {
5161
5130
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5162
5131
  const line = state.doc.lineAt(node.from);
5163
5132
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5164
- atomicDeco.add(line.from, to, import_view22.Decoration.replace({
5133
+ atomicDeco.add(line.from, to, import_view21.Decoration.replace({
5165
5134
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5166
5135
  }));
5167
5136
  break;
@@ -5248,7 +5217,7 @@ var buildDecorations3 = (view, options, focus2) => {
5248
5217
  if (!editing) {
5249
5218
  atomicDeco.add(node.from, marks[0].to, hide);
5250
5219
  }
5251
- deco.add(marks[0].to, marks[1].from, import_view22.Decoration.mark({
5220
+ deco.add(marks[0].to, marks[1].from, import_view21.Decoration.mark({
5252
5221
  tagName: "a",
5253
5222
  attributes: {
5254
5223
  class: "cm-link",
@@ -5258,7 +5227,7 @@ var buildDecorations3 = (view, options, focus2) => {
5258
5227
  }
5259
5228
  }));
5260
5229
  if (!editing) {
5261
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view22.Decoration.replace({
5230
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view21.Decoration.replace({
5262
5231
  widget: new LinkButton(url, options.renderLinkButton)
5263
5232
  }) : hide);
5264
5233
  }
@@ -5292,7 +5261,7 @@ var buildDecorations3 = (view, options, focus2) => {
5292
5261
  }
5293
5262
  }
5294
5263
  };
5295
- const tree = (0, import_language9.syntaxTree)(state);
5264
+ const tree = (0, import_language8.syntaxTree)(state);
5296
5265
  if (options.numberedHeadings?.from === void 0) {
5297
5266
  for (const { from, to } of view.visibleRanges) {
5298
5267
  tree.iterate({
@@ -5316,13 +5285,13 @@ var buildDecorations3 = (view, options, focus2) => {
5316
5285
  var forceUpdate = import_state18.StateEffect.define();
5317
5286
  var decorateMarkdown = (options = {}) => {
5318
5287
  return [
5319
- import_view22.ViewPlugin.fromClass(class {
5288
+ import_view21.ViewPlugin.fromClass(class {
5320
5289
  constructor(view) {
5321
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(view, options, view.hasFocus));
5290
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5322
5291
  }
5323
5292
  update(update2) {
5324
5293
  if (update2.docChanged || update2.viewportChanged || update2.focusChanged || update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(forceUpdate))) || update2.selectionSet && !options.selectionChangeDelay) {
5325
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(update2.view, options, update2.view.hasFocus));
5294
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(update2.view, options, update2.view.hasFocus));
5326
5295
  this.clearUpdate();
5327
5296
  } else if (update2.selectionSet) {
5328
5297
  this.scheduleUpdate(update2.view);
@@ -5348,9 +5317,9 @@ var decorateMarkdown = (options = {}) => {
5348
5317
  }
5349
5318
  }, {
5350
5319
  provide: (plugin) => [
5351
- import_view22.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5352
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5353
- import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view22.Decoration.none)
5320
+ import_view21.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5321
+ import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5322
+ import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view21.Decoration.none)
5354
5323
  ]
5355
5324
  }),
5356
5325
  image(),
@@ -5359,9 +5328,9 @@ var decorateMarkdown = (options = {}) => {
5359
5328
  formattingStyles
5360
5329
  ];
5361
5330
  };
5362
- var linkTooltip = (render) => {
5363
- return (0, import_view27.hoverTooltip)((view, pos, side) => {
5364
- const syntax = (0, import_language13.syntaxTree)(view.state).resolveInner(pos, side);
5331
+ var linkTooltip = (renderTooltip) => {
5332
+ return (0, import_view26.hoverTooltip)((view, pos, side) => {
5333
+ const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5365
5334
  let link = null;
5366
5335
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
5367
5336
  link = node.name === "Link" ? node : null;
@@ -5374,11 +5343,14 @@ var linkTooltip = (render) => {
5374
5343
  return {
5375
5344
  pos: link.from,
5376
5345
  end: link.to,
5377
- above: true,
5346
+ // NOTE: Forcing above causes the tooltip to flicker.
5347
+ // above: true,
5378
5348
  create: () => {
5379
5349
  const el = document.createElement("div");
5380
- el.className = (0, import_react_ui_theme8.tooltipContent)({}, "pli-2 plb-1");
5381
- render(el, urlText);
5350
+ el.className = (0, import_react_ui_theme7.tooltipContent)({});
5351
+ renderTooltip(el, {
5352
+ url: urlText
5353
+ }, view);
5382
5354
  return {
5383
5355
  dom: el,
5384
5356
  offset: {
@@ -5388,6 +5360,9 @@ var linkTooltip = (render) => {
5388
5360
  };
5389
5361
  }
5390
5362
  };
5363
+ }, {
5364
+ // NOTE: 0 = default of 300ms.
5365
+ hoverTime: 1
5391
5366
  });
5392
5367
  };
5393
5368
  var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
@@ -5444,7 +5419,7 @@ var InputModeExtensions = {
5444
5419
  editorInputMode.of({
5445
5420
  type: "vscode"
5446
5421
  }),
5447
- import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5422
+ import_view27.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5448
5423
  ],
5449
5424
  vim: [
5450
5425
  // https://github.com/replit/codemirror-vim
@@ -5453,7 +5428,7 @@ var InputModeExtensions = {
5453
5428
  type: "vim",
5454
5429
  noTabster: true
5455
5430
  }),
5456
- import_view28.keymap.of([
5431
+ import_view27.keymap.of([
5457
5432
  {
5458
5433
  key: "Alt-Escape",
5459
5434
  run: (view) => {
@@ -5464,6 +5439,159 @@ var InputModeExtensions = {
5464
5439
  ])
5465
5440
  ]
5466
5441
  };
5442
+ var preview = (options = {}) => {
5443
+ return [
5444
+ // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
5445
+ // "Block decorations may not be specified via plugins"
5446
+ import_state22.StateField.define({
5447
+ create: (state) => buildDecorations3(state, options),
5448
+ update: (_, tr) => buildDecorations3(tr.state, options),
5449
+ provide: (field) => [
5450
+ import_view28.EditorView.decorations.from(field),
5451
+ import_view28.EditorView.atomicRanges.of((view) => view.state.field(field))
5452
+ ]
5453
+ }),
5454
+ import_view28.EditorView.theme({
5455
+ ".cm-preview-block": {
5456
+ marginLeft: "-1rem",
5457
+ marginRight: "-1rem",
5458
+ padding: "1rem",
5459
+ borderRadius: "0.5rem",
5460
+ background: "var(--dx-modalSurface)",
5461
+ border: "1px solid var(--dx-separator)"
5462
+ }
5463
+ })
5464
+ ];
5465
+ };
5466
+ var getLinkRef = (state, node) => {
5467
+ const mark = node.getChild("LinkMark");
5468
+ const label = node.getChild("LinkLabel");
5469
+ if (mark && label) {
5470
+ const ref = state.sliceDoc(label.from + 1, label.to - 1);
5471
+ return {
5472
+ suggest: ref.startsWith("?"),
5473
+ block: state.sliceDoc(mark.from, mark.from + 1) === "!",
5474
+ label: state.sliceDoc(mark.to, label.from - 1),
5475
+ ref: ref.startsWith("?") ? ref.slice(1) : ref
5476
+ };
5477
+ }
5478
+ };
5479
+ var buildDecorations3 = (state, options) => {
5480
+ const builder = new import_state22.RangeSetBuilder();
5481
+ (0, import_language13.syntaxTree)(state).iterate({
5482
+ enter: (node) => {
5483
+ switch (node.name) {
5484
+ //
5485
+ // Decoration.
5486
+ // [Label][dxn:echo:123]
5487
+ //
5488
+ case "Link": {
5489
+ const link = getLinkRef(state, node.node);
5490
+ if (link) {
5491
+ builder.add(node.from, node.to, import_view28.Decoration.replace({
5492
+ widget: new PreviewInlineWidget(options, link)
5493
+ }));
5494
+ }
5495
+ break;
5496
+ }
5497
+ //
5498
+ // Block widget.
5499
+ // ![Label][dxn:echo:123]
5500
+ //
5501
+ case "Image": {
5502
+ const link = getLinkRef(state, node.node);
5503
+ if (options.renderBlock && link) {
5504
+ builder.add(node.from, node.to, import_view28.Decoration.replace({
5505
+ block: true,
5506
+ // atomic: true,
5507
+ widget: new PreviewBlockWidget(options, link)
5508
+ }));
5509
+ }
5510
+ break;
5511
+ }
5512
+ }
5513
+ }
5514
+ });
5515
+ return builder.finish();
5516
+ };
5517
+ var PreviewInlineWidget = class extends import_view28.WidgetType {
5518
+ constructor(_options, _link) {
5519
+ super();
5520
+ this._options = _options;
5521
+ this._link = _link;
5522
+ }
5523
+ // override ignoreEvent() {
5524
+ // return false;
5525
+ // }
5526
+ eq(other) {
5527
+ return this._link.ref === other._link.ref && this._link.label === other._link.label;
5528
+ }
5529
+ toDOM(view) {
5530
+ const root = document.createElement("dx-ref-tag");
5531
+ root.setAttribute("label", this._link.label);
5532
+ root.setAttribute("ref", this._link.ref);
5533
+ return root;
5534
+ }
5535
+ };
5536
+ var PreviewBlockWidget = class extends import_view28.WidgetType {
5537
+ constructor(_options, _link) {
5538
+ super();
5539
+ this._options = _options;
5540
+ this._link = _link;
5541
+ }
5542
+ // override ignoreEvent() {
5543
+ // return true;
5544
+ // }
5545
+ eq(other) {
5546
+ return this._link.ref === other._link.ref;
5547
+ }
5548
+ toDOM(view) {
5549
+ const root = document.createElement("div");
5550
+ root.classList.add("cm-preview-block");
5551
+ const handleAction = (action) => {
5552
+ const pos = view.posAtDOM(root);
5553
+ const node = (0, import_language13.syntaxTree)(view.state).resolve(pos + 1).node.parent;
5554
+ if (!node) {
5555
+ return;
5556
+ }
5557
+ const link = getLinkRef(view.state, node);
5558
+ if (link?.ref !== action.link.ref) {
5559
+ return;
5560
+ }
5561
+ switch (action.type) {
5562
+ // TODO(burdon): Should we dispatch to the view or mutate the document? (i.e., handle externally?)
5563
+ // Insert ref text.
5564
+ case "insert": {
5565
+ view.dispatch({
5566
+ changes: {
5567
+ from: node.from,
5568
+ to: node.to,
5569
+ insert: action.target.text
5570
+ }
5571
+ });
5572
+ break;
5573
+ }
5574
+ // Remove ref.
5575
+ case "delete": {
5576
+ view.dispatch({
5577
+ changes: {
5578
+ from: node.from,
5579
+ to: node.to
5580
+ }
5581
+ });
5582
+ break;
5583
+ }
5584
+ }
5585
+ };
5586
+ this._options.renderBlock(root, {
5587
+ readonly: view.state.readOnly,
5588
+ link: this._link,
5589
+ onAction: handleAction,
5590
+ onLookup: this._options.onLookup
5591
+ }, view);
5592
+ return root;
5593
+ }
5594
+ };
5467
5595
  var defaultItems = [
5468
5596
  "hello world!",
5469
5597
  "this is a test.",
@@ -5526,7 +5654,7 @@ var useActionHandler = (view) => {
5526
5654
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5527
5655
  var instanceCount = 0;
5528
5656
  var useTextEditor = (props = {}, deps = []) => {
5529
- const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5657
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = (0, import_react8.useMemo)(() => (0, import_util5.getProviderValue)(props), deps ?? []);
5530
5658
  const [instanceId] = (0, import_react8.useState)(() => `text-editor-${++instanceCount}`);
5531
5659
  const [view, setView] = (0, import_react8.useState)();
5532
5660
  const parentRef = (0, import_react8.useRef)(null);
@@ -5539,7 +5667,7 @@ var useTextEditor = (props = {}, deps = []) => {
5539
5667
  doc: initialValue?.length ?? 0
5540
5668
  }, {
5541
5669
  F: __dxlog_file11,
5542
- L: 75,
5670
+ L: 76,
5543
5671
  S: void 0,
5544
5672
  C: (f, a) => f(...a)
5545
5673
  });
@@ -5555,8 +5683,8 @@ var useTextEditor = (props = {}, deps = []) => {
5555
5683
  anchor
5556
5684
  };
5557
5685
  }
5558
- const state = import_state22.EditorState.create({
5559
- doc: initialValue,
5686
+ const state = import_state23.EditorState.create({
5687
+ doc: doc ?? initialValue,
5560
5688
  // selection: initialSelection,
5561
5689
  extensions: [
5562
5690
  id && documentId.of(id),
@@ -5565,7 +5693,7 @@ var useTextEditor = (props = {}, deps = []) => {
5565
5693
  import_view30.EditorView.exceptionSink.of((err) => {
5566
5694
  import_log7.log.catch(err, void 0, {
5567
5695
  F: __dxlog_file11,
5568
- L: 97,
5696
+ L: 98,
5569
5697
  S: void 0,
5570
5698
  C: (f, a) => f(...a)
5571
5699
  });
@@ -5597,7 +5725,7 @@ var useTextEditor = (props = {}, deps = []) => {
5597
5725
  id
5598
5726
  }, {
5599
5727
  F: __dxlog_file11,
5600
- L: 134,
5728
+ L: 135,
5601
5729
  S: void 0,
5602
5730
  C: (f, a) => f(...a)
5603
5731
  });
@@ -5614,7 +5742,7 @@ var useTextEditor = (props = {}, deps = []) => {
5614
5742
  selection
5615
5743
  }, {
5616
5744
  F: __dxlog_file11,
5617
- L: 143,
5745
+ L: 144,
5618
5746
  S: void 0,
5619
5747
  C: (f, a) => f(...a)
5620
5748
  });
@@ -5697,7 +5825,10 @@ var useTextEditor = (props = {}, deps = []) => {
5697
5825
  blast,
5698
5826
  callbackWrapper,
5699
5827
  clientRectsFor,
5828
+ closeCommand,
5829
+ closeEffect,
5700
5830
  command,
5831
+ commandKeyBindings,
5701
5832
  comments,
5702
5833
  commentsState,
5703
5834
  convertTreeToJson,
@@ -5711,6 +5842,7 @@ var useTextEditor = (props = {}, deps = []) => {
5711
5842
  createElement,
5712
5843
  createExternalCommentSync,
5713
5844
  createMarkdownExtensions,
5845
+ createRenderer,
5714
5846
  createThemeExtensions,
5715
5847
  debugDispatcher,
5716
5848
  debugNodeLogger,
@@ -5724,6 +5856,7 @@ var useTextEditor = (props = {}, deps = []) => {
5724
5856
  editorGutter,
5725
5857
  editorInputMode,
5726
5858
  editorMonospace,
5859
+ editorWidth,
5727
5860
  editorWithToolbarLayout,
5728
5861
  flattenRect,
5729
5862
  focus,
@@ -5742,8 +5875,11 @@ var useTextEditor = (props = {}, deps = []) => {
5742
5875
  markdownTags,
5743
5876
  markdownTagsExtensions,
5744
5877
  mention,
5878
+ openCommand,
5879
+ openEffect,
5745
5880
  overlap,
5746
5881
  preventNewline,
5882
+ preview,
5747
5883
  processEditorPayload,
5748
5884
  removeBlockquote,
5749
5885
  removeCodeblock,