@dxos/react-ui-editor 0.8.2-main.f11618f → 0.8.2-staging.7ac8446

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