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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/lib/browser/index.mjs +371 -499
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +379 -515
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +371 -499
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/{stories/InputMode.stories.d.ts → InputMode.stories.d.ts} +1 -1
  11. package/dist/types/src/InputMode.stories.d.ts.map +1 -0
  12. package/dist/types/src/{stories/TextEditorBasic.stories.d.ts → TextEditor.stories.d.ts} +35 -2
  13. package/dist/types/src/TextEditor.stories.d.ts.map +1 -0
  14. package/dist/types/src/components/EditorToolbar/util.d.ts +3 -3
  15. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  16. package/dist/types/src/components/EditorToolbar/{view-mode.d.ts → viewMode.d.ts} +1 -1
  17. package/dist/types/src/components/EditorToolbar/viewMode.d.ts.map +1 -0
  18. package/dist/types/src/defaults.d.ts +0 -1
  19. package/dist/types/src/defaults.d.ts.map +1 -1
  20. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  21. package/dist/types/src/extensions/command/command.d.ts +10 -5
  22. package/dist/types/src/extensions/command/command.d.ts.map +1 -1
  23. package/dist/types/src/extensions/command/hint.d.ts +2 -4
  24. package/dist/types/src/extensions/command/hint.d.ts.map +1 -1
  25. package/dist/types/src/extensions/command/index.d.ts +0 -1
  26. package/dist/types/src/extensions/command/index.d.ts.map +1 -1
  27. package/dist/types/src/extensions/command/menu.d.ts +2 -7
  28. package/dist/types/src/extensions/command/menu.d.ts.map +1 -1
  29. package/dist/types/src/extensions/command/preview.d.ts +12 -0
  30. package/dist/types/src/extensions/command/preview.d.ts.map +1 -0
  31. package/dist/types/src/extensions/command/state.d.ts +11 -9
  32. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  33. package/dist/types/src/extensions/comments.d.ts +7 -9
  34. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  35. package/dist/types/src/extensions/index.d.ts +0 -1
  36. package/dist/types/src/extensions/index.d.ts.map +1 -1
  37. package/dist/types/src/extensions/markdown/decorate.d.ts +1 -4
  38. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  39. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -2
  40. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  41. package/dist/types/src/extensions/markdown/link.d.ts +1 -4
  42. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  43. package/dist/types/src/fragments.d.ts +3 -0
  44. package/dist/types/src/fragments.d.ts.map +1 -0
  45. package/dist/types/src/hooks/useTextEditor.d.ts +1 -2
  46. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  47. package/dist/types/src/types.d.ts +0 -5
  48. package/dist/types/src/types.d.ts.map +1 -1
  49. package/dist/types/src/util/react.d.ts +1 -6
  50. package/dist/types/src/util/react.d.ts.map +1 -1
  51. package/package.json +27 -33
  52. package/src/{stories/InputMode.stories.tsx → InputMode.stories.tsx} +4 -4
  53. package/src/TextEditor.stories.tsx +856 -0
  54. package/src/components/EditorToolbar/EditorToolbar.tsx +2 -2
  55. package/src/components/EditorToolbar/util.ts +3 -3
  56. package/src/defaults.ts +3 -5
  57. package/src/extensions/automerge/automerge.stories.tsx +11 -3
  58. package/src/extensions/command/command.ts +27 -9
  59. package/src/extensions/command/hint.ts +30 -33
  60. package/src/extensions/command/index.ts +0 -1
  61. package/src/extensions/command/menu.ts +8 -11
  62. package/src/extensions/command/preview.ts +79 -0
  63. package/src/extensions/command/state.ts +61 -41
  64. package/src/extensions/comments.ts +9 -9
  65. package/src/extensions/folding.tsx +1 -1
  66. package/src/extensions/index.ts +0 -1
  67. package/src/extensions/markdown/decorate.ts +3 -4
  68. package/src/extensions/markdown/formatting.ts +2 -2
  69. package/src/extensions/markdown/image.ts +11 -12
  70. package/src/extensions/markdown/link.ts +24 -33
  71. package/src/fragments.ts +19 -0
  72. package/src/hooks/useTextEditor.ts +3 -4
  73. package/src/types.ts +0 -7
  74. package/src/util/react.tsx +2 -20
  75. package/dist/lib/browser/testing/index.mjs +0 -67
  76. package/dist/lib/browser/testing/index.mjs.map +0 -7
  77. package/dist/lib/node/testing/index.cjs +0 -101
  78. package/dist/lib/node/testing/index.cjs.map +0 -7
  79. package/dist/lib/node-esm/testing/index.mjs +0 -69
  80. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  81. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +0 -1
  82. package/dist/types/src/extensions/command/action.d.ts +0 -17
  83. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  84. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  85. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  86. package/dist/types/src/extensions/preview/preview.d.ts +0 -39
  87. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  88. package/dist/types/src/stories/InputMode.stories.d.ts.map +0 -1
  89. package/dist/types/src/stories/TextEditorBasic.stories.d.ts.map +0 -1
  90. package/dist/types/src/stories/TextEditorComments.stories.d.ts +0 -13
  91. package/dist/types/src/stories/TextEditorComments.stories.d.ts.map +0 -1
  92. package/dist/types/src/stories/TextEditorPreview.stories.d.ts +0 -13
  93. package/dist/types/src/stories/TextEditorPreview.stories.d.ts.map +0 -1
  94. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts +0 -19
  95. package/dist/types/src/stories/TextEditorSpecial.stories.d.ts.map +0 -1
  96. package/dist/types/src/stories/story-utils.d.ts +0 -53
  97. package/dist/types/src/stories/story-utils.d.ts.map +0 -1
  98. package/dist/types/src/testing/RefPopover.d.ts +0 -21
  99. package/dist/types/src/testing/RefPopover.d.ts.map +0 -1
  100. package/dist/types/src/testing/index.d.ts +0 -2
  101. package/dist/types/src/testing/index.d.ts.map +0 -1
  102. package/src/extensions/command/action.ts +0 -49
  103. package/src/extensions/preview/index.ts +0 -5
  104. package/src/extensions/preview/preview.ts +0 -271
  105. package/src/stories/TextEditorBasic.stories.tsx +0 -289
  106. package/src/stories/TextEditorComments.stories.tsx +0 -99
  107. package/src/stories/TextEditorPreview.stories.tsx +0 -239
  108. package/src/stories/TextEditorSpecial.stories.tsx +0 -107
  109. package/src/stories/story-utils.tsx +0 -329
  110. package/src/testing/RefPopover.tsx +0 -74
  111. package/src/testing/index.ts +0 -5
  112. /package/src/components/EditorToolbar/{view-mode.ts → viewMode.ts} +0 -0
@@ -47,10 +47,10 @@ import { textBlockWidth } from "@dxos/react-ui-theme";
47
47
 
48
48
  // packages/ui/react-ui-editor/src/components/EditorToolbar/util.ts
49
49
  import { useMemo } from "react";
50
- import { live } from "@dxos/live-object";
50
+ import { create } from "@dxos/live-object";
51
51
  import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
52
52
  var useEditorToolbarState = (initialState = {}) => {
53
- return useMemo(() => live(initialState), []);
53
+ return useMemo(() => create(initialState), []);
54
54
  };
