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