@dxos/react-ui-editor 0.4.4-main.b30fc36 → 0.4.4-main.e05bf88

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 (38) hide show
  1. package/dist/lib/browser/index.mjs +154 -114
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts +3 -2
  5. package/dist/types/src/components/TextEditor/MarkdownEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/components/TextEditor/TextEditor.d.ts +3 -3
  7. package/dist/types/src/components/TextEditor/TextEditor.d.ts.map +1 -1
  8. package/dist/types/src/components/TextEditor/TextEditor.stories.d.ts +1 -1
  9. package/dist/types/src/components/TextEditor/hooks.stories.d.ts +1 -1
  10. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  11. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  12. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  13. package/dist/types/src/extensions/comments.d.ts +15 -7
  14. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  15. package/dist/types/src/extensions/cursor.d.ts +1 -1
  16. package/dist/types/src/extensions/cursor.d.ts.map +1 -1
  17. package/dist/types/src/hooks/useEditorView.d.ts +6 -4
  18. package/dist/types/src/hooks/useEditorView.d.ts.map +1 -1
  19. package/dist/types/src/hooks/useTextModel.d.ts +3 -0
  20. package/dist/types/src/hooks/useTextModel.d.ts.map +1 -1
  21. package/dist/types/src/index.d.ts +1 -1
  22. package/dist/types/src/index.d.ts.map +1 -1
  23. package/dist/types/src/styles/layout.d.ts +4 -1
  24. package/dist/types/src/styles/layout.d.ts.map +1 -1
  25. package/package.json +24 -24
  26. package/src/components/TextEditor/MarkdownEditor.stories.tsx +3 -2
  27. package/src/components/TextEditor/TextEditor.tsx +3 -3
  28. package/src/components/TextEditor/hooks.stories.tsx +4 -4
  29. package/src/components/Toolbar/Toolbar.stories.tsx +9 -6
  30. package/src/extensions/autocomplete.ts +1 -1
  31. package/src/extensions/automerge/cursor.ts +15 -4
  32. package/src/extensions/automerge/defs.ts +0 -1
  33. package/src/extensions/comments.ts +111 -82
  34. package/src/extensions/cursor.ts +4 -2
  35. package/src/hooks/useEditorView.ts +13 -11
  36. package/src/hooks/useTextModel.ts +7 -7
  37. package/src/index.ts +7 -1
  38. package/src/styles/layout.ts +6 -1
@@ -12,7 +12,7 @@ import { EditorView as EditorView15 } from "@codemirror/view";
12
12
  import { useFocusableGroup } from "@fluentui/react-tabster";
13
13
  import defaultsDeep2 from "lodash.defaultsdeep";
14
14
  import React, { forwardRef, useCallback, useEffect as useEffect2, useImperativeHandle, useRef, useState as useState2 } from "react";
15
- import { log as log2 } from "@dxos/log";
15
+ import { log as log3 } from "@dxos/log";
16
16
  import { useThemeContext } from "@dxos/react-ui";
17
17
  import { focusRing } from "@dxos/react-ui-theme";
18
18
  import { isNotFalsy as isNotFalsy4 } from "@dxos/util";
