@dxos/react-ui-editor 0.8.2 → 0.8.3-main.672df60

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 (56) hide show
  1. package/dist/lib/browser/index.mjs +159 -105
  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 +172 -119
  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 +159 -105
  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/extensions/command/menu.d.ts.map +1 -1
  11. package/dist/types/src/extensions/hashtag.d.ts +3 -0
  12. package/dist/types/src/extensions/hashtag.d.ts.map +1 -0
  13. package/dist/types/src/extensions/index.d.ts +1 -0
  14. package/dist/types/src/extensions/index.d.ts.map +1 -1
  15. package/dist/types/src/extensions/json.d.ts.map +1 -1
  16. package/dist/types/src/extensions/markdown/debug.d.ts +2 -2
  17. package/dist/types/src/extensions/markdown/debug.d.ts.map +1 -1
  18. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -3
  19. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  20. package/dist/types/src/stories/Command.stories.d.ts +1 -1
  21. package/dist/types/src/stories/Command.stories.d.ts.map +1 -1
  22. package/dist/types/src/stories/Comments.stories.d.ts +1 -1
  23. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  24. package/dist/types/src/stories/Experimental.stories.d.ts +1 -1
  25. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  26. package/dist/types/src/stories/Markdown.stories.d.ts +1 -1
  27. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  28. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  29. package/dist/types/src/stories/Preview.stories.d.ts +1 -1
  30. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  31. package/dist/types/src/stories/TextEditor.stories.d.ts +1 -1
  32. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  33. package/dist/types/src/stories/components/EditorStory.d.ts +43 -0
  34. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -0
  35. package/dist/types/src/stories/components/index.d.ts +3 -0
  36. package/dist/types/src/stories/components/index.d.ts.map +1 -0
  37. package/dist/types/src/stories/{util.d.ts → components/util.d.ts} +3 -18
  38. package/dist/types/src/stories/components/util.d.ts.map +1 -0
  39. package/package.json +28 -27
  40. package/src/extensions/command/menu.ts +31 -22
  41. package/src/extensions/hashtag.tsx +68 -0
  42. package/src/extensions/index.ts +1 -0
  43. package/src/extensions/json.ts +2 -1
  44. package/src/extensions/markdown/debug.ts +2 -2
  45. package/src/extensions/outliner/outliner.ts +9 -8
  46. package/src/stories/Command.stories.tsx +1 -1
  47. package/src/stories/Comments.stories.tsx +2 -2
  48. package/src/stories/Experimental.stories.tsx +2 -2
  49. package/src/stories/Markdown.stories.tsx +2 -2
  50. package/src/stories/Outliner.stories.tsx +19 -7
  51. package/src/stories/Preview.stories.tsx +2 -2
  52. package/src/stories/TextEditor.stories.tsx +3 -3
  53. package/src/stories/components/EditorStory.tsx +135 -0
  54. package/src/stories/components/index.ts +6 -0
  55. package/src/stories/{util.tsx → components/util.tsx} +5 -100
  56. package/dist/types/src/stories/util.d.ts.map +0 -1
