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