55
55
  var createEditorAction = (payload, icon, label = [
56
56
  `${payload.type} label`,
@@ -266,7 +266,7 @@ var createLists = (state) => {
266
266
  };
267
267
  };
268
268
 
269
- // packages/ui/react-ui-editor/src/components/EditorToolbar/view-mode.ts
269
+ // packages/ui/react-ui-editor/src/components/EditorToolbar/viewMode.ts
270
270
  var createViewModeGroupAction = (value) => createEditorActionGroup("viewMode", {
271
271
  variant: "dropdownMenu",
272
272
  applyActive: true,
@@ -311,12 +311,99 @@ var createViewMode = (state) => {
311
311
  };
312
312
  };
313
313
 
314
+ // packages/ui/react-ui-editor/src/fragments.ts
315
+ import { mx } from "@dxos/react-ui-theme";
316
+ var stackItemContentToolbarClassNames = (role) => mx("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
317
+
318
+ // packages/ui/react-ui-editor/src/components/EditorToolbar/EditorToolbar.tsx
319
+ var createToolbar = ({ state, customActions, ...features }) => {
320
+ const nodes = [];
321
+ const edges = [];
322
+ if (features.headings ?? true) {
323
+ const headings2 = createHeadings(state);
324
+ nodes.push(...headings2.nodes);
325
+ edges.push(...headings2.edges);
326
+ }
327
+ if (features.formatting ?? true) {
328
+ const formatting = createFormatting(state);
329
+ nodes.push(...formatting.nodes);
330
+ edges.push(...formatting.edges);
331
+ }
332
+ if (features.lists ?? true) {
333
+ const lists = createLists(state);
334
+ nodes.push(...lists.nodes);
335
+ edges.push(...lists.edges);
336
+ }
337
+ if (features.blocks ?? true) {
338
+ const blocks = createBlocks(state);
339
+ nodes.push(...blocks.nodes);
340
+ edges.push(...blocks.edges);
341
+ }
342
+ if (customActions) {
343
+ const custom = customActions();
344
+ nodes.push(...custom.nodes);
345
+ edges.push(...custom.edges);
346
+ }
347
+ const editorToolbarGap = createGapSeparator();
348
+ nodes.push(...editorToolbarGap.nodes);
349
+ edges.push(...editorToolbarGap.edges);
350
+ if (features.comment ?? true) {
351
+ const comment = createComment(state);
352
+ nodes.push(...comment.nodes);
353
+ edges.push(...comment.edges);
354
+ }
355
+ if (features.search ?? true) {
356
+ nodes.push(editorToolbarSearch);
357
+ edges.push({
358
+ source: "root",
359
+ target: editorToolbarSearch.id
360
+ });
361
+ }
362
+ if (features.viewMode ?? true) {
363
+ const viewMode = createViewMode(state);
364
+ nodes.push(...viewMode.nodes);
365
+ edges.push(...viewMode.edges);
366
+ }
367
+ return {
368
+ nodes,
369
+ edges
370
+ };
371
+ };
372
+ var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
373
+ const menuCreator = useCallback(() => createToolbar(props), [
374
+ props
375
+ ]);
376
+ const { resolveGroupItems } = useMenuActions(menuCreator);
377
+ return {
378
+ resolveGroupItems,
379
+ onAction
380
+ };
381
+ };
382
+ var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
383
+ const menuProps = useEditorToolbarActionGraph(props);
384
+ return /* @__PURE__ */ React.createElement("div", {
385
+ role: "none",
386
+ className: stackItemContentToolbarClassNames(role)
387
+ }, /* @__PURE__ */ React.createElement(ElevationProvider, {
388
+ elevation: role === "section" ? "positioned" : "base"
389
+ }, /* @__PURE__ */ React.createElement(MenuProvider, {
390
+ ...menuProps,
391
+ attendableId
392
+ }, /* @__PURE__ */ React.createElement(ToolbarMenu, {
393
+ classNames: [
394
+ textBlockWidth,
395
+ "!bg-transparent",
396
+ classNames
397
+ ]
398
+ }))));
399
+ };
400
+
314
401
  // packages/ui/react-ui-editor/src/defaults.ts
315
402
  import { EditorView } from "@codemirror/view";
316
- import { mx as mx2 } from "@dxos/react-ui-theme";
403
+ import { mx as mx3 } from "@dxos/react-ui-theme";
317
404
 
318
405
  // packages/ui/react-ui-editor/src/styles/markdown.ts
319
- import { mx } from "@dxos/react-ui-theme";
406
+ import { mx as mx2 } from "@dxos/react-ui-theme";
320
407
  var headings = {
321
408
  1: "text-4xl",
322
409
  2: "text-3xl",
@@ -330,7 +417,7 @@ var theme = {
330
417
  codeMark: "font-mono text-primary-500",
331
418
  mark: "opacity-50",
332
419
  heading: (level) => {
333
- return mx(headings[level], "dark:text-primary-400");
420
+ return mx2(headings[level], "dark:text-primary-400");
334
421
  }
335
422
  };
336
423
 
@@ -549,9 +636,8 @@ var defaultTheme = {
549
636
 
550
637
  // packages/ui/react-ui-editor/src/defaults.ts
551
638
  var margin = "!mt-[1rem]";
552
- var editorWidth = "!mli-auto is-full max-is-[min(50rem,100%-4rem)]";
553
- var editorContent = mx2(margin, editorWidth);
554
- var editorFullWidth = mx2(margin);
639
+ var editorContent = mx3(margin, "!mli-auto w-full max-w-[min(50rem,100%-4rem)]");
640
+ var editorFullWidth = mx3(margin);
555
641
  var editorGutter = EditorView.theme({
556
642
  // Match margin from content.
557
643
  // Gutter = 2rem + 1rem margin.
@@ -566,91 +652,8 @@ var editorMonospace = EditorView.theme({
566
652
  }
567
653
  });
568
654
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
569
- 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");
570
- var stackItemContentToolbarClassNames = (role) => mx2("attention-surface is-full border-be !border-separator relative z-[1]", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
571
-
572
- // packages/ui/react-ui-editor/src/components/EditorToolbar/EditorToolbar.tsx
573
- var createToolbar = ({ state, customActions, ...features }) => {
574
- const nodes = [];
575
- const edges = [];
576
- if (features.headings ?? true) {
577
- const headings2 = createHeadings(state);
578
- nodes.push(...headings2.nodes);
579
- edges.push(...headings2.edges);
580
- }
581
- if (features.formatting ?? true) {
582
- const formatting = createFormatting(state);
583
- nodes.push(...formatting.nodes);
584
- edges.push(...formatting.edges);
585
- }
586
- if (features.lists ?? true) {
587
- const lists = createLists(state);
588
- nodes.push(...lists.nodes);
589
- edges.push(...lists.edges);
590
- }
591
- if (features.blocks ?? true) {
592
- const blocks = createBlocks(state);
593
- nodes.push(...blocks.nodes);
594
- edges.push(...blocks.edges);
595
- }
596
- if (customActions) {
597
- const custom = customActions();
598
- nodes.push(...custom.nodes);
599
- edges.push(...custom.edges);
600
- }
601
- const editorToolbarGap = createGapSeparator();
602
- nodes.push(...editorToolbarGap.nodes);
603
- edges.push(...editorToolbarGap.edges);
604
- if (features.comment ?? true) {
605
- const comment = createComment(state);
606
- nodes.push(...comment.nodes);
607
- edges.push(...comment.edges);
608
- }
609
- if (features.search ?? true) {
610
- nodes.push(editorToolbarSearch);
611
- edges.push({
612
- source: "root",
613
- target: editorToolbarSearch.id
614
- });
615
- }
616
- if (features.viewMode ?? true) {
617
- const viewMode = createViewMode(state);
618
- nodes.push(...viewMode.nodes);
619
- edges.push(...viewMode.edges);
620
- }
621
- return {
622
- nodes,
623
- edges
624
- };
625
- };
626
- var useEditorToolbarActionGraph = ({ onAction, ...props }) => {
627
- const menuCreator = useCallback(() => createToolbar(props), [
628
- props
629
- ]);
630
- const { resolveGroupItems } = useMenuActions(menuCreator);
631
- return {
632
- resolveGroupItems,
633
- onAction
634
- };
635
- };
636
- var EditorToolbar = ({ classNames, attendableId, role, ...props }) => {
637
- const menuProps = useEditorToolbarActionGraph(props);
638
- return /* @__PURE__ */ React.createElement("div", {
639
- role: "none",
640
- className: stackItemContentToolbarClassNames(role)
641
- }, /* @__PURE__ */ React.createElement(ElevationProvider, {
642
- elevation: role === "section" ? "positioned" : "base"
643
- }, /* @__PURE__ */ React.createElement(MenuProvider, {
644
- ...menuProps,
645
- attendableId
646
- }, /* @__PURE__ */ React.createElement(ToolbarMenu, {
647
- classNames: [
648
- textBlockWidth,
649
- "!bg-transparent",
650
- classNames
651
- ]
652
- }))));
653
- };
655
+ var stackItemContentEditorClassNames = (role) => mx3("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");
656
+ var stackItemContentToolbarClassNames2 = (role) => mx3("attention-surface is-full border-be !border-separator", role === "section" && "sticky block-start-0 z-[1] -mbe-px min-is-0");
654
657
 
655
658
  // packages/ui/react-ui-editor/src/extensions/annotations.ts
656
659
  import { StateField } from "@codemirror/state";
@@ -791,7 +794,7 @@ var clientRectsFor = (dom) => {
791
794
  // packages/ui/react-ui-editor/src/util/react.tsx
792
795
  import React2 from "react";
793
796
  import { createRoot } from "react-dom/client";
794
- import { ThemeProvider, Tooltip } from "@dxos/react-ui";
797
+ import { ThemeProvider } from "@dxos/react-ui";
795
798
  import { defaultTx } from "@dxos/react-ui-theme";
796
799
  var createElement = (tag, options, children) => {
797
800
  const el = document.createElement(tag);
@@ -811,11 +814,6 @@ var renderRoot = (root, node) => {
811
814
  }, node));
812
815
  return root;
813
816
  };
814
- var createRenderer = (Component) => (el, props) => {
815
- renderRoot(el, /* @__PURE__ */ React2.createElement(ThemeProvider, {
816
- tx: defaultTx
817
- }, /* @__PURE__ */ React2.createElement(Tooltip.Provider, null, /* @__PURE__ */ React2.createElement(Component, props))));
818
- };
819
817
 
820
818
  // packages/ui/react-ui-editor/src/extensions/annotations.ts
821
819
  var annotationMark = Decoration.mark({
@@ -1859,11 +1857,15 @@ var random = (min, max) => {
1859
1857
  return min + ~~(Math.random() * (max - min + 1));
1860
1858
  };
1861
1859
 
1862
- // packages/ui/react-ui-editor/src/extensions/command/action.ts
1863
- import { StateEffect as StateEffect2 } from "@codemirror/state";
1860
+ // packages/ui/react-ui-editor/src/extensions/command/command.ts
1861
+ import { EditorView as EditorView8, keymap as keymap3 } from "@codemirror/view";
1862
+
1863
+ // packages/ui/react-ui-editor/src/extensions/command/hint.ts
1864
+ import { RangeSetBuilder } from "@codemirror/state";
1865
+ import { Decoration as Decoration3, EditorView as EditorView6, ViewPlugin as ViewPlugin3, WidgetType as WidgetType2 } from "@codemirror/view";
1864
1866
 
1865
1867
  // packages/ui/react-ui-editor/src/extensions/command/state.ts
1866
- import { StateField as StateField3 } from "@codemirror/state";
1868
+ import { StateEffect as StateEffect2, StateField as StateField3 } from "@codemirror/state";
1867
1869
  import { showTooltip } from "@codemirror/view";
1868
1870
  var commandConfig = singleValueFacet();
1869
1871
  var commandState = StateField3.define({
@@ -1873,8 +1875,8 @@ var commandState = StateField3.define({
1873
1875
  if (effect.is(closeEffect)) {
1874
1876
  return {};
1875
1877
  }
1876
- const { renderDialog } = tr.state.facet(commandConfig);
1877
- if (effect.is(openEffect) && renderDialog) {
1878
+ if (effect.is(openEffect)) {
1879
+ const options = tr.state.facet(commandConfig);
1878
1880
  const { pos, fullWidth } = effect.value;
1879
1881
  const tooltip = {
1880
1882
  pos,
@@ -1882,39 +1884,34 @@ var commandState = StateField3.define({
1882
1884
  arrow: false,
1883
1885
  strictSide: true,
1884
1886
  create: (view) => {
1885
- const root = document.createElement("div");
1887
+ const dom = document.createElement("div");
1886
1888
  const tooltipView = {
1887
- dom: root,
1889
+ dom,
1888
1890
  mount: (view2) => {
1889
1891
  if (fullWidth) {
1890
- const parent = root.parentElement;
1892
+ const parent = dom.parentElement;
1891
1893
  const { paddingLeft, paddingRight } = window.getComputedStyle(parent);
1892
1894
  const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
1893
- root.style.width = `${widthWithoutPadding}px`;
1895
+ dom.style.width = `${widthWithoutPadding}px`;
1894
1896
  }
1895
- renderDialog(root, {
1896
- onAction: (action) => {
1897
+ options.onRenderDialog(dom, (action) => {
1898
+ view2.dispatch({
1899
+ effects: closeEffect.of(null)
1900
+ });
1901
+ if (action?.insert?.length) {
1902
+ const text = action.insert + "\n";
1897
1903
  view2.dispatch({
1898
- effects: closeEffect.of(null)
1899
- });
1900
- switch (action?.type) {
1901
- case "insert": {
1902
- const text = action.text + "\n";
1903
- view2.dispatch({
1904
- changes: {
1905
- from: pos,
1906
- insert: text
1907
- },
1908
- selection: {
1909
- anchor: pos + text.length
1910
- }
1911
- });
1912
- break;
1904
+ changes: {
1905
+ from: pos,
1906
+ insert: text
1907
+ },
1908
+ selection: {
1909
+ anchor: pos + text.length
1913
1910
  }
1914
- }
1915
- requestAnimationFrame(() => view2.focus());
1911
+ });
1916
1912
  }
1917
- }, view2);
1913
+ requestAnimationFrame(() => view2.focus());
1914
+ });
1918
1915
  }
1919
1916
  };
1920
1917
  return tooltipView;
@@ -1931,8 +1928,6 @@ var commandState = StateField3.define({
1931
1928
  showTooltip.from(field, (value) => value.tooltip ?? null)
1932
1929
  ]
1933
1930
  });
1934
-
1935
- // packages/ui/react-ui-editor/src/extensions/command/action.ts
1936
1931
  var openEffect = StateEffect2.define();
1937
1932
  var closeEffect = StateEffect2.define();
1938
1933
  var openCommand = (view) => {
@@ -1971,38 +1966,7 @@ var commandKeyBindings = [
1971
1966
  }
1972
1967
  ];
1973
1968
 
1974
- // packages/ui/react-ui-editor/src/extensions/command/command.ts
1975
- import { EditorView as EditorView7, keymap as keymap3 } from "@codemirror/view";
1976
-
1977
1969
  // packages/ui/react-ui-editor/src/extensions/command/hint.ts
1978
- import { RangeSetBuilder } from "@codemirror/state";
1979
- import { Decoration as Decoration3, EditorView as EditorView6, ViewPlugin as ViewPlugin3, WidgetType as WidgetType2 } from "@codemirror/view";
1980
- var hintViewPlugin = ({ onHint }) => ViewPlugin3.fromClass(class {
1981
- constructor() {
1982
- this.deco = Decoration3.none;
1983
- }
1984
- update(update2) {
1985
- const builder = new RangeSetBuilder();
1986
- const cState = update2.view.state.field(commandState, false);
1987
- if (!cState?.tooltip) {
1988
- const selection = update2.view.state.selection.main;
1989
- const line = update2.view.state.doc.lineAt(selection.from);
1990
- if (selection.from === selection.to && line.from === line.to) {
1991
- const hint = onHint();
1992
- if (hint) {
1993
- builder.add(selection.from, selection.to, Decoration3.widget({
1994
- widget: new CommandHint(hint)
1995
- }));
1996
- }
1997
- }
1998
- }
1999
- this.deco = builder.finish();
2000
- }
2001
- }, {
2002
- provide: (plugin) => [
2003
- EditorView6.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration3.none)
2004
- ]
2005
- });
2006
1970
  var CommandHint = class extends WidgetType2 {
2007
1971
  constructor(content) {
2008
1972
  super();
@@ -2042,6 +2006,32 @@ var CommandHint = class extends WidgetType2 {
2042
2006
  return false;
2043
2007
  }
2044
2008
  };
2009
+ var hintViewPlugin = ({ onHint }) => ViewPlugin3.fromClass(class {
2010
+ constructor() {
2011
+ this.deco = Decoration3.none;
2012
+ }
2013
+ update(update2) {
2014
+ const builder = new RangeSetBuilder();
2015
+ const cState = update2.view.state.field(commandState, false);
2016
+ if (!cState?.tooltip) {
2017
+ const selection = update2.view.state.selection.main;
2018
+ const line = update2.view.state.doc.lineAt(selection.from);
2019
+ if (selection.from === selection.to && line.from === line.to) {
2020
+ const hint = onHint();
2021
+ if (hint) {
2022
+ builder.add(selection.from, selection.to, Decoration3.widget({
2023
+ widget: new CommandHint(hint)
2024
+ }));
2025
+ }
2026
+ }
2027
+ }
2028
+ this.deco = builder.finish();
2029
+ }
2030
+ }, {
2031
+ provide: (plugin) => [
2032
+ EditorView6.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration3.none)
2033
+ ]
2034
+ });
2045
2035
 
2046
2036
  // packages/ui/react-ui-editor/src/extensions/command/menu.ts
2047
2037
  import { ViewPlugin as ViewPlugin4 } from "@codemirror/view";
@@ -2057,11 +2047,11 @@ var floatingMenu = (options) => ViewPlugin4.fromClass(class {
2057
2047
  this.button.style.position = "absolute";
2058
2048
  this.button.style.zIndex = "10";
2059
2049
  this.button.style.display = "none";
2060
- options.renderMenu(this.button, {
2061
- onAction: () => openCommand(view)
2062
- }, view);
2050
+ options.onRenderMenu(this.button, () => {
2051
+ openCommand(view);
2052
+ });
2063
2053
  container.appendChild(this.button);
2064
- container.addEventListener("scroll", this.scheduleUpdate.bind(this));
2054
+ container.addEventListener("scroll", this.scheduleUpdate);
2065
2055
  this.scheduleUpdate();
2066
2056
  }
2067
2057
  update(update2) {
@@ -2077,7 +2067,7 @@ var floatingMenu = (options) => ViewPlugin4.fromClass(class {
2077
2067
  if (this.rafId != null) {
2078
2068
  cancelAnimationFrame(this.rafId);
2079
2069
  }
2080
- this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
2070
+ this.rafId = requestAnimationFrame(() => this.updateButtonPosition());
2081
2071
  }
2082
2072
  updateButtonPosition() {
2083
2073
  const pos = this.view.state.selection.main.head;
@@ -2107,24 +2097,83 @@ var floatingMenu = (options) => ViewPlugin4.fromClass(class {
2107
2097
  }
2108
2098
  });
2109
2099
 
2100
+ // packages/ui/react-ui-editor/src/extensions/command/preview.ts
2101
+ import { syntaxTree } from "@codemirror/language";
2102
+ import { RangeSetBuilder as RangeSetBuilder2, StateField as StateField4 } from "@codemirror/state";
2103
+ import { Decoration as Decoration4, EditorView as EditorView7, WidgetType as WidgetType3 } from "@codemirror/view";
2104
+ var preview = (options) => {
2105
+ return [
2106
+ StateField4.define({
2107
+ create: (state) => buildDecorations(state, options),
2108
+ update: (_, tr) => buildDecorations(tr.state, options),
2109
+ // TODO(burdon): Make atomic.
2110
+ provide: (field) => EditorView7.decorations.from(field)
2111
+ })
2112
+ ];
2113
+ };
2114
+ var buildDecorations = (state, options) => {
2115
+ const builder = new RangeSetBuilder2();
2116
+ syntaxTree(state).iterate({
2117
+ enter: (node) => {
2118
+ if (node.name === "Link") {
2119
+ const urlNode = node.node.getChild("URL");
2120
+ if (urlNode) {
2121
+ const text = state.sliceDoc(node.from + 1, urlNode.from - 2);
2122
+ const url = state.sliceDoc(urlNode.from, urlNode.to);
2123
+ builder.add(node.from, node.to, Decoration4.replace({
2124
+ block: true,
2125
+ widget: new PreviewWidget(options.onRenderPreview, url, text)
2126
+ }));
2127
+ }
2128
+ }
2129
+ }
2130
+ });
2131
+ return builder.finish();
2132
+ };
2133
+ var PreviewWidget = class extends WidgetType3 {
2134
+ constructor(_onRenderPreview, _url, _text) {
2135
+ super();
2136
+ this._onRenderPreview = _onRenderPreview;
2137
+ this._url = _url;
2138
+ this._text = _text;
2139
+ }
2140
+ eq(other) {
2141
+ return this._url === other._url;
2142
+ }
2143
+ toDOM(view) {
2144
+ const root = document.createElement("div");
2145
+ root.classList.add("cm-preview");
2146
+ this._onRenderPreview(root, {
2147
+ url: this._url,
2148
+ text: this._text
2149
+ });
2150
+ return root;
2151
+ }
2152
+ };
2153
+
2110
2154
  // packages/ui/react-ui-editor/src/extensions/command/command.ts
2111
- var command = (options = {}) => {
2155
+ var command = (options) => {
2112
2156
  return [
2113
- keymap3.of(commandKeyBindings),
2114
2157
  commandConfig.of(options),
2115
2158
  commandState,
2116
- options.renderMenu ? floatingMenu({
2117
- renderMenu: options.renderMenu
2118
- }) : [],
2119
- options.onHint ? hintViewPlugin({
2120
- onHint: options.onHint
2121
- }) : [],
2122
- EditorView7.focusChangeEffect.of((_, focusing) => {
2159
+ keymap3.of(commandKeyBindings),
2160
+ preview(options),
2161
+ floatingMenu(options),
2162
+ hintViewPlugin(options),
2163
+ EditorView8.focusChangeEffect.of((_, focusing) => {
2123
2164
  return focusing ? closeEffect.of(null) : null;
2124
2165
  }),
2125
- EditorView7.theme({
2166
+ EditorView8.theme({
2126
2167
  ".cm-tooltip": {
2127
2168
  background: "transparent"
2169
+ },
2170
+ ".cm-preview": {
2171
+ marginLeft: "-1rem",
2172
+ marginRight: "-1rem",
2173
+ padding: "1rem",
2174
+ borderRadius: "1rem",
2175
+ background: "var(--dx-modalSurface)",
2176
+ border: "1px solid var(--dx-separator)"
2128
2177
  }
2129
2178
  })
2130
2179
  ];
@@ -2132,8 +2181,8 @@ var command = (options = {}) => {
2132
2181
 
2133
2182
  // packages/ui/react-ui-editor/src/extensions/comments.ts
2134
2183
  import { invertedEffects } from "@codemirror/commands";
2135
- import { StateEffect as StateEffect3, StateField as StateField4 } from "@codemirror/state";
2136
- import { hoverTooltip, keymap as keymap5, Decoration as Decoration4, EditorView as EditorView9, ViewPlugin as ViewPlugin5 } from "@codemirror/view";
2184
+ import { StateEffect as StateEffect3, StateField as StateField5 } from "@codemirror/state";
2185
+ import { hoverTooltip, keymap as keymap5, Decoration as Decoration5, EditorView as EditorView10, ViewPlugin as ViewPlugin5 } from "@codemirror/view";
2137
2186
  import sortBy from "lodash.sortby";
2138
2187
  import { useEffect, useMemo as useMemo2 } from "react";
2139
2188
  import { debounce as debounce2 } from "@dxos/async";
@@ -2142,7 +2191,7 @@ import { isNonNullable } from "@dxos/util";
2142
2191
 
2143
2192
  // packages/ui/react-ui-editor/src/extensions/selection.ts
2144
2193
  import { Transaction } from "@codemirror/state";
2145
- import { EditorView as EditorView8, keymap as keymap4 } from "@codemirror/view";
2194
+ import { EditorView as EditorView9, keymap as keymap4 } from "@codemirror/view";
2146
2195
  import { debounce } from "@dxos/async";
2147
2196
  import { invariant as invariant3 } from "@dxos/invariant";
2148
2197
  import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
@@ -2153,7 +2202,7 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
2153
2202
  return {
2154
2203
  selection,
2155
2204
  scrollIntoView: !scrollTo,
2156
- effects: scrollTo ? EditorView8.scrollIntoView(scrollTo, {
2205
+ effects: scrollTo ? EditorView9.scrollIntoView(scrollTo, {
2157
2206
  yMargin: 96
2158
2207
  }) : void 0,
2159
2208
  annotations: Transaction.userEvent.of(stateRestoreAnnotation)
@@ -2195,7 +2244,7 @@ var selectionState = ({ getState, setState } = {}) => {
2195
2244
  // setStateDebounced(id, {});
2196
2245
  // },
2197
2246
  // }),
2198
- EditorView8.updateListener.of(({ view, transactions }) => {
2247
+ EditorView9.updateListener.of(({ view, transactions }) => {
2199
2248
  const id = view.state.facet(documentId);
2200
2249
  if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
2201
2250
  return;
@@ -2238,7 +2287,7 @@ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src
2238
2287
  var setComments = StateEffect3.define();
2239
2288
  var setSelection = StateEffect3.define();
2240
2289
  var setCommentState = StateEffect3.define();
2241
- var commentsState = StateField4.define({
2290
+ var commentsState = StateField5.define({
2242
2291
  create: (state) => ({
2243
2292
  id: state.facet(documentId),
2244
2293
  comments: [],
@@ -2276,7 +2325,7 @@ var commentsState = StateField4.define({
2276
2325
  return value;
2277
2326
  }
2278
2327
  });
2279
- var styles3 = EditorView9.theme({
2328
+ var styles3 = EditorView10.theme({
2280
2329
  ".cm-comment, .cm-comment-current": {
2281
2330
  margin: "0 -3px",
2282
2331
  padding: "3px",
@@ -2289,14 +2338,14 @@ var styles3 = EditorView9.theme({
2289
2338
  textDecoration: "underline"
2290
2339
  }
2291
2340
  });
2292
- var createCommentMark = (id, isCurrent) => Decoration4.mark({
2341
+ var createCommentMark = (id, isCurrent) => Decoration5.mark({
2293
2342
  class: isCurrent ? "cm-comment-current" : "cm-comment",
2294
2343
  attributes: {
2295
2344
  "data-testid": "cm-comment",
2296
2345
  "data-comment-id": id
2297
2346
  }
2298
2347
  });
2299
- var commentsDecorations = EditorView9.decorations.compute([
2348
+ var commentsDecorations = EditorView10.decorations.compute([
2300
2349
  commentsState
2301
2350
  ], (state) => {
2302
2351
  const { selection: { current }, comments: comments2 } = state.field(commentsState);
@@ -2316,10 +2365,10 @@ var commentsDecorations = EditorView9.decorations.compute([
2316
2365
  const mark = createCommentMark(comment.comment.id, comment.comment.id === current);
2317
2366
  return mark.range(range.from, range.to);
2318
2367
  }).filter(isNonNullable);
2319
- return Decoration4.set(decorations);
2368
+ return Decoration5.set(decorations);
2320
2369
  });
2321
2370
  var commentClickedEffect = StateEffect3.define();
2322
- var handleCommentClick = EditorView9.domEventHandlers({
2371
+ var handleCommentClick = EditorView10.domEventHandlers({
2323
2372
  click: (event, view) => {
2324
2373
  let target = event.target;
2325
2374
  const editorRoot = view.dom;
@@ -2358,7 +2407,7 @@ var trackPastedComments = (onUpdate) => {
2358
2407
  }
2359
2408
  };
2360
2409
  return [
2361
- EditorView9.domEventHandlers({
2410
+ EditorView10.domEventHandlers({
2362
2411
  cut: handleTrack,
2363
2412
  copy: handleTrack
2364
2413
  }),
@@ -2380,7 +2429,7 @@ var trackPastedComments = (onUpdate) => {
2380
2429
  return effects;
2381
2430
  }),
2382
2431
  // Handle paste or the undo of comment deletion.
2383
- EditorView9.updateListener.of((update2) => {
2432
+ EditorView10.updateListener.of((update2) => {
2384
2433
  const restore = [];
2385
2434
  for (let i = 0; i < update2.transactions.length; i++) {
2386
2435
  const tr = update2.transactions[i];
@@ -2491,7 +2540,7 @@ var comments = (options = {}) => {
2491
2540
  // Hover tooltip (for key shortcut hints, etc.)
2492
2541
  // TODO(burdon): Factor out to generic hints extension for current selection/line.
2493
2542
  //
2494
- options.renderTooltip && hoverTooltip((view, pos) => {
2543
+ options.onHover && hoverTooltip((view, pos) => {
2495
2544
  const selection = view.state.selection.main;
2496
2545
  if (selection && pos >= selection.from && pos <= selection.to) {
2497
2546
  return {
@@ -2500,9 +2549,7 @@ var comments = (options = {}) => {
2500
2549
  above: true,
2501
2550
  create: () => {
2502
2551
  const el = document.createElement("div");
2503
- options.renderTooltip(el, {
2504
- shortcut
2505
- }, view);
2552
+ options.onHover(el, shortcut);
2506
2553
  return {
2507
2554
  dom: el,
2508
2555
  offset: {
@@ -2522,7 +2569,7 @@ var comments = (options = {}) => {
2522
2569
  //
2523
2570
  // Track deleted ranges and update ranges for decorations.
2524
2571
  //
2525
- EditorView9.updateListener.of(({ view, state, changes }) => {
2572
+ EditorView10.updateListener.of(({ view, state, changes }) => {
2526
2573
  let mod = false;
2527
2574
  const { comments: comments2, ...value } = state.field(commentsState);
2528
2575
  changes.iterChanges((from, to, from2, to2) => {
@@ -2554,7 +2601,7 @@ var comments = (options = {}) => {
2554
2601
  //
2555
2602
  // Track selection/proximity.
2556
2603
  //
2557
- EditorView9.updateListener.of(({ view, state }) => {
2604
+ EditorView10.updateListener.of(({ view, state }) => {
2558
2605
  let min = Infinity;
2559
2606
  const { selection: { current, closest }, comments: comments2 } = state.field(commentsState);
2560
2607
  const { head } = state.selection.main;
@@ -2608,7 +2655,7 @@ var scrollThreadIntoView = (view, id, center = true) => {
2608
2655
  anchor: range.from
2609
2656
  } : void 0,
2610
2657
  effects: [
2611
- needsScroll ? EditorView9.scrollIntoView(range.from, center ? {
2658
+ needsScroll ? EditorView10.scrollIntoView(range.from, center ? {
2612
2659
  y: "center"
2613
2660
  } : void 0) : [],
2614
2661
  needsSelectionUpdate ? setSelection.of({
@@ -2660,7 +2707,7 @@ var createExternalCommentSync = (id, subscribe, getComments) => ViewPlugin5.from
2660
2707
  }
2661
2708
  });
2662
2709
  var useCommentState = (state) => {
2663
- return useMemo2(() => EditorView9.updateListener.of((update2) => {
2710
+ return useMemo2(() => EditorView10.updateListener.of((update2) => {
2664
2711
  if (update2.docChanged || update2.selectionSet) {
2665
2712
  state.comment = selectionOverlapsComment(update2.state);
2666
2713
  state.selection = hasActiveSelection(update2.state);
@@ -2684,7 +2731,7 @@ var useComments = (view, id, comments2) => {
2684
2731
  });
2685
2732
  };
2686
2733
  var useCommentClickListener = (onCommentClick) => {
2687
- return useMemo2(() => EditorView9.updateListener.of((update2) => {
2734
+ return useMemo2(() => EditorView10.updateListener.of((update2) => {
2688
2735
  update2.transactions.forEach((transaction) => {
2689
2736
  transaction.effects.forEach((effect) => {
2690
2737
  if (effect.is(commentClickedEffect)) {
@@ -2698,21 +2745,21 @@ var useCommentClickListener = (onCommentClick) => {
2698
2745
  };
2699
2746
 
2700
2747
  // packages/ui/react-ui-editor/src/extensions/debug.ts
2701
- import { syntaxTree } from "@codemirror/language";
2702
- import { StateField as StateField5 } from "@codemirror/state";
2748
+ import { syntaxTree as syntaxTree2 } from "@codemirror/language";
2749
+ import { StateField as StateField6 } from "@codemirror/state";
2703
2750
  var debugNodeLogger = (log8 = console.log) => {
2704
- const logTokens = (state) => syntaxTree(state).iterate({
2751
+ const logTokens = (state) => syntaxTree2(state).iterate({
2705
2752
  enter: (node) => log8(node.type)
2706
2753
  });
2707
- return StateField5.define({
2754
+ return StateField6.define({
2708
2755
  create: (state) => logTokens(state),
2709
2756
  update: (_, tr) => logTokens(tr.state)
2710
2757
  });
2711
2758
  };
2712
2759
 
2713
2760
  // packages/ui/react-ui-editor/src/extensions/dnd.ts
2714
- import { dropCursor, EditorView as EditorView10 } from "@codemirror/view";
2715
- var styles4 = EditorView10.theme({
2761
+ import { dropCursor, EditorView as EditorView11 } from "@codemirror/view";
2762
+ var styles4 = EditorView11.theme({
2716
2763
  ".cm-dropCursor": {
2717
2764
  borderLeft: "2px solid var(--dx-accentText)",
2718
2765
  color: "var(--dx-accentText)",
@@ -2726,7 +2773,7 @@ var dropFile = (options = {}) => {
2726
2773
  return [
2727
2774
  styles4,
2728
2775
  dropCursor(),
2729
- EditorView10.domEventHandlers({
2776
+ EditorView11.domEventHandlers({
2730
2777
  drop: (event, view) => {
2731
2778
  event.preventDefault();
2732
2779
  const files = event.dataTransfer?.files;
@@ -2753,7 +2800,7 @@ import { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from "@cod
2753
2800
  import { searchKeymap } from "@codemirror/search";
2754
2801
  import { EditorState } from "@codemirror/state";
2755
2802
  import { oneDarkHighlightStyle } from "@codemirror/theme-one-dark";
2756
- import { EditorView as EditorView12, drawSelection, dropCursor as dropCursor2, highlightActiveLine, keymap as keymap6, lineNumbers, placeholder, scrollPastEnd } from "@codemirror/view";
2803
+ import { EditorView as EditorView13, drawSelection, dropCursor as dropCursor2, highlightActiveLine, keymap as keymap6, lineNumbers, placeholder, scrollPastEnd } from "@codemirror/view";
2757
2804
  import defaultsDeep2 from "lodash.defaultsdeep";
2758
2805
  import merge from "lodash.merge";
2759
2806
  import { generateName } from "@dxos/display-name";
@@ -2761,10 +2808,10 @@ import { log as log5 } from "@dxos/log";
2761
2808
  import { hexToHue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
2762
2809
 
2763
2810
  // packages/ui/react-ui-editor/src/extensions/focus.ts
2764
- import { StateEffect as StateEffect4, StateField as StateField6 } from "@codemirror/state";
2765
- import { EditorView as EditorView11 } from "@codemirror/view";
2811
+ import { StateEffect as StateEffect4, StateField as StateField7 } from "@codemirror/state";
2812
+ import { EditorView as EditorView12 } from "@codemirror/view";
2766
2813
  var focusEffect = StateEffect4.define();
2767
- var focusField = StateField6.define({
2814
+ var focusField = StateField7.define({
2768
2815
  create: () => false,
2769
2816
  update: (value, tr) => {
2770
2817
  for (const effect of tr.effects) {
@@ -2777,7 +2824,7 @@ var focusField = StateField6.define({
2777
2824
  });
2778
2825
  var focus = [
2779
2826
  focusField,
2780
- EditorView11.domEventHandlers({
2827
+ EditorView12.domEventHandlers({
2781
2828
  focus: (event, view) => {
2782
2829
  setTimeout(() => view.dispatch({
2783
2830
  effects: focusEffect.of(true)
@@ -2815,7 +2862,7 @@ var createBasicExtensions = (_props) => {
2815
2862
  const props = defaultsDeep2({}, _props, defaultBasicOptions);
2816
2863
  return [
2817
2864
  // NOTE: Doesn't catch errors in keymap functions.
2818
- EditorView12.exceptionSink.of((err) => {
2865
+ EditorView13.exceptionSink.of((err) => {
2819
2866
  log5.catch(err, void 0, {
2820
2867
  F: __dxlog_file8,
2821
2868
  L: 96,
@@ -2830,12 +2877,12 @@ var createBasicExtensions = (_props) => {
2830
2877
  props.drawSelection && drawSelection({
2831
2878
  cursorBlinkRate: 1200
2832
2879
  }),
2833
- props.editable !== void 0 && EditorView12.editable.of(props.editable),
2880
+ props.editable !== void 0 && EditorView13.editable.of(props.editable),
2834
2881
  props.focus && focus,
2835
2882
  props.highlightActiveLine && highlightActiveLine(),
2836
2883
  props.history && history(),
2837
2884
  props.lineNumbers && lineNumbers(),
2838
- props.lineWrapping && EditorView12.lineWrapping,
2885
+ props.lineWrapping && EditorView13.lineWrapping,
2839
2886
  props.placeholder && placeholder(props.placeholder),
2840
2887
  props.readOnly !== void 0 && EditorState.readOnly.of(props.readOnly),
2841
2888
  props.scrollPastEnd && scrollPastEnd(),
@@ -2872,14 +2919,14 @@ var defaultThemeSlots = {
2872
2919
  var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _syntaxHighlighting, slots: _slots } = {}) => {
2873
2920
  const slots = defaultsDeep2({}, _slots, defaultThemeSlots);
2874
2921
  return [
2875
- EditorView12.darkTheme.of(themeMode === "dark"),
2876
- EditorView12.baseTheme(styles5 ? merge({}, defaultTheme, styles5) : defaultTheme),
2922
+ EditorView13.darkTheme.of(themeMode === "dark"),
2923
+ EditorView13.baseTheme(styles5 ? merge({}, defaultTheme, styles5) : defaultTheme),
2877
2924
  // https://github.com/codemirror/theme-one-dark
2878
2925
  _syntaxHighlighting && (themeMode === "dark" ? syntaxHighlighting(oneDarkHighlightStyle) : syntaxHighlighting(defaultHighlightStyle)),
2879
- slots.editor?.className && EditorView12.editorAttributes.of({
2926
+ slots.editor?.className && EditorView13.editorAttributes.of({
2880
2927
  class: slots.editor.className
2881
2928
  }),
2882
- slots.content?.className && EditorView12.contentAttributes.of({
2929
+ slots.content?.className && EditorView13.contentAttributes.of({
2883
2930
  class: slots.content.className
2884
2931
  })
2885
2932
  ].filter(isNotFalsy3);
@@ -2908,7 +2955,7 @@ var createDataExtensions = ({ id, text, space, identity }) => {
2908
2955
 
2909
2956
  // packages/ui/react-ui-editor/src/extensions/folding.tsx
2910
2957
  import { codeFolding, foldGutter } from "@codemirror/language";
2911
- import { EditorView as EditorView13 } from "@codemirror/view";
2958
+ import { EditorView as EditorView14 } from "@codemirror/view";
2912
2959
  import React3 from "react";
2913
2960
  import { Icon } from "@dxos/react-ui";
2914
2961
  var folding = (_props = {}) => [
@@ -2923,7 +2970,7 @@ var folding = (_props = {}) => [
2923
2970
  className: "flex h-full items-center"
2924
2971
  });
2925
2972
  return renderRoot(el, /* @__PURE__ */ React3.createElement(Icon, {
2926
- icon: "ph--caret-right--bold",
2973
+ icon: "ph--caret-right--regular",
2927
2974
  size: 3,
2928
2975
  classNames: [
2929
2976
  "mx-3 cursor-pointer",
@@ -2932,7 +2979,7 @@ var folding = (_props = {}) => [
2932
2979
  }));
2933
2980
  }
2934
2981
  }),
2935
- EditorView13.theme({
2982
+ EditorView14.theme({
2936
2983
  ".cm-foldGutter": {
2937
2984
  opacity: 0.3,
2938
2985
  transition: "opacity 0.3s",
@@ -2945,14 +2992,14 @@ var folding = (_props = {}) => [
2945
2992
  ];
2946
2993
 
2947
2994
  // packages/ui/react-ui-editor/src/extensions/listener.ts
2948
- import { EditorView as EditorView14 } from "@codemirror/view";
2995
+ import { EditorView as EditorView15 } from "@codemirror/view";
2949
2996
  var listener = ({ onFocus, onChange }) => {
2950
2997
  const extensions = [];
2951
- onFocus && extensions.push(EditorView14.focusChangeEffect.of((_, focusing) => {
2998
+ onFocus && extensions.push(EditorView15.focusChangeEffect.of((_, focusing) => {
2952
2999
  onFocus(focusing);
2953
3000
  return null;
2954
3001
  }));
2955
- onChange && extensions.push(EditorView14.updateListener.of((update2) => {
3002
+ onChange && extensions.push(EditorView15.updateListener.of((update2) => {
2956
3003
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2957
3004
  }));
2958
3005
  return extensions;
@@ -2960,9 +3007,9 @@ var listener = ({ onFocus, onChange }) => {
2960
3007
 
2961
3008
  // packages/ui/react-ui-editor/src/extensions/markdown/formatting.ts
2962
3009
  import { snippet } from "@codemirror/autocomplete";
2963
- import { syntaxTree as syntaxTree2 } from "@codemirror/language";
3010
+ import { syntaxTree as syntaxTree3 } from "@codemirror/language";
2964
3011
  import { EditorSelection } from "@codemirror/state";
2965
- import { EditorView as EditorView15, keymap as keymap7 } from "@codemirror/view";
3012
+ import { EditorView as EditorView16, keymap as keymap7 } from "@codemirror/view";
2966
3013
  import { useMemo as useMemo3 } from "react";
2967
3014
  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;
2968
3015
  var Inline;
@@ -2985,7 +3032,7 @@ var setHeading = (level) => {
2985
3032
  let prevBlock = -1;
2986
3033
  for (const range of ranges) {
2987
3034
  let sawBlock = false;
2988
- syntaxTree2(state).iterate({
3035
+ syntaxTree3(state).iterate({
2989
3036
  from: range.from,
2990
3037
  to: range.to,
2991
3038
  enter: (node) => {
@@ -3094,7 +3141,7 @@ var setStyle = (type, enable) => {
3094
3141
  let startCovered = false;
3095
3142
  let endCovered = false;
3096
3143
  let { from, to } = range;
3097
- syntaxTree2(state).iterate({
3144
+ syntaxTree3(state).iterate({
3098
3145
  from,
3099
3146
  to,
3100
3147
  enter: (node) => {
@@ -3297,7 +3344,7 @@ var insertTable = (view) => {
3297
3344
  snippets.table(view, null, from, from);
3298
3345
  };
3299
3346
  var removeLinkInner = (from, to, changes, state) => {
3300
- syntaxTree2(state).iterate({
3347
+ syntaxTree3(state).iterate({
3301
3348
  from,
3302
3349
  to,
3303
3350
  enter: (node) => {
@@ -3342,7 +3389,7 @@ var addLink = ({ url, image: image2 } = {}) => {
3342
3389
  let { from, to } = range;
3343
3390
  const cutStyles = [];
3344
3391
  let okay = null;
3345
- syntaxTree2(state).iterate({
3392
+ syntaxTree3(state).iterate({
3346
3393
  from,
3347
3394
  to,
3348
3395
  enter: (node) => {
@@ -3437,7 +3484,7 @@ var addList = (type) => {
3437
3484
  let parentColumn = null;
3438
3485
  const blocks = [];
3439
3486
  for (const { from, to } of state.selection.ranges) {
3440
- syntaxTree2(state).iterate({
3487
+ syntaxTree3(state).iterate({
3441
3488
  from,
3442
3489
  to,
3443
3490
  enter: (node) => {
@@ -3572,7 +3619,7 @@ var removeList = (type) => {
3572
3619
  const stack = [];
3573
3620
  const targetNodeType = type === 0 ? "OrderedList" : type === 1 ? "BulletList" : "TaskList";
3574
3621
  for (const { from, to } of state.selection.ranges) {
3575
- syntaxTree2(state).iterate({
3622
+ syntaxTree3(state).iterate({
3576
3623
  from,
3577
3624
  to,
3578
3625
  enter: (node) => {
@@ -3659,7 +3706,7 @@ var setBlockquote = (enable) => {
3659
3706
  let lastBlock = -1;
3660
3707
  for (const { from, to } of state.selection.ranges) {
3661
3708
  const sawBlock = false;
3662
- syntaxTree2(state).iterate({
3709
+ syntaxTree3(state).iterate({
3663
3710
  from,
3664
3711
  to,
3665
3712
  enter: (node) => {
@@ -3749,7 +3796,7 @@ var addCodeblock = (target) => {
3749
3796
  for (const { from, to } of selection.ranges) {
3750
3797
  let blockFrom = from;
3751
3798
  let blockTo = to;
3752
- syntaxTree2(state).iterate({
3799
+ syntaxTree3(state).iterate({
3753
3800
  from,
3754
3801
  to,
3755
3802
  enter: (node) => {
@@ -3800,7 +3847,7 @@ var removeCodeblock = ({ state, dispatch }) => {
3800
3847
  let lastBlock = -1;
3801
3848
  const changes = [];
3802
3849
  for (const { from, to } of state.selection.ranges) {
3803
- syntaxTree2(state).iterate({
3850
+ syntaxTree3(state).iterate({
3804
3851
  from,
3805
3852
  to,
3806
3853
  enter: (node) => {
@@ -3962,7 +4009,7 @@ var getFormatting = (state) => {
3962
4009
  }
3963
4010
  }
3964
4011
  }
3965
- syntaxTree2(state).iterate({
4012
+ syntaxTree3(state).iterate({
3966
4013
  from: range.from,
3967
4014
  to: range.to,
3968
4015
  enter: (node) => {
@@ -4051,7 +4098,7 @@ var getFormatting = (state) => {
4051
4098
  };
4052
4099
  };
4053
4100
  var useFormattingState = (state) => {
4054
- return useMemo3(() => EditorView15.updateListener.of((update2) => {
4101
+ return useMemo3(() => EditorView16.updateListener.of((update2) => {
4055
4102
  if (update2.docChanged || update2.selectionSet) {
4056
4103
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
4057
4104
  state[key] = active;
@@ -4334,9 +4381,9 @@ var createMarkdownExtensions = ({ themeMode } = {}) => {
4334
4381
  };
4335
4382
 
4336
4383
  // packages/ui/react-ui-editor/src/extensions/markdown/debug.ts
4337
- import { syntaxTree as syntaxTree3 } from "@codemirror/language";
4338
- import { StateField as StateField7 } from "@codemirror/state";
4339
- var debugTree = (cb) => StateField7.define({
4384
+ import { syntaxTree as syntaxTree4 } from "@codemirror/language";
4385
+ import { StateField as StateField8 } from "@codemirror/state";
4386
+ var debugTree = (cb) => StateField8.define({
4340
4387
  create: (state) => cb(convertTreeToJson(state)),
4341
4388
  update: (value, tr) => cb(convertTreeToJson(tr.state))
4342
4389
  });
@@ -4357,24 +4404,24 @@ var convertTreeToJson = (state) => {
4357
4404
  }
4358
4405
  return node;
4359
4406
  };
4360
- return treeToJson(syntaxTree3(state).cursor());
4407
+ return treeToJson(syntaxTree4(state).cursor());
4361
4408
  };
4362
4409
 
4363
4410
  // packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
4364
- import { syntaxTree as syntaxTree7 } from "@codemirror/language";
4365
- import { RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect5 } from "@codemirror/state";
4366
- import { EditorView as EditorView19, Decoration as Decoration7, WidgetType as WidgetType5, ViewPlugin as ViewPlugin7 } from "@codemirror/view";
4411
+ import { syntaxTree as syntaxTree8 } from "@codemirror/language";
4412
+ import { RangeSetBuilder as RangeSetBuilder4, StateEffect as StateEffect5 } from "@codemirror/state";
4413
+ import { EditorView as EditorView20, Decoration as Decoration8, WidgetType as WidgetType6, ViewPlugin as ViewPlugin7 } from "@codemirror/view";
4367
4414
  import { invariant as invariant4 } from "@dxos/invariant";
4368
- import { mx as mx3 } from "@dxos/react-ui-theme";
4415
+ import { mx as mx4 } from "@dxos/react-ui-theme";
4369
4416
 
4370
4417
  // packages/ui/react-ui-editor/src/extensions/markdown/changes.ts
4371
- import { syntaxTree as syntaxTree4 } from "@codemirror/language";
4418
+ import { syntaxTree as syntaxTree5 } from "@codemirror/language";
4372
4419
  import { Transaction as Transaction2 } from "@codemirror/state";
4373
4420
  import { ViewPlugin as ViewPlugin6 } from "@codemirror/view";
4374
4421
  var adjustChanges = () => {
4375
4422
  return ViewPlugin6.fromClass(class {
4376
4423
  update(update2) {
4377
- const tree = syntaxTree4(update2.state);
4424
+ const tree = syntaxTree5(update2.state);
4378
4425
  const adjustments = [];
4379
4426
  for (const tr of update2.transactions) {
4380
4427
  const event = tr.annotation(Transaction2.userEvent);
@@ -4512,14 +4559,14 @@ var getValidUrl = (str) => {
4512
4559
  };
4513
4560
 
4514
4561
  // packages/ui/react-ui-editor/src/extensions/markdown/image.ts
4515
- import { syntaxTree as syntaxTree5 } from "@codemirror/language";
4516
- import { StateField as StateField8 } from "@codemirror/state";
4517
- import { Decoration as Decoration5, EditorView as EditorView16, WidgetType as WidgetType3 } from "@codemirror/view";
4562
+ import { syntaxTree as syntaxTree6 } from "@codemirror/language";
4563
+ import { StateField as StateField9 } from "@codemirror/state";
4564
+ import { Decoration as Decoration6, EditorView as EditorView17, WidgetType as WidgetType4 } from "@codemirror/view";
4518
4565
  var image = (_options = {}) => {
4519
4566
  return [
4520
- StateField8.define({
4567
+ StateField9.define({
4521
4568
  create: (state) => {
4522
- return Decoration5.set(buildDecorations(0, state.doc.length, state));
4569
+ return Decoration6.set(buildDecorations2(0, state.doc.length, state));
4523
4570
  },
4524
4571
  update: (value, tr) => {
4525
4572
  if (!tr.docChanged && !tr.selection) {
@@ -4539,17 +4586,25 @@ var image = (_options = {}) => {
4539
4586
  filterFrom: from,
4540
4587
  filterTo: to,
4541
4588
  filter: () => false,
4542
- add: buildDecorations(from, to, tr.state)
4589
+ add: buildDecorations2(from, to, tr.state)
4543
4590
  });
4544
4591
  },
4545
- provide: (field) => EditorView16.decorations.from(field)
4592
+ provide: (field) => EditorView17.decorations.from(field)
4546
4593
  })
4547
4594
  ];
4548
4595
  };
4549
- var buildDecorations = (from, to, state) => {
4596
+ var preloaded = /* @__PURE__ */ new Set();
4597
+ var preloadImage = (url) => {
4598
+ if (!preloaded.has(url)) {
4599
+ const img = document.createElement("img");
4600
+ img.src = url;
4601
+ preloaded.add(url);
4602
+ }
4603
+ };
4604
+ var buildDecorations2 = (from, to, state) => {
4550
4605
  const decorations = [];
4551
4606
  const cursor = state.selection.main.head;
4552
- syntaxTree5(state).iterate({
4607
+ syntaxTree6(state).iterate({
4553
4608
  enter: (node) => {
4554
4609
  if (node.name === "Image") {
4555
4610
  const urlNode = node.node.getChild("URL");
@@ -4560,7 +4615,7 @@ var buildDecorations = (from, to, state) => {
4560
4615
  return;
4561
4616
  }
4562
4617
  preloadImage(url);
4563
- decorations.push(Decoration5.replace({
4618
+ decorations.push(Decoration6.replace({
4564
4619
  block: true,
4565
4620
  widget: new ImageWidget(url)
4566
4621
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4572,15 +4627,7 @@ var buildDecorations = (from, to, state) => {
4572
4627
  });
4573
4628
  return decorations;
4574
4629
  };
4575
- var preloaded = /* @__PURE__ */ new Set();
4576
- var preloadImage = (url) => {
4577
- if (!preloaded.has(url)) {
4578
- const img = document.createElement("img");
4579
- img.src = url;
4580
- preloaded.add(url);
4581
- }
4582
- };
4583
- var ImageWidget = class extends WidgetType3 {
4630
+ var ImageWidget = class extends WidgetType4 {
4584
4631
  constructor(_url) {
4585
4632
  super();
4586
4633
  this._url = _url;
@@ -4602,10 +4649,10 @@ var ImageWidget = class extends WidgetType3 {
4602
4649
  };
4603
4650
 
4604
4651
  // packages/ui/react-ui-editor/src/extensions/markdown/styles.ts
4605
- import { EditorView as EditorView17 } from "@codemirror/view";
4652
+ import { EditorView as EditorView18 } from "@codemirror/view";
4606
4653
  var bulletListIndentationWidth = 24;
4607
4654
  var orderedListIndentationWidth = 36;
4608
- var formattingStyles = EditorView17.theme({
4655
+ var formattingStyles = EditorView18.theme({
4609
4656
  /**
4610
4657
  * Horizontal rule.
4611
4658
  */
@@ -4724,18 +4771,18 @@ var formattingStyles = EditorView17.theme({
4724
4771
  });
4725
4772
 
4726
4773
  // packages/ui/react-ui-editor/src/extensions/markdown/table.ts
4727
- import { syntaxTree as syntaxTree6 } from "@codemirror/language";
4728
- import { RangeSetBuilder as RangeSetBuilder2, StateField as StateField9 } from "@codemirror/state";
4729
- import { Decoration as Decoration6, EditorView as EditorView18, WidgetType as WidgetType4 } from "@codemirror/view";
4774
+ import { syntaxTree as syntaxTree7 } from "@codemirror/language";
4775
+ import { RangeSetBuilder as RangeSetBuilder3, StateField as StateField10 } from "@codemirror/state";
4776
+ import { Decoration as Decoration7, EditorView as EditorView19, WidgetType as WidgetType5 } from "@codemirror/view";
4730
4777
  var table = (options = {}) => {
4731
- return StateField9.define({
4778
+ return StateField10.define({
4732
4779
  create: (state) => update(state, options),
4733
4780
  update: (_, tr) => update(tr.state, options),
4734
- provide: (field) => EditorView18.decorations.from(field)
4781
+ provide: (field) => EditorView19.decorations.from(field)
4735
4782
  });
4736
4783
  };
4737
4784
  var update = (state, _options) => {
4738
- const builder = new RangeSetBuilder2();
4785
+ const builder = new RangeSetBuilder3();
4739
4786
  const cursor = state.selection.main.head;
4740
4787
  const tables = [];
4741
4788
  const getTable = () => tables[tables.length - 1];
@@ -4743,7 +4790,7 @@ var update = (state, _options) => {
4743
4790
  const table2 = getTable();
4744
4791
  return table2.rows?.[table2.rows.length - 1];
4745
4792
  };
4746
- syntaxTree6(state).iterate({
4793
+ syntaxTree7(state).iterate({
4747
4794
  enter: (node) => {
4748
4795
  switch (node.name) {
4749
4796
  case "Table": {
@@ -4776,19 +4823,19 @@ var update = (state, _options) => {
4776
4823
  tables.forEach((table2) => {
4777
4824
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4778
4825
  if (replace) {
4779
- builder.add(table2.from, table2.to, Decoration6.replace({
4826
+ builder.add(table2.from, table2.to, Decoration7.replace({
4780
4827
  block: true,
4781
4828
  widget: new TableWidget(table2)
4782
4829
  }));
4783
4830
  } else {
4784
- builder.add(table2.from, table2.to, Decoration6.mark({
4831
+ builder.add(table2.from, table2.to, Decoration7.mark({
4785
4832
  class: "cm-table"
4786
4833
  }));
4787
4834
  }
4788
4835
  });
4789
4836
  return builder.finish();
4790
4837
  };
4791
- var TableWidget = class extends WidgetType4 {
4838
+ var TableWidget = class extends WidgetType5 {
4792
4839
  constructor(_table) {
4793
4840
  super();
4794
4841
  this._table = _table;
@@ -4830,14 +4877,14 @@ var Unicode = {
4830
4877
  bulletSmall: "\u2219",
4831
4878
  bulletSquare: "\u2B1D"
4832
4879
  };
4833
- var HorizontalRuleWidget = class extends WidgetType5 {
4880
+ var HorizontalRuleWidget = class extends WidgetType6 {
4834
4881
  toDOM() {
4835
4882
  const el = document.createElement("span");
4836
4883
  el.className = "cm-hr";
4837
4884
  return el;
4838
4885
  }
4839
4886
  };
4840
- var LinkButton = class extends WidgetType5 {
4887
+ var LinkButton = class extends WidgetType6 {
4841
4888
  constructor(url, render) {
4842
4889
  super();
4843
4890
  this.url = url;
@@ -4849,13 +4896,11 @@ var LinkButton = class extends WidgetType5 {
4849
4896
  // TODO(burdon): Create icon and link directly without react?
4850
4897
  toDOM(view) {
4851
4898
  const el = document.createElement("span");
4852
- this.render(el, {
4853
- url: this.url
4854
- }, view);
4899
+ this.render(el, this.url);
4855
4900
  return el;
4856
4901
  }
4857
4902
  };
4858
- var CheckboxWidget = class extends WidgetType5 {
4903
+ var CheckboxWidget = class extends WidgetType6 {
4859
4904
  constructor(_checked) {
4860
4905
  super();
4861
4906
  this._checked = _checked;
@@ -4900,7 +4945,7 @@ var CheckboxWidget = class extends WidgetType5 {
4900
4945
  return false;
4901
4946
  }
4902
4947
  };
4903
- var TextWidget = class extends WidgetType5 {
4948
+ var TextWidget = class extends WidgetType6 {
4904
4949
  constructor(text, className) {
4905
4950
  super();
4906
4951
  this.text = text;
@@ -4915,29 +4960,29 @@ var TextWidget = class extends WidgetType5 {
4915
4960
  return el;
4916
4961
  }
4917
4962
  };
4918
- var hide = Decoration7.replace({});
4919
- var blockQuote = Decoration7.line({
4920
- class: mx3("cm-blockquote")
4963
+ var hide = Decoration8.replace({});
4964
+ var blockQuote = Decoration8.line({
4965
+ class: mx4("cm-blockquote")
4921
4966
  });
4922
- var fencedCodeLine = Decoration7.line({
4923
- class: mx3("cm-code cm-codeblock-line")
4967
+ var fencedCodeLine = Decoration8.line({
4968
+ class: mx4("cm-code cm-codeblock-line")
4924
4969
  });
4925
- var fencedCodeLineFirst = Decoration7.line({
4926
- class: mx3("cm-code cm-codeblock-line", "cm-codeblock-first")
4970
+ var fencedCodeLineFirst = Decoration8.line({
4971
+ class: mx4("cm-code cm-codeblock-line", "cm-codeblock-first")
4927
4972
  });
4928
- var fencedCodeLineLast = Decoration7.line({
4929
- class: mx3("cm-code cm-codeblock-line", "cm-codeblock-last")
4973
+ var fencedCodeLineLast = Decoration8.line({
4974
+ class: mx4("cm-code cm-codeblock-line", "cm-codeblock-last")
4930
4975
  });
4931
4976
  var commentBlockLine = fencedCodeLine;
4932
4977
  var commentBlockLineFirst = fencedCodeLineFirst;
4933
4978
  var commentBlockLineLast = fencedCodeLineLast;
4934
- var horizontalRule = Decoration7.replace({
4979
+ var horizontalRule = Decoration8.replace({
4935
4980
  widget: new HorizontalRuleWidget()
4936
4981
  });
4937
- var checkedTask = Decoration7.replace({
4982
+ var checkedTask = Decoration8.replace({
4938
4983
  widget: new CheckboxWidget(true)
4939
4984
  });
4940
- var uncheckedTask = Decoration7.replace({
4985
+ var uncheckedTask = Decoration8.replace({
4941
4986
  widget: new CheckboxWidget(false)
4942
4987
  });
4943
4988
  var editingRange = (state, range, focus2) => {
@@ -4952,15 +4997,15 @@ var autoHideTags = /* @__PURE__ */ new Set([
4952
4997
  "SubscriptMark",
4953
4998
  "SuperscriptMark"
4954
4999
  ]);
4955
- var buildDecorations2 = (view, options, focus2) => {
4956
- const deco = new RangeSetBuilder3();
4957
- const atomicDeco = new RangeSetBuilder3();
5000
+ var buildDecorations3 = (view, options, focus2) => {
5001
+ const deco = new RangeSetBuilder4();
5002
+ const atomicDeco = new RangeSetBuilder4();
4958
5003
  const { state } = view;
4959
5004
  const headerLevels = [];
4960
5005
  const getHeaderLevels = (node, level) => {
4961
5006
  invariant4(level > 0, void 0, {
4962
5007
  F: __dxlog_file9,
4963
- L: 179,
5008
+ L: 178,
4964
5009
  S: void 0,
4965
5010
  A: [
4966
5011
  "level > 0",
@@ -4999,7 +5044,7 @@ var buildDecorations2 = (view, options, focus2) => {
4999
5044
  const getCurrentListLevel = () => {
5000
5045
  invariant4(listLevels.length, void 0, {
5001
5046
  F: __dxlog_file9,
5002
- L: 201,
5047
+ L: 200,
5003
5048
  S: void 0,
5004
5049
  A: [
5005
5050
  "listLevels.length",
@@ -5041,7 +5086,7 @@ var buildDecorations2 = (view, options, focus2) => {
5041
5086
  } else {
5042
5087
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
5043
5088
  if (num.length) {
5044
- atomicDeco.add(mark.from, mark.from + len, Decoration7.replace({
5089
+ atomicDeco.add(mark.from, mark.from + len, Decoration8.replace({
5045
5090
  widget: new TextWidget(num, theme.heading(level))
5046
5091
  }));
5047
5092
  }
@@ -5066,7 +5111,7 @@ var buildDecorations2 = (view, options, focus2) => {
5066
5111
  if (node.from === line.to - 1) {
5067
5112
  return false;
5068
5113
  }
5069
- deco.add(line.from, line.from, Decoration7.line({
5114
+ deco.add(line.from, line.from, Decoration8.line({
5070
5115
  class: "cm-list-item",
5071
5116
  attributes: {
5072
5117
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -5083,7 +5128,7 @@ var buildDecorations2 = (view, options, focus2) => {
5083
5128
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
5084
5129
  const line = state.doc.lineAt(node.from);
5085
5130
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
5086
- atomicDeco.add(line.from, to, Decoration7.replace({
5131
+ atomicDeco.add(line.from, to, Decoration8.replace({
5087
5132
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
5088
5133
  }));
5089
5134
  break;
@@ -5170,7 +5215,7 @@ var buildDecorations2 = (view, options, focus2) => {
5170
5215
  if (!editing) {
5171
5216
  atomicDeco.add(node.from, marks[0].to, hide);
5172
5217
  }
5173
- deco.add(marks[0].to, marks[1].from, Decoration7.mark({
5218
+ deco.add(marks[0].to, marks[1].from, Decoration8.mark({
5174
5219
  tagName: "a",
5175
5220
  attributes: {
5176
5221
  class: "cm-link",
@@ -5180,7 +5225,7 @@ var buildDecorations2 = (view, options, focus2) => {
5180
5225
  }
5181
5226
  }));
5182
5227
  if (!editing) {
5183
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? Decoration7.replace({
5228
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? Decoration8.replace({
5184
5229
  widget: new LinkButton(url, options.renderLinkButton)
5185
5230
  }) : hide);
5186
5231
  }
@@ -5214,7 +5259,7 @@ var buildDecorations2 = (view, options, focus2) => {
5214
5259
  }
5215
5260
  }
5216
5261
  };
5217
- const tree = syntaxTree7(state);
5262
+ const tree = syntaxTree8(state);
5218
5263
  if (options.numberedHeadings?.from === void 0) {
5219
5264
  for (const { from, to } of view.visibleRanges) {
5220
5265
  tree.iterate({
@@ -5240,11 +5285,11 @@ var decorateMarkdown = (options = {}) => {
5240
5285
  return [
5241
5286
  ViewPlugin7.fromClass(class {
5242
5287
  constructor(view) {
5243
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5288
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(view, options, view.hasFocus));
5244
5289
  }
5245
5290
  update(update2) {
5246
5291
  if (update2.docChanged || update2.viewportChanged || update2.focusChanged || update2.transactions.some((tr) => tr.effects.some((effect) => effect.is(forceUpdate))) || update2.selectionSet && !options.selectionChangeDelay) {
5247
- ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(update2.view, options, update2.view.hasFocus));
5292
+ ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations3(update2.view, options, update2.view.hasFocus));
5248
5293
  this.clearUpdate();
5249
5294
  } else if (update2.selectionSet) {
5250
5295
  this.scheduleUpdate(update2.view);
@@ -5270,9 +5315,9 @@ var decorateMarkdown = (options = {}) => {
5270
5315
  }
5271
5316
  }, {
5272
5317
  provide: (plugin) => [
5273
- EditorView19.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration7.none),
5274
- EditorView19.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration7.none),
5275
- EditorView19.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration7.none)
5318
+ EditorView20.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration8.none),
5319
+ EditorView20.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? Decoration8.none),
5320
+ EditorView20.decorations.of((view) => view.plugin(plugin)?.deco ?? Decoration8.none)
5276
5321
  ]
5277
5322
  }),
5278
5323
  image(),
@@ -5283,12 +5328,12 @@ var decorateMarkdown = (options = {}) => {
5283
5328
  };
5284
5329
 
5285
5330
  // packages/ui/react-ui-editor/src/extensions/markdown/link.ts
5286
- import { syntaxTree as syntaxTree8 } from "@codemirror/language";
5331
+ import { syntaxTree as syntaxTree9 } from "@codemirror/language";
5287
5332
  import { hoverTooltip as hoverTooltip2 } from "@codemirror/view";
5288
5333
  import { tooltipContent } from "@dxos/react-ui-theme";
5289
- var linkTooltip = (renderTooltip) => {
5334
+ var linkTooltip = (render) => {
5290
5335
  return hoverTooltip2((view, pos, side) => {
5291
- const syntax = syntaxTree8(view.state).resolveInner(pos, side);
5336
+ const syntax = syntaxTree9(view.state).resolveInner(pos, side);
5292
5337
  let link = null;
5293
5338
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
5294
5339
  link = node.name === "Link" ? node : null;
@@ -5301,14 +5346,11 @@ var linkTooltip = (renderTooltip) => {
5301
5346
  return {
5302
5347
  pos: link.from,
5303
5348
  end: link.to,
5304
- // NOTE: Forcing above causes the tooltip to flicker.
5305
- // above: true,
5349
+ above: true,
5306
5350
  create: () => {
5307
5351
  const el = document.createElement("div");
5308
- el.className = tooltipContent({});
5309
- renderTooltip(el, {
5310
- url: urlText
5311
- }, view);
5352
+ el.className = tooltipContent({}, "pli-2 plb-1");
5353
+ render(el, urlText);
5312
5354
  return {
5313
5355
  dom: el,
5314
5356
  offset: {
@@ -5318,9 +5360,6 @@ var linkTooltip = (renderTooltip) => {
5318
5360
  };
5319
5361
  }
5320
5362
  };
5321
- }, {
5322
- // NOTE: 0 = default of 300ms.
5323
- hoverTime: 1
5324
5363
  });
5325
5364
  };
5326
5365
 
@@ -5408,165 +5447,6 @@ var InputModeExtensions = {
5408
5447
  ]
5409
5448
  };
5410
5449
 
5411
- // packages/ui/react-ui-editor/src/extensions/preview/preview.ts
5412
- import "@dxos/lit-ui/dx-ref-tag.pcss";
5413
- import { syntaxTree as syntaxTree9 } from "@codemirror/language";
5414
- import { RangeSetBuilder as RangeSetBuilder4, StateField as StateField10 } from "@codemirror/state";
5415
- import { Decoration as Decoration8, EditorView as EditorView20, WidgetType as WidgetType6 } from "@codemirror/view";
5416
- var preview = (options = {}) => {
5417
- return [
5418
- // NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
5419
- // "Block decorations may not be specified via plugins"
5420
- StateField10.define({
5421
- create: (state) => buildDecorations3(state, options),
5422
- update: (_, tr) => buildDecorations3(tr.state, options),
5423
- provide: (field) => [
5424
- EditorView20.decorations.from(field),
5425
- EditorView20.atomicRanges.of((view) => view.state.field(field))
5426
- ]
5427
- }),
5428
- EditorView20.theme({
5429
- ".cm-preview-block": {
5430
- marginLeft: "-1rem",
5431
- marginRight: "-1rem",
5432
- padding: "1rem",
5433
- borderRadius: "0.5rem",
5434
- background: "var(--dx-modalSurface)",
5435
- border: "1px solid var(--dx-separator)"
5436
- }
5437
- })
5438
- ];
5439
- };
5440
- var getLinkRef = (state, node) => {
5441
- const mark = node.getChild("LinkMark");
5442
- const label = node.getChild("LinkLabel");
5443
- if (mark && label) {
5444
- const ref = state.sliceDoc(label.from + 1, label.to - 1);
5445
- return {
5446
- suggest: ref.startsWith("?"),
5447
- block: state.sliceDoc(mark.from, mark.from + 1) === "!",
5448
- label: state.sliceDoc(mark.to, label.from - 1),
5449
- ref: ref.startsWith("?") ? ref.slice(1) : ref
5450
- };
5451
- }
5452
- };
5453
- var buildDecorations3 = (state, options) => {
5454
- const builder = new RangeSetBuilder4();
5455
- syntaxTree9(state).iterate({
5456
- enter: (node) => {
5457
- switch (node.name) {
5458
- //
5459
- // Decoration.
5460
- // [Label][dxn:echo:123]
5461
- //
5462
- case "Link": {
5463
- const link = getLinkRef(state, node.node);
5464
- if (link) {
5465
- builder.add(node.from, node.to, Decoration8.replace({
5466
- widget: new PreviewInlineWidget(options, link)
5467
- }));
5468
- }
5469
- break;
5470
- }
5471
- //
5472
- // Block widget.
5473
- // ![Label][dxn:echo:123]
5474
- //
5475
- case "Image": {
5476
- const link = getLinkRef(state, node.node);
5477
- if (options.renderBlock && link) {
5478
- builder.add(node.from, node.to, Decoration8.replace({
5479
- block: true,
5480
- // atomic: true,
5481
- widget: new PreviewBlockWidget(options, link)
5482
- }));
5483
- }
5484
- break;
5485
- }
5486
- }
5487
- }
5488
- });
5489
- return builder.finish();
5490
- };
5491
- var PreviewInlineWidget = class extends WidgetType6 {
5492
- constructor(_options, _link) {
5493
- super();
5494
- this._options = _options;
5495
- this._link = _link;
5496
- }
5497
- // override ignoreEvent() {
5498
- // return false;
5499
- // }
5500
- eq(other) {
5501
- return this._link.ref === other._link.ref && this._link.label === other._link.label;
5502
- }
5503
- toDOM(view) {
5504
- const root = document.createElement("dx-ref-tag");
5505
- root.textContent = this._link.label;
5506
- root.setAttribute("ref", this._link.ref);
5507
- return root;
5508
- }
5509
- };
5510
- var PreviewBlockWidget = class extends WidgetType6 {
5511
- constructor(_options, _link) {
5512
- super();
5513
- this._options = _options;
5514
- this._link = _link;
5515
- }
5516
- // override ignoreEvent() {
5517
- // return true;
5518
- // }
5519
- eq(other) {
5520
- return this._link.ref === other._link.ref;
5521
- }
5522
- toDOM(view) {
5523
- const root = document.createElement("div");
5524
- root.classList.add("cm-preview-block");
5525
- const handleAction = (action) => {
5526
- const pos = view.posAtDOM(root);
5527
- const node = syntaxTree9(view.state).resolve(pos + 1).node.parent;
5528
- if (!node) {
5529
- return;
5530
- }
5531
- const link = getLinkRef(view.state, node);
5532
- if (link?.ref !== action.link.ref) {
5533
- return;
5534
- }
5535
- switch (action.type) {
5536
- // TODO(burdon): Should we dispatch to the view or mutate the document? (i.e., handle externally?)
5537
- // Insert ref text.
5538
- case "insert": {
5539
- view.dispatch({
5540
- changes: {
5541
- from: node.from,
5542
- to: node.to,
5543
- insert: action.target.text
5544
- }
5545
- });
5546
- break;
5547
- }
5548
- // Remove ref.
5549
- case "delete": {
5550
- view.dispatch({
5551
- changes: {
5552
- from: node.from,
5553
- to: node.to
5554
- }
5555
- });
5556
- break;
5557
- }
5558
- }
5559
- };
5560
- this._options.renderBlock(root, {
5561
- readonly: view.state.readOnly,
5562
- link: this._link,
5563
- onAction: handleAction,
5564
- onLookup: this._options.onLookup
5565
- }, view);
5566
- return root;
5567
- }
5568
- };
5569
-
5570
5450
  // packages/ui/react-ui-editor/src/extensions/typewriter.ts
5571
5451
  import { keymap as keymap10 } from "@codemirror/view";
5572
5452
  var defaultItems = [
@@ -5642,7 +5522,7 @@ import { getProviderValue, isNotFalsy as isNotFalsy4 } from "@dxos/util";
5642
5522
  var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
5643
5523
  var instanceCount = 0;
5644
5524
  var useTextEditor = (props = {}, deps = []) => {
5645
- const { id, doc, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo4(() => getProviderValue(props), deps ?? []);
5525
+ const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo4(() => getProviderValue(props), deps ?? []);
5646
5526
  const [instanceId] = useState(() => `text-editor-${++instanceCount}`);
5647
5527
  const [view, setView] = useState();
5648
5528
  const parentRef = useRef(null);
@@ -5655,7 +5535,7 @@ var useTextEditor = (props = {}, deps = []) => {
5655
5535
  doc: initialValue?.length ?? 0
5656
5536
  }, {
5657
5537
  F: __dxlog_file11,
5658
- L: 76,
5538
+ L: 75,
5659
5539
  S: void 0,
5660
5540
  C: (f, a) => f(...a)
5661
5541
  });
@@ -5672,7 +5552,7 @@ var useTextEditor = (props = {}, deps = []) => {
5672
5552
  };
5673
5553
  }
5674
5554
  const state = EditorState2.create({
5675
- doc: doc ?? initialValue,
5555
+ doc: initialValue,
5676
5556
  // selection: initialSelection,
5677
5557
  extensions: [
5678
5558
  id && documentId.of(id),
@@ -5681,7 +5561,7 @@ var useTextEditor = (props = {}, deps = []) => {
5681
5561
  EditorView21.exceptionSink.of((err) => {
5682
5562
  log7.catch(err, void 0, {
5683
5563
  F: __dxlog_file11,
5684
- L: 98,
5564
+ L: 97,
5685
5565
  S: void 0,
5686
5566
  C: (f, a) => f(...a)
5687
5567
  });
@@ -5713,7 +5593,7 @@ var useTextEditor = (props = {}, deps = []) => {
5713
5593
  id
5714
5594
  }, {
5715
5595
  F: __dxlog_file11,
5716
- L: 135,
5596
+ L: 134,
5717
5597
  S: void 0,
5718
5598
  C: (f, a) => f(...a)
5719
5599
  });
@@ -5730,7 +5610,7 @@ var useTextEditor = (props = {}, deps = []) => {
5730
5610
  selection
5731
5611
  }, {
5732
5612
  F: __dxlog_file11,
5733
- L: 144,
5613
+ L: 143,
5734
5614
  S: void 0,
5735
5615
  C: (f, a) => f(...a)
5736
5616
  });
@@ -5812,10 +5692,7 @@ export {
5812
5692
  blast,
5813
5693
  callbackWrapper,
5814
5694
  clientRectsFor,
5815
- closeCommand,
5816
- closeEffect,
5817
5695
  command,
5818
- commandKeyBindings,
5819
5696
  comments,
5820
5697
  commentsState,
5821
5698
  convertTreeToJson,
@@ -5829,7 +5706,6 @@ export {
5829
5706
  createElement,
5830
5707
  createExternalCommentSync,
5831
5708
  createMarkdownExtensions,
5832
- createRenderer,
5833
5709
  createThemeExtensions,
5834
5710
  debugDispatcher,
5835
5711
  debugNodeLogger,
@@ -5843,7 +5719,6 @@ export {
5843
5719
  editorGutter,
5844
5720
  editorInputMode,
5845
5721
  editorMonospace,
5846
- editorWidth,
5847
5722
  editorWithToolbarLayout,
5848
5723
  flattenRect,
5849
5724
  focus,
@@ -5862,11 +5737,8 @@ export {
5862
5737
  markdownTags,
5863
5738
  markdownTagsExtensions,
5864
5739
  mention,
5865
- openCommand,
5866
- openEffect,
5867
5740
  overlap,
5868
5741
  preventNewline,
5869
- preview,
5870
5742
  processEditorPayload,
5871
5743
  removeBlockquote,
5872
5744
  removeCodeblock,
@@ -5884,7 +5756,7 @@ export {
5884
5756
  setStyle,
5885
5757
  singleValueFacet,
5886
5758
  stackItemContentEditorClassNames,
5887
- stackItemContentToolbarClassNames,
5759
+ stackItemContentToolbarClassNames2 as stackItemContentToolbarClassNames,
5888
5760
  table,
5889
5761
  tags2 as tags,
5890
5762
  textRange,