@dxos/react-ui-editor 0.8.3 → 0.8.4-main.28f8d3d

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 (174) hide show
  1. package/dist/lib/browser/chunk-22UMM3QJ.mjs +22 -0
  2. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +790 -700
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +1 -1
  7. package/dist/lib/browser/testing/index.mjs.map +2 -2
  8. package/dist/lib/browser/types/index.mjs +13 -0
  9. package/dist/lib/browser/types/index.mjs.map +7 -0
  10. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +24 -0
  11. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +7 -0
  12. package/dist/lib/node-esm/index.mjs +789 -700
  13. package/dist/lib/node-esm/index.mjs.map +4 -4
  14. package/dist/lib/node-esm/meta.json +1 -1
  15. package/dist/lib/node-esm/testing/index.mjs +1 -1
  16. package/dist/lib/node-esm/testing/index.mjs.map +2 -2
  17. package/dist/lib/node-esm/types/index.mjs +14 -0
  18. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  19. package/dist/types/src/components/Editor/Editor.d.ts +19 -0
  20. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -0
  21. package/dist/types/src/components/Editor/index.d.ts +2 -0
  22. package/dist/types/src/components/Editor/index.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  27. package/dist/types/src/components/EditorToolbar/util.d.ts +4 -3
  28. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  30. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  31. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +1 -1
  32. package/dist/types/src/components/index.d.ts +1 -0
  33. package/dist/types/src/components/index.d.ts.map +1 -1
  34. package/dist/types/src/extensions/autocomplete.d.ts +1 -1
  35. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  36. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  37. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +28 -28
  38. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  39. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  40. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  41. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  42. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  43. package/dist/types/src/extensions/blast.d.ts.map +1 -1
  44. package/dist/types/src/extensions/command/action.d.ts +1 -1
  45. package/dist/types/src/extensions/command/action.d.ts.map +1 -1
  46. package/dist/types/src/extensions/command/command-menu.d.ts +1 -1
  47. package/dist/types/src/extensions/command/command-menu.d.ts.map +1 -1
  48. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  49. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  50. package/dist/types/src/extensions/command/index.d.ts +1 -1
  51. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  52. package/dist/types/src/extensions/command/state.d.ts +1 -1
  53. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  54. package/dist/types/src/extensions/command/typeahead.d.ts +7 -2
  55. package/dist/types/src/extensions/command/typeahead.d.ts.map +1 -1
  56. package/dist/types/src/extensions/command/useCommandMenu.d.ts +1 -1
  57. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +1 -1
  58. package/dist/types/src/extensions/comments.d.ts +1 -1
  59. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  60. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  61. package/dist/types/src/extensions/factories.d.ts +19 -0
  62. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  63. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  64. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  65. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  66. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -1
  67. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  68. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  69. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  70. package/dist/types/src/extensions/modes.d.ts +0 -7
  71. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  72. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  73. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  74. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  75. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  76. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  77. package/dist/types/src/index.d.ts +1 -1
  78. package/dist/types/src/index.d.ts.map +1 -1
  79. package/dist/types/src/stories/Command.stories.d.ts.map +1 -1
  80. package/dist/types/src/stories/CommandMenu.stories.d.ts +1 -1
  81. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +1 -1
  82. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -1
  84. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  85. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  86. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  87. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  88. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  89. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  90. package/dist/types/src/stories/components/EditorStory.d.ts +2 -2
  91. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  92. package/dist/types/src/testing/util.d.ts +1 -0
  93. package/dist/types/src/testing/util.d.ts.map +1 -1
  94. package/dist/types/src/translations.d.ts +28 -29
  95. package/dist/types/src/translations.d.ts.map +1 -1
  96. package/dist/types/src/types/index.d.ts +2 -0
  97. package/dist/types/src/types/index.d.ts.map +1 -0
  98. package/dist/types/src/types/types.d.ts +21 -0
  99. package/dist/types/src/types/types.d.ts.map +1 -0
  100. package/dist/types/src/util/cursor.d.ts.map +1 -1
  101. package/dist/types/tsconfig.tsbuildinfo +1 -1
  102. package/package.json +47 -41
  103. package/src/components/Editor/Editor.tsx +39 -0
  104. package/src/components/Editor/index.ts +5 -0
  105. package/src/components/EditorToolbar/EditorToolbar.tsx +1 -1
  106. package/src/components/EditorToolbar/blocks.ts +4 -3
  107. package/src/components/EditorToolbar/formatting.ts +3 -2
  108. package/src/components/EditorToolbar/headings.ts +2 -1
  109. package/src/components/EditorToolbar/lists.ts +3 -2
  110. package/src/components/EditorToolbar/util.ts +6 -5
  111. package/src/components/EditorToolbar/view-mode.ts +3 -2
  112. package/src/components/Popover/RefDropdownMenu.tsx +10 -4
  113. package/src/components/Popover/RefPopover.tsx +4 -4
  114. package/src/components/index.ts +1 -0
  115. package/src/extensions/autocomplete.ts +3 -3
  116. package/src/extensions/automerge/automerge.stories.tsx +8 -6
  117. package/src/extensions/automerge/automerge.ts +4 -3
  118. package/src/extensions/automerge/defs.ts +1 -1
  119. package/src/extensions/automerge/sync.ts +1 -1
  120. package/src/extensions/automerge/update-automerge.ts +1 -1
  121. package/src/extensions/awareness/awareness.ts +2 -2
  122. package/src/extensions/blast.ts +3 -16
  123. package/src/extensions/command/action.ts +1 -1
  124. package/src/extensions/command/command-menu.ts +4 -3
  125. package/src/extensions/command/command.ts +3 -3
  126. package/src/extensions/command/hint.ts +2 -1
  127. package/src/extensions/command/index.ts +1 -1
  128. package/src/extensions/command/placeholder.ts +1 -1
  129. package/src/extensions/command/state.ts +4 -3
  130. package/src/extensions/command/typeahead.ts +28 -15
  131. package/src/extensions/command/useCommandMenu.ts +2 -1
  132. package/src/extensions/comments.ts +7 -6
  133. package/src/extensions/dnd.ts +1 -1
  134. package/src/extensions/factories.ts +28 -8
  135. package/src/extensions/markdown/action.ts +2 -1
  136. package/src/extensions/markdown/bundle.ts +1 -1
  137. package/src/extensions/markdown/changes.ts +1 -1
  138. package/src/extensions/markdown/decorate.ts +7 -6
  139. package/src/extensions/markdown/formatting.test.ts +7 -7
  140. package/src/extensions/markdown/formatting.ts +16 -14
  141. package/src/extensions/markdown/highlight.ts +1 -1
  142. package/src/extensions/mention.ts +1 -1
  143. package/src/extensions/modes.ts +0 -9
  144. package/src/extensions/outliner/outliner.test.ts +3 -2
  145. package/src/extensions/outliner/outliner.ts +4 -3
  146. package/src/extensions/outliner/selection.ts +1 -1
  147. package/src/extensions/outliner/tree.test.ts +2 -1
  148. package/src/extensions/outliner/tree.ts +1 -1
  149. package/src/hooks/useTextEditor.ts +3 -3
  150. package/src/index.ts +1 -1
  151. package/src/stories/Command.stories.tsx +6 -5
  152. package/src/stories/CommandMenu.stories.tsx +7 -6
  153. package/src/stories/Comments.stories.tsx +3 -2
  154. package/src/stories/EditorToolbar.stories.tsx +6 -7
  155. package/src/stories/Experimental.stories.tsx +4 -3
  156. package/src/stories/Markdown.stories.tsx +3 -2
  157. package/src/stories/Outliner.stories.tsx +4 -3
  158. package/src/stories/Preview.stories.tsx +25 -26
  159. package/src/stories/TextEditor.stories.tsx +16 -15
  160. package/src/stories/components/EditorStory.tsx +5 -5
  161. package/src/styles/theme.ts +8 -8
  162. package/src/testing/util.ts +2 -0
  163. package/src/translations.ts +4 -2
  164. package/src/types/index.ts +5 -0
  165. package/src/types/types.ts +32 -0
  166. package/src/util/cursor.ts +2 -1
  167. package/dist/lib/node/index.cjs +0 -7754
  168. package/dist/lib/node/index.cjs.map +0 -7
  169. package/dist/lib/node/meta.json +0 -1
  170. package/dist/lib/node/testing/index.cjs +0 -29
  171. package/dist/lib/node/testing/index.cjs.map +0 -7
  172. package/dist/types/src/types.d.ts +0 -14
  173. package/dist/types/src/types.d.ts.map +0 -1
  174. package/src/types.ts +0 -23
@@ -1,6 +1,13 @@
1
- // packages/ui/react-ui-editor/src/translations.ts
1
+ import {
2
+ EditorInputMode,
3
+ EditorInputModes,
4
+ EditorViewMode,
5
+ EditorViewModes
6
+ } from "./chunk-22UMM3QJ.mjs";
7
+
8
+ // src/translations.ts
2
9
  var translationKey = "react-ui-editor";