@@ -104,6 +104,7 @@ __export(node_exports, {
104
104
  getFormatting: () => getFormatting,
105
105
  getListItemContent: () => getListItemContent,
106
106
  getRange: () => getRange,
107
+ hashtag: () => hashtag,
107
108
  image: () => image,
108
109
  indentItemLess: () => indentItemLess,
109
110
  indentItemMore: () => indentItemMore,
@@ -224,6 +225,7 @@ var import_view8 = require("@codemirror/view");
224
225
  var import_state10 = require("@codemirror/state");
225
226
  var import_view9 = require("@codemirror/view");
226
227
  var import_view10 = require("@codemirror/view");
228
+ var import_async3 = require("@dxos/async");
227
229
  var import_state11 = require("@codemirror/state");
228
230
  var import_view11 = require("@codemirror/view");
229
231
  var import_commands = require("@codemirror/commands");
@@ -231,12 +233,12 @@ var import_state12 = require("@codemirror/state");
231
233
  var import_view12 = require("@codemirror/view");
232
234
  var import_lodash2 = __toESM(require("lodash.sortby"));
233
235
  var import_react4 = require("react");
234
- var import_async3 = require("@dxos/async");
236
+ var import_async4 = require("@dxos/async");
235
237
  var import_log4 = require("@dxos/log");
236
238
  var import_util = require("@dxos/util");
237
239
  var import_state13 = require("@codemirror/state");
238
240
  var import_view13 = require("@codemirror/view");
239
- var import_async4 = require("@dxos/async");
241
+ var import_async5 = require("@dxos/async");
240
242
  var import_invariant3 = require("@dxos/invariant");
241
243
  var import_util2 = require("@dxos/util");
242
244
  var import_language = require("@codemirror/language");
@@ -263,14 +265,16 @@ var import_language3 = require("@codemirror/language");
263
265
  var import_view17 = require("@codemirror/view");
264
266
  var import_react5 = __toESM(require("react"));
265
267
  var import_react_ui3 = require("@dxos/react-ui");
268
+ var import_view18 = require("@codemirror/view");
269
+ var import_react_ui_theme5 = require("@dxos/react-ui-theme");
266
270
  var import_lang_json = require("@codemirror/lang-json");
267
271
  var import_lint = require("@codemirror/lint");
268
272
  var import_ajv = __toESM(require("ajv"));
269
- var import_view18 = require("@codemirror/view");
273
+ var import_view19 = require("@codemirror/view");
270
274
  var import_autocomplete3 = require("@codemirror/autocomplete");
271
275
  var import_language4 = require("@codemirror/language");
272
276
  var import_state17 = require("@codemirror/state");
273
- var import_view19 = require("@codemirror/view");
277
+ var import_view20 = require("@codemirror/view");
274
278
  var import_react6 = require("react");
275
279
  var import_autocomplete4 = require("@codemirror/autocomplete");
276
280
  var import_commands3 = require("@codemirror/commands");
@@ -278,7 +282,7 @@ var import_lang_markdown2 = require("@codemirror/lang-markdown");
278
282
  var import_language5 = require("@codemirror/language");
279
283
  var import_language_data = require("@codemirror/language-data");
280
284
  var import_lint2 = require("@codemirror/lint");
281
- var import_view20 = require("@codemirror/view");
285
+ var import_view21 = require("@codemirror/view");
282
286
  var import_util5 = require("@dxos/util");
283
287
  var import_lang_markdown3 = require("@codemirror/lang-markdown");
284
288
  var import_language6 = require("@codemirror/language");
@@ -288,63 +292,63 @@ var import_language7 = require("@codemirror/language");
288
292
  var import_state18 = require("@codemirror/state");
289
293
  var import_language8 = require("@codemirror/language");
290
294
  var import_state19 = require("@codemirror/state");
291
- var import_view21 = require("@codemirror/view");
295
+ var import_view22 = require("@codemirror/view");
292
296
  var import_invariant4 = require("@dxos/invariant");
293
- var import_react_ui_theme5 = require("@dxos/react-ui-theme");
297
+ var import_react_ui_theme6 = require("@dxos/react-ui-theme");
294
298
  var import_language9 = require("@codemirror/language");
295
299
  var import_state20 = require("@codemirror/state");
296
- var import_view22 = require("@codemirror/view");
300
+ var import_view23 = require("@codemirror/view");
297
301
  var import_language10 = require("@codemirror/language");
298
302
  var import_state21 = require("@codemirror/state");
299
- var import_view23 = require("@codemirror/view");
300
303
  var import_view24 = require("@codemirror/view");
304
+ var import_view25 = require("@codemirror/view");
301
305
  var import_language11 = require("@codemirror/language");
302
306
  var import_state22 = require("@codemirror/state");
303
- var import_view25 = require("@codemirror/view");
304
- var import_language12 = require("@codemirror/language");
305
307
  var import_view26 = require("@codemirror/view");
306
- var import_react_ui_theme6 = require("@dxos/react-ui-theme");
308
+ var import_language12 = require("@codemirror/language");
309
+ var import_view27 = require("@codemirror/view");
310
+ var import_react_ui_theme7 = require("@dxos/react-ui-theme");
307
311
  var import_autocomplete5 = require("@codemirror/autocomplete");
308
312
  var import_log6 = require("@dxos/log");
309
- var import_view27 = require("@codemirror/view");
313
+ var import_view28 = require("@codemirror/view");
310
314
  var import_codemirror_vim = require("@replit/codemirror-vim");
311
315
  var import_codemirror_vscode_keymap = require("@replit/codemirror-vscode-keymap");
312
316
  var import_effect = require("effect");
313
317
  var import_commands4 = require("@codemirror/commands");
314
318
  var import_language13 = require("@codemirror/language");
315
319
  var import_state23 = require("@codemirror/state");
316
- var import_view28 = require("@codemirror/view");
320
+ var import_view29 = require("@codemirror/view");
317
321
  var import_state24 = require("@codemirror/state");
318
322
  var import_language14 = require("@codemirror/language");
319
323
  var import_state25 = require("@codemirror/state");
320
324
  var import_state26 = require("@codemirror/state");
321
325
  var import_invariant5 = require("@dxos/invariant");
322
326
  var import_state27 = require("@codemirror/state");
323
- var import_view29 = require("@codemirror/view");
324
- var import_react_ui_theme7 = require("@dxos/react-ui-theme");
325
- var import_state28 = require("@codemirror/state");
326
327
  var import_view30 = require("@codemirror/view");
328
+ var import_react_ui_theme8 = require("@dxos/react-ui-theme");
329
+ var import_state28 = require("@codemirror/state");
330
+ var import_view31 = require("@codemirror/view");
327
331
  var import_log7 = require("@dxos/log");
328
332
  var import_dx_ref_tag = require("@dxos/lit-ui/dx-ref-tag.pcss");
329
333
  var import_language15 = require("@codemirror/language");
330
334
  var import_state29 = require("@codemirror/state");
331
- var import_view31 = require("@codemirror/view");
332
335
  var import_view32 = require("@codemirror/view");
333
- var import_search2 = require("@codemirror/search");
334
336
  var import_view33 = require("@codemirror/view");
335
- var import_react_ui_theme8 = require("@dxos/react-ui-theme");
337
+ var import_search2 = require("@codemirror/search");
338
+ var import_view34 = require("@codemirror/view");
339
+ var import_react_ui_theme9 = require("@dxos/react-ui-theme");
336
340
  var import_tracking2 = require("@preact-signals/safe-react/tracking");
337
341
  var import_react_context = require("@radix-ui/react-context");
338
342
  var import_react7 = __toESM(require("react"));
339
- var import_async5 = require("@dxos/async");
343
+ var import_async6 = require("@dxos/async");
340
344
  var import_react_ui4 = require("@dxos/react-ui");
341
345
  var import_tracking3 = require("@preact-signals/safe-react/tracking");
342
346
  var import_react_context2 = require("@radix-ui/react-context");
343
347
  var import_react8 = __toESM(require("react"));
344
- var import_async6 = require("@dxos/async");
348
+ var import_async7 = require("@dxos/async");
345
349
  var import_react_ui5 = require("@dxos/react-ui");
346
350
  var import_state30 = require("@codemirror/state");
347
- var import_view34 = require("@codemirror/view");
351
+ var import_view35 = require("@codemirror/view");
348
352
  var import_react_tabster = require("@fluentui/react-tabster");
349
353
  var import_react9 = require("react");
350
354
  var import_log8 = require("@dxos/log");
@@ -1704,23 +1708,32 @@ var command = (options = {}) => {
1704
1708
  var floatingMenu = (options = {}) => [
1705
1709
  import_view10.ViewPlugin.fromClass(class {
1706
1710
  constructor(view) {
1707
- this.rafId = null;
1708
1711
  this.view = view;
1709
1712
  const container = view.scrollDOM;
1710
1713
  if (getComputedStyle(container).position === "static") {
1711
1714
  container.style.position = "relative";
1712
1715
  }
1713
- const icon = document.createElement("dx-icon");
1714
- icon.setAttribute("icon", options.icon ?? "ph--dots-three-outline--regular");
1715
- const button = document.createElement("button");
1716
- button.appendChild(icon);
1717
- this.tag = document.createElement("dx-ref-tag");
1718
- this.tag.classList.add("cm-ref-tag");
1719
- this.tag.appendChild(button);
1716
+ {
1717
+ const icon = document.createElement("dx-icon");
1718
+ icon.setAttribute("icon", options.icon ?? "ph--dots-three-vertical--regular");
1719
+ const button = document.createElement("button");
1720
+ button.appendChild(icon);
1721
+ this.tag = document.createElement("dx-ref-tag");
1722
+ this.tag.classList.add("cm-ref-tag");
1723
+ this.tag.appendChild(button);
1724
+ }
1720
1725
  container.appendChild(this.tag);
1721
- container.addEventListener("scroll", this.scheduleUpdate.bind(this));
1726
+ const handler = () => this.scheduleUpdate();
1727
+ this.cleanup = (0, import_async3.addEventListener)(container, "scroll", handler);
1722
1728
  this.scheduleUpdate();
1723
1729
  }
1730
+ destroy() {
1731
+ this.cleanup?.();
1732
+ this.tag.remove();
1733
+ if (this.rafId != null) {
1734
+ cancelAnimationFrame(this.rafId);
1735
+ }
1736
+ }
1724
1737
  update(update2) {
1725
1738
  this.tag.dataset.focused = update2.view.hasFocus ? "true" : "false";
1726
1739
  if (!update2.view.hasFocus) {
@@ -1757,20 +1770,19 @@ var floatingMenu = (options = {}) => [
1757
1770
  }
1758
1771
  this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
1759
1772
  }
1760
- destroy() {
1761
- this.tag.remove();
1762
- if (this.rafId != null) {
1763
- cancelAnimationFrame(this.rafId);
1764
- }
1765
- }
1766
1773
  }),
1767
1774
  import_view10.EditorView.theme({
1768
1775
  ".cm-ref-tag": {
1769
1776
  position: "fixed",
1770
1777
  padding: "0",
1771
1778
  border: "none",
1772
- transition: "opacity 0.3s ease-in-out",
1773
- opacity: 0.1
1779
+ opacity: "0"
1780
+ },
1781
+ "[data-has-focus] & .cm-ref-tag": {
1782
+ opacity: "1"
1783
+ },
1784
+ "[data-is-attention-source] & .cm-ref-tag": {
1785
+ opacity: "1"
1774
1786
  },
1775
1787
  ".cm-ref-tag button": {
1776
1788
  display: "grid",
@@ -1778,9 +1790,6 @@ var floatingMenu = (options = {}) => [
1778
1790
  justifyContent: "center",
1779
1791
  width: "2rem",
1780
1792
  height: "2rem"
1781
- },
1782
- '.cm-ref-tag[data-focused="true"]': {
1783
- opacity: 1
1784
1793
  }
1785
1794
  })
1786
1795
  ];
@@ -1904,7 +1913,7 @@ var createEditorStateStore = (keyPrefix) => ({
1904
1913
  }
1905
1914
  });
1906
1915
  var selectionState = ({ getState, setState } = {}) => {
1907
- const setStateDebounced = (0, import_async4.debounce)(setState, 1e3);
1916
+ const setStateDebounced = (0, import_async5.debounce)(setState, 1e3);
1908
1917
  return [
1909
1918
  // TODO(burdon): Track scrolling (currently only updates when cursor moves).
1910
1919
  // EditorView.domEventHandlers({
@@ -2185,7 +2194,7 @@ var createComment = (view) => {
2185
2194
  var optionsFacet = singleValueFacet();
2186
2195
  var comments = (options = {}) => {
2187
2196
  const { key: shortcut = "meta-'" } = options;
2188
- const handleSelect = (0, import_async3.debounce)((state) => options.onSelect?.(state), 200);
2197
+ const handleSelect = (0, import_async4.debounce)((state) => options.onSelect?.(state), 200);
2189
2198
  return [
2190
2199
  optionsFacet.of(options),
2191
2200
  options.id ? documentId.of(options.id) : void 0,
@@ -2823,11 +2832,51 @@ var folding = (_props = {}) => [
2823
2832
  }
2824
2833
  })
2825
2834
  ];
2835
+ var TagWidget = class extends import_view18.WidgetType {
2836
+ constructor(_text) {
2837
+ super(), this._text = _text;
2838
+ }
2839
+ toDOM() {
2840
+ const span = document.createElement("span");
2841
+ span.className = (0, import_react_ui_theme5.mx)("cm-tag", (0, import_react_ui_theme5.getHashColor)(this._text).tag);
2842
+ span.textContent = this._text;
2843
+ return span;
2844
+ }
2845
+ };
2846
+ var tagMatcher = new import_view18.MatchDecorator({
2847
+ regexp: /#(\w+)\W/g,
2848
+ decoration: (match) => import_view18.Decoration.replace({
2849
+ widget: new TagWidget(match[1])
2850
+ })
2851
+ });
2852
+ var hashtag = () => [
2853
+ import_view18.ViewPlugin.fromClass(class {
2854
+ constructor(view) {
2855
+ this.tags = tagMatcher.createDeco(view);
2856
+ }
2857
+ update(update2) {
2858
+ this.tags = tagMatcher.updateDeco(update2, this.tags);
2859
+ }
2860
+ }, {
2861
+ decorations: (instance) => instance.tags,
2862
+ provide: (plugin) => import_view18.EditorView.atomicRanges.of((view) => {
2863
+ return view.plugin(plugin)?.tags || import_view18.Decoration.none;
2864
+ })
2865
+ }),
2866
+ import_view18.EditorView.theme({
2867
+ ".cm-tag": {
2868
+ borderRadius: "4px",
2869
+ marginRight: "6px",
2870
+ padding: "2px 6px"
2871
+ }
2872
+ })
2873
+ ];
2826
2874
  var createJsonExtensions = ({ schema } = {}) => {
2827
2875
  let lintSource = (0, import_lang_json.jsonParseLinter)();
2828
2876
  if (schema) {
2829
2877
  const ajv = new import_ajv.default({
2830
- allErrors: false
2878
+ allErrors: false,
2879
+ strict: false
2831
2880
  });
2832
2881
  const validate = ajv.compile(schema);
2833
2882
  lintSource = schemaLinter(validate);
@@ -2864,11 +2913,11 @@ var schemaLinter = (validate) => (view) => {
2864
2913
  };
2865
2914
  var listener = ({ onFocus, onChange }) => {
2866
2915
  const extensions = [];
2867
- onFocus && extensions.push(import_view18.EditorView.focusChangeEffect.of((_, focusing) => {
2916
+ onFocus && extensions.push(import_view19.EditorView.focusChangeEffect.of((_, focusing) => {
2868
2917
  onFocus(focusing);
2869
2918
  return null;
2870
2919
  }));
2871
- onChange && extensions.push(import_view18.EditorView.updateListener.of((update2) => {
2920
+ onChange && extensions.push(import_view19.EditorView.updateListener.of((update2) => {
2872
2921
  onChange(update2.state.doc.toString(), update2.state.facet(documentId));
2873
2922
  }));
2874
2923
  return extensions;
@@ -3759,7 +3808,7 @@ var toggleCodeblock = (target) => {
3759
3808
  };
3760
3809
  var formattingKeymap = (_options = {}) => {
3761
3810
  return [
3762
- import_view19.keymap.of([
3811
+ import_view20.keymap.of([
3763
3812
  {
3764
3813
  key: "meta-b",
3765
3814
  run: toggleStrong
@@ -3960,7 +4009,7 @@ var getFormatting = (state) => {
3960
4009
  };
3961
4010
  };
3962
4011
  var useFormattingState = (state) => {
3963
- return (0, import_react6.useMemo)(() => import_view19.EditorView.updateListener.of((update2) => {
4012
+ return (0, import_react6.useMemo)(() => import_view20.EditorView.updateListener.of((update2) => {
3964
4013
  if (update2.docChanged || update2.selectionSet) {
3965
4014
  Object.entries(getFormatting(update2.state)).forEach(([key, active]) => {
3966
4015
  state[key] = active;
@@ -4212,7 +4261,7 @@ var createMarkdownExtensions = (options = {}) => {
4212
4261
  }),
4213
4262
  // Custom styles.
4214
4263
  (0, import_language5.syntaxHighlighting)(markdownHighlightStyle()),
4215
- import_view20.keymap.of([
4264
+ import_view21.keymap.of([
4216
4265
  // https://codemirror.net/docs/ref/#commands.indentWithTab
4217
4266
  options.indentWithTab !== false && import_commands3.indentWithTab,
4218
4267
  // https://codemirror.net/docs/ref/#commands.defaultKeymap
@@ -4246,7 +4295,7 @@ var convertTreeToJson = (state) => {
4246
4295
  return treeToJson((0, import_language7.syntaxTree)(state).cursor());
4247
4296
  };
4248
4297
  var adjustChanges = () => {
4249
- return import_view22.ViewPlugin.fromClass(class {
4298
+ return import_view23.ViewPlugin.fromClass(class {
4250
4299
  update(update2) {
4251
4300
  const tree = (0, import_language9.syntaxTree)(update2.state);
4252
4301
  const adjustments = [];
@@ -4388,7 +4437,7 @@ var image = (_options = {}) => {
4388
4437
  return [
4389
4438
  import_state21.StateField.define({
4390
4439
  create: (state) => {
4391
- return import_view23.Decoration.set(buildDecorations(0, state.doc.length, state));
4440
+ return import_view24.Decoration.set(buildDecorations(0, state.doc.length, state));
4392
4441
  },
4393
4442
  update: (value, tr) => {
4394
4443
  if (!tr.docChanged && !tr.selection) {
@@ -4411,7 +4460,7 @@ var image = (_options = {}) => {
4411
4460
  add: buildDecorations(from, to, tr.state)
4412
4461
  });
4413
4462
  },
4414
- provide: (field) => import_view23.EditorView.decorations.from(field)
4463
+ provide: (field) => import_view24.EditorView.decorations.from(field)
4415
4464
  })
4416
4465
  ];
4417
4466
  };
@@ -4429,7 +4478,7 @@ var buildDecorations = (from, to, state) => {
4429
4478
  return;
4430
4479
  }
4431
4480
  preloadImage(url);
4432
- decorations2.push(import_view23.Decoration.replace({
4481
+ decorations2.push(import_view24.Decoration.replace({
4433
4482
  block: true,
4434
4483
  widget: new ImageWidget(url)
4435
4484
  }).range(hide2 ? node.from : node.to, node.to));
@@ -4449,7 +4498,7 @@ var preloadImage = (url) => {
4449
4498
  preloaded.add(url);
4450
4499
  }
4451
4500
  };
4452
- var ImageWidget = class extends import_view23.WidgetType {
4501
+ var ImageWidget = class extends import_view24.WidgetType {
4453
4502
  constructor(_url) {
4454
4503
  super(), this._url = _url;
4455
4504
  }
@@ -4470,7 +4519,7 @@ var ImageWidget = class extends import_view23.WidgetType {
4470
4519
  };
4471
4520
  var bulletListIndentationWidth = 24;
4472
4521
  var orderedListIndentationWidth = 36;
4473
- var formattingStyles = import_view24.EditorView.theme({
4522
+ var formattingStyles = import_view25.EditorView.theme({
4474
4523
  /**
4475
4524
  * Horizontal rule.
4476
4525
  */
@@ -4592,7 +4641,7 @@ var table = (options = {}) => {
4592
4641
  return import_state22.StateField.define({
4593
4642
  create: (state) => update(state, options),
4594
4643
  update: (_, tr) => update(tr.state, options),
4595
- provide: (field) => import_view25.EditorView.decorations.from(field)
4644
+ provide: (field) => import_view26.EditorView.decorations.from(field)
4596
4645
  });
4597
4646
  };
4598
4647
  var update = (state, _options) => {
@@ -4637,19 +4686,19 @@ var update = (state, _options) => {
4637
4686
  tables.forEach((table2) => {
4638
4687
  const replace = state.readOnly || cursor < table2.from || cursor > table2.to;
4639
4688
  if (replace) {
4640
- builder.add(table2.from, table2.to, import_view25.Decoration.replace({
4689
+ builder.add(table2.from, table2.to, import_view26.Decoration.replace({
4641
4690
  block: true,
4642
4691
  widget: new TableWidget(table2)
4643
4692
  }));
4644
4693
  } else {
4645
- builder.add(table2.from, table2.to, import_view25.Decoration.mark({
4694
+ builder.add(table2.from, table2.to, import_view26.Decoration.mark({
4646
4695
  class: "cm-table"
4647
4696
  }));
4648
4697
  }
4649
4698
  });
4650
4699
  return builder.finish();
4651
4700
  };
4652
- var TableWidget = class extends import_view25.WidgetType {
4701
+ var TableWidget = class extends import_view26.WidgetType {
4653
4702
  constructor(_table) {
4654
4703
  super(), this._table = _table;
4655
4704
  }
@@ -4688,14 +4737,14 @@ var Unicode = {
4688
4737
  bulletSmall: "\u2219",
4689
4738
  bulletSquare: "\u2B1D"
4690
4739
  };
4691
- var HorizontalRuleWidget = class extends import_view21.WidgetType {
4740
+ var HorizontalRuleWidget = class extends import_view22.WidgetType {
4692
4741
  toDOM() {
4693
4742
  const el = document.createElement("span");
4694
4743
  el.className = "cm-hr";
4695
4744
  return el;
4696
4745
  }
4697
4746
  };
4698
- var LinkButton = class extends import_view21.WidgetType {
4747
+ var LinkButton = class extends import_view22.WidgetType {
4699
4748
  constructor(url, render) {
4700
4749
  super(), this.url = url, this.render = render;
4701
4750
  }
@@ -4711,7 +4760,7 @@ var LinkButton = class extends import_view21.WidgetType {
4711
4760
  return el;
4712
4761
  }
4713
4762
  };
4714
- var CheckboxWidget = class extends import_view21.WidgetType {
4763
+ var CheckboxWidget = class extends import_view22.WidgetType {
4715
4764
  constructor(_checked) {
4716
4765
  super(), this._checked = _checked;
4717
4766
  }
@@ -4755,7 +4804,7 @@ var CheckboxWidget = class extends import_view21.WidgetType {
4755
4804
  return false;
4756
4805
  }
4757
4806
  };
4758
- var TextWidget = class extends import_view21.WidgetType {
4807
+ var TextWidget = class extends import_view22.WidgetType {
4759
4808
  constructor(text, className) {
4760
4809
  super(), this.text = text, this.className = className;
4761
4810
  }
@@ -4768,29 +4817,29 @@ var TextWidget = class extends import_view21.WidgetType {
4768
4817
  return el;
4769
4818
  }
4770
4819
  };
4771
- var hide = import_view21.Decoration.replace({});
4772
- var blockQuote = import_view21.Decoration.line({
4820
+ var hide = import_view22.Decoration.replace({});
4821
+ var blockQuote = import_view22.Decoration.line({
4773
4822
  class: "cm-blockquote"
4774
4823
  });
4775
- var fencedCodeLine = import_view21.Decoration.line({
4824
+ var fencedCodeLine = import_view22.Decoration.line({
4776
4825
  class: "cm-code cm-codeblock-line"
4777
4826
  });
4778
- var fencedCodeLineFirst = import_view21.Decoration.line({
4779
- class: (0, import_react_ui_theme5.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
4827
+ var fencedCodeLineFirst = import_view22.Decoration.line({
4828
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-start")
4780
4829
  });
4781
- var fencedCodeLineLast = import_view21.Decoration.line({
4782
- class: (0, import_react_ui_theme5.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
4830
+ var fencedCodeLineLast = import_view22.Decoration.line({
4831
+ class: (0, import_react_ui_theme6.mx)("cm-code cm-codeblock-line", "cm-codeblock-end")
4783
4832
  });
4784
4833
  var commentBlockLine = fencedCodeLine;
4785
4834
  var commentBlockLineFirst = fencedCodeLineFirst;
4786
4835
  var commentBlockLineLast = fencedCodeLineLast;
4787
- var horizontalRule = import_view21.Decoration.replace({
4836
+ var horizontalRule = import_view22.Decoration.replace({
4788
4837
  widget: new HorizontalRuleWidget()
4789
4838
  });
4790
- var checkedTask = import_view21.Decoration.replace({
4839
+ var checkedTask = import_view22.Decoration.replace({
4791
4840
  widget: new CheckboxWidget(true)
4792
4841
  });
4793
- var uncheckedTask = import_view21.Decoration.replace({
4842
+ var uncheckedTask = import_view22.Decoration.replace({
4794
4843
  widget: new CheckboxWidget(false)
4795
4844
  });
4796
4845
  var editingRange = (state, range, focus2) => {
@@ -4894,7 +4943,7 @@ var buildDecorations2 = (view, options, focus2) => {
4894
4943
  } else {
4895
4944
  const num = headers.slice(from - 1).map((level2) => level2?.number ?? 0).join(".") + " ";
4896
4945
  if (num.length) {
4897
- atomicDeco.add(mark.from, mark.from + len, import_view21.Decoration.replace({
4946
+ atomicDeco.add(mark.from, mark.from + len, import_view22.Decoration.replace({
4898
4947
  widget: new TextWidget(num, theme.heading(level))
4899
4948
  }));
4900
4949
  }
@@ -4919,7 +4968,7 @@ var buildDecorations2 = (view, options, focus2) => {
4919
4968
  if (node.from === line.to - 1) {
4920
4969
  return false;
4921
4970
  }
4922
- deco.add(line.from, line.from, import_view21.Decoration.line({
4971
+ deco.add(line.from, line.from, import_view22.Decoration.line({
4923
4972
  class: "cm-list-item",
4924
4973
  attributes: {
4925
4974
  style: `padding-left: ${offset}px; text-indent: -${width}px;`
@@ -4936,7 +4985,7 @@ var buildDecorations2 = (view, options, focus2) => {
4936
4985
  const label = list.type === "OrderedList" ? `${++list.number}.` : Unicode.bulletSmall;
4937
4986
  const line = state.doc.lineAt(node.from);
4938
4987
  const to = state.doc.sliceString(node.to, node.to + 1) === " " ? node.to + 1 : node.to;
4939
- atomicDeco.add(line.from, to, import_view21.Decoration.replace({
4988
+ atomicDeco.add(line.from, to, import_view22.Decoration.replace({
4940
4989
  widget: new TextWidget(label, list.type === "OrderedList" ? "cm-list-mark cm-list-mark-ordered" : "cm-list-mark cm-list-mark-bullet")
4941
4990
  }));
4942
4991
  break;
@@ -5023,7 +5072,7 @@ var buildDecorations2 = (view, options, focus2) => {
5023
5072
  if (!editing) {
5024
5073
  atomicDeco.add(node.from, marks[0].to, hide);
5025
5074
  }
5026
- deco.add(marks[0].to, marks[1].from, import_view21.Decoration.mark({
5075
+ deco.add(marks[0].to, marks[1].from, import_view22.Decoration.mark({
5027
5076
  tagName: "a",
5028
5077
  attributes: {
5029
5078
  class: "cm-link",
@@ -5033,7 +5082,7 @@ var buildDecorations2 = (view, options, focus2) => {
5033
5082
  }
5034
5083
  }));
5035
5084
  if (!editing) {
5036
- atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view21.Decoration.replace({
5085
+ atomicDeco.add(marks[1].from, node.to, options.renderLinkButton ? import_view22.Decoration.replace({
5037
5086
  widget: new LinkButton(url, options.renderLinkButton)
5038
5087
  }) : hide);
5039
5088
  }
@@ -5091,7 +5140,7 @@ var buildDecorations2 = (view, options, focus2) => {
5091
5140
  var forceUpdate = import_state19.StateEffect.define();
5092
5141
  var decorateMarkdown = (options = {}) => {
5093
5142
  return [
5094
- import_view21.ViewPlugin.fromClass(class {
5143
+ import_view22.ViewPlugin.fromClass(class {
5095
5144
  constructor(view) {
5096
5145
  ({ deco: this.deco, atomicDeco: this.atomicDeco } = buildDecorations2(view, options, view.hasFocus));
5097
5146
  }
@@ -5123,9 +5172,9 @@ var decorateMarkdown = (options = {}) => {
5123
5172
  }
5124
5173
  }, {
5125
5174
  provide: (plugin) => [
5126
- import_view21.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5127
- import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view21.Decoration.none),
5128
- import_view21.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view21.Decoration.none)
5175
+ import_view22.EditorView.atomicRanges.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5176
+ import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.atomicDeco ?? import_view22.Decoration.none),
5177
+ import_view22.EditorView.decorations.of((view) => view.plugin(plugin)?.deco ?? import_view22.Decoration.none)
5129
5178
  ]
5130
5179
  }),
5131
5180
  image(),
@@ -5135,7 +5184,7 @@ var decorateMarkdown = (options = {}) => {
5135
5184
  ];
5136
5185
  };
5137
5186
  var linkTooltip = (renderTooltip) => {
5138
- return (0, import_view26.hoverTooltip)((view, pos, side) => {
5187
+ return (0, import_view27.hoverTooltip)((view, pos, side) => {
5139
5188
  const syntax = (0, import_language12.syntaxTree)(view.state).resolveInner(pos, side);
5140
5189
  let link = null;
5141
5190
  for (let i = 0, node = syntax; !link && node && i < 5; node = node.parent, i++) {
@@ -5153,7 +5202,7 @@ var linkTooltip = (renderTooltip) => {
5153
5202
  // above: true,
5154
5203
  create: () => {
5155
5204
  const el = document.createElement("div");
5156
- el.className = (0, import_react_ui_theme6.tooltipContent)({});
5205
+ el.className = (0, import_react_ui_theme7.tooltipContent)({});
5157
5206
  renderTooltip(el, {
5158
5207
  url: urlText
5159
5208
  }, view);
@@ -5225,7 +5274,7 @@ var InputModeExtensions = {
5225
5274
  editorInputMode.of({
5226
5275
  type: "vscode"
5227
5276
  }),
5228
- import_view27.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5277
+ import_view28.keymap.of(import_codemirror_vscode_keymap.vscodeKeymap)
5229
5278
  ],
5230
5279
  vim: [
5231
5280
  // https://github.com/replit/codemirror-vim
@@ -5234,7 +5283,7 @@ var InputModeExtensions = {
5234
5283
  type: "vim",
5235
5284
  noTabster: true
5236
5285
  }),
5237
- import_view27.keymap.of([
5286
+ import_view28.keymap.of([
5238
5287
  {
5239
5288
  key: "Alt-Escape",
5240
5289
  run: (view) => {
@@ -5693,7 +5742,7 @@ var toggleTask = (view) => {
5693
5742
  }
5694
5743
  return true;
5695
5744
  };
5696
- var commands = () => import_view28.keymap.of([
5745
+ var commands = () => import_view29.keymap.of([
5697
5746
  //
5698
5747
  // Indentation.
5699
5748
  //
@@ -5800,7 +5849,7 @@ var commands = () => import_view28.keymap.of([
5800
5849
  var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/outliner/editor.ts";
5801
5850
  var LIST_ITEM_REGEX = /^\s*- (\[ \]|\[x\])? /;
5802
5851
  var initialize = () => {
5803
- return import_view30.ViewPlugin.fromClass(class {
5852
+ return import_view31.ViewPlugin.fromClass(class {
5804
5853
  constructor(view) {
5805
5854
  const first = view.state.doc.lineAt(0);
5806
5855
  const text = view.state.sliceDoc(first.from, first.to);
@@ -5993,20 +6042,20 @@ var outliner = (options = {}) => [
5993
6042
  // Floating menu.
5994
6043
  floatingMenu(),
5995
6044
  // Line decorations.
5996
- decorations(options),
6045
+ decorations(),
5997
6046
  // Default markdown decorations.
5998
6047
  decorateMarkdown({
5999
6048
  listPaddingLeft: 8
6000
6049
  }),
6001
6050
  // Researve space for menu.
6002
- import_view29.EditorView.contentAttributes.of({
6051
+ import_view30.EditorView.contentAttributes.of({
6003
6052
  class: "is-full !mr-[3rem]"
6004
6053
  })
6005
6054
  ];
6006
- var decorations = (options) => [
6007
- import_view29.ViewPlugin.fromClass(class {
6055
+ var decorations = () => [
6056
+ import_view30.ViewPlugin.fromClass(class {
6008
6057
  constructor(view) {
6009
- this.decorations = import_view29.Decoration.none;
6058
+ this.decorations = import_view30.Decoration.none;
6010
6059
  this.updateDecorations(view.state, view);
6011
6060
  }
6012
6061
  update(update2) {
@@ -6028,18 +6077,18 @@ var decorations = (options) => [
6028
6077
  const lineFrom = doc.lineAt(item.contentRange.from);
6029
6078
  const lineTo = doc.lineAt(item.contentRange.to);
6030
6079
  const isSelected = selection.includes(item.index) || item === current;
6031
- decorations2.push(import_view29.Decoration.line({
6032
- class: (0, import_react_ui_theme7.mx)("cm-list-item", lineFrom.number === line.number && "cm-list-item-start", lineTo.number === line.number && "cm-list-item-end", isSelected && (hasFocus ? "cm-list-item-focused" : "cm-list-item-selected"))
6080
+ decorations2.push(import_view30.Decoration.line({
6081
+ class: (0, import_react_ui_theme8.mx)("cm-list-item", lineFrom.number === line.number && "cm-list-item-start", lineTo.number === line.number && "cm-list-item-end", isSelected && (hasFocus ? "cm-list-item-focused" : "cm-list-item-selected"))
6033
6082
  }).range(line.from, line.from));
6034
6083
  }
6035
6084
  }
6036
- this.decorations = import_view29.Decoration.set(decorations2);
6085
+ this.decorations = import_view30.Decoration.set(decorations2);
6037
6086
  }
6038
6087
  }, {
6039
6088
  decorations: (v) => v.decorations
6040
6089
  }),
6041
6090
  // Theme.
6042
- import_view29.EditorView.theme(Object.assign({
6091
+ import_view30.EditorView.theme(Object.assign({
6043
6092
  ".cm-list-item": {
6044
6093
  borderLeftWidth: "1px",
6045
6094
  borderRightWidth: "1px",
@@ -6063,11 +6112,14 @@ var decorations = (options) => [
6063
6112
  paddingBottom: "4px",
6064
6113
  marginBottom: "2px"
6065
6114
  },
6066
- ".cm-list-item-selected": {
6067
- borderColor: options.showSelected ? "var(--dx-separator)" : void 0
6068
- },
6069
6115
  ".cm-list-item-focused": {
6070
6116
  borderColor: "var(--dx-accentFocusIndicator)"
6117
+ },
6118
+ "[data-has-focus] & .cm-list-item-selected": {
6119
+ borderColor: "var(--dx-separator)"
6120
+ },
6121
+ "[data-is-attention-source] & .cm-list-item-selected": {
6122
+ borderColor: "var(--dx-separator)"
6071
6123
  }
6072
6124
  }))
6073
6125
  ];
@@ -6079,11 +6131,11 @@ var preview = (options = {}) => {
6079
6131
  create: (state) => buildDecorations3(state, options),
6080
6132
  update: (_, tr) => buildDecorations3(tr.state, options),
6081
6133
  provide: (field) => [
6082
- import_view31.EditorView.decorations.from(field),
6083
- import_view31.EditorView.atomicRanges.of((view) => view.state.field(field))
6134
+ import_view32.EditorView.decorations.from(field),
6135
+ import_view32.EditorView.atomicRanges.of((view) => view.state.field(field))
6084
6136
  ]
6085
6137
  }),
6086
- import_view31.EditorView.theme({
6138
+ import_view32.EditorView.theme({
6087
6139
  ".cm-preview-block": {
6088
6140
  marginLeft: "-1rem",
6089
6141
  marginRight: "-1rem",
@@ -6120,7 +6172,7 @@ var buildDecorations3 = (state, options) => {
6120
6172
  case "Link": {
6121
6173
  const link = getLinkRef(state, node.node);
6122
6174
  if (link) {
6123
- builder.add(node.from, node.to, import_view31.Decoration.replace({
6175
+ builder.add(node.from, node.to, import_view32.Decoration.replace({
6124
6176
  widget: new PreviewInlineWidget(options, link)
6125
6177
  }));
6126
6178
  }
@@ -6133,7 +6185,7 @@ var buildDecorations3 = (state, options) => {
6133
6185
  case "Image": {
6134
6186
  const link = getLinkRef(state, node.node);
6135
6187
  if (options.renderBlock && link) {
6136
- builder.add(node.from, node.to, import_view31.Decoration.replace({
6188
+ builder.add(node.from, node.to, import_view32.Decoration.replace({
6137
6189
  block: true,
6138
6190
  // atomic: true,
6139
6191
  widget: new PreviewBlockWidget(options, link)
@@ -6146,7 +6198,7 @@ var buildDecorations3 = (state, options) => {
6146
6198
  });
6147
6199
  return builder.finish();
6148
6200
  };
6149
- var PreviewInlineWidget = class extends import_view31.WidgetType {
6201
+ var PreviewInlineWidget = class extends import_view32.WidgetType {
6150
6202
  constructor(_options, _link) {
6151
6203
  super(), this._options = _options, this._link = _link;
6152
6204
  }
@@ -6163,7 +6215,7 @@ var PreviewInlineWidget = class extends import_view31.WidgetType {
6163
6215
  return root;
6164
6216
  }
6165
6217
  };
6166
- var PreviewBlockWidget = class extends import_view31.WidgetType {
6218
+ var PreviewBlockWidget = class extends import_view32.WidgetType {
6167
6219
  constructor(_options, _link) {
6168
6220
  super(), this._options = _options, this._link = _link;
6169
6221
  }
@@ -6229,7 +6281,7 @@ var typewriter = ({ delay = 75, items = defaultItems } = {}) => {
6229
6281
  let t;
6230
6282
  let idx = 0;
6231
6283
  return [
6232
- import_view32.keymap.of([
6284
+ import_view33.keymap.of([
6233
6285
  {
6234
6286
  // Reset.
6235
6287
  key: "alt-meta-'",
@@ -6565,19 +6617,19 @@ var editorSlots = {
6565
6617
  className: editorWidth
6566
6618
  }
6567
6619
  };
6568
- var editorGutter = import_view33.EditorView.theme({
6620
+ var editorGutter = import_view34.EditorView.theme({
6569
6621
  ".cm-gutters": {
6570
6622
  paddingRight: "1rem"
6571
6623
  }
6572
6624
  });
6573
- var editorMonospace = import_view33.EditorView.theme({
6625
+ var editorMonospace = import_view34.EditorView.theme({
6574
6626
  ".cm-content": {
6575
6627
  fontFamily: fontMono
6576
6628
  }
6577
6629
  });
6578
6630
  var editorWithToolbarLayout = "grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden";
6579
- var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme8.mx)("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");
6580
- var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme8.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
6631
+ var stackItemContentEditorClassNames = (role) => (0, import_react_ui_theme9.mx)("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");
6632
+ var stackItemContentToolbarClassNames = (role) => (0, import_react_ui_theme9.mx)("relative z-[1] flex is-full bg-toolbarSurface border-be border-subduedSeparator", role === "section" && "sticky block-start-0 -mbe-px min-is-0");
6581
6633
  var createToolbar = ({ getView, state, customActions, ...features }) => {
6582
6634
  return import_rx_react.Rx.make((get2) => {
6583
6635
  const nodes = [];
@@ -6716,7 +6768,7 @@ var RefPopoverProvider = ({ children, onLookup }) => {
6716
6768
  onLookup
6717
6769
  ]);
6718
6770
  (0, import_react7.useEffect)(() => {
6719
- return rootRef ? (0, import_async5.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
6771
+ return rootRef ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions) : void 0;
6720
6772
  }, [
6721
6773
  rootRef
6722
6774
  ]);
@@ -6778,7 +6830,7 @@ var RefDropdownMenuProvider = ({ children, onLookup }) => {
6778
6830
  onLookup
6779
6831
  ]);
6780
6832
  (0, import_react8.useEffect)(() => {
6781
- return rootRef ? (0, import_async6.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
6833
+ return rootRef ? (0, import_async7.addEventListener)(rootRef, "dx-ref-tag-activate", handleDxRefTagActivate, customEventOptions2) : void 0;
6782
6834
  }, [
6783
6835
  rootRef
6784
6836
  ]);
@@ -6842,7 +6894,7 @@ var useTextEditor = (props = {}, deps = []) => {
6842
6894
  id && documentId.of(id),
6843
6895
  extensions,
6844
6896
  // NOTE: This doesn't catch errors in keymap functions.
6845
- import_view34.EditorView.exceptionSink.of((err) => {
6897
+ import_view35.EditorView.exceptionSink.of((err) => {
6846
6898
  import_log8.log.catch(err, void 0, {
6847
6899
  F: __dxlog_file13,
6848
6900
  L: 98,
@@ -6852,10 +6904,10 @@ var useTextEditor = (props = {}, deps = []) => {
6852
6904
  })
6853
6905
  ].filter(import_util6.isNotFalsy)
6854
6906
  });
6855
- view2 = new import_view34.EditorView({
6907
+ view2 = new import_view35.EditorView({
6856
6908
  parent: parentRef.current,
6857
6909
  state,
6858
- scrollTo: scrollTo ? import_view34.EditorView.scrollIntoView(scrollTo, {
6910
+ scrollTo: scrollTo ? import_view35.EditorView.scrollIntoView(scrollTo, {
6859
6911
  yMargin: 96
6860
6912
  }) : void 0,
6861
6913
  dispatchTransactions: debug ? debugDispatcher : void 0
@@ -7026,6 +7078,7 @@ var useTextEditor = (props = {}, deps = []) => {
7026
7078
  getFormatting,
7027
7079
  getListItemContent,
7028
7080
  getRange,
7081
+ hashtag,
7029
7082
  image,
7030
7083
  indentItemLess,
7031
7084
  indentItemMore,