@@ -31,7 +31,9 @@ var defaultCursorConverter = {
31
31
  var Cursor = class _Cursor {
32
32
  static {
33
33
  this.converter = Facet.define({
34
- combine: (providers) => providers[0] ?? defaultCursorConverter
34
+ combine: (providers) => {
35
+ return providers[0] ?? defaultCursorConverter;
36
+ }
35
37
  });
36
38
  }
37
39
  static {
@@ -130,7 +132,7 @@ var autocomplete = ({ onSearch }) => {
130
132
  // https://codemirror.net/examples/autocompletion
131
133
  // https://codemirror.net/docs/ref/#autocomplete.autocompletion
132
134
  autocompletion({
133
- activateOnTyping: true,
135
+ activateOnTyping: false,
134
136
  // closeOnBlur: false,
135
137
  // defaultKeymap: false,
136
138
  // TODO(burdon): Styles/fragments.
@@ -161,6 +163,8 @@ import { next as A4 } from "@dxos/automerge/automerge";
161
163
  // packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts
162
164
  import get from "lodash.get";
163
165
  import { next as A } from "@dxos/automerge/automerge";
166
+ import { log } from "@dxos/log";
167
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/automerge/cursor.ts";
164
168
  var cursorConverter = (handle, path) => ({
165
169
  // TODO(burdon): Handle assoc to associate with a previous character.
166
170
  toCursor: (pos) => {
@@ -172,7 +176,17 @@ var cursorConverter = (handle, path) => ({
172
176
  if (typeof value === "string" && value.length <= pos) {
173
177
  return "end";
174
178
  }
175
- return A.getCursor(doc, path.slice(), pos);
179
+ try {
180
+ return A.getCursor(doc, path.slice(), pos);
181
+ } catch (err) {
182
+ log.catch(err, void 0, {
183
+ F: __dxlog_file,
184
+ L: 31,
185
+ S: void 0,
186
+ C: (f, a) => f(...a)
187
+ });
188
+ return "";
189
+ }
176
190
  },
177
191
  fromCursor: (cursor) => {
178
192
  if (cursor === "") {
@@ -190,7 +204,17 @@ var cursorConverter = (handle, path) => ({
190
204
  return 0;
191
205
  }
192
206
  }
193
- return A.getCursorPosition(doc, path.slice(), cursor);
207
+ try {
208
+ return A.getCursorPosition(doc, path.slice(), cursor);
209
+ } catch (err) {
210
+ log.catch(err, void 0, {
211
+ F: __dxlog_file,
212
+ L: 59,
213
+ S: void 0,
214
+ C: (f, a) => f(...a)
215
+ });
216
+ return 0;
217
+ }
194
218
  }
195
219
  });
196
220
 
@@ -708,7 +732,7 @@ var createBasicBundle = ({ themeMode, placeholder: _placeholder, lineWrapping =
708
732
  import { EditorView as EditorView5, keymap as keymap2 } from "@codemirror/view";
709
733
  import defaultsDeep from "lodash.defaultsdeep";
710
734
  import { invariant } from "@dxos/invariant";
711
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
735
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/blast.ts";
712
736
  var defaultOptions = {
713
737
  effect: 2,
714
738
  maxParticles: 200,
@@ -835,7 +859,7 @@ var Blaster = class {
835
859
  }
836
860
  initialize() {
837
861
  invariant(!this._canvas && !this._ctx, void 0, {
838
- F: __dxlog_file,
862
+ F: __dxlog_file2,
839
863
  L: 141,
840
864
  S: this,
841
865
  A: [
@@ -872,7 +896,7 @@ var Blaster = class {
872
896
  }
873
897
  start() {
874
898
  invariant(this._canvas && this._ctx, void 0, {
875
- F: __dxlog_file,
899
+ F: __dxlog_file2,
876
900
  L: 180,
877
901
  S: this,
878
902
  A: [
@@ -1091,17 +1115,20 @@ var tokens = tailwindConfig({}).theme;
1091
1115
  var getToken = (path, defaultValue = void 0) => get2(tokens, path, defaultValue);
1092
1116
 
1093
1117
  // packages/ui/react-ui-editor/src/styles/layout.ts
1094
- var editorWithToolbarLayout = "fixed inset-0 grid grid-cols-1 grid-rows-[min-content_1fr] justify-center content-start overflow-hidden";
1118
+ var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] justify-center content-start overflow-hidden";
1119
+ var editorFillLayoutRoot = "min-bs-full grid";
1120
+ var editorFillLayoutEditor = "min-bs-full";
1121
+ var editorHalfViewportOverscrollContent = "after:block after:min-bs-[50dvh] after:pointer-events-none";
1095
1122
 
1096
1123
  // packages/ui/react-ui-editor/src/util.ts
1097
- import { log } from "@dxos/log";
1098
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util.ts";
1124
+ import { log as log2 } from "@dxos/log";
1125
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util.ts";
1099
1126
  var callbackWrapper = (fn) => (...args) => {
1100
1127
  try {
1101
1128
  return fn(...args);
1102
1129
  } catch (err) {
1103
- log.catch(err, void 0, {
1104
- F: __dxlog_file2,
1130
+ log2.catch(err, void 0, {
1131
+ F: __dxlog_file3,
1105
1132
  L: 18,
1106
1133
  S: void 0,
1107
1134
  C: (f, a) => f(...a)
@@ -1129,68 +1156,15 @@ var logChanges = (trs) => {
1129
1156
  };
1130
1157
 
1131
1158
  // packages/ui/react-ui-editor/src/extensions/comments.ts
1132
- var styles3 = EditorView6.baseTheme({
1133
- "&light .cm-comment, &light .cm-comment-current": {
1134
- mixBlendMode: "darken"
1135
- },
1136
- "&dark .cm-comment, &dark .cm-comment-current": {
1137
- mixBlendMode: "plus-lighter"
1138
- },
1139
- "&light .cm-comment": {
1140
- backgroundColor: getToken("extend.colors.yellow.50")
1141
- },
1142
- "&light .cm-comment-current": {
1143
- backgroundColor: getToken("extend.colors.yellow.100")
1144
- },
1145
- "&dark .cm-comment": {
1146
- color: getToken("extend.colors.yellow.50"),
1147
- backgroundColor: getToken("extend.colors.yellow.900")
1148
- },
1149
- "&dark .cm-comment-current": {
1150
- color: getToken("extend.colors.yellow.100"),
1151
- backgroundColor: getToken("extend.colors.yellow.950")
1152
- }
1159
+ var documentId = Facet3.define({
1160
+ combine: (values) => values[0]
1153
1161
  });
1154
- var commentMark = Decoration3.mark({
1155
- class: "cm-comment",
1156
- attributes: {
1157
- "data-testid": "cm-comment"
1158
- }
1159
- });
1160
- var commentCurrentMark = Decoration3.mark({
1161
- class: "cm-comment-current",
1162
- attributes: {
1163
- "data-testid": "cm-comment"
1164
- }
1165
- });
1166
- var focusComment = (view, id, center = true) => {
1167
- const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
1168
- if (!comment?.comment.cursor) {
1169
- return;
1170
- }
1171
- const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
1172
- if (range) {
1173
- view.dispatch({
1174
- selection: {
1175
- anchor: range.from
1176
- },
1177
- effects: [
1178
- //
1179
- EditorView6.scrollIntoView(range.from, center ? {
1180
- y: "center"
1181
- } : void 0),
1182
- setSelection.of({
1183
- current: id
1184
- })
1185
- ]
1186
- });
1187
- }
1188
- };
1189
1162
  var setComments = StateEffect2.define();
1190
1163
  var setSelection = StateEffect2.define();
1191
1164
  var setCommentState = StateEffect2.define();
1192
1165
  var commentsState = StateField3.define({
1193
- create: () => ({
1166
+ create: (state) => ({
1167
+ id: state.facet(documentId),
1194
1168
  comments: [],
1195
1169
  selection: {}
1196
1170
  }),
@@ -1203,7 +1177,8 @@ var commentsState = StateField3.define({
1203
1177
  };
1204
1178
  }
1205
1179
  if (effect.is(setComments)) {
1206
- const comments2 = effect.value.map((comment) => {
1180
+ const { comments: comments2 } = effect.value;
1181
+ const commentStates = comments2.map((comment) => {
1207
1182
  if (!comment.cursor) {
1208
1183
  return void 0;
1209
1184
  }
@@ -1215,7 +1190,7 @@ var commentsState = StateField3.define({
1215
1190
  }).filter(nonNullable);
1216
1191
  return {
1217
1192
  ...value,
1218
- comments: comments2
1193
+ comments: commentStates
1219
1194
  };
1220
1195
  }
1221
1196
  if (effect.is(setCommentState)) {
@@ -1225,6 +1200,40 @@ var commentsState = StateField3.define({
1225
1200
  return value;
1226
1201
  }
1227
1202
  });
1203
+ var styles3 = EditorView6.baseTheme({
1204
+ "&light .cm-comment, &light .cm-comment-current": {
1205
+ mixBlendMode: "darken"
1206
+ },
1207
+ "&dark .cm-comment, &dark .cm-comment-current": {
1208
+ mixBlendMode: "plus-lighter"
1209
+ },
1210
+ "&light .cm-comment": {
1211
+ backgroundColor: getToken("extend.colors.yellow.50")
1212
+ },
1213
+ "&light .cm-comment-current": {
1214
+ backgroundColor: getToken("extend.colors.yellow.100")
1215
+ },
1216
+ "&dark .cm-comment": {
1217
+ color: getToken("extend.colors.yellow.50"),
1218
+ backgroundColor: getToken("extend.colors.yellow.900")
1219
+ },
1220
+ "&dark .cm-comment-current": {
1221
+ color: getToken("extend.colors.yellow.100"),
1222
+ backgroundColor: getToken("extend.colors.yellow.950")
1223
+ }
1224
+ });
1225
+ var commentMark = Decoration3.mark({
1226
+ class: "cm-comment",
1227
+ attributes: {
1228
+ "data-testid": "cm-comment"
1229
+ }
1230
+ });
1231
+ var commentCurrentMark = Decoration3.mark({
1232
+ class: "cm-comment-current",
1233
+ attributes: {
1234
+ "data-testid": "cm-comment"
1235
+ }
1236
+ });
1228
1237
  var commentsDecorations = EditorView6.decorations.compute([
1229
1238
  commentsState
1230
1239
  ], (state) => {
@@ -1344,9 +1353,6 @@ var mapTrackedComment = (comment, changes) => ({
1344
1353
  var restoreCommentEffect = StateEffect2.define({
1345
1354
  map: mapTrackedComment
1346
1355
  });
1347
- var optionsFacet = Facet3.define({
1348
- combine: (providers) => providers[0]
1349
- });
1350
1356
  var createComment = (view) => {
1351
1357
  const options = view.state.facet(optionsFacet);
1352
1358
  const { from, to } = view.state.selection.main;
@@ -1385,11 +1391,15 @@ var createComment = (view) => {
1385
1391
  }
1386
1392
  return false;
1387
1393
  };
1394
+ var optionsFacet = Facet3.define({
1395
+ combine: (providers) => providers[0]
1396
+ });
1388
1397
  var comments = (options = {}) => {
1389
1398
  const { key: shortcut = "meta-'" } = options;
1390
1399
  const handleSelect = debounce((state) => options.onSelect?.(state), 200);
1391
1400
  return [
1392
1401
  optionsFacet.of(options),
1402
+ documentId.of(options.id),
1393
1403
  commentsState,
1394
1404
  commentsDecorations,
1395
1405
  styles3,
@@ -1491,6 +1501,7 @@ var comments = (options = {}) => {
1491
1501
  });
1492
1502
  handleSelect({
1493
1503
  selection,
1504
+ id: state.facet(documentId),
1494
1505
  comments: comments2.map(({ comment, range }) => ({
1495
1506
  comment,
1496
1507
  range,
@@ -1502,14 +1513,41 @@ var comments = (options = {}) => {
1502
1513
  options.onUpdate ? trackPastedComments(options.onUpdate) : []
1503
1514
  ];
1504
1515
  };
1505
- var useComments = (view, comments2 = []) => {
1516
+ var focusComment = (view, id, center = true) => {
1517
+ const comment = view.state.field(commentsState).comments.find((range2) => range2.comment.id === id);
1518
+ if (!comment?.comment.cursor) {
1519
+ return;
1520
+ }
1521
+ const range = Cursor.getRangeFromCursor(view.state, comment.comment.cursor);
1522
+ if (range) {
1523
+ view.dispatch({
1524
+ selection: {
1525
+ anchor: range.from
1526
+ },
1527
+ effects: [
1528
+ //
1529
+ EditorView6.scrollIntoView(range.from, center ? {
1530
+ y: "center"
1531
+ } : void 0),
1532
+ setSelection.of({
1533
+ current: id
1534
+ })
1535
+ ]
1536
+ });
1537
+ }
1538
+ };
1539
+ var useComments = (view, id, comments2 = []) => {
1506
1540
  useEffect(() => {
1507
1541
  if (view) {
1508
1542
  view.dispatch({
1509
- effects: setComments.of(comments2)
1543
+ effects: setComments.of({
1544
+ id,
1545
+ comments: comments2
1546
+ })
1510
1547
  });
1511
1548
  }
1512
1549
  }, [
1550
+ id,
1513
1551
  view,
1514
1552
  comments2
1515
1553
  ]);
@@ -3868,7 +3906,7 @@ var codeTheme = {
3868
3906
  };
3869
3907
 
3870
3908
  // packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx
3871
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx";
3909
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/components/TextEditor/TextEditor.tsx";
3872
3910
  var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, scrollTo, selection, theme, slots = defaultSlots, extensions = [], debug }, forwardedRef) => {
3873
3911
  const tabsterDOMAttribute = useFocusableGroup({
3874
3912
  tabBehavior: "limited"
@@ -3905,8 +3943,8 @@ var BaseTextEditor = /* @__PURE__ */ forwardRef(({ model, readonly, autoFocus, s
3905
3943
  extensions: [
3906
3944
  // TODO(burdon): Doesn't catch errors in keymap functions.
3907
3945
  EditorView15.exceptionSink.of((err) => {
3908
- log2.catch(err, void 0, {
3909
- F: __dxlog_file3,
3946
+ log3.catch(err, void 0, {
3947
+ F: __dxlog_file4,
3910
3948
  L: 112,
3911
3949
  S: void 0,
3912
3950
  C: (f, a) => f(...a)
@@ -4308,8 +4346,8 @@ var Toolbar = {
4308
4346
  import { DeferredTask, Event as Event2, sleep } from "@dxos/async";
4309
4347
  import { Context as Context2 } from "@dxos/context";
4310
4348
  import { invariant as invariant2 } from "@dxos/invariant";
4311
- import { log as log3 } from "@dxos/log";
4312
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/awareness-provider.ts";
4349
+ import { log as log4 } from "@dxos/log";
4350
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/awareness-provider.ts";
4313
4351
  var DEBOUNCE_INTERVAL = 100;
4314
4352
  var SpaceAwarenessProvider = class {
4315
4353
  constructor(params) {
@@ -4346,10 +4384,10 @@ var SpaceAwarenessProvider = class {
4346
4384
  void this._space.postMessage(this._channel, {
4347
4385
  kind: "query"
4348
4386
  }).catch((err) => {
4349
- log3.debug("failed to query awareness", {
4387
+ log4.debug("failed to query awareness", {
4350
4388
  err
4351
4389
  }, {
4352
- F: __dxlog_file4,
4390
+ F: __dxlog_file5,
4353
4391
  L: 89,
4354
4392
  S: this,
4355
4393
  C: (f, a) => f(...a)
@@ -4366,7 +4404,7 @@ var SpaceAwarenessProvider = class {
4366
4404
  }
4367
4405
  update(position) {
4368
4406
  invariant2(this._postTask, void 0, {
4369
- F: __dxlog_file4,
4407
+ F: __dxlog_file5,
4370
4408
  L: 104,
4371
4409
  S: this,
4372
4410
  A: [
@@ -4383,7 +4421,7 @@ var SpaceAwarenessProvider = class {
4383
4421
  }
4384
4422
  _handleQueryMessage() {
4385
4423
  invariant2(this._postTask, void 0, {
4386
- F: __dxlog_file4,
4424
+ F: __dxlog_file5,
4387
4425
  L: 115,
4388
4426
  S: this,
4389
4427
  A: [
@@ -4395,7 +4433,7 @@ var SpaceAwarenessProvider = class {
4395
4433
  }
4396
4434
  _handlePostMessage(message) {
4397
4435
  invariant2(message.kind === "post", void 0, {
4398
- F: __dxlog_file4,
4436
+ F: __dxlog_file5,
4399
4437
  L: 120,
4400
4438
  S: this,
4401
4439
  A: [
@@ -4464,28 +4502,36 @@ var useActionHandler = (view) => {
4464
4502
  };
4465
4503
 
4466
4504
  // packages/ui/react-ui-editor/src/hooks/useEditorView.ts
4467
- import { useState as useState3 } from "react";
4468
- var useEditorView = () => {
4469
- const [view, setView] = useState3(null);
4505
+ import { useRef as useRef2, useState as useState3 } from "react";
4506
+ var useEditorView = (id) => {
4507
+ const editorRef = useRef2(null);
4508
+ const [prev, setPrev] = useState3([
4509
+ null,
4510
+ ""
4511
+ ]);
4512
+ if (prev[0] !== editorRef.current) {
4513
+ setPrev([
4514
+ editorRef.current,
4515
+ id
4516
+ ]);
4517
+ }
4470
4518
  return [
4471
- (ref) => {
4472
- setView(ref);
4473
- },
4474
- view
4519
+ editorRef,
4520
+ prev[1] !== id
4475
4521
  ];
4476
4522
  };
4477
4523
 
4478
4524
  // packages/ui/react-ui-editor/src/hooks/useTextEditor.ts
4479
4525
  import { EditorSelection as EditorSelection2, EditorState as EditorState3 } from "@codemirror/state";
4480
4526
  import { EditorView as EditorView16 } from "@codemirror/view";
4481
- import { useEffect as useEffect3, useRef as useRef2, useState as useState4 } from "react";
4482
- import { log as log4 } from "@dxos/log";
4527
+ import { useEffect as useEffect3, useRef as useRef3, useState as useState4 } from "react";
4528
+ import { log as log5 } from "@dxos/log";
4483
4529
  import { isNotFalsy as isNotFalsy5 } from "@dxos/util";
4484
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
4530
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
4485
4531
  var useTextEditor = ({ autoFocus, scrollTo, debug, doc, selection, extensions } = {}) => {
4486
- const onUpdate = useRef2();
4532
+ const onUpdate = useRef3();
4487
4533
  const [view, setView] = useState4();
4488
- const parentRef = useRef2(null);
4534
+ const parentRef = useRef3(null);
4489
4535
  useEffect3(() => {
4490
4536
  if (parentRef.current) {
4491
4537
  const state = EditorState3.create({
@@ -4494,8 +4540,8 @@ var useTextEditor = ({ autoFocus, scrollTo, debug, doc, selection, extensions }
4494
4540
  extensions: [
4495
4541
  // TODO(burdon): Doesn't catch errors in keymap functions.
4496
4542
  EditorView16.exceptionSink.of((err) => {
4497
- log4.catch(err, void 0, {
4498
- F: __dxlog_file5,
4543
+ log5.catch(err, void 0, {
4544
+ F: __dxlog_file6,
4499
4545
  L: 57,
4500
4546
  S: void 0,
4501
4547
  C: (f, a) => f(...a)
@@ -4584,22 +4630,13 @@ var createThemeExtensions = ({ theme, themeMode, slots } = {}) => {
4584
4630
 
4585
4631
  // packages/ui/react-ui-editor/src/hooks/useTextModel.ts
4586
4632
  import get4 from "lodash.get";
4587
- import { useEffect as useEffect4, useState as useState5 } from "react";
4633
+ import { useState as useState5, useMemo as useMemo2 } from "react";
4588
4634
  import { generateName } from "@dxos/display-name";
4589
4635
  import { getRawDoc } from "@dxos/echo-schema";
4590
4636
  import { invariant as invariant3 } from "@dxos/invariant";
4591
4637
  import { isAutomergeObject } from "@dxos/react-client/echo";
4592
- var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
4593
- var useTextModel = (props) => {
4594
- const { identity, space, text } = props;
4595
- const [model, setModel] = useState5();
4596
- useEffect4(() => setModel(createModel(props)), [
4597
- identity,
4598
- space,
4599
- text
4600
- ]);
4601
- return model;
4602
- };
4638
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextModel.ts";
4639
+ var useTextModel = (props) => useMemo2(() => createModel(props), Object.values(props));
4603
4640
  var useInMemoryTextModel = ({ id, defaultContent }) => {
4604
4641
  const [content, setContent] = useState5(defaultContent ?? "");
4605
4642
  return {
@@ -4614,7 +4651,7 @@ var createModel = ({ space, identity, text }) => {
4614
4651
  return void 0;
4615
4652
  }
4616
4653
  invariant3(isAutomergeObject(text), void 0, {
4617
- F: __dxlog_file6,
4654
+ F: __dxlog_file7,
4618
4655
  L: 54,
4619
4656
  S: void 0,
4620
4657
  A: [
@@ -4699,6 +4736,9 @@ export {
4699
4736
  defaultSlots,
4700
4737
  defaultTextSlots,
4701
4738
  defaultTheme,
4739
+ editorFillLayoutEditor,
4740
+ editorFillLayoutRoot,
4741
+ editorHalfViewportOverscrollContent,
4702
4742
  editorMode,
4703
4743
  editorWithToolbarLayout,
4704
4744
  focusComment,