3
- var translations_default = [
10
+ var translations = [
4
11
  {
5
12
  "en-US": {
6
13
  [translationKey]: {
@@ -33,46 +40,27 @@ var translations_default = [
33
40
  }
34
41
  ];
35
42
 
36
- // packages/ui/react-ui-editor/src/index.ts
43
+ // src/index.ts
37
44
  import { EditorState as EditorState4 } from "@codemirror/state";
38
45
  import { EditorView as EditorView27, keymap as keymap14 } from "@codemirror/view";
39
46
  import { tags as tags2 } from "@lezer/highlight";
40
47
  import { TextKind } from "@dxos/protocols/proto/dxos/echo/model/text";
41
48
 
42
- // packages/ui/react-ui-editor/src/components/EditorToolbar/EditorToolbar.tsx
49
+ // src/components/Editor/Editor.tsx
43
50
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
44
- import { Rx } from "@effect-rx/rx-react";
45
- import React3, { memo, useMemo as useMemo4 } from "react";
46
- import { rxFromSignal } from "@dxos/app-graph";
47
- import { ElevationProvider } from "@dxos/react-ui";
48
- import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
51
+ import React3, { forwardRef, useImperativeHandle } from "react";
52
+ import { useThemeContext } from "@dxos/react-ui";
53
+ import { mx as mx6 } from "@dxos/react-ui-theme";
49
54
 
50
- // packages/ui/react-ui-editor/src/components/EditorToolbar/util.ts
51
- import { useMemo } from "react";
52
- import { live } from "@dxos/live-object";
53
- import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
54
- var useEditorToolbarState = (initialState = {}) => {
55
- return useMemo(() => live(initialState), []);
56
- };
57
- var createEditorAction = (id, invoke, properties) => {
58
- const { label = [
59
- `${id} label`,
60
- {
61
- ns: translationKey
62
- }
63
- ], ...rest } = properties;
64
- return createMenuAction(id, invoke, {
65
- label,
66
- ...rest
67
- });
68
- };
69
- var createEditorActionGroup = (id, props, icon) => createMenuItemGroup(id, {
70
- icon,
71
- iconOnly: true,
72
- ...props
73
- });
55
+ // src/hooks/useTextEditor.ts
56
+ import { EditorState as EditorState3 } from "@codemirror/state";
57
+ import { EditorView as EditorView26 } from "@codemirror/view";
58
+ import { useFocusableGroup } from "@fluentui/react-tabster";
59
+ import { useCallback as useCallback3, useEffect as useEffect2, useMemo as useMemo3, useRef as useRef2, useState as useState2 } from "react";
60
+ import { log as log8 } from "@dxos/log";
61
+ import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
74
62
 
75
- // packages/ui/react-ui-editor/src/extensions/annotations.ts
63
+ // src/extensions/annotations.ts
76
64
  import { RangeSetBuilder } from "@codemirror/state";
77
65
  import { Decoration, EditorView, ViewPlugin } from "@codemirror/view";
78
66
  var annotationMark = Decoration.mark({
@@ -81,9 +69,7 @@ var annotationMark = Decoration.mark({
81
69
  var annotations = ({ match } = {}) => {
82
70
  return [
83
71
  ViewPlugin.fromClass(class {
84
- constructor() {
85
- this.decorations = Decoration.none;
86
- }
72
+ decorations = Decoration.none;
87
73
  update(update2) {
88
74
  const builder = new RangeSetBuilder();
89
75
  if (match) {
@@ -113,7 +99,7 @@ var annotations = ({ match } = {}) => {
113
99
  ];
114
100
  };
115
101
 
116
- // packages/ui/react-ui-editor/src/extensions/autocomplete.ts
102
+ // src/extensions/autocomplete.ts
117
103
  import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
118
104
  import { markdownLanguage } from "@codemirror/lang-markdown";
119
105
  import { keymap } from "@codemirror/view";
@@ -150,22 +136,179 @@ var autocomplete = ({ activateOnTyping, override, onSearch } = {}) => {
150
136
  return extensions;
151
137
  };
152
138
 
153
- // packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
139
+ // src/extensions/automerge/automerge.ts
154
140
  import { next as A3 } from "@automerge/automerge";
155
141
  import { StateField } from "@codemirror/state";
156
142
  import { EditorView as EditorView2, ViewPlugin as ViewPlugin2 } from "@codemirror/view";
157
143
 
158
- // packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts
144
+ // src/util/facet.ts
145
+ import { Facet } from "@codemirror/state";
146
+ var singleValueFacet = (defaultValue) => Facet.define({
147
+ // Called immediately.
148
+ combine: (providers) => {
149
+ return providers[0] ?? defaultValue;
150
+ }
151
+ });
152
+
153
+ // src/util/cursor.ts
154
+ var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
155
+ var defaultCursorConverter = {
156
+ toCursor: (position) => position.toString(),
157
+ fromCursor: (cursor) => parseInt(cursor)
158
+ };
159
+ var Cursor = class _Cursor {
160
+ static converter = singleValueFacet(defaultCursorConverter);
161
+ static getCursorFromRange = (state, range) => {
162
+ const cursorConverter2 = state.facet(_Cursor.converter);
163
+ const from = cursorConverter2.toCursor(range.from);
164
+ const to = cursorConverter2.toCursor(range.to, -1);
165
+ return [
166
+ from,
167
+ to
168
+ ].join(":");
169
+ };
170
+ static getRangeFromCursor = (state, cursor) => {
171
+ const cursorConverter2 = state.facet(_Cursor.converter);
172
+ const parts = cursor.split(":");
173
+ const from = cursorConverter2.fromCursor(parts[0]);
174
+ const to = cursorConverter2.fromCursor(parts[1]);
175
+ return from !== void 0 && to !== void 0 ? {
176
+ from,
177
+ to
178
+ } : void 0;
179
+ };
180
+ };
181
+
182
+ // src/util/debug.ts
159
183
  import { log } from "@dxos/log";
184
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
185
+ var wrapWithCatch = (fn) => {
186
+ return (...args) => {
187
+ try {
188
+ return fn(...args);
189
+ } catch (err) {
190
+ log.catch(err, void 0, {
191
+ F: __dxlog_file,
192
+ L: 15,
193
+ S: void 0,
194
+ C: (f, a) => f(...a)
195
+ });
196
+ }
197
+ };
198
+ };
199
+ var callbackWrapper = (fn) => (...args) => {
200
+ try {
201
+ return fn(...args);
202
+ } catch (err) {
203
+ log.catch(err, void 0, {
204
+ F: __dxlog_file,
205
+ L: 29,
206
+ S: void 0,
207
+ C: (f, a) => f(...a)
208
+ });
209
+ }
210
+ };
211
+ var debugDispatcher = (trs, view) => {
212
+ logChanges(trs);
213
+ view.update(trs);
214
+ };
215
+ var logChanges = (trs) => {
216
+ const changes = trs.flatMap((tr) => {
217
+ if (tr.changes.empty) {
218
+ return void 0;
219
+ }
220
+ const changes2 = [];
221
+ tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
222
+ fromA,
223
+ toA,
224
+ fromB,
225
+ toB,
226
+ inserted: inserted.toString()
227
+ })));
228
+ return changes2;
229
+ }).filter(Boolean);
230
+ if (changes.length) {
231
+ log("changes", {
232
+ changes
233
+ }, {
234
+ F: __dxlog_file,
235
+ L: 62,
236
+ S: void 0,
237
+ C: (f, a) => f(...a)
238
+ });
239
+ }
240
+ };
241
+
242
+ // src/util/dom.ts
243
+ var flattenRect = (rect, left) => {
244
+ const x = left ? rect.left : rect.right;
245
+ return {
246
+ left: x,
247
+ right: x,
248
+ top: rect.top,
249
+ bottom: rect.bottom
250
+ };
251
+ };
252
+ var scratchRange;
253
+ var textRange = (node, from, to = from) => {
254
+ const range = scratchRange || (scratchRange = document.createRange());
255
+ range.setEnd(node, to);
256
+ range.setStart(node, from);
257
+ return range;
258
+ };
259
+ var clientRectsFor = (dom) => {
260
+ if (dom.nodeType === 3) {
261
+ return textRange(dom, 0, dom.nodeValue.length).getClientRects();
262
+ } else if (dom.nodeType === 1) {
263
+ return dom.getClientRects();
264
+ } else {
265
+ return [];
266
+ }
267
+ };
268
+ var createElement = (tag, options, children) => {
269
+ const el = document.createElement(tag);
270
+ if (options?.className) {
271
+ el.className = options.className;
272
+ }
273
+ if (options?.text) {
274
+ el.textContent = options.text;
275
+ }
276
+ if (children) {
277
+ el.append(...Array.isArray(children) ? children : [
278
+ children
279
+ ]);
280
+ }
281
+ return el;
282
+ };
283
+
284
+ // src/util/react.tsx
285
+ import React from "react";
286
+ import { createRoot } from "react-dom/client";
287
+ import { ThemeProvider, Tooltip } from "@dxos/react-ui";
288
+ import { defaultTx } from "@dxos/react-ui-theme";
289
+ var renderRoot = (root, node) => {
290
+ createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
291
+ tx: defaultTx
292
+ }, node));
293
+ return root;
294
+ };
295
+ var createRenderer = (Component) => (el, props) => {
296
+ renderRoot(el, /* @__PURE__ */ React.createElement(ThemeProvider, {
297
+ tx: defaultTx
298
+ }, /* @__PURE__ */ React.createElement(Tooltip.Provider, null, /* @__PURE__ */ React.createElement(Component, props))));
299
+ };
300
+
301
+ // src/extensions/automerge/cursor.ts
302
+ import { log as log2 } from "@dxos/log";
160
303
  import { fromCursor, toCursor } from "@dxos/react-client/echo";
161
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
304
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
162
305
  var cursorConverter = (accessor) => ({
163
306
  toCursor: (pos, assoc) => {
164
307
  try {
165
308
  return toCursor(accessor, pos, assoc);
166
309
  } catch (err) {
167
- log.catch(err, void 0, {
168
- F: __dxlog_file,
310
+ log2.catch(err, void 0, {
311
+ F: __dxlog_file2,
169
312
  L: 15,
170
313
  S: void 0,
171
314
  C: (f, a) => f(...a)
@@ -177,8 +320,8 @@ var cursorConverter = (accessor) => ({
177
320
  try {
178
321
  return fromCursor(accessor, cursor);
179
322
  } catch (err) {
180
- log.catch(err, void 0, {
181
- F: __dxlog_file,
323
+ log2.catch(err, void 0, {
324
+ F: __dxlog_file2,
182
325
  L: 24,
183
326
  S: void 0,
184
327
  C: (f, a) => f(...a)
@@ -188,7 +331,7 @@ var cursorConverter = (accessor) => ({
188
331
  }
189
332
  });
190
333
 
191
- // packages/ui/react-ui-editor/src/extensions/automerge/defs.ts
334
+ // src/extensions/automerge/defs.ts
192
335
  import { Annotation, StateEffect } from "@codemirror/state";
193
336
  var getPath = (state, field) => state.field(field).path;
194
337
  var getLastHeads = (state, field) => state.field(field).lastHeads;
@@ -201,10 +344,10 @@ var isReconcile = (tr) => {
201
344
  return !!tr.annotation(reconcileAnnotation);
202
345
  };
203
346
 
204
- // packages/ui/react-ui-editor/src/extensions/automerge/sync.ts
347
+ // src/extensions/automerge/sync.ts
205
348
  import { next as A2 } from "@automerge/automerge";
206
349
 
207
- // packages/ui/react-ui-editor/src/extensions/automerge/update-automerge.ts
350
+ // src/extensions/automerge/update-automerge.ts
208
351
  import { next as A } from "@automerge/automerge";
209
352
  var updateAutomerge = (field, handle, transactions, state) => {
210
353
  const { lastHeads, path } = state.field(field);
@@ -235,7 +378,7 @@ var updateAutomerge = (field, handle, transactions, state) => {
235
378
  return newHeads ?? void 0;
236
379
  };
237
380
 
238
- // packages/ui/react-ui-editor/src/extensions/automerge/update-codemirror.ts
381
+ // src/extensions/automerge/update-codemirror.ts
239
382
  import { ChangeSet } from "@codemirror/state";
240
383
  var updateCodeMirror = (view, selection, target, patches) => {
241
384
  for (const patch of patches) {
@@ -342,8 +485,11 @@ var charPath = (textPath, candidatePath) => {
342
485
  return null;
343
486
  };
344
487
 
345
- // packages/ui/react-ui-editor/src/extensions/automerge/sync.ts
488
+ // src/extensions/automerge/sync.ts
346
489
  var Syncer = class {
490
+ _handle;
491
+ _state;
492
+ _pending;
347
493
  // prettier-ignore
348
494
  constructor(_handle, _state) {
349
495
  this._handle = _handle;
@@ -386,170 +532,7 @@ var Syncer = class {
386
532
  }
387
533
  };
388
534
 
389
- // packages/ui/react-ui-editor/src/util/facet.ts
390
- import { Facet } from "@codemirror/state";
391
- var singleValueFacet = (defaultValue) => Facet.define({
392
- // Called immediately.
393
- combine: (providers) => {
394
- return providers[0] ?? defaultValue;
395
- }
396
- });
397
-
398
- // packages/ui/react-ui-editor/src/util/cursor.ts
399
- var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
400
- var defaultCursorConverter = {
401
- toCursor: (position) => position.toString(),
402
- fromCursor: (cursor) => parseInt(cursor)
403
- };
404
- var Cursor = class _Cursor {
405
- static {
406
- this.converter = singleValueFacet(defaultCursorConverter);
407
- }
408
- static {
409
- this.getCursorFromRange = (state, range) => {
410
- const cursorConverter2 = state.facet(_Cursor.converter);
411
- const from = cursorConverter2.toCursor(range.from);
412
- const to = cursorConverter2.toCursor(range.to, -1);
413
- return [
414
- from,
415
- to
416
- ].join(":");
417
- };
418
- }
419
- static {
420
- this.getRangeFromCursor = (state, cursor) => {
421
- const cursorConverter2 = state.facet(_Cursor.converter);
422
- const parts = cursor.split(":");
423
- const from = cursorConverter2.fromCursor(parts[0]);
424
- const to = cursorConverter2.fromCursor(parts[1]);
425
- return from !== void 0 && to !== void 0 ? {
426
- from,
427
- to
428
- } : void 0;
429
- };
430
- }
431
- };
432
-
433
- // packages/ui/react-ui-editor/src/util/debug.ts
434
- import { log as log2 } from "@dxos/log";
435
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util/debug.ts";
436
- var wrapWithCatch = (fn) => {
437
- return (...args) => {
438
- try {
439
- return fn(...args);
440
- } catch (err) {
441
- log2.catch(err, void 0, {
442
- F: __dxlog_file2,
443
- L: 15,
444
- S: void 0,
445
- C: (f, a) => f(...a)
446
- });
447
- }
448
- };
449
- };
450
- var callbackWrapper = (fn) => (...args) => {
451
- try {
452
- return fn(...args);
453
- } catch (err) {
454
- log2.catch(err, void 0, {
455
- F: __dxlog_file2,
456
- L: 29,
457
- S: void 0,
458
- C: (f, a) => f(...a)
459
- });
460
- }
461
- };
462
- var debugDispatcher = (trs, view) => {
463
- logChanges(trs);
464
- view.update(trs);
465
- };
466
- var logChanges = (trs) => {
467
- const changes = trs.flatMap((tr) => {
468
- if (tr.changes.empty) {
469
- return void 0;
470
- }
471
- const changes2 = [];
472
- tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => changes2.push(JSON.stringify({
473
- fromA,
474
- toA,
475
- fromB,
476
- toB,
477
- inserted: inserted.toString()
478
- })));
479
- return changes2;
480
- }).filter(Boolean);
481
- if (changes.length) {
482
- log2("changes", {
483
- changes
484
- }, {
485
- F: __dxlog_file2,
486
- L: 62,
487
- S: void 0,
488
- C: (f, a) => f(...a)
489
- });
490
- }
491
- };
492
-
493
- // packages/ui/react-ui-editor/src/util/dom.ts
494
- var flattenRect = (rect, left) => {
495
- const x = left ? rect.left : rect.right;
496
- return {
497
- left: x,
498
- right: x,
499
- top: rect.top,
500
- bottom: rect.bottom
501
- };
502
- };
503
- var scratchRange;
504
- var textRange = (node, from, to = from) => {
505
- const range = scratchRange || (scratchRange = document.createRange());
506
- range.setEnd(node, to);
507
- range.setStart(node, from);
508
- return range;
509
- };
510
- var clientRectsFor = (dom) => {
511
- if (dom.nodeType === 3) {
512
- return textRange(dom, 0, dom.nodeValue.length).getClientRects();
513
- } else if (dom.nodeType === 1) {
514
- return dom.getClientRects();
515
- } else {
516
- return [];
517
- }
518
- };
519
- var createElement = (tag, options, children) => {
520
- const el = document.createElement(tag);
521
- if (options?.className) {
522
- el.className = options.className;
523
- }
524
- if (options?.text) {
525
- el.textContent = options.text;
526
- }
527
- if (children) {
528
- el.append(...Array.isArray(children) ? children : [
529
- children
530
- ]);
531
- }
532
- return el;
533
- };
534
-
535
- // packages/ui/react-ui-editor/src/util/react.tsx
536
- import React from "react";
537
- import { createRoot } from "react-dom/client";
538
- import { ThemeProvider, Tooltip } from "@dxos/react-ui";
539
- import { defaultTx } from "@dxos/react-ui-theme";
540
- var renderRoot = (root, node) => {
541
- createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
542
- tx: defaultTx
543
- }, node));
544
- return root;
545
- };
546
- var createRenderer = (Component) => (el, props) => {
547
- renderRoot(el, /* @__PURE__ */ React.createElement(ThemeProvider, {
548
- tx: defaultTx
549
- }, /* @__PURE__ */ React.createElement(Tooltip.Provider, null, /* @__PURE__ */ React.createElement(Component, props))));
550
- };
551
-
552
- // packages/ui/react-ui-editor/src/extensions/automerge/automerge.ts
535
+ // src/extensions/automerge/automerge.ts
553
536
  var automerge = (accessor) => {
554
537
  const syncState = StateField.define({
555
538
  create: () => ({
@@ -587,6 +570,7 @@ var automerge = (accessor) => {
587
570
  syncState,
588
571
  // Reconcile external updates.
589
572
  ViewPlugin2.fromClass(class {
573
+ _view;
590
574
  constructor(_view) {
591
575
  this._view = _view;
592
576
  this._handleChange = () => {
@@ -597,6 +581,7 @@ var automerge = (accessor) => {
597
581
  destroy() {
598
582
  accessor.handle.removeListener("change", this._handleChange);
599
583
  }
584
+ _handleChange;
600
585
  }),
601
586
  // Reconcile local updates.
602
587
  EditorView2.updateListener.of(({ view, changes }) => {
@@ -607,12 +592,12 @@ var automerge = (accessor) => {
607
592
  ];
608
593
  };
609
594
 
610
- // packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts
595
+ // src/extensions/awareness/awareness.ts
611
596
  import { Annotation as Annotation2, RangeSet } from "@codemirror/state";
612
597
  import { Decoration as Decoration2, EditorView as EditorView3, ViewPlugin as ViewPlugin3, WidgetType } from "@codemirror/view";
613
598
  import { Event } from "@dxos/async";
614
599
  import { Context } from "@dxos/context";
615
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts";
600
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness.ts";
616
601
  var dummyProvider = {
617
602
  remoteStateChange: new Event(),
618
603
  open: () => {
@@ -635,12 +620,16 @@ var awareness = (provider = dummyProvider) => {
635
620
  ];
636
621
  };
637
622
  var RemoteSelectionsDecorator = class {
623
+ _ctx = new Context(void 0, {
624
+ F: __dxlog_file3,
625
+ L: 80
626
+ });
627
+ _cursorConverter;
628
+ _provider;
629
+ _lastAnchor;
630
+ _lastHead;
631
+ decorations = RangeSet.of([]);
638
632
  constructor(view) {
639
- this._ctx = new Context(void 0, {
640
- F: __dxlog_file3,
641
- L: 80
642
- });
643
- this.decorations = RangeSet.of([]);
644
633
  this._cursorConverter = view.state.facet(Cursor.converter);
645
634
  this._provider = view.state.facet(awarenessProvider);
646
635
  this._provider.open();
@@ -748,6 +737,8 @@ var RemoteSelectionsDecorator = class {
748
737
  }
749
738
  };
750
739
  var RemoteCaretWidget = class extends WidgetType {
740
+ _name;
741
+ _color;
751
742
  constructor(_name, _color) {
752
743
  super(), this._name = _name, this._color = _color;
753
744
  }
@@ -839,17 +830,24 @@ var styles = EditorView3.theme({
839
830
  }
840
831
  });
841
832
 
842
- // packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts
833
+ // src/extensions/awareness/awareness-provider.ts
843
834
  import { DeferredTask, Event as Event2, sleep } from "@dxos/async";
844
835
  import { Context as Context2 } from "@dxos/context";
845
836
  import { invariant } from "@dxos/invariant";
846
837
  import { log as log3 } from "@dxos/log";
847
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts";
838
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/awareness/awareness-provider.ts";
848
839
  var DEBOUNCE_INTERVAL = 100;
849
840
  var SpaceAwarenessProvider = class {
841
+ _remoteStates = /* @__PURE__ */ new Map();
842
+ _space;
843
+ _channel;
844
+ _peerId;
845
+ _info;
846
+ _ctx;
847
+ _postTask;
848
+ _localState;
849
+ remoteStateChange = new Event2();
850
850
  constructor(params) {
851
- this._remoteStates = /* @__PURE__ */ new Map();
852
- this.remoteStateChange = new Event2();
853
851
  this._space = params.space;
854
852
  this._channel = params.channel;
855
853
  this._peerId = params.peerId;
@@ -946,11 +944,12 @@ var SpaceAwarenessProvider = class {
946
944
  }
947
945
  };
948
946
 
949
- // packages/ui/react-ui-editor/src/extensions/blast.ts
947
+ // src/extensions/blast.ts
950
948
  import { EditorView as EditorView4, keymap as keymap2 } from "@codemirror/view";
951
949
  import defaultsDeep from "lodash.defaultsdeep";
950
+ import { throttle } from "@dxos/async";
952
951
  import { invariant as invariant2 } from "@dxos/invariant";
953
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
952
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
954
953
  var defaultOptions = {
955
954
  effect: 2,
956
955
  maxParticles: 200,
@@ -1044,6 +1043,18 @@ var blast = (options = defaultOptions) => {
1044
1043
  ];
1045
1044
  };
1046
1045
  var Blaster = class {
1046
+ _node;
1047
+ _options;
1048
+ _effect;
1049
+ _canvas;
1050
+ _ctx;
1051
+ _running;
1052
+ _lastTime;
1053
+ _shakeTime;
1054
+ _shakeTimeMax;
1055
+ _particles;
1056
+ _particlePointer;
1057
+ _lastPoint;
1047
1058
  constructor(_node, _options) {
1048
1059
  this._node = _node;
1049
1060
  this._options = _options;
@@ -1078,7 +1089,7 @@ var Blaster = class {
1078
1089
  initialize() {
1079
1090
  invariant2(!this._canvas && !this._ctx, void 0, {
1080
1091
  F: __dxlog_file5,
1081
- L: 141,
1092
+ L: 142,
1082
1093
  S: this,
1083
1094
  A: [
1084
1095
  "!this._canvas && !this._ctx",
@@ -1115,7 +1126,7 @@ var Blaster = class {
1115
1126
  start() {
1116
1127
  invariant2(this._canvas && this._ctx, void 0, {
1117
1128
  F: __dxlog_file5,
1118
- L: 180,
1129
+ L: 181,
1119
1130
  S: this,
1120
1131
  A: [
1121
1132
  "this._canvas && this._ctx",
@@ -1148,6 +1159,8 @@ var Blaster = class {
1148
1159
  this.drawParticles();
1149
1160
  requestAnimationFrame(this.loop.bind(this));
1150
1161
  }
1162
+ shake;
1163
+ spawn;
1151
1164
  drawParticles() {
1152
1165
  for (let i = this._particles.length; i--; i > 0) {
1153
1166
  const particle = this._particles[i];
@@ -1162,6 +1175,7 @@ var Blaster = class {
1162
1175
  }
1163
1176
  };
1164
1177
  var Effect = class {
1178
+ _options;
1165
1179
  constructor(_options) {
1166
1180
  this._options = _options;
1167
1181
  }
@@ -1219,18 +1233,6 @@ var Effect2 = class extends Effect {
1219
1233
  ctx.fill();
1220
1234
  }
1221
1235
  };
1222
- function throttle(callback, limit) {
1223
- let wait = false;
1224
- return function(...args) {
1225
- if (!wait) {
1226
- callback.apply(this, args);
1227
- wait = true;
1228
- setTimeout(() => {
1229
- wait = false;
1230
- }, limit);
1231
- }
1232
- };
1233
- }
1234
1236
  var getRGBComponents = (node, color) => {
1235
1237
  if (typeof color === "function") {
1236
1238
  return color();
@@ -1256,10 +1258,10 @@ var random = (min, max) => {
1256
1258
  return min + ~~(Math.random() * (max - min + 1));
1257
1259
  };
1258
1260
 
1259
- // packages/ui/react-ui-editor/src/extensions/command/action.ts
1261
+ // src/extensions/command/action.ts
1260
1262
  import { StateEffect as StateEffect2 } from "@codemirror/state";
1261
1263
 
1262
- // packages/ui/react-ui-editor/src/extensions/command/state.ts
1264
+ // src/extensions/command/state.ts
1263
1265
  import { StateField as StateField2 } from "@codemirror/state";
1264
1266
  import { showTooltip } from "@codemirror/view";
1265
1267
  var commandConfig = singleValueFacet();
@@ -1272,7 +1274,7 @@ var commandState = StateField2.define({
1272
1274
  }
1273
1275
  const { renderDialog } = tr.state.facet(commandConfig);
1274
1276
  if (effect.is(openEffect) && renderDialog) {
1275
- const { pos, fullWidth } = effect.value;
1277
+ const { pos, fullWidth: fullWidth2 } = effect.value;
1276
1278
  const tooltip = {
1277
1279
  pos,
1278
1280
  above: false,
@@ -1283,7 +1285,7 @@ var commandState = StateField2.define({
1283
1285
  const tooltipView = {
1284
1286
  dom: root,
1285
1287
  mount: (view2) => {
1286
- if (fullWidth) {
1288
+ if (fullWidth2) {
1287
1289
  const parent = root.parentElement;
1288
1290
  const { paddingLeft, paddingRight } = window.getComputedStyle(parent);
1289
1291
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
@@ -1329,7 +1331,7 @@ var commandState = StateField2.define({
1329
1331
  ]
1330
1332
  });
1331
1333
 
1332
- // packages/ui/react-ui-editor/src/extensions/command/action.ts
1334
+ // src/extensions/command/action.ts
1333
1335
  var openEffect = StateEffect2.define();
1334
1336
  var closeEffect = StateEffect2.define();
1335
1337
  var openCommand = (view) => {
@@ -1369,19 +1371,18 @@ var commandKeyBindings = [
1369
1371
  }
1370
1372
  ];
1371
1373
 
1372
- // packages/ui/react-ui-editor/src/extensions/command/command.ts
1374
+ // src/extensions/command/command.ts
1373
1375
  import { Prec } from "@codemirror/state";
1374
1376
  import { EditorView as EditorView6, keymap as keymap3 } from "@codemirror/view";
1375
1377
  import { isNonNullable } from "@dxos/util";
1376
1378
 
1377
- // packages/ui/react-ui-editor/src/extensions/command/hint.ts
1379
+ // src/extensions/command/hint.ts
1378
1380
  import { RangeSetBuilder as RangeSetBuilder2 } from "@codemirror/state";
1379
1381
  import { Decoration as Decoration3, EditorView as EditorView5, ViewPlugin as ViewPlugin4, WidgetType as WidgetType2 } from "@codemirror/view";
1380
1382
  var hint = ({ delay = 3e3, onHint }) => {
1381
1383
  return ViewPlugin4.fromClass(class {
1382
- constructor() {
1383
- this.decorations = Decoration3.none;
1384
- }
1384
+ decorations = Decoration3.none;
1385
+ timeout;
1385
1386
  update(update2) {
1386
1387
  if (this.timeout) {
1387
1388
  clearTimeout(this.timeout);
@@ -1420,6 +1421,7 @@ var hint = ({ delay = 3e3, onHint }) => {
1420
1421
  });
1421
1422
  };
1422
1423
  var Hint = class extends WidgetType2 {
1424
+ content;
1423
1425
  constructor(content) {
1424
1426
  super(), this.content = content;
1425
1427
  }
@@ -1458,7 +1460,7 @@ var Hint = class extends WidgetType2 {
1458
1460
  }
1459
1461
  };
1460
1462
 
1461
- // packages/ui/react-ui-editor/src/extensions/command/command.ts
1463
+ // src/extensions/command/command.ts
1462
1464
  var command = (options = {}) => {
1463
1465
  return [
1464
1466
  Prec.highest(keymap3.of(commandKeyBindings)),
@@ -1474,17 +1476,16 @@ var command = (options = {}) => {
1474
1476
  ].filter(isNonNullable);
1475
1477
  };
1476
1478
 
1477
- // packages/ui/react-ui-editor/src/extensions/command/command-menu.ts
1478
- import { RangeSetBuilder as RangeSetBuilder3, StateField as StateField3, StateEffect as StateEffect3, Prec as Prec2 } from "@codemirror/state";
1479
- import { EditorView as EditorView8, ViewPlugin as ViewPlugin6, Decoration as Decoration5, keymap as keymap4 } from "@codemirror/view";
1479
+ // src/extensions/command/command-menu.ts
1480
+ import { Prec as Prec2, RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect3, StateField as StateField3 } from "@codemirror/state";
1481
+ import { Decoration as Decoration5, EditorView as EditorView8, ViewPlugin as ViewPlugin6, keymap as keymap4 } from "@codemirror/view";
1480
1482
 
1481
- // packages/ui/react-ui-editor/src/extensions/command/placeholder.ts
1482
- import { Decoration as Decoration4, EditorView as EditorView7, WidgetType as WidgetType3, ViewPlugin as ViewPlugin5 } from "@codemirror/view";
1483
+ // src/extensions/command/placeholder.ts
1484
+ import { Decoration as Decoration4, EditorView as EditorView7, ViewPlugin as ViewPlugin5, WidgetType as WidgetType3 } from "@codemirror/view";
1483
1485
  var placeholder = ({ delay = 3e3, content }) => {
1484
1486
  const plugin = ViewPlugin5.fromClass(class {
1485
- constructor() {
1486
- this.decorations = Decoration4.none;
1487
- }
1487
+ decorations = Decoration4.none;
1488
+ timeout;
1488
1489
  update(update2) {
1489
1490
  if (this.timeout) {
1490
1491
  window.clearTimeout(this.timeout);
@@ -1526,6 +1527,7 @@ var placeholder = ({ delay = 3e3, content }) => {
1526
1527
  ] : plugin;
1527
1528
  };
1528
1529
  var Placeholder = class extends WidgetType3 {
1530
+ content;
1529
1531
  constructor(content) {
1530
1532
  super(), this.content = content;
1531
1533
  }
@@ -1560,9 +1562,11 @@ var Placeholder = class extends WidgetType3 {
1560
1562
  }
1561
1563
  };
1562
1564
 
1563
- // packages/ui/react-ui-editor/src/extensions/command/command-menu.ts
1565
+ // src/extensions/command/command-menu.ts
1564
1566
  var commandMenu = (options) => {
1565
1567
  const commandMenuPlugin = ViewPlugin6.fromClass(class {
1568
+ view;
1569
+ decorations;
1566
1570
  constructor(view) {
1567
1571
  this.view = view;
1568
1572
  this.decorations = Decoration5.none;
@@ -1717,11 +1721,15 @@ var commandMenuState = StateField3.define({
1717
1721
  }
1718
1722
  });
1719
1723
 
1720
- // packages/ui/react-ui-editor/src/extensions/command/floating-menu.ts
1724
+ // src/extensions/command/floating-menu.ts
1721
1725
  import { EditorView as EditorView9, ViewPlugin as ViewPlugin7 } from "@codemirror/view";
1722
1726
  import { addEventListener } from "@dxos/async";
1723
1727
  var floatingMenu = (options = {}) => [
1724
1728
  ViewPlugin7.fromClass(class {
1729
+ view;
1730
+ tag;
1731
+ rafId;
1732
+ cleanup;
1725
1733
  constructor(view) {
1726
1734
  this.view = view;
1727
1735
  const container = view.scrollDOM;
@@ -1803,11 +1811,94 @@ var floatingMenu = (options = {}) => [
1803
1811
  width: "2rem",
1804
1812
  height: "2rem"
1805
1813
  }
1806
- })
1807
- ];
1814
+ })
1815
+ ];
1816
+
1817
+ // src/extensions/command/typeahead.ts
1818
+ import { EditorSelection, Prec as Prec3, RangeSetBuilder as RangeSetBuilder4 } from "@codemirror/state";
1819
+ import { Decoration as Decoration6, ViewPlugin as ViewPlugin8, keymap as keymap5 } from "@codemirror/view";
1820
+ var typeahead = ({ onComplete } = {}) => {
1821
+ let hint2;
1822
+ const complete = (view) => {
1823
+ if (!hint2) {
1824
+ return false;
1825
+ }
1826
+ const selection = view.state.selection.main;
1827
+ view.dispatch({
1828
+ changes: [
1829
+ {
1830
+ from: selection.from,
1831
+ to: selection.to,
1832
+ insert: hint2
1833
+ }
1834
+ ],
1835
+ selection: EditorSelection.cursor(selection.from + hint2.length)
1836
+ });
1837
+ return true;
1838
+ };
1839
+ return [
1840
+ ViewPlugin8.fromClass(class {
1841
+ decorations = Decoration6.none;
1842
+ update(update2) {
1843
+ const builder = new RangeSetBuilder4();
1844
+ const selection = update2.view.state.selection.main;
1845
+ const line = update2.view.state.doc.lineAt(selection.from);
1846
+ if (selection.from === selection.to && selection.from === line.to) {
1847
+ const str = update2.state.sliceDoc(line.from, selection.from);
1848
+ hint2 = onComplete?.({
1849
+ line: str
1850
+ });
1851
+ if (hint2) {
1852
+ builder.add(selection.from, selection.to, Decoration6.widget({
1853
+ widget: new Hint(hint2)
1854
+ }));
1855
+ }
1856
+ }
1857
+ this.decorations = builder.finish();
1858
+ }
1859
+ }, {
1860
+ decorations: (v) => v.decorations
1861
+ }),
1862
+ // Keys.
1863
+ Prec3.highest(keymap5.of([
1864
+ {
1865
+ key: "Tab",
1866
+ preventDefault: true,
1867
+ run: complete
1868
+ },
1869
+ {
1870
+ key: "ArrowRight",
1871
+ preventDefault: true,
1872
+ run: complete
1873
+ }
1874
+ ]))
1875
+ ];
1876
+ };
1877
+ var staticCompletion = (completions, options = {}) => ({ line }) => {
1878
+ if (line.length === 0 && options.default) {
1879
+ return options.default;
1880
+ }
1881
+ const parts = line.split(/\s+/).filter(Boolean);
1882
+ if (parts.length) {
1883
+ const str = parts.at(-1);
1884
+ if (str.length >= (options.minLength ?? 0)) {
1885
+ for (const completion of completions) {
1886
+ const match = matchCompletion(completion, str);
1887
+ if (match) {
1888
+ return match;
1889
+ }
1890
+ }
1891
+ }
1892
+ }
1893
+ };
1894
+ var matchCompletion = (completion, str, minLength = 0) => {
1895
+ if (str.length >= minLength && completion.length > str.length && completion.startsWith(str)) {
1896
+ return completion.slice(str.length);
1897
+ }
1898
+ };
1808
1899
 
1809
- // packages/ui/react-ui-editor/src/extensions/command/useCommandMenu.ts
1810
- import { useCallback, useMemo as useMemo2, useRef, useState } from "react";
1900
+ // src/extensions/command/useCommandMenu.ts
1901
+ import { useCallback, useMemo, useRef, useState } from "react";
1811
1902
  var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu }) => {
1812
1903
  const triggerRef = useRef(null);
1813
1904
  const currentRef = useRef(null);
@@ -1855,7 +1946,7 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu })
1855
1946
  void item.onSelect?.(view, selection.head);
1856
1947
  }, []);
1857
1948
  const serializedTrigger = Array.isArray(trigger) ? trigger.join(",") : trigger;
1858
- const _commandMenu = useMemo2(() => {
1949
+ const _commandMenu = useMemo(() => {
1859
1950
  return commandMenu({
1860
1951
  trigger,
1861
1952
  placeholder: placeholder3,
@@ -1907,106 +1998,23 @@ var useCommandMenu = ({ viewRef, trigger, placeholder: placeholder3, getMenu })
1907
1998
  };
1908
1999
  };
1909
2000
 
1910
- // packages/ui/react-ui-editor/src/extensions/command/typeahead.ts
1911
- import { EditorSelection, Prec as Prec3, RangeSetBuilder as RangeSetBuilder4 } from "@codemirror/state";
1912
- import { Decoration as Decoration6, keymap as keymap5, ViewPlugin as ViewPlugin8 } from "@codemirror/view";
1913
- var typeahead = ({ onComplete } = {}) => {
1914
- let hint2;
1915
- const complete = (view) => {
1916
- if (!hint2) {
1917
- return false;
1918
- }
1919
- const selection = view.state.selection.main;
1920
- view.dispatch({
1921
- changes: [
1922
- {
1923
- from: selection.from,
1924
- to: selection.to,
1925
- insert: hint2
1926
- }
1927
- ],
1928
- selection: EditorSelection.cursor(selection.from + hint2.length)
1929
- });
1930
- return true;
1931
- };
1932
- return [
1933
- ViewPlugin8.fromClass(class {
1934
- constructor() {
1935
- this.decorations = Decoration6.none;
1936
- }
1937
- update(update2) {
1938
- const builder = new RangeSetBuilder4();
1939
- const selection = update2.view.state.selection.main;
1940
- const line = update2.view.state.doc.lineAt(selection.from);
1941
- if (selection.from === selection.to && selection.from === line.to) {
1942
- const str = update2.state.sliceDoc(line.from, selection.from);
1943
- hint2 = onComplete?.({
1944
- line: str
1945
- });
1946
- if (hint2) {
1947
- builder.add(selection.from, selection.to, Decoration6.widget({
1948
- widget: new Hint(hint2)
1949
- }));
1950
- }
1951
- }
1952
- this.decorations = builder.finish();
1953
- }
1954
- }, {
1955
- decorations: (v) => v.decorations
1956
- }),
1957
- // Keys.
1958
- Prec3.highest(keymap5.of([
1959
- {
1960
- key: "Tab",
1961
- preventDefault: true,
1962
- run: complete
1963
- },
1964
- {
1965
- key: "ArrowRight",
1966
- preventDefault: true,
1967
- run: complete
1968
- }
1969
- ]))
1970
- ];
1971
- };
1972
- var staticCompletion = (completions, defaultCompletion) => ({ line }) => {
1973
- if (line.length === 0 && defaultCompletion) {
1974
- return defaultCompletion;
1975
- }
1976
- const words = line.split(/\s+/).filter(Boolean);
1977
- if (words.length) {
1978
- const word = words.at(-1);
1979
- for (const completion of completions) {
1980
- const match = matchCompletion(completion, word);
1981
- if (match) {
1982
- return match;
1983
- }
1984
- }
1985
- }
1986
- };
1987
- var matchCompletion = (completion, word) => {
1988
- if (completion.length > word.length && completion.startsWith(word)) {
1989
- return completion.slice(word.length);
1990
- }
1991
- };
1992
-
1993
- // packages/ui/react-ui-editor/src/extensions/comments.ts
2001
+ // src/extensions/comments.ts
1994
2002
  import { invertedEffects } from "@codemirror/commands";
1995
2003
  import { StateEffect as StateEffect4, StateField as StateField4 } from "@codemirror/state";
1996
- import { hoverTooltip, keymap as keymap7, Decoration as Decoration7, EditorView as EditorView11, ViewPlugin as ViewPlugin9 } from "@codemirror/view";
2004
+ import { Decoration as Decoration7, EditorView as EditorView11, ViewPlugin as ViewPlugin9, hoverTooltip, keymap as keymap7 } from "@codemirror/view";
1997
2005
  import sortBy from "lodash.sortby";
1998
2006
  import { useEffect } from "react";
1999
2007
  import { debounce as debounce2 } from "@dxos/async";
2000
2008
  import { log as log4 } from "@dxos/log";
2001
2009
  import { isNonNullable as isNonNullable2 } from "@dxos/util";
2002
2010
 
2003
- // packages/ui/react-ui-editor/src/extensions/selection.ts
2011
+ // src/extensions/selection.ts
2004
2012
  import { Transaction } from "@codemirror/state";
2005
2013
  import { EditorView as EditorView10, keymap as keymap6 } from "@codemirror/view";
2006
2014
  import { debounce } from "@dxos/async";
2007
2015
  import { invariant as invariant3 } from "@dxos/invariant";
2008
2016
  import { isNotFalsy } from "@dxos/util";
2009
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
2017
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
2010
2018
  var documentId = singleValueFacet();
2011
2019
  var stateRestoreAnnotation = "dxos.org/cm/state-restore";
2012
2020
  var createEditorStateTransaction = ({ scrollTo, selection }) => {
@@ -2093,8 +2101,8 @@ var selectionState = ({ getState, setState } = {}) => {
2093
2101
  ].filter(isNotFalsy);
2094
2102
  };
2095
2103
 
2096
- // packages/ui/react-ui-editor/src/extensions/comments.ts
2097
- var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2104
+ // src/extensions/comments.ts
2105
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
2098
2106
  var setComments = StateEffect4.define();
2099
2107
  var setSelection = StateEffect4.define();
2100
2108
  var setCommentState = StateEffect4.define();
@@ -2165,7 +2173,7 @@ var commentsDecorations = EditorView11.decorations.compute([
2165
2173
  if (!range) {
2166
2174
  log4.warn("Invalid range:", range, {
2167
2175
  F: __dxlog_file7,
2168
- L: 135,
2176
+ L: 136,
2169
2177
  S: void 0,
2170
2178
  C: (f, a) => f(...a)
2171
2179
  });
@@ -2480,10 +2488,8 @@ var scrollThreadIntoView = (view, id, center = true) => {
2480
2488
  }
2481
2489
  };
2482
2490
  var ExternalCommentSync = class {
2491
+ unsubscribe;
2483
2492
  constructor(view, id, subscribe, getComments) {
2484
- this.destroy = () => {
2485
- this.unsubscribe();
2486
- };
2487
2493
  const updateComments = () => {
2488
2494
  const comments2 = getComments();
2489
2495
  if (id === view.state.facet(documentId)) {
@@ -2497,6 +2503,9 @@ var ExternalCommentSync = class {
2497
2503
  };
2498
2504
  this.unsubscribe = subscribe(updateComments);
2499
2505
  }
2506
+ destroy = () => {
2507
+ this.unsubscribe();
2508
+ };
2500
2509
  };
2501
2510
  var createExternalCommentSync = (id, subscribe, getComments) => ViewPlugin9.fromClass(class {
2502
2511
  constructor(view) {
@@ -2518,7 +2527,7 @@ var useComments = (view, id, comments2) => {
2518
2527
  });
2519
2528
  };
2520
2529
 
2521
- // packages/ui/react-ui-editor/src/extensions/debug.ts
2530
+ // src/extensions/debug.ts
2522
2531
  import { syntaxTree } from "@codemirror/language";
2523
2532
  import { StateField as StateField5 } from "@codemirror/state";
2524
2533
  var debugNodeLogger = (log9 = console.log) => {
@@ -2531,8 +2540,8 @@ var debugNodeLogger = (log9 = console.log) => {
2531
2540
  });
2532
2541
  };
2533
2542
 
2534
- // packages/ui/react-ui-editor/src/extensions/dnd.ts
2535
- import { dropCursor, EditorView as EditorView12 } from "@codemirror/view";
2543
+ // src/extensions/dnd.ts
2544
+ import { EditorView as EditorView12, dropCursor } from "@codemirror/view";
2536
2545
  var styles3 = EditorView12.theme({
2537
2546
  ".cm-dropCursor": {
2538
2547
  borderLeft: "2px solid var(--dx-accentText)",
@@ -2567,7 +2576,7 @@ var dropFile = (options = {}) => {
2567
2576
  ];
2568
2577
  };
2569
2578
 
2570
- // packages/ui/react-ui-editor/src/extensions/factories.ts
2579
+ // src/extensions/factories.ts
2571
2580
  import { closeBrackets, closeBracketsKeymap } from "@codemirror/autocomplete";
2572
2581
  import { defaultKeymap, history, historyKeymap, indentWithTab, standardKeymap } from "@codemirror/commands";
2573
2582
  import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
@@ -2581,42 +2590,11 @@ import { generateName } from "@dxos/display-name";
2581
2590
  import { log as log5 } from "@dxos/log";
2582
2591
  import { hexToHue, isNotFalsy as isNotFalsy2 } from "@dxos/util";
2583
2592
 
2584
- // packages/ui/react-ui-editor/src/extensions/focus.ts
2585
- import { StateEffect as StateEffect5, StateField as StateField6 } from "@codemirror/state";
2593
+ // src/defaults.ts
2586
2594
  import { EditorView as EditorView13 } from "@codemirror/view";
2587
- var focusEffect = StateEffect5.define();
2588
- var focusField = StateField6.define({
2589
- create: () => false,
2590
- update: (value, tr) => {
2591
- for (const effect of tr.effects) {
2592
- if (effect.is(focusEffect)) {
2593
- return effect.value;
2594
- }
2595
- }
2596
- return value;
2597
- }
2598
- });
2599
- var focus = [
2600
- focusField,
2601
- EditorView13.domEventHandlers({
2602
- focus: (event, view) => {
2603
- setTimeout(() => view.dispatch({
2604
- effects: focusEffect.of(true)
2605
- }));
2606
- },
2607
- blur: (event, view) => {
2608
- setTimeout(() => view.dispatch({
2609
- effects: focusEffect.of(false)
2610
- }));
2611
- }
2612
- })
2613
- ];
2614
-
2615
- // packages/ui/react-ui-editor/src/defaults.ts
2616
- import { EditorView as EditorView14 } from "@codemirror/view";
2617
2595
  import { mx as mx2 } from "@dxos/react-ui-theme";
2618
2596
 
2619
- // packages/ui/react-ui-editor/src/styles/markdown.ts
2597
+ // src/styles/markdown.ts
2620
2598
  import { mx } from "@dxos/react-ui-theme";
2621
2599
  var headings = {
2622
2600
  1: "text-4xl",
@@ -2635,7 +2613,7 @@ var theme = {
2635
2613
  }
2636
2614
  };
2637
2615
 
2638
- // packages/ui/react-ui-editor/src/styles/tokens.ts
2616
+ // src/styles/tokens.ts
2639
2617
  import { tokens } from "@dxos/react-ui-theme";
2640
2618
  import { get } from "@dxos/util";
2641
2619
  var getToken = (path, defaultValue) => {
@@ -2645,7 +2623,7 @@ var getToken = (path, defaultValue) => {
2645
2623
  var fontBody = getToken("fontFamily.body");
2646
2624
  var fontMono = getToken("fontFamily.mono");
2647
2625
 
2648
- // packages/ui/react-ui-editor/src/styles/theme.ts
2626
+ // src/styles/theme.ts
2649
2627
  var defaultTheme = {
2650
2628
  "&": {},
2651
2629
  "&.cm-focused": {
@@ -2680,18 +2658,17 @@ var defaultTheme = {
2680
2658
  ".cm-gutter": {},
2681
2659
  ".cm-gutter.cm-lineNumbers": {
2682
2660
  paddingRight: "4px",
2683
- borderRight: "1px solid var(--dx-separator)"
2661
+ borderRight: "1px solid var(--dx-subduedSeparator)"
2684
2662
  },
2685
2663
  ".cm-gutter.cm-lineNumbers .cm-gutterElement": {
2686
- minWidth: "40px",
2687
- alignContent: "center"
2664
+ minWidth: "40px"
2688
2665
  },
2689
2666
  /**
2690
- * Height is set to match the corresponding line.
2667
+ * Height is set to match the corresponding line (which may have wrapped).
2691
2668
  */
2692
2669
  ".cm-gutterElement": {
2693
- alignItems: "center",
2694
- fontSize: "12px"
2670
+ fontSize: "12px",
2671
+ lineHeight: "24px"
2695
2672
  },
2696
2673
  /**
2697
2674
  * Line.
@@ -2709,7 +2686,7 @@ var defaultTheme = {
2709
2686
  borderLeft: "2px solid var(--dx-cmCursor)"
2710
2687
  },
2711
2688
  ".cm-placeholder": {
2712
- color: "var(--dx-subdued)"
2689
+ color: "var(--dx-placeholder)"
2713
2690
  },
2714
2691
  /**
2715
2692
  * Selection (layer).
@@ -2751,7 +2728,7 @@ var defaultTheme = {
2751
2728
  * Tooltip.
2752
2729
  */
2753
2730
  ".cm-tooltip": {
2754
- background: "var(--dx-baseSurface)"
2731
+ background: "var(--dx-modalSurface)"
2755
2732
  },
2756
2733
  ".cm-tooltip-below": {},
2757
2734
  /**
@@ -2771,7 +2748,8 @@ var defaultTheme = {
2771
2748
  padding: "4px"
2772
2749
  },
2773
2750
  ".cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]": {
2774
- background: "var(--dx-hoverSurface)"
2751
+ background: "var(--dx-accentSurface)",
2752
+ color: "var(--dx-accentSurfaceText)"
2775
2753
  },
2776
2754
  ".cm-tooltip.cm-tooltip-autocomplete > ul > completion-section": {
2777
2755
  paddingLeft: "4px !important",
@@ -2825,7 +2803,7 @@ var defaultTheme = {
2825
2803
  outline: "1px solid transparent"
2826
2804
  },
2827
2805
  ".cm-panel input, .cm-panel button": {
2828
- backgroundColor: "var(--dx-input)"
2806
+ backgroundColor: "var(--dx-inputSurface)"
2829
2807
  },
2830
2808
  ".cm-panel input:focus, .cm-panel button:focus": {
2831
2809
  outline: "1px solid var(--dx-neutralFocusIndicator)"
@@ -2857,7 +2835,7 @@ var defaultTheme = {
2857
2835
  }
2858
2836
  };
2859
2837
 
2860
- // packages/ui/react-ui-editor/src/defaults.ts
2838
+ // src/defaults.ts
2861
2839
  var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
2862
2840
  var editorSlots = {
2863
2841
  scroll: {
@@ -2867,13 +2845,13 @@ var editorSlots = {
2867
2845
  className: editorWidth
2868
2846
  }
2869
2847
  };
2870
- var editorGutter = EditorView14.theme({
2848
+ var editorGutter = EditorView13.theme({
2871
2849
  ".cm-gutters": {
2872
2850
  background: "var(--dx-baseSurface)",
2873
2851
  paddingRight: "1rem"
2874
2852
  }
2875
2853
  });
2876
- var editorMonospace = EditorView14.theme({
2854
+ var editorMonospace = EditorView13.theme({
2877
2855
  ".cm-content": {
2878
2856
  fontFamily: fontMono
2879
2857
  }
@@ -2881,8 +2859,39 @@ var editorMonospace = EditorView14.theme({
2881
2859
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
2882
2860
  var stackItemContentEditorClassNames = (role) => mx2("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");
2883
2861
 
2884
- // packages/ui/react-ui-editor/src/extensions/factories.ts
2885
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2862
+ // src/extensions/focus.ts
2863
+ import { StateEffect as StateEffect5, StateField as StateField6 } from "@codemirror/state";
2864
+ import { EditorView as EditorView14 } from "@codemirror/view";
2865
+ var focusEffect = StateEffect5.define();
2866
+ var focusField = StateField6.define({
2867
+ create: () => false,
2868
+ update: (value, tr) => {
2869
+ for (const effect of tr.effects) {
2870
+ if (effect.is(focusEffect)) {
2871
+ return effect.value;
2872
+ }
2873
+ }
2874
+ return value;
2875
+ }
2876
+ });
2877
+ var focus = [
2878
+ focusField,
2879
+ EditorView14.domEventHandlers({
2880
+ focus: (event, view) => {
2881
+ setTimeout(() => view.dispatch({
2882
+ effects: focusEffect.of(true)
2883
+ }));
2884
+ },
2885
+ blur: (event, view) => {
2886
+ setTimeout(() => view.dispatch({
2887
+ effects: focusEffect.of(false)
2888
+ }));
2889
+ }
2890
+ })
2891
+ ];
2892
+
2893
+ // src/extensions/factories.ts
2894
+ var __dxlog_file8 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
2886
2895
  var preventNewline = EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
2887
2896
  var defaultBasicOptions = {
2888
2897
  allowMultipleSelections: true,
@@ -2893,7 +2902,7 @@ var defaultBasicOptions = {
2893
2902
  history: true,
2894
2903
  keymap: "standard",
2895
2904
  lineWrapping: true,
2896
- search: true
2905
+ search: false
2897
2906
  };
2898
2907
  var keymaps = {
2899
2908
  // https://codemirror.net/docs/ref/#commands.standardKeymap
@@ -2908,7 +2917,7 @@ var createBasicExtensions = (_props) => {
2908
2917
  EditorView15.exceptionSink.of((err) => {
2909
2918
  log5.catch(err, void 0, {
2910
2919
  F: __dxlog_file8,
2911
- L: 100,
2920
+ L: 101,
2912
2921
  S: void 0,
2913
2922
  C: (f, a) => f(...a)
2914
2923
  });
@@ -2958,11 +2967,17 @@ var createBasicExtensions = (_props) => {
2958
2967
  ].filter(isNotFalsy2))
2959
2968
  ].filter(isNotFalsy2);
2960
2969
  };
2961
- var defaultThemeSlots = {
2970
+ var grow = {
2962
2971
  editor: {
2963
- className: "w-full bs-full"
2972
+ className: "is-full bs-full"
2964
2973
  }
2965
2974
  };
2975
+ var fullWidth = {
2976
+ editor: {
2977
+ className: "is-full"
2978
+ }
2979
+ };
2980
+ var defaultThemeSlots = grow;
2966
2981
  var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2967
2982
  const slots = defaultsDeep2({}, _slots, defaultThemeSlots);
2968
2983
  return [
@@ -2980,6 +2995,11 @@ var createThemeExtensions = ({ themeMode, styles: styles4, syntaxHighlighting: _
2980
2995
  constructor(view) {
2981
2996
  view.scrollDOM.classList.add(slots.scroll.className);
2982
2997
  }
2998
+ }),
2999
+ slots.scroller?.className && ViewPlugin10.fromClass(class {
3000
+ constructor(view) {
3001
+ view.dom.querySelector(".cm-scroller")?.classList.add(...slots.scroller.className.split(" "));
3002
+ }
2983
3003
  })
2984
3004
  ].filter(isNotFalsy2);
2985
3005
  };
@@ -3005,7 +3025,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
3005
3025
  return extensions;
3006
3026
  };
3007
3027
 
3008
- // packages/ui/react-ui-editor/src/extensions/folding.tsx
3028
+ // src/extensions/folding.tsx
3009
3029
  import { codeFolding, foldGutter } from "@codemirror/language";
3010
3030
  import { EditorView as EditorView16 } from "@codemirror/view";
3011
3031
  import React2 from "react";
@@ -3043,10 +3063,11 @@ var folding = (_props = {}) => [
3043
3063
  })
3044
3064
  ];
3045
3065
 
3046
- // packages/ui/react-ui-editor/src/extensions/hashtag.tsx
3066
+ // src/extensions/hashtag.tsx
3047
3067
  import { Decoration as Decoration8, EditorView as EditorView17, MatchDecorator, ViewPlugin as ViewPlugin11, WidgetType as WidgetType4 } from "@codemirror/view";
3048
3068
  import { getHashColor, mx as mx3 } from "@dxos/react-ui-theme";
3049
3069
  var TagWidget = class extends WidgetType4 {
3070
+ _text;
3050
3071
  constructor(_text) {
3051
3072
  super(), this._text = _text;
3052
3073
  }
@@ -3065,6 +3086,7 @@ var tagMatcher = new MatchDecorator({
3065
3086
  });
3066
3087
  var hashtag = () => [
3067
3088
  ViewPlugin11.fromClass(class {
3089
+ tags;
3068
3090
  constructor(view) {
3069
3091
  this.tags = tagMatcher.createDeco(view);
3070
3092
  }
@@ -3086,7 +3108,7 @@ var hashtag = () => [
3086
3108
  })
3087
3109
  ];
3088
3110
 
3089
- // packages/ui/react-ui-editor/src/extensions/json.ts
3111
+ // src/extensions/json.ts
3090
3112
  import { json, jsonParseLinter } from "@codemirror/lang-json";
3091
3113
  import { linter } from "@codemirror/lint";
3092
3114
  import Ajv from "ajv";
@@ -3131,7 +3153,7 @@ var schemaLinter = (validate) => (view) => {
3131
3153
  }
3132
3154
  };
3133
3155
 
3134
- // packages/ui/react-ui-editor/src/extensions/listener.ts
3156
+ // src/extensions/listener.ts
3135
3157
  import { EditorView as EditorView18 } from "@codemirror/view";
3136
3158
  var listener = ({ onFocus, onChange }) => {
3137
3159
  const extensions = [];
@@ -3145,12 +3167,13 @@ var listener = ({ onFocus, onChange }) => {
3145
3167
  return extensions;
3146
3168
  };
3147
3169
 
3148
- // packages/ui/react-ui-editor/src/extensions/markdown/formatting.ts
3170
+ // src/extensions/markdown/formatting.ts
3149
3171
  import { snippet } from "@codemirror/autocomplete";
3150
3172
  import { syntaxTree as syntaxTree2 } from "@codemirror/language";
3151
3173
  import { EditorSelection as EditorSelection2 } from "@codemirror/state";
3152
3174
  import { EditorView as EditorView19, keymap as keymap9 } from "@codemirror/view";
3153
- import { useMemo as useMemo3 } from "react";
3175
+ import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
3176
+ import { debounceAndThrottle } from "@dxos/async";
3154
3177
  var formattingEquals = (a, b) => a.blockType === b.blockType && a.strong === b.strong && a.emphasis === b.emphasis && a.strikethrough === b.strikethrough && a.code === b.code && a.link === b.link && a.listStyle === b.listStyle && a.blockQuote === b.blockQuote;
3155
3178
  var Inline = /* @__PURE__ */ function(Inline2) {
3156
3179
  Inline2[Inline2["Strong"] = 0] = "Strong";
@@ -4238,16 +4261,21 @@ var getFormatting = (state) => {
4238
4261
  };
4239
4262
  };
4240
4263
  var useFormattingState = (state) => {
4241
- return useMemo3(() => EditorView19.updateListener.of((update2) => {
4264
+ const handleUpdate = useCallback2(debounceAndThrottle((update2) => {
4242
4265
  if (update2.docChanged || update2.selectionSet) {
4243
4266
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4244
4267
  state[key] = active;
4245
4268
  });
4246
4269
  }
4247
- }), []);
4270
+ }, 100), [
4271
+ state
4272
+ ]);
4273
+ return useMemo2(() => EditorView19.updateListener.of(handleUpdate), [
4274
+ handleUpdate
4275
+ ]);
4248
4276
  };
4249
4277
 
4250
- // packages/ui/react-ui-editor/src/extensions/markdown/action.ts
4278
+ // src/extensions/markdown/action.ts
4251
4279
  var processEditorPayload = (view, { type, data }) => {
4252
4280
  let inlineType, listType;
4253
4281
  switch (type) {
@@ -4296,19 +4324,19 @@ var processEditorPayload = (view, { type, data }) => {
4296
4324
  });
4297
4325
  };
4298
4326
 
4299
- // packages/ui/react-ui-editor/src/extensions/markdown/bundle.ts
4327
+ // src/extensions/markdown/bundle.ts
4300
4328
  import { completionKeymap as completionKeymap2 } from "@codemirror/autocomplete";
4301
4329
  import { defaultKeymap as defaultKeymap2, indentWithTab as indentWithTab2 } from "@codemirror/commands";
4302
- import { markdownLanguage as markdownLanguage3, markdown } from "@codemirror/lang-markdown";
4330
+ import { markdown, markdownLanguage as markdownLanguage3 } from "@codemirror/lang-markdown";
4303
4331
  import { syntaxHighlighting as syntaxHighlighting2 } from "@codemirror/language";
4304
4332
  import { languages } from "@codemirror/language-data";
4305
4333
  import { keymap as keymap10 } from "@codemirror/view";
4306
4334
  import { isNotFalsy as isNotFalsy3 } from "@dxos/util";
4307
4335
 
4308
- // packages/ui/react-ui-editor/src/extensions/markdown/highlight.ts
4336
+ // src/extensions/markdown/highlight.ts
4309
4337
  import { markdownLanguage as markdownLanguage2 } from "@codemirror/lang-markdown";
4310
4338
  import { HighlightStyle } from "@codemirror/language";
4311
- import { tags, styleTags, Tag } from "@lezer/highlight";
4339
+ import { Tag, styleTags, tags } from "@lezer/highlight";
4312
4340
  import { Table } from "@lezer/markdown";
4313
4341
  var markdownTags = {
4314
4342
  Blockquote: Tag.define(),
@@ -4484,7 +4512,7 @@ var markdownHighlightStyle = (_options = {}) => {
4484
4512
  });
4485
4513
  };
4486
4514
 
4487
- // packages/ui/react-ui-editor/src/extensions/markdown/bundle.ts
4515
+ // src/extensions/markdown/bundle.ts
4488
4516
  var createMarkdownExtensions = (options = {}) => {
4489
4517
  return [
4490
4518
  // Main extension.
@@ -4519,7 +4547,7 @@ var createMarkdownExtensions = (options = {}) => {
4519
4547
  ];
4520
4548
  };
4521
4549
 
4522
- // packages/ui/react-ui-editor/src/extensions/markdown/debug.ts
4550
+ // src/extensions/markdown/debug.ts
4523
4551
  import { syntaxTree as syntaxTree3 } from "@codemirror/language";
4524
4552
  import { StateField as StateField7 } from "@codemirror/state";
4525
4553
  var debugTree = (cb) => StateField7.define({
@@ -4546,14 +4574,14 @@ var convertTreeToJson = (state) => {
4546
4574
  return treeToJson(syntaxTree3(state).cursor());
4547
4575
  };
4548
4576
 
4549
- // packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
4577
+ // src/extensions/markdown/decorate.ts
4550
4578
  import { syntaxTree as syntaxTree7 } from "@codemirror/language";
4551
4579
  import { RangeSetBuilder as RangeSetBuilder6, StateEffect as StateEffect6 } from "@codemirror/state";
4552
- import { EditorView as EditorView23, Decoration as Decoration11, WidgetType as WidgetType7, ViewPlugin as ViewPlugin13 } from "@codemirror/view";
4580
+ import { Decoration as Decoration11, EditorView as EditorView23, ViewPlugin as ViewPlugin13, WidgetType as WidgetType7 } from "@codemirror/view";
4553
4581
  import { invariant as invariant4 } from "@dxos/invariant";
4554
4582
  import { mx as mx4 } from "@dxos/react-ui-theme";
4555
4583
 
4556
- // packages/ui/react-ui-editor/src/extensions/markdown/changes.ts
4584
+ // src/extensions/markdown/changes.ts
4557
4585
  import { syntaxTree as syntaxTree4 } from "@codemirror/language";
4558
4586
  import { Transaction as Transaction2 } from "@codemirror/state";
4559
4587
  import { ViewPlugin as ViewPlugin12 } from "@codemirror/view";
@@ -4697,7 +4725,7 @@ var getValidUrl = (str) => {
4697
4725
  }
4698
4726
  };
4699
4727
 
4700
- // packages/ui/react-ui-editor/src/extensions/markdown/image.ts
4728
+ // src/extensions/markdown/image.ts
4701
4729
  import { syntaxTree as syntaxTree5 } from "@codemirror/language";
4702
4730
  import { StateField as StateField8 } from "@codemirror/state";
4703
4731
  import { Decoration as Decoration9, EditorView as EditorView20, WidgetType as WidgetType5 } from "@codemirror/view";
@@ -4767,6 +4795,7 @@ var preloadImage = (url) => {
4767
4795
  }
4768
4796
  };
4769
4797
  var ImageWidget = class extends WidgetType5 {
4798
+ _url;
4770
4799
  constructor(_url) {
4771
4800
  super(), this._url = _url;
4772
4801
  }
@@ -4786,7 +4815,7 @@ var ImageWidget = class extends WidgetType5 {
4786
4815
  }
4787
4816
  };
4788
4817
 
4789
- // packages/ui/react-ui-editor/src/extensions/markdown/styles.ts
4818
+ // src/extensions/markdown/styles.ts
4790
4819
  import { EditorView as EditorView21 } from "@codemirror/view";
4791
4820
  var bulletListIndentationWidth = 24;
4792
4821
  var orderedListIndentationWidth = 36;
@@ -4909,7 +4938,7 @@ var formattingStyles = EditorView21.theme({
4909
4938
  }
4910
4939
  });
4911
4940
 
4912
- // packages/ui/react-ui-editor/src/extensions/markdown/table.ts
4941
+ // src/extensions/markdown/table.ts
4913
4942
  import { syntaxTree as syntaxTree6 } from "@codemirror/language";
4914
4943
  import { RangeSetBuilder as RangeSetBuilder5, StateField as StateField9 } from "@codemirror/state";
4915
4944
  import { Decoration as Decoration10, EditorView as EditorView22, WidgetType as WidgetType6 } from "@codemirror/view";
@@ -4975,6 +5004,7 @@ var update = (state, _options) => {
4975
5004
  return builder.finish();
4976
5005
  };
4977
5006
  var TableWidget = class extends WidgetType6 {
5007
+ _table;
4978
5008
  constructor(_table) {
4979
5009
  super(), this._table = _table;
4980
5010
  }
@@ -5007,8 +5037,8 @@ var TableWidget = class extends WidgetType6 {
5007
5037
  }
5008
5038
  };
5009
5039
 
5010
- // packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
5011
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
5040
+ // src/extensions/markdown/decorate.ts
5041
+ var __dxlog_file9 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
5012
5042
  var Unicode = {
5013
5043
  emDash: "\u2014",
5014
5044
  bullet: "\u2022",
@@ -5023,6 +5053,8 @@ var HorizontalRuleWidget = class extends WidgetType7 {
5023
5053
  }
5024
5054
  };
5025
5055
  var LinkButton = class extends WidgetType7 {
5056
+ url;
5057
+ render;
5026
5058
  constructor(url, render) {
5027
5059
  super(), this.url = url, this.render = render;
5028
5060
  }
@@ -5039,6 +5071,7 @@ var LinkButton = class extends WidgetType7 {
5039
5071
  }
5040
5072
  };
5041
5073
  var CheckboxWidget = class extends WidgetType7 {
5074
+ _checked;
5042
5075
  constructor(_checked) {
5043
5076
  super(), this._checked = _checked;
5044
5077
  }
@@ -5083,6 +5116,8 @@ var CheckboxWidget = class extends WidgetType7 {
5083
5116
  }
5084
5117
  };
5085
5118
  var TextWidget = class extends WidgetType7 {
5119
+ text;
5120
+ className;
5086
5121
  constructor(text, className) {
5087
5122
  super(), this.text = text, this.className = className;
5088
5123
  }
@@ -5140,7 +5175,7 @@ var buildDecorations2 = (view, options, focus2) => {
5140
5175
  const getHeaderLevels = (node, level) => {
5141
5176
  invariant4(level > 0, void 0, {
5142
5177
  F: __dxlog_file9,
5143
- L: 179,
5178
+ L: 180,
5144
5179
  S: void 0,
5145
5180
  A: [
5146
5181
  "level > 0",
@@ -5179,7 +5214,7 @@ var buildDecorations2 = (view, options, focus2) => {
5179
5214
  const getCurrentListLevel = () => {
5180
5215
  invariant4(listLevels.length, void 0, {
5181
5216
  F: __dxlog_file9,
5182
- L: 201,
5217
+ L: 202,
5183
5218
  S: void 0,
5184
5219
  A: [
5185
5220
  "listLevels.length",
@@ -5419,6 +5454,9 @@ var forceUpdate = StateEffect6.define();
5419
5454
  var decorateMarkdown = (options = {}) => {
5420
5455
  return [
5421
5456
  ViewPlugin13.fromClass(class {
5457
+ deco;
5458
+ atomicDeco;
5459
+ pendingUpdate;
5422
5460
  constructor(view) {
5423
5461
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5424
5462
  }
@@ -5462,7 +5500,7 @@ var decorateMarkdown = (options = {}) => {
5462
5500
  ];
5463
5501
  };
5464
5502
 
5465
- // packages/ui/react-ui-editor/src/extensions/markdown/link.ts
5503
+ // src/extensions/markdown/link.ts
5466
5504
  import { syntaxTree as syntaxTree8 } from "@codemirror/language";
5467
5505
  import { hoverTooltip as hoverTooltip2 } from "@codemirror/view";
5468
5506
  import { tooltipContent } from "@dxos/react-ui-theme";
@@ -5504,10 +5542,10 @@ var linkTooltip = (renderTooltip) => {
5504
5542
  });
5505
5543
  };
5506
5544
 
5507
- // packages/ui/react-ui-editor/src/extensions/mention.ts
5545
+ // src/extensions/mention.ts
5508
5546
  import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
5509
5547
  import { log as log6 } from "@dxos/log";
5510
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5548
+ var __dxlog_file10 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
5511
5549
  var mention = ({ debug, onSearch }) => {
5512
5550
  return autocompletion2({
5513
5551
  // TODO(burdon): Not working.
@@ -5542,23 +5580,10 @@ var mention = ({ debug, onSearch }) => {
5542
5580
  });
5543
5581
  };
5544
5582
 
5545
- // packages/ui/react-ui-editor/src/extensions/modes.ts
5583
+ // src/extensions/modes.ts
5546
5584
  import { keymap as keymap11 } from "@codemirror/view";
5547
5585
  import { vim } from "@replit/codemirror-vim";
5548
5586
  import { vscodeKeymap } from "@replit/codemirror-vscode-keymap";
5549
- import { Schema } from "effect";
5550
- var EditorViewModes = [
5551
- "preview",
5552
- "readonly",
5553
- "source"
5554
- ];
5555
- var EditorViewMode = Schema.Union(...EditorViewModes.map((mode) => Schema.Literal(mode)));
5556
- var EditorInputModes = [
5557
- "default",
5558
- "vim",
5559
- "vscode"
5560
- ];
5561
- var EditorInputMode = Schema.Union(...EditorInputModes.map((mode) => Schema.Literal(mode)));
5562
5587
  var editorInputMode = singleValueFacet({});
5563
5588
  var InputModeExtensions = {
5564
5589
  default: [],
@@ -5588,21 +5613,21 @@ var InputModeExtensions = {
5588
5613
  ]
5589
5614
  };
5590
5615
 
5591
- // packages/ui/react-ui-editor/src/extensions/outliner/commands.ts
5616
+ // src/extensions/outliner/commands.ts
5592
5617
  import { indentMore } from "@codemirror/commands";
5593
5618
  import { getIndentUnit } from "@codemirror/language";
5594
5619
  import { EditorSelection as EditorSelection3 } from "@codemirror/state";
5595
5620
  import { keymap as keymap12 } from "@codemirror/view";
5596
5621
 
5597
- // packages/ui/react-ui-editor/src/extensions/outliner/selection.ts
5622
+ // src/extensions/outliner/selection.ts
5598
5623
  import { Compartment, Facet as Facet3 } from "@codemirror/state";
5599
5624
 
5600
- // packages/ui/react-ui-editor/src/extensions/outliner/tree.ts
5625
+ // src/extensions/outliner/tree.ts
5601
5626
  import { syntaxTree as syntaxTree9 } from "@codemirror/language";
5602
5627
  import { StateField as StateField10 } from "@codemirror/state";
5603
5628
  import { Facet as Facet2 } from "@codemirror/state";
5604
5629
  import { invariant as invariant5 } from "@dxos/invariant";
5605
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/tree.ts";
5630
+ var __dxlog_file11 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/tree.ts";
5606
5631
  var itemToJSON = ({ type, index, level, lineRange, contentRange, children }) => {
5607
5632
  return {
5608
5633
  type,
@@ -5614,11 +5639,14 @@ var itemToJSON = ({ type, index, level, lineRange, contentRange, children }) =>
5614
5639
  };
5615
5640
  };
5616
5641
  var Tree = class {
5642
+ type = "root";
5643
+ index = -1;
5644
+ level = -1;
5645
+ node;
5646
+ lineRange;
5647
+ contentRange;
5648
+ children = [];
5617
5649
  constructor(node) {
5618
- this.type = "root";
5619
- this.index = -1;
5620
- this.level = -1;
5621
- this.children = [];
5622
5650
  this.node = node;
5623
5651
  this.lineRange = {
5624
5652
  from: node.from,
@@ -5896,7 +5924,7 @@ var outlinerTree = (options = {}) => {
5896
5924
  ];
5897
5925
  };
5898
5926
 
5899
- // packages/ui/react-ui-editor/src/extensions/outliner/selection.ts
5927
+ // src/extensions/outliner/selection.ts
5900
5928
  var getSelection = (state) => state.selection.main;
5901
5929
  var selectionEquals = (a, b) => a.length === b.length && a.every((i) => b.includes(i));
5902
5930
  var selectionFacet = Facet3.define({
@@ -5926,7 +5954,7 @@ var selectDown = (view) => {
5926
5954
  return true;
5927
5955
  };
5928
5956
 
5929
- // packages/ui/react-ui-editor/src/extensions/outliner/commands.ts
5957
+ // src/extensions/outliner/commands.ts
5930
5958
  var indentItemMore = (view) => {
5931
5959
  const pos = getSelection(view.state).from;
5932
5960
  const tree = view.state.facet(treeFacet);
@@ -6160,16 +6188,16 @@ var commands = () => keymap12.of([
6160
6188
  }
6161
6189
  ]);
6162
6190
 
6163
- // packages/ui/react-ui-editor/src/extensions/outliner/outliner.ts
6191
+ // src/extensions/outliner/outliner.ts
6164
6192
  import { Prec as Prec4 } from "@codemirror/state";
6165
6193
  import { Decoration as Decoration12, EditorView as EditorView24, ViewPlugin as ViewPlugin15 } from "@codemirror/view";
6166
6194
  import { mx as mx5 } from "@dxos/react-ui-theme";
6167
6195
 
6168
- // packages/ui/react-ui-editor/src/extensions/outliner/editor.ts
6196
+ // src/extensions/outliner/editor.ts
6169
6197
  import { EditorSelection as EditorSelection4, EditorState as EditorState2 } from "@codemirror/state";
6170
6198
  import { ViewPlugin as ViewPlugin14 } from "@codemirror/view";
6171
6199
  import { log as log7 } from "@dxos/log";
6172
- var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
6200
+ var __dxlog_file12 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
6173
6201
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
6174
6202
  var initialize = () => {
6175
6203
  return ViewPlugin14.fromClass(class {
@@ -6354,7 +6382,7 @@ var editor = () => [
6354
6382
  })
6355
6383
  ];
6356
6384
 
6357
- // packages/ui/react-ui-editor/src/extensions/outliner/outliner.ts
6385
+ // src/extensions/outliner/outliner.ts
6358
6386
  var outliner = (options = {}) => [
6359
6387
  // Commands.
6360
6388
  Prec4.highest(commands()),
@@ -6379,8 +6407,8 @@ var outliner = (options = {}) => [
6379
6407
  ];
6380
6408
  var decorations = () => [
6381
6409
  ViewPlugin15.fromClass(class {
6410
+ decorations = Decoration12.none;
6382
6411
  constructor(view) {
6383
- this.decorations = Decoration12.none;
6384
6412
  this.updateDecorations(view.state, view);
6385
6413
  }
6386
6414
  update(update2) {
@@ -6446,7 +6474,7 @@ var decorations = () => [
6446
6474
  }))
6447
6475
  ];
6448
6476
 
6449
- // packages/ui/react-ui-editor/src/extensions/preview/preview.ts
6477
+ // src/extensions/preview/preview.ts
6450
6478
  import "@dxos/lit-ui/dx-ref-tag.pcss";
6451
6479
  import { syntaxTree as syntaxTree10 } from "@codemirror/language";
6452
6480
  import { RangeSetBuilder as RangeSetBuilder7, StateField as StateField11 } from "@codemirror/state";
@@ -6517,6 +6545,8 @@ var buildDecorations3 = (state, options) => {
6517
6545
  return builder.finish();
6518
6546
  };
6519
6547
  var PreviewInlineWidget = class extends WidgetType8 {
6548
+ _options;
6549
+ _link;
6520
6550
  constructor(_options, _link) {
6521
6551
  super(), this._options = _options, this._link = _link;
6522
6552
  }
@@ -6534,6 +6564,8 @@ var PreviewInlineWidget = class extends WidgetType8 {
6534
6564
  }
6535
6565
  };
6536
6566
  var PreviewBlockWidget = class extends WidgetType8 {
6567
+ _options;
6568
+ _link;
6537
6569
  constructor(_options, _link) {
6538
6570
  super(), this._options = _options, this._link = _link;
6539
6571
  }
@@ -6554,7 +6586,7 @@ var PreviewBlockWidget = class extends WidgetType8 {
6554
6586
  }
6555
6587
  };
6556
6588
 
6557
- // packages/ui/react-ui-editor/src/extensions/typewriter.ts
6589
+ // src/extensions/typewriter.ts
6558
6590
  import { keymap as keymap13 } from "@codemirror/view";
6559
6591
  var defaultItems = [
6560
6592
  "hello world!",
@@ -6607,11 +6639,218 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6607
6639
  return true;
6608
6640
  }
6609
6641
  }
6610
- ])
6611
- ];
6642
+ ])
6643
+ ];
6644
+ };
6645
+
6646
+ // src/hooks/useTextEditor.ts
6647
+ var __dxlog_file13 = "/__w/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
6648
+ var instanceCount = 0;
6649
+ var useTextEditor = (props = {}, deps = []) => {
6650
+ const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo3(() => getProviderValue(props), deps ?? []);
6651
+ const [instanceId] = useState2(() => `text-editor-${++instanceCount}`);
6652
+ const [view, setView] = useState2();
6653
+ const parentRef = useRef2(null);
6654
+ useEffect2(() => {
6655
+ let view2;
6656
+ if (parentRef.current) {
6657
+ log8("create", {
6658
+ id,
6659
+ instanceId,
6660
+ doc: initialValue?.length ?? 0
6661
+ }, {
6662
+ F: __dxlog_file13,
6663
+ L: 75,
6664
+ S: void 0,
6665
+ C: (f, a) => f(...a)
6666
+ });
6667
+ let initialSelection;
6668
+ if (selection?.anchor && initialValue?.length) {
6669
+ if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {
6670
+ initialSelection = selection;
6671
+ }
6672
+ } else if (moveToEndOfLine && selection === void 0) {
6673
+ const index = initialValue?.indexOf("\n");
6674
+ const anchor = !index || index === -1 ? 0 : index;
6675
+ initialSelection = {
6676
+ anchor
6677
+ };
6678
+ }
6679
+ const state = EditorState3.create({
6680
+ doc: doc ?? initialValue,
6681
+ // selection: initialSelection,
6682
+ extensions: [
6683
+ id && documentId.of(id),
6684
+ extensions,
6685
+ // NOTE: This doesn't catch errors in keymap functions.
6686
+ EditorView26.exceptionSink.of((err) => {
6687
+ log8.catch(err, void 0, {
6688
+ F: __dxlog_file13,
6689
+ L: 97,
6690
+ S: void 0,
6691
+ C: (f, a) => f(...a)
6692
+ });
6693
+ })
6694
+ ].filter(isNotFalsy4)
6695
+ });
6696
+ view2 = new EditorView26({
6697
+ parent: parentRef.current,
6698
+ state,
6699
+ scrollTo: scrollTo ? EditorView26.scrollIntoView(scrollTo, {
6700
+ yMargin: 96
6701
+ }) : void 0,
6702
+ dispatchTransactions: debug ? debugDispatcher : void 0
6703
+ });
6704
+ if (moveToEndOfLine && !initialSelection) {
6705
+ const { to } = view2.state.doc.lineAt(0);
6706
+ if (to) {
6707
+ view2.dispatch({
6708
+ selection: {
6709
+ anchor: to
6710
+ }
6711
+ });
6712
+ }
6713
+ }
6714
+ setView(view2);
6715
+ }
6716
+ return () => {
6717
+ log8("destroy", {
6718
+ id
6719
+ }, {
6720
+ F: __dxlog_file13,
6721
+ L: 134,
6722
+ S: void 0,
6723
+ C: (f, a) => f(...a)
6724
+ });
6725
+ view2?.destroy();
6726
+ };
6727
+ }, deps);
6728
+ useEffect2(() => {
6729
+ if (view) {
6730
+ if (scrollTo || selection) {
6731
+ if (selection && selection.anchor > view.state.doc.length) {
6732
+ log8.warn("invalid selection", {
6733
+ length: view.state.doc.length,
6734
+ scrollTo,
6735
+ selection
6736
+ }, {
6737
+ F: __dxlog_file13,
6738
+ L: 143,
6739
+ S: void 0,
6740
+ C: (f, a) => f(...a)
6741
+ });
6742
+ return;
6743
+ }
6744
+ view.dispatch(createEditorStateTransaction({
6745
+ scrollTo,
6746
+ selection
6747
+ }));
6748
+ }
6749
+ }
6750
+ }, [
6751
+ view,
6752
+ scrollTo,
6753
+ selection
6754
+ ]);
6755
+ useEffect2(() => {
6756
+ if (view && autoFocus) {
6757
+ view.focus();
6758
+ }
6759
+ }, [
6760
+ autoFocus,
6761
+ view
6762
+ ]);
6763
+ const focusableGroupAttrs = useFocusableGroup({
6764
+ tabBehavior: "limited",
6765
+ ignoreDefaultKeydown: {
6766
+ Escape: view?.state.facet(editorInputMode).noTabster
6767
+ }
6768
+ });
6769
+ const handleKeyUp = useCallback3((event) => {
6770
+ const { key, target, currentTarget } = event;
6771
+ if (target === currentTarget) {
6772
+ switch (key) {
6773
+ case "Enter": {
6774
+ view?.focus();
6775
+ break;
6776
+ }
6777
+ }
6778
+ }
6779
+ }, [
6780
+ view
6781
+ ]);
6782
+ return {
6783
+ parentRef,
6784
+ view,
6785
+ focusAttributes: {
6786
+ tabIndex: 0,
6787
+ ...focusableGroupAttrs,
6788
+ onKeyUp: handleKeyUp
6789
+ }
6790
+ };
6791
+ };
6792
+
6793
+ // src/components/Editor/Editor.tsx
6794
+ var Editor = /* @__PURE__ */ forwardRef(({ classNames, id, text, ...props }, forwardedRef) => {
6795
+ var _effect = _useSignals();
6796
+ try {
6797
+ const { themeMode } = useThemeContext();
6798
+ const { parentRef, focusAttributes, view } = useTextEditor(() => ({
6799
+ id,
6800
+ initialValue: text.content,
6801
+ ...props
6802
+ }), [
6803
+ id,
6804
+ text,
6805
+ themeMode
6806
+ ]);
6807
+ useImperativeHandle(forwardedRef, () => view, [
6808
+ view
6809
+ ]);
6810
+ return /* @__PURE__ */ React3.createElement("div", {
6811
+ ref: parentRef,
6812
+ className: mx6(classNames),
6813
+ ...focusAttributes
6814
+ });
6815
+ } finally {
6816
+ _effect.f();
6817
+ }
6818
+ });
6819
+
6820
+ // src/components/EditorToolbar/EditorToolbar.tsx
6821
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
6822
+ import { Rx } from "@effect-rx/rx-react";
6823
+ import React4, { memo, useMemo as useMemo5 } from "react";
6824
+ import { rxFromSignal } from "@dxos/app-graph";
6825
+ import { ElevationProvider } from "@dxos/react-ui";
6826
+ import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
6827
+
6828
+ // src/components/EditorToolbar/util.ts
6829
+ import { useMemo as useMemo4 } from "react";
6830
+ import { live } from "@dxos/live-object";
6831
+ import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
6832
+ var useEditorToolbarState = (initialState = {}) => {
6833
+ return useMemo4(() => live(initialState), []);
6834
+ };
6835
+ var createEditorAction = (id, invoke, properties) => {
6836
+ const { label = [
6837
+ `${id} label`,
6838
+ {
6839
+ ns: translationKey
6840
+ }
6841
+ ], ...rest } = properties;
6842
+ return createMenuAction(id, invoke, {
6843
+ label,
6844
+ ...rest
6845
+ });
6612
6846
  };
6847
+ var createEditorActionGroup = (id, props, icon) => createMenuItemGroup(id, {
6848
+ icon,
6849
+ iconOnly: true,
6850
+ ...props
6851
+ });
6613
6852
 
6614
- // packages/ui/react-ui-editor/src/components/EditorToolbar/blocks.ts
6853
+ // src/components/EditorToolbar/blocks.ts
6615
6854
  var createBlockGroupAction = (value) => createEditorActionGroup("block", {
6616
6855
  variant: "toggleGroup",
6617
6856
  selectCardinality: "single",
@@ -6669,7 +6908,7 @@ var createBlocks = (state, getView) => {
6669
6908
  };
6670
6909
  };
6671
6910
 
6672
- // packages/ui/react-ui-editor/src/components/EditorToolbar/formatting.ts
6911
+ // src/components/EditorToolbar/formatting.ts
6673
6912
  var formats = {
6674
6913
  strong: "ph--text-b--regular",
6675
6914
  emphasis: "ph--text-italic--regular",
@@ -6721,7 +6960,7 @@ var createFormatting = (state, getView) => {
6721
6960
  };
6722
6961
  };
6723
6962
 
6724
- // packages/ui/react-ui-editor/src/components/EditorToolbar/headings.ts
6963
+ // src/components/EditorToolbar/headings.ts
6725
6964
  var createHeadingGroupAction = (value) => createEditorActionGroup("heading", {
6726
6965
  variant: "dropdownMenu",
6727
6966
  applyActive: true,
@@ -6776,7 +7015,7 @@ var createHeadings = (state, getView) => {
6776
7015
  };
6777
7016
  };
6778
7017
 
6779
- // packages/ui/react-ui-editor/src/components/EditorToolbar/image.ts
7018
+ // src/components/EditorToolbar/image.ts
6780
7019
  var createImageUploadAction = (onImageUpload) => createEditorAction("image", onImageUpload, {
6781
7020
  testId: "editor.toolbar.image",
6782
7021
  icon: "ph--image-square--regular"
@@ -6793,7 +7032,7 @@ var createImageUpload = (onImageUpload) => ({
6793
7032
  ]
6794
7033
  });
6795
7034
 
6796
- // packages/ui/react-ui-editor/src/components/EditorToolbar/lists.ts
7035
+ // src/components/EditorToolbar/lists.ts
6797
7036
  var listStyles = {
6798
7037
  bullet: "ph--list-bullets--regular",
6799
7038
  ordered: "ph--list-numbers--regular",
@@ -6844,7 +7083,7 @@ var createLists = (state, getView) => {
6844
7083
  };
6845
7084
  };
6846
7085
 
6847
- // packages/ui/react-ui-editor/src/components/EditorToolbar/search.ts
7086
+ // src/components/EditorToolbar/search.ts
6848
7087
  import { openSearchPanel } from "@codemirror/search";
6849
7088
  var createSearchAction = (getView) => createEditorAction("search", () => openSearchPanel(getView()), {
6850
7089
  testId: "editor.toolbar.search",
@@ -6862,7 +7101,7 @@ var createSearch = (getView) => ({
6862
7101
  ]
6863
7102
  });
6864
7103
 
6865
- // packages/ui/react-ui-editor/src/components/EditorToolbar/view-mode.ts
7104
+ // src/components/EditorToolbar/view-mode.ts
6866
7105
  var createViewModeGroupAction = (value) => createEditorActionGroup("viewMode", {
6867
7106
  variant: "dropdownMenu",
6868
7107
  applyActive: true,
@@ -6908,7 +7147,7 @@ var createViewMode = (state, onViewModeChange) => {
6908
7147
  };
6909
7148
  };
6910
7149
 
6911
- // packages/ui/react-ui-editor/src/components/EditorToolbar/EditorToolbar.tsx
7150
+ // src/components/EditorToolbar/EditorToolbar.tsx
6912
7151
  var createToolbar = ({ getView, state, customActions, ...features }) => {
6913
7152
  return Rx.make((get2) => {
6914
7153
  const nodes = [];
@@ -6963,7 +7202,7 @@ var createToolbar = ({ getView, state, customActions, ...features }) => {
6963
7202
  });
6964
7203
  };
6965
7204
  var useEditorToolbarActionGraph = (props) => {
6966
- const menuCreator = useMemo4(() => createToolbar({
7205
+ const menuCreator = useMemo5(() => createToolbar({
6967
7206
  getView: props.getView,
6968
7207
  state: props.state,
6969
7208
  customActions: props.customActions,
@@ -6989,15 +7228,15 @@ var useEditorToolbarActionGraph = (props) => {
6989
7228
  return useMenuActions(menuCreator);
6990
7229
  };
6991
7230
  var EditorToolbar = /* @__PURE__ */ memo(({ classNames, attendableId, role, ...props }) => {
6992
- var _effect = _useSignals();
7231
+ var _effect = _useSignals2();
6993
7232
  try {
6994
7233
  const menuProps = useEditorToolbarActionGraph(props);
6995
- return /* @__PURE__ */ React3.createElement(ElevationProvider, {
7234
+ return /* @__PURE__ */ React4.createElement(ElevationProvider, {
6996
7235
  elevation: role === "section" ? "positioned" : "base"
6997
- }, /* @__PURE__ */ React3.createElement(MenuProvider, {
7236
+ }, /* @__PURE__ */ React4.createElement(MenuProvider, {
6998
7237
  ...menuProps,
6999
7238
  attendableId
7000
- }, /* @__PURE__ */ React3.createElement(ToolbarMenu, {
7239
+ }, /* @__PURE__ */ React4.createElement(ToolbarMenu, {
7001
7240
  classNames,
7002
7241
  textBlockWidth: true
7003
7242
  })));
@@ -7006,16 +7245,16 @@ var EditorToolbar = /* @__PURE__ */ memo(({ classNames, attendableId, role, ...p
7006
7245
  }
7007
7246
  });
7008
7247
 
7009
- // packages/ui/react-ui-editor/src/components/Popover/CommandMenu.tsx
7010
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
7011
- import React4, { useCallback as useCallback2, useEffect as useEffect2, useRef as useRef2 } from "react";
7012
- import { Icon as Icon2, Popover, toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
7248
+ // src/components/Popover/CommandMenu.tsx
7249
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7250
+ import React5, { useCallback as useCallback4, useEffect as useEffect3, useRef as useRef3 } from "react";
7251
+ import { Icon as Icon2, Popover, toLocalizedString, useThemeContext as useThemeContext2, useTranslation } from "@dxos/react-ui";
7013
7252
  var CommandMenu = ({ groups, currentItem, onSelect }) => {
7014
- var _effect = _useSignals2();
7253
+ var _effect = _useSignals3();
7015
7254
  try {
7016
- const { tx } = useThemeContext();
7255
+ const { tx } = useThemeContext2();
7017
7256
  const groupsWithItems = groups.filter((group) => group.items.length > 0);
7018
- return /* @__PURE__ */ React4.createElement(Popover.Portal, null, /* @__PURE__ */ React4.createElement(Popover.Content, {
7257
+ return /* @__PURE__ */ React5.createElement(Popover.Portal, null, /* @__PURE__ */ React5.createElement(Popover.Content, {
7019
7258
  align: "start",
7020
7259
  onOpenAutoFocus: (event) => event.preventDefault(),
7021
7260
  classNames: tx("menu.content", "menu--exotic-unfocusable", {
@@ -7023,15 +7262,15 @@ var CommandMenu = ({ groups, currentItem, onSelect }) => {
7023
7262
  }, [
7024
7263
  "max-h-[300px] overflow-y-auto"
7025
7264
  ])
7026
- }, /* @__PURE__ */ React4.createElement(Popover.Viewport, {
7265
+ }, /* @__PURE__ */ React5.createElement(Popover.Viewport, {
7027
7266
  classNames: tx("menu.viewport", "menu__viewport--exotic-unfocusable", {})
7028
- }, /* @__PURE__ */ React4.createElement("ul", null, groupsWithItems.map((group, index) => /* @__PURE__ */ React4.createElement(React4.Fragment, {
7267
+ }, /* @__PURE__ */ React5.createElement("ul", null, groupsWithItems.map((group, index) => /* @__PURE__ */ React5.createElement(React5.Fragment, {
7029
7268
  key: group.id
7030
- }, /* @__PURE__ */ React4.createElement(CommandGroup, {
7269
+ }, /* @__PURE__ */ React5.createElement(CommandGroup, {
7031
7270
  group,
7032
7271
  currentItem,
7033
7272
  onSelect
7034
- }), index < groupsWithItems.length - 1 && /* @__PURE__ */ React4.createElement("div", {
7273
+ }), index < groupsWithItems.length - 1 && /* @__PURE__ */ React5.createElement("div", {
7035
7274
  className: tx("menu.separator", "menu__item", {})
7036
7275
  })))))));
7037
7276
  } finally {
@@ -7039,13 +7278,13 @@ var CommandMenu = ({ groups, currentItem, onSelect }) => {
7039
7278
  }
7040
7279
  };
7041
7280
  var CommandGroup = ({ group, currentItem, onSelect }) => {
7042
- var _effect = _useSignals2();
7281
+ var _effect = _useSignals3();
7043
7282
  try {
7044
- const { tx } = useThemeContext();
7283
+ const { tx } = useThemeContext2();
7045
7284
  const { t } = useTranslation();
7046
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, group.label && /* @__PURE__ */ React4.createElement("div", {
7285
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, group.label && /* @__PURE__ */ React5.createElement("div", {
7047
7286
  className: tx("menu.groupLabel", "menu__group__label", {})
7048
- }, /* @__PURE__ */ React4.createElement("span", null, toLocalizedString(group.label, t))), group.items.map((item) => /* @__PURE__ */ React4.createElement(CommandItem, {
7287
+ }, /* @__PURE__ */ React5.createElement("span", null, toLocalizedString(group.label, t))), group.items.map((item) => /* @__PURE__ */ React5.createElement(CommandItem, {
7049
7288
  key: item.id,
7050
7289
  item,
7051
7290
  current: currentItem === item.id,
@@ -7056,16 +7295,16 @@ var CommandGroup = ({ group, currentItem, onSelect }) => {
7056
7295
  }
7057
7296
  };
7058
7297
  var CommandItem = ({ item, current, onSelect }) => {
7059
- var _effect = _useSignals2();
7298
+ var _effect = _useSignals3();
7060
7299
  try {
7061
- const ref = useRef2(null);
7062
- const { tx } = useThemeContext();
7300
+ const ref = useRef3(null);
7301
+ const { tx } = useThemeContext2();
7063
7302
  const { t } = useTranslation();
7064
- const handleSelect = useCallback2(() => onSelect(item), [
7303
+ const handleSelect = useCallback4(() => onSelect(item), [
7065
7304
  item,
7066
7305
  onSelect
7067
7306
  ]);
7068
- useEffect2(() => {
7307
+ useEffect3(() => {
7069
7308
  if (current && ref.current) {
7070
7309
  ref.current.scrollIntoView({
7071
7310
  behavior: "smooth",
@@ -7075,16 +7314,16 @@ var CommandItem = ({ item, current, onSelect }) => {
7075
7314
  }, [
7076
7315
  current
7077
7316
  ]);
7078
- return /* @__PURE__ */ React4.createElement("li", {
7317
+ return /* @__PURE__ */ React5.createElement("li", {
7079
7318
  ref,
7080
7319
  className: tx("menu.item", "menu__item--exotic-unfocusable", {}, [
7081
7320
  current && "bg-hoverSurface"
7082
7321
  ]),
7083
7322
  onClick: handleSelect
7084
- }, item.icon && /* @__PURE__ */ React4.createElement(Icon2, {
7323
+ }, item.icon && /* @__PURE__ */ React5.createElement(Icon2, {
7085
7324
  icon: item.icon,
7086
7325
  size: 5
7087
- }), /* @__PURE__ */ React4.createElement("span", {
7326
+ }), /* @__PURE__ */ React5.createElement("span", {
7088
7327
  className: "grow truncate"
7089
7328
  }, toLocalizedString(item.label, t)));
7090
7329
  } finally {
@@ -7271,21 +7510,21 @@ var linkSlashCommands = {
7271
7510
  ]
7272
7511
  };
7273
7512
 
7274
- // packages/ui/react-ui-editor/src/components/Popover/RefPopover.tsx
7275
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
7513
+ // src/components/Popover/RefPopover.tsx
7514
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
7276
7515
  import { createContext } from "@radix-ui/react-context";
7277
- import React5, { useRef as useRef3, useState as useState2, useEffect as useEffect3, useCallback as useCallback3, forwardRef } from "react";
7516
+ import React6, { forwardRef as forwardRef2, useCallback as useCallback5, useEffect as useEffect4, useRef as useRef4, useState as useState3 } from "react";
7278
7517
  import { addEventListener as addEventListener2 } from "@dxos/async";
7279
7518
  import { Popover as Popover2 } from "@dxos/react-ui";
7280
7519
  var customEventOptions = {
7281
7520
  capture: true,
7282
7521
  passive: false
7283
7522
  };
7284
- var RefPopover = /* @__PURE__ */ forwardRef(({ children, open, onOpenChange, modal, onActivate }, ref) => {
7285
- var _effect = _useSignals3();
7523
+ var RefPopover = /* @__PURE__ */ forwardRef2(({ children, open, onOpenChange, modal, onActivate }, ref) => {
7524
+ var _effect = _useSignals4();
7286
7525
  try {
7287
- const [rootRef, setRootRef] = useState2(null);
7288
- useEffect3(() => {
7526
+ const [rootRef, setRootRef] = useState3(null);
7527
+ useEffect4(() => {
7289
7528
  if (!rootRef || !onActivate) {
7290
7529
  return;
7291
7530
  }
@@ -7294,13 +7533,13 @@ var RefPopover = /* @__PURE__ */ forwardRef(({ children, open, onOpenChange, mod
7294
7533
  rootRef,
7295
7534
  onActivate
7296
7535
  ]);
7297
- return /* @__PURE__ */ React5.createElement(Popover2.Root, {
7536
+ return /* @__PURE__ */ React6.createElement(Popover2.Root, {
7298
7537
  open,
7299
7538
  onOpenChange,
7300
7539
  modal
7301
- }, /* @__PURE__ */ React5.createElement(Popover2.VirtualTrigger, {
7540
+ }, /* @__PURE__ */ React6.createElement(Popover2.VirtualTrigger, {
7302
7541
  virtualRef: ref
7303
- }), /* @__PURE__ */ React5.createElement("div", {
7542
+ }), /* @__PURE__ */ React6.createElement("div", {
7304
7543
  role: "none",
7305
7544
  className: "contents",
7306
7545
  ref: setRootRef
@@ -7312,12 +7551,12 @@ var RefPopover = /* @__PURE__ */ forwardRef(({ children, open, onOpenChange, mod
7312
7551
  var REF_POPOVER = "RefPopover";
7313
7552
  var [RefPopoverContextProvider, useRefPopover] = createContext(REF_POPOVER, {});
7314
7553
  var PreviewProvider = ({ children, onLookup }) => {
7315
- var _effect = _useSignals3();
7554
+ var _effect = _useSignals4();
7316
7555
  try {
7317
- const trigger = useRef3(null);
7318
- const [value, setValue] = useState2({});
7319
- const [open, setOpen] = useState2(false);
7320
- const handleDxRefTagActivate = useCallback3((event) => {
7556
+ const trigger = useRef4(null);
7557
+ const [value, setValue] = useState3({});
7558
+ const [open, setOpen] = useState3(false);
7559
+ const handleDxRefTagActivate = useCallback5((event) => {
7321
7560
  const { refId, label, trigger: dxTrigger } = event;
7322
7561
  setValue((value2) => ({
7323
7562
  ...value2,
@@ -7340,11 +7579,11 @@ var PreviewProvider = ({ children, onLookup }) => {
7340
7579
  }, [
7341
7580
  onLookup
7342
7581
  ]);
7343
- return /* @__PURE__ */ React5.createElement(RefPopoverContextProvider, {
7582
+ return /* @__PURE__ */ React6.createElement(RefPopoverContextProvider, {
7344
7583
  pending: value.pending,
7345
7584
  link: value.link,
7346
7585
  target: value.target
7347
- }, /* @__PURE__ */ React5.createElement(RefPopover, {
7586
+ }, /* @__PURE__ */ React6.createElement(RefPopover, {
7348
7587
  ref: trigger,
7349
7588
  open,
7350
7589
  onOpenChange: setOpen,
@@ -7355,10 +7594,10 @@ var PreviewProvider = ({ children, onLookup }) => {
7355
7594
  }
7356
7595
  };
7357
7596
 
7358
- // packages/ui/react-ui-editor/src/components/Popover/RefDropdownMenu.tsx
7359
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
7597
+ // src/components/Popover/RefDropdownMenu.tsx
7598
+ import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
7360
7599
  import { createContext as createContext2 } from "@radix-ui/react-context";
7361
- import React6, { useRef as useRef4, useState as useState3, useEffect as useEffect4, useCallback as useCallback4 } from "react";
7600
+ import React7, { useCallback as useCallback6, useEffect as useEffect5, useRef as useRef5, useState as useState4 } from "react";
7362
7601
  import { addEventListener as addEventListener3 } from "@dxos/async";
7363
7602
  import { DropdownMenu } from "@dxos/react-ui";
7364
7603
  var customEventOptions2 = {
@@ -7368,13 +7607,13 @@ var customEventOptions2 = {
7368
7607
  var REF_DROPDOWN_MENU = "RefDropdownMenu";
7369
7608
  var [RefDropdownMenuContextProvider, useRefDropdownMenu] = createContext2(REF_DROPDOWN_MENU, {});
7370
7609
  var RefDropdownMenuProvider = ({ children, onLookup }) => {
7371
- var _effect = _useSignals4();
7610
+ var _effect = _useSignals5();
7372
7611
  try {
7373
- const trigger = useRef4(null);
7374
- const [value, setValue] = useState3({});
7375
- const [rootRef, setRootRef] = useState3(null);
7376
- const [open, setOpen] = useState3(false);
7377
- const handleDxRefTagActivate = useCallback4((event) => {
7612
+ const trigger = useRef5(null);
7613
+ const [value, setValue] = useState4({});
7614
+ const [rootRef, setRootRef] = useState4(null);
7615
+ const [open, setOpen] = useState4(false);
7616
+ const handleDxRefTagActivate = useCallback6((event) => {
7378
7617
  const { refId, label, trigger: dxTrigger } = event;
7379
7618
  setValue((value2) => ({
7380
7619
  ...value2,
@@ -7397,7 +7636,7 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
7397
7636
  }, [
7398
7637
  onLookup
7399
7638
  ]);
7400
- useEffect4(() => {
7639
+ useEffect5(() => {
7401
7640
  if (!rootRef) {
7402
7641
  return;
7403
7642
  }
@@ -7405,16 +7644,16 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
7405
7644
  }, [
7406
7645
  rootRef
7407
7646
  ]);
7408
- return /* @__PURE__ */ React6.createElement(RefDropdownMenuContextProvider, {
7647
+ return /* @__PURE__ */ React7.createElement(RefDropdownMenuContextProvider, {
7409
7648
  pending: value.pending,
7410
7649
  link: value.link,
7411
7650
  target: value.target
7412
- }, /* @__PURE__ */ React6.createElement(DropdownMenu.Root, {
7651
+ }, /* @__PURE__ */ React7.createElement(DropdownMenu.Root, {
7413
7652
  open,
7414
7653
  onOpenChange: setOpen
7415
- }, /* @__PURE__ */ React6.createElement(DropdownMenu.VirtualTrigger, {
7654
+ }, /* @__PURE__ */ React7.createElement(DropdownMenu.VirtualTrigger, {
7416
7655
  virtualRef: trigger
7417
- }), /* @__PURE__ */ React6.createElement("div", {
7656
+ }), /* @__PURE__ */ React7.createElement("div", {
7418
7657
  role: "none",
7419
7658
  className: "contents",
7420
7659
  ref: setRootRef
@@ -7426,162 +7665,10 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
7426
7665
  var RefDropdownMenu = {
7427
7666
  Provider: RefDropdownMenuProvider
7428
7667
  };
7429
-
7430
- // packages/ui/react-ui-editor/src/hooks/useTextEditor.ts
7431
- import { EditorState as EditorState3 } from "@codemirror/state";
7432
- import { EditorView as EditorView26 } from "@codemirror/view";
7433
- import { useFocusableGroup } from "@fluentui/react-tabster";
7434
- import { useCallback as useCallback5, useEffect as useEffect5, useMemo as useMemo5, useRef as useRef5, useState as useState4 } from "react";
7435
- import { log as log8 } from "@dxos/log";
7436
- import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
7437
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
7438
- var instanceCount = 0;
7439
- var useTextEditor = (props = {}, deps = []) => {
7440
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo5(() => getProviderValue(props), deps ?? []);
7441
- const [instanceId] = useState4(() => `text-editor-${++instanceCount}`);
7442
- const [view, setView] = useState4();
7443
- const parentRef = useRef5(null);
7444
- useEffect5(() => {
7445
- let view2;
7446
- if (parentRef.current) {
7447
- log8("create", {
7448
- id,
7449
- instanceId,
7450
- doc: initialValue?.length ?? 0
7451
- }, {
7452
- F: __dxlog_file13,
7453
- L: 75,
7454
- S: void 0,
7455
- C: (f, a) => f(...a)
7456
- });
7457
- let initialSelection;
7458
- if (selection?.anchor && initialValue?.length) {
7459
- if (selection.anchor <= initialValue.length && (selection?.head ?? 0) <= initialValue.length) {
7460
- initialSelection = selection;
7461
- }
7462
- } else if (moveToEndOfLine && selection === void 0) {
7463
- const index = initialValue?.indexOf("\n");
7464
- const anchor = !index || index === -1 ? 0 : index;
7465
- initialSelection = {
7466
- anchor
7467
- };
7468
- }
7469
- const state = EditorState3.create({
7470
- doc: doc ?? initialValue,
7471
- // selection: initialSelection,
7472
- extensions: [
7473
- id && documentId.of(id),
7474
- extensions,
7475
- // NOTE: This doesn't catch errors in keymap functions.
7476
- EditorView26.exceptionSink.of((err) => {
7477
- log8.catch(err, void 0, {
7478
- F: __dxlog_file13,
7479
- L: 97,
7480
- S: void 0,
7481
- C: (f, a) => f(...a)
7482
- });
7483
- })
7484
- ].filter(isNotFalsy4)
7485
- });
7486
- view2 = new EditorView26({
7487
- parent: parentRef.current,
7488
- state,
7489
- scrollTo: scrollTo ? EditorView26.scrollIntoView(scrollTo, {
7490
- yMargin: 96
7491
- }) : void 0,
7492
- dispatchTransactions: debug ? debugDispatcher : void 0
7493
- });
7494
- if (moveToEndOfLine && !initialSelection) {
7495
- const { to } = view2.state.doc.lineAt(0);
7496
- if (to) {
7497
- view2.dispatch({
7498
- selection: {
7499
- anchor: to
7500
- }
7501
- });
7502
- }
7503
- }
7504
- setView(view2);
7505
- }
7506
- return () => {
7507
- log8("destroy", {
7508
- id
7509
- }, {
7510
- F: __dxlog_file13,
7511
- L: 134,
7512
- S: void 0,
7513
- C: (f, a) => f(...a)
7514
- });
7515
- view2?.destroy();
7516
- };
7517
- }, deps);
7518
- useEffect5(() => {
7519
- if (view) {
7520
- if (scrollTo || selection) {
7521
- if (selection && selection.anchor > view.state.doc.length) {
7522
- log8.warn("invalid selection", {
7523
- length: view.state.doc.length,
7524
- scrollTo,
7525
- selection
7526
- }, {
7527
- F: __dxlog_file13,
7528
- L: 143,
7529
- S: void 0,
7530
- C: (f, a) => f(...a)
7531
- });
7532
- return;
7533
- }
7534
- view.dispatch(createEditorStateTransaction({
7535
- scrollTo,
7536
- selection
7537
- }));
7538
- }
7539
- }
7540
- }, [
7541
- view,
7542
- scrollTo,
7543
- selection
7544
- ]);
7545
- useEffect5(() => {
7546
- if (view && autoFocus) {
7547
- view.focus();
7548
- }
7549
- }, [
7550
- autoFocus,
7551
- view
7552
- ]);
7553
- const focusableGroupAttrs = useFocusableGroup({
7554
- tabBehavior: "limited",
7555
- ignoreDefaultKeydown: {
7556
- Escape: view?.state.facet(editorInputMode).noTabster
7557
- }
7558
- });
7559
- const handleKeyUp = useCallback5((event) => {
7560
- const { key, target, currentTarget } = event;
7561
- if (target === currentTarget) {
7562
- switch (key) {
7563
- case "Enter": {
7564
- view?.focus();
7565
- break;
7566
- }
7567
- }
7568
- }
7569
- }, [
7570
- view
7571
- ]);
7572
- return {
7573
- parentRef,
7574
- view,
7575
- focusAttributes: {
7576
- tabIndex: 0,
7577
- ...focusableGroupAttrs,
7578
- onKeyUp: handleKeyUp
7579
- }
7580
- };
7581
- };
7582
7668
  export {
7583
7669
  CommandMenu,
7584
7670
  Cursor,
7671
+ Editor,
7585
7672
  EditorInputMode,
7586
7673
  EditorInputModes,
7587
7674
  EditorState4 as EditorState,
@@ -7642,6 +7729,7 @@ export {
7642
7729
  debugTree,
7643
7730
  decorateMarkdown,
7644
7731
  defaultOptions,
7732
+ defaultThemeSlots,
7645
7733
  deleteItem,
7646
7734
  documentId,
7647
7735
  dropFile,
@@ -7659,6 +7747,7 @@ export {
7659
7747
  folding,
7660
7748
  formattingEquals,
7661
7749
  formattingKeymap,
7750
+ fullWidth,
7662
7751
  getFormatting,
7663
7752
  getItem,
7664
7753
  getLinkRef,
@@ -7666,6 +7755,7 @@ export {
7666
7755
  getNextItem,
7667
7756
  getPreviousItem,
7668
7757
  getRange,
7758
+ grow,
7669
7759
  hashtag,
7670
7760
  image,
7671
7761
  indentItemLess,
@@ -7723,7 +7813,7 @@ export {
7723
7813
  toggleStrong,
7724
7814
  toggleStyle,
7725
7815
  toggleTask,
7726
- translations_default as translations,
7816
+ translations,
7727
7817
  traverse,
7728
7818
  treeFacet,
7729
7819
  typeahead,