@dxos/react-ui-editor 0.6.13-main.ed424a1 → 0.6.13

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 (123) hide show
  1. package/dist/lib/browser/index.mjs +346 -241
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/types/src/TextEditor.stories.d.ts +1 -4
  5. package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
  6. package/dist/types/src/defaults.d.ts.map +1 -1
  7. package/dist/types/src/extensions/autocomplete.d.ts +1 -2
  8. package/dist/types/src/extensions/autocomplete.d.ts.map +1 -1
  9. package/dist/types/src/extensions/automerge/automerge.spec.d.ts +2 -0
  10. package/dist/types/src/extensions/automerge/automerge.spec.d.ts.map +1 -0
  11. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +1 -1
  12. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  13. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  14. package/dist/types/src/extensions/awareness/awareness.d.ts +2 -2
  15. package/dist/types/src/extensions/awareness/awareness.d.ts.map +1 -1
  16. package/dist/types/src/extensions/command/state.d.ts +2 -2
  17. package/dist/types/src/extensions/command/state.d.ts.map +1 -1
  18. package/dist/types/src/extensions/comments.d.ts +1 -1
  19. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  20. package/dist/types/src/{state → extensions}/cursor.d.ts +2 -2
  21. package/dist/types/src/extensions/cursor.d.ts.map +1 -0
  22. package/dist/types/src/extensions/debug.d.ts +2 -2
  23. package/dist/types/src/extensions/debug.d.ts.map +1 -1
  24. package/dist/types/src/extensions/doc.d.ts +6 -0
  25. package/dist/types/src/extensions/doc.d.ts.map +1 -0
  26. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  27. package/dist/types/src/extensions/index.d.ts +4 -0
  28. package/dist/types/src/extensions/index.d.ts.map +1 -1
  29. package/dist/types/src/extensions/listener.d.ts +0 -1
  30. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  31. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  32. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  33. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  34. package/dist/types/src/extensions/markdown/link.d.ts +1 -1
  35. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  36. package/dist/types/src/extensions/markdown/styles.d.ts.map +1 -1
  37. package/dist/types/src/extensions/modes.d.ts +3 -3
  38. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  39. package/dist/types/src/{state → extensions}/state.d.ts +2 -2
  40. package/dist/types/src/extensions/state.d.ts.map +1 -0
  41. package/dist/types/src/extensions/types.d.ts.map +1 -0
  42. package/dist/types/src/extensions/util/overlap.d.ts +1 -1
  43. package/dist/types/src/extensions/util/overlap.d.ts.map +1 -1
  44. package/dist/types/src/extensions/util/react.d.ts +1 -1
  45. package/dist/types/src/extensions/util/react.d.ts.map +1 -1
  46. package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
  47. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  48. package/dist/types/src/index.d.ts +0 -1
  49. package/dist/types/src/index.d.ts.map +1 -1
  50. package/dist/types/src/styles/markdown.d.ts +2 -1
  51. package/dist/types/src/styles/markdown.d.ts.map +1 -1
  52. package/dist/types/src/styles/theme.d.ts.map +1 -1
  53. package/dist/types/src/util.d.ts +0 -6
  54. package/dist/types/src/util.d.ts.map +1 -1
  55. package/package.json +38 -59
  56. package/src/TextEditor.stories.tsx +20 -25
  57. package/src/defaults.ts +2 -0
  58. package/src/extensions/annotations.ts +1 -1
  59. package/src/extensions/autocomplete.ts +8 -9
  60. package/src/extensions/automerge/{automerge.test.tsx → automerge.spec.tsx} +0 -1
  61. package/src/extensions/automerge/automerge.stories.tsx +1 -1
  62. package/src/extensions/automerge/automerge.test.ts +13 -0
  63. package/src/extensions/automerge/automerge.ts +2 -2
  64. package/src/extensions/automerge/cursor.ts +1 -1
  65. package/src/extensions/awareness/awareness.ts +5 -3
  66. package/src/extensions/command/hint.ts +1 -1
  67. package/src/extensions/command/state.ts +4 -3
  68. package/src/extensions/comments.ts +45 -44
  69. package/src/{state → extensions}/cursor.ts +6 -3
  70. package/src/extensions/debug.ts +2 -2
  71. package/src/extensions/doc.ts +17 -0
  72. package/src/extensions/folding.tsx +2 -4
  73. package/src/extensions/index.ts +4 -0
  74. package/src/extensions/listener.ts +0 -1
  75. package/src/extensions/markdown/changes.test.ts +3 -1
  76. package/src/extensions/markdown/decorate.ts +6 -49
  77. package/src/extensions/markdown/formatting.test.ts +3 -1
  78. package/src/extensions/markdown/highlight.ts +5 -0
  79. package/src/extensions/markdown/link.ts +2 -3
  80. package/src/extensions/markdown/parser.test.ts +2 -1
  81. package/src/extensions/markdown/styles.ts +0 -10
  82. package/src/extensions/markdown/table.ts +3 -3
  83. package/src/extensions/modes.ts +5 -6
  84. package/src/{state → extensions}/state.ts +3 -7
  85. package/src/extensions/util/overlap.ts +1 -1
  86. package/src/extensions/util/react.tsx +1 -5
  87. package/src/hooks/useTextEditor.ts +32 -36
  88. package/src/index.ts +0 -1
  89. package/src/styles/markdown.ts +3 -1
  90. package/src/styles/theme.ts +1 -3
  91. package/src/util.ts +0 -10
  92. package/dist/lib/browser/chunk-CIQSMP7K.mjs +0 -148
  93. package/dist/lib/browser/chunk-CIQSMP7K.mjs.map +0 -7
  94. package/dist/lib/browser/state/index.mjs +0 -17
  95. package/dist/lib/browser/state/index.mjs.map +0 -7
  96. package/dist/lib/node/chunk-GZWIENFM.cjs +0 -169
  97. package/dist/lib/node/chunk-GZWIENFM.cjs.map +0 -7
  98. package/dist/lib/node/index.cjs +0 -5493
  99. package/dist/lib/node/index.cjs.map +0 -7
  100. package/dist/lib/node/meta.json +0 -1
  101. package/dist/lib/node/state/index.cjs +0 -39
  102. package/dist/lib/node/state/index.cjs.map +0 -7
  103. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs +0 -150
  104. package/dist/lib/node-esm/chunk-GP5RCZ3X.mjs.map +0 -7
  105. package/dist/lib/node-esm/index.mjs +0 -5484
  106. package/dist/lib/node-esm/index.mjs.map +0 -7
  107. package/dist/lib/node-esm/meta.json +0 -1
  108. package/dist/lib/node-esm/state/index.mjs +0 -18
  109. package/dist/lib/node-esm/state/index.mjs.map +0 -7
  110. package/dist/types/src/state/cursor.d.ts.map +0 -1
  111. package/dist/types/src/state/doc.d.ts +0 -5
  112. package/dist/types/src/state/doc.d.ts.map +0 -1
  113. package/dist/types/src/state/index.d.ts +0 -6
  114. package/dist/types/src/state/index.d.ts.map +0 -1
  115. package/dist/types/src/state/state.d.ts.map +0 -1
  116. package/dist/types/src/state/types.d.ts.map +0 -1
  117. package/dist/types/src/state/util.d.ts +0 -3
  118. package/dist/types/src/state/util.d.ts.map +0 -1
  119. package/src/state/doc.ts +0 -10
  120. package/src/state/index.ts +0 -11
  121. package/src/state/util.ts +0 -13
  122. /package/dist/types/src/{state → extensions}/types.d.ts +0 -0
  123. /package/src/{state → extensions}/types.ts +0 -0
@@ -19,12 +19,10 @@ import {
19
19
  import { log } from '@dxos/log';
20
20
  import { getProviderValue, isNotFalsy, type MaybeProvider } from '@dxos/util';
21
21
 
22
- import { editorInputMode } from '../extensions';
23
- import { type EditorSelection, documentId, createEditorStateTransaction } from '../state';
24
- import { debugDispatcher } from '../util';
22
+ import { createEditorStateTransaction, documentId, editorInputMode, type EditorSelection } from '../extensions';
23
+ import { logChanges } from '../util';
25
24
 
26
25
  export type UseTextEditor = {
27
- // TODO(burdon): Rename.
28
26
  parentRef: RefObject<HTMLDivElement>;
29
27
  view?: EditorView;
30
28
  focusAttributes: ReturnType<typeof useFocusableGroup> & {
@@ -67,6 +65,8 @@ export const useTextEditor = (
67
65
 
68
66
  // NOTE: Increments by 2 in strict mode.
69
67
  const [instanceId] = useState(() => `text-editor-${++instanceCount}`);
68
+ // Callback once view is created.
69
+ const onUpdate = useRef<() => void>();
70
70
  const [view, setView] = useState<EditorView>();
71
71
  const parentRef = useRef<HTMLDivElement>(null);
72
72
 
@@ -87,45 +87,44 @@ export const useTextEditor = (
87
87
  }
88
88
 
89
89
  // https://codemirror.net/docs/ref/#state.EditorStateConfig
90
+ // NOTE: Don't set selection here in case it is invalid (and crashes the state); dispatch below.
90
91
  const state = EditorState.create({
91
92
  doc: initialValue,
92
- // selection: initialSelection,
93
+ selection: initialSelection,
93
94
  extensions: [
94
95
  id && documentId.of(id),
95
- extensions,
96
- // NOTE: This doesn't catch errors in keymap functions.
96
+ // NOTE: Doesn't catch errors in keymap functions.
97
97
  EditorView.exceptionSink.of((err) => {
98
98
  log.catch(err);
99
99
  }),
100
- // TODO(burdon): Factor out debug inspector.
101
- // ViewPlugin.fromClass(
102
- // class {
103
- // constructor(_view: EditorView) {
104
- // log('construct', { id });
105
- // }
106
- //
107
- // destroy() {
108
- // log('destroy', { id });
109
- // }
110
- // },
111
- // ),
100
+ extensions,
101
+ EditorView.updateListener.of(() => {
102
+ setTimeout(() => {
103
+ onUpdate.current?.();
104
+ });
105
+ }),
112
106
  ].filter(isNotFalsy),
113
107
  });
114
108
 
115
109
  // https://codemirror.net/docs/ref/#view.EditorViewConfig
116
110
  view = new EditorView({
117
111
  parent: parentRef.current,
112
+ selection: initialSelection,
118
113
  state,
119
- scrollTo: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined, // TODO(burdon): Const.
120
- dispatchTransactions: debug ? debugDispatcher : undefined,
114
+ // NOTE: Uncomment to debug/monitor all transactions.
115
+ // https://codemirror.net/docs/ref/#view.EditorView.dispatch
116
+ dispatchTransactions: (trs, view) => {
117
+ if (debug) {
118
+ logChanges(trs);
119
+ }
120
+ view.update(trs);
121
+ },
121
122
  });
122
123
 
123
- // Move to end of line after document loaded (unless selection is specified).
124
- if (moveToEndOfLine && !initialSelection) {
124
+ // Move to end of line after document loaded.
125
+ if (!initialValue && moveToEndOfLine) {
125
126
  const { to } = view.state.doc.lineAt(0);
126
- if (to) {
127
- view.dispatch({ selection: { anchor: to } });
128
- }
127
+ view.dispatch({ selection: { anchor: to } });
129
128
  }
130
129
 
131
130
  setView(view);
@@ -139,21 +138,18 @@ export const useTextEditor = (
139
138
 
140
139
  useEffect(() => {
141
140
  if (view) {
141
+ // NOTE: Set selection after first update (since content may rerender on focus).
142
+ onUpdate.current = () => {
143
+ onUpdate.current = undefined;
144
+ view.dispatch(createEditorStateTransaction({ scrollTo, selection }));
145
+ };
146
+
142
147
  // Remove tabster attribute (rely on custom keymap).
143
148
  if (view.state.facet(editorInputMode).noTabster) {
144
149
  parentRef.current?.removeAttribute('data-tabster');
145
150
  }
146
-
147
- if (scrollTo || selection) {
148
- if (selection && selection.anchor > view.state.doc.length) {
149
- log.warn('invalid selection', { length: view.state.doc.length, scrollTo, selection });
150
- return;
151
- }
152
-
153
- view.dispatch(createEditorStateTransaction(view.state, { scrollTo, selection }));
154
- }
155
151
  }
156
- }, [view, scrollTo, selection]);
152
+ }, [view, selection, scrollTo]);
157
153
 
158
154
  useEffect(() => {
159
155
  if (view && autoFocus) {
package/src/index.ts CHANGED
@@ -14,7 +14,6 @@ export * from './components';
14
14
  export * from './defaults';
15
15
  export * from './extensions';
16
16
  export * from './hooks';
17
- export * from './state';
18
17
  export * from './util';
19
18
 
20
19
  export { translations };
@@ -17,9 +17,11 @@ const headings: Record<HeadingLevel, string> = {
17
17
  };
18
18
 
19
19
  export const theme = {
20
+ mark: 'opacity-50',
20
21
  code: 'font-mono !no-underline text-neutral-700 dark:text-neutral-300',
21
22
  codeMark: 'font-mono text-primary-500',
22
- mark: 'opacity-50',
23
+ // TODO(burdon): Replace with widget.
24
+ blockquote: 'pl-1 mr-1 border-is-4 border-orange-500 dark:border-orange-500 dark:text-neutral-500',
23
25
  heading: (level: HeadingLevel) => {
24
26
  return mx(headings[level], 'dark:text-primary-400');
25
27
  },
@@ -71,11 +71,9 @@ export const defaultTheme: ThemeStyles = {
71
71
  /**
72
72
  * Gutters
73
73
  * NOTE: Gutters should have the same top margin as the content.
74
- * NOTE: They can't be transparent since the content needs to scroll below.
75
74
  */
76
75
  '.cm-gutters': {
77
76
  background: 'var(--surface-bg)',
78
- borderRight: 'none',
79
77
  },
80
78
  '.cm-gutter': {},
81
79
  '.cm-gutter.cm-lineNumbers .cm-gutterElement': {
@@ -97,7 +95,7 @@ export const defaultTheme: ThemeStyles = {
97
95
  paddingInline: 0,
98
96
  },
99
97
  '.cm-activeLine': {
100
- background: 'var(--dx-cmActiveLine)',
98
+ background: 'var(--dx-hoverSurface)',
101
99
  },
102
100
 
103
101
  /**
package/src/util.ts CHANGED
@@ -3,7 +3,6 @@
3
3
  //
4
4
 
5
5
  import type { Transaction } from '@codemirror/state';
6
- import { type EditorView } from '@codemirror/view';
7
6
 
8
7
  import { log } from '@dxos/log';
9
8
 
@@ -20,15 +19,6 @@ export const callbackWrapper = <T extends Function>(fn: T): T =>
20
19
  }
21
20
  }) as unknown as T;
22
21
 
23
- /**
24
- * Log all changes before dispatching them to the view.
25
- * https://codemirror.net/docs/ref/#view.EditorView.dispatch
26
- */
27
- export const debugDispatcher = (trs: readonly Transaction[], view: EditorView) => {
28
- logChanges(trs);
29
- view.update(trs);
30
- };
31
-
32
22
  export const logChanges = (trs: readonly Transaction[]) => {
33
23
  const changes = trs
34
24
  .flatMap((tr) => {
@@ -1,148 +0,0 @@
1
- // packages/ui/react-ui-editor/src/state/util.ts
2
- import { Facet } from "@codemirror/state";
3
- var singleValueFacet = (defaultValue) => Facet.define({
4
- // Called immediately.
5
- combine: (providers) => {
6
- return providers[0] ?? defaultValue;
7
- }
8
- });
9
-
10
- // packages/ui/react-ui-editor/src/state/cursor.ts
11
- var defaultCursorConverter = {
12
- toCursor: (position) => position.toString(),
13
- fromCursor: (cursor) => parseInt(cursor)
14
- };
15
- var Cursor = class _Cursor {
16
- static {
17
- this.converter = singleValueFacet(defaultCursorConverter);
18
- }
19
- static {
20
- this.getCursorFromRange = (state2, range) => {
21
- const cursorConverter = state2.facet(_Cursor.converter);
22
- const from = cursorConverter.toCursor(range.from);
23
- const to = cursorConverter.toCursor(range.to, -1);
24
- return [
25
- from,
26
- to
27
- ].join(":");
28
- };
29
- }
30
- static {
31
- this.getRangeFromCursor = (state2, cursor) => {
32
- const cursorConverter = state2.facet(_Cursor.converter);
33
- const parts = cursor.split(":");
34
- const from = cursorConverter.fromCursor(parts[0]);
35
- const to = cursorConverter.fromCursor(parts[1]);
36
- return from !== void 0 && to !== void 0 ? {
37
- from,
38
- to
39
- } : void 0;
40
- };
41
- }
42
- };
43
-
44
- // packages/ui/react-ui-editor/src/state/doc.ts
45
- var documentId = singleValueFacet();
46
-
47
- // packages/ui/react-ui-editor/src/state/state.ts
48
- import { Transaction } from "@codemirror/state";
49
- import { EditorView, keymap } from "@codemirror/view";
50
- import { debounce } from "@dxos/async";
51
- import { invariant } from "@dxos/invariant";
52
- import { isNotFalsy } from "@dxos/util";
53
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/state/state.ts";
54
- var stateRestoreAnnotation = "dxos.org/cm/state-restore";
55
- var keyPrefix = "dxos.org/react-ui-editor/state";
56
- var localStorageStateStoreAdapter = {
57
- getState: (id) => {
58
- invariant(id, void 0, {
59
- F: __dxlog_file,
60
- L: 34,
61
- S: void 0,
62
- A: [
63
- "id",
64
- ""
65
- ]
66
- });
67
- const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
68
- return state2 ? JSON.parse(state2) : void 0;
69
- },
70
- setState: (id, state2) => {
71
- invariant(id, void 0, {
72
- F: __dxlog_file,
73
- L: 40,
74
- S: void 0,
75
- A: [
76
- "id",
77
- ""
78
- ]
79
- });
80
- localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
81
- }
82
- };
83
- var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
84
- return {
85
- selection,
86
- scrollIntoView: !scrollTo,
87
- effects: scrollTo ? EditorView.scrollIntoView(scrollTo, {
88
- yMargin: 96
89
- }) : void 0,
90
- annotations: Transaction.userEvent.of(stateRestoreAnnotation)
91
- };
92
- };
93
- var state = ({ getState, setState } = {}) => {
94
- const setStateDebounced = debounce(setState, 1e3);
95
- return [
96
- // TODO(burdon): Track scrolling (currently only updates when cursor moves).
97
- // EditorView.domEventHandlers({
98
- // scroll: (event) => {
99
- // setStateDebounced(id, {});
100
- // },
101
- // }),
102
- EditorView.updateListener.of(({ view, transactions }) => {
103
- const id = view.state.facet(documentId);
104
- if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
105
- return;
106
- }
107
- if (setState) {
108
- const { scrollTop } = view.scrollDOM;
109
- const pos = view.posAtCoords({
110
- x: 0,
111
- y: scrollTop
112
- });
113
- if (pos !== null) {
114
- const { anchor, head } = view.state.selection.main;
115
- setStateDebounced(id, {
116
- scrollTo: pos,
117
- selection: {
118
- anchor,
119
- head
120
- }
121
- });
122
- }
123
- }
124
- }),
125
- getState && keymap.of([
126
- {
127
- key: "ctrl-r",
128
- run: (view) => {
129
- const state2 = getState(view.state.facet(documentId));
130
- if (state2) {
131
- view.dispatch(createEditorStateTransaction(view.state, state2));
132
- }
133
- return true;
134
- }
135
- }
136
- ])
137
- ].filter(isNotFalsy);
138
- };
139
-
140
- export {
141
- singleValueFacet,
142
- Cursor,
143
- documentId,
144
- localStorageStateStoreAdapter,
145
- createEditorStateTransaction,
146
- state
147
- };
148
- //# sourceMappingURL=chunk-CIQSMP7K.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/state/util.ts", "../../../src/state/cursor.ts", "../../../src/state/doc.ts", "../../../src/state/state.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = (\n state: EditorState,\n { scrollTo, selection }: EditorSelectionState,\n): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(view.state, state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
5
- "mappings": "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",
6
- "names": ["Facet", "singleValueFacet", "defaultValue", "Facet", "define", "combine", "providers", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "singleValueFacet", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "documentId", "singleValueFacet", "Transaction", "EditorView", "keymap", "debounce", "invariant", "isNotFalsy", "stateRestoreAnnotation", "keyPrefix", "localStorageStateStoreAdapter", "getState", "id", "invariant", "state", "localStorage", "getItem", "JSON", "parse", "undefined", "setState", "setItem", "stringify", "createEditorStateTransaction", "scrollTo", "selection", "scrollIntoView", "effects", "EditorView", "yMargin", "annotations", "Transaction", "userEvent", "of", "setStateDebounced", "debounce", "updateListener", "view", "transactions", "facet", "documentId", "some", "tr", "isUserEvent", "scrollTop", "scrollDOM", "pos", "posAtCoords", "x", "y", "anchor", "head", "main", "keymap", "key", "run", "dispatch", "filter", "isNotFalsy"]
7
- }
@@ -1,17 +0,0 @@
1
- import {
2
- Cursor,
3
- createEditorStateTransaction,
4
- documentId,
5
- localStorageStateStoreAdapter,
6
- singleValueFacet,
7
- state
8
- } from "../chunk-CIQSMP7K.mjs";
9
- export {
10
- Cursor,
11
- createEditorStateTransaction,
12
- documentId,
13
- localStorageStateStoreAdapter,
14
- singleValueFacet,
15
- state
16
- };
17
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,169 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_GZWIENFM_exports = {};
20
- __export(chunk_GZWIENFM_exports, {
21
- Cursor: () => Cursor,
22
- createEditorStateTransaction: () => createEditorStateTransaction,
23
- documentId: () => documentId,
24
- localStorageStateStoreAdapter: () => localStorageStateStoreAdapter,
25
- singleValueFacet: () => singleValueFacet,
26
- state: () => state
27
- });
28
- module.exports = __toCommonJS(chunk_GZWIENFM_exports);
29
- var import_state = require("@codemirror/state");
30
- var import_state2 = require("@codemirror/state");
31
- var import_view = require("@codemirror/view");
32
- var import_async = require("@dxos/async");
33
- var import_invariant = require("@dxos/invariant");
34
- var import_util = require("@dxos/util");
35
- var singleValueFacet = (defaultValue) => import_state.Facet.define({
36
- // Called immediately.
37
- combine: (providers) => {
38
- return providers[0] ?? defaultValue;
39
- }
40
- });
41
- var defaultCursorConverter = {
42
- toCursor: (position) => position.toString(),
43
- fromCursor: (cursor) => parseInt(cursor)
44
- };
45
- var Cursor = class _Cursor {
46
- static {
47
- this.converter = singleValueFacet(defaultCursorConverter);
48
- }
49
- static {
50
- this.getCursorFromRange = (state2, range) => {
51
- const cursorConverter = state2.facet(_Cursor.converter);
52
- const from = cursorConverter.toCursor(range.from);
53
- const to = cursorConverter.toCursor(range.to, -1);
54
- return [
55
- from,
56
- to
57
- ].join(":");
58
- };
59
- }
60
- static {
61
- this.getRangeFromCursor = (state2, cursor) => {
62
- const cursorConverter = state2.facet(_Cursor.converter);
63
- const parts = cursor.split(":");
64
- const from = cursorConverter.fromCursor(parts[0]);
65
- const to = cursorConverter.fromCursor(parts[1]);
66
- return from !== void 0 && to !== void 0 ? {
67
- from,
68
- to
69
- } : void 0;
70
- };
71
- }
72
- };
73
- var documentId = singleValueFacet();
74
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/state/state.ts";
75
- var stateRestoreAnnotation = "dxos.org/cm/state-restore";
76
- var keyPrefix = "dxos.org/react-ui-editor/state";
77
- var localStorageStateStoreAdapter = {
78
- getState: (id) => {
79
- (0, import_invariant.invariant)(id, void 0, {
80
- F: __dxlog_file,
81
- L: 34,
82
- S: void 0,
83
- A: [
84
- "id",
85
- ""
86
- ]
87
- });
88
- const state2 = localStorage.getItem(`${keyPrefix}/${id}`);
89
- return state2 ? JSON.parse(state2) : void 0;
90
- },
91
- setState: (id, state2) => {
92
- (0, import_invariant.invariant)(id, void 0, {
93
- F: __dxlog_file,
94
- L: 40,
95
- S: void 0,
96
- A: [
97
- "id",
98
- ""
99
- ]
100
- });
101
- localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
102
- }
103
- };
104
- var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
105
- return {
106
- selection,
107
- scrollIntoView: !scrollTo,
108
- effects: scrollTo ? import_view.EditorView.scrollIntoView(scrollTo, {
109
- yMargin: 96
110
- }) : void 0,
111
- annotations: import_state2.Transaction.userEvent.of(stateRestoreAnnotation)
112
- };
113
- };
114
- var state = ({ getState, setState } = {}) => {
115
- const setStateDebounced = (0, import_async.debounce)(setState, 1e3);
116
- return [
117
- // TODO(burdon): Track scrolling (currently only updates when cursor moves).
118
- // EditorView.domEventHandlers({
119
- // scroll: (event) => {
120
- // setStateDebounced(id, {});
121
- // },
122
- // }),
123
- import_view.EditorView.updateListener.of(({ view, transactions }) => {
124
- const id = view.state.facet(documentId);
125
- if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
126
- return;
127
- }
128
- if (setState) {
129
- const { scrollTop } = view.scrollDOM;
130
- const pos = view.posAtCoords({
131
- x: 0,
132
- y: scrollTop
133
- });
134
- if (pos !== null) {
135
- const { anchor, head } = view.state.selection.main;
136
- setStateDebounced(id, {
137
- scrollTo: pos,
138
- selection: {
139
- anchor,
140
- head
141
- }
142
- });
143
- }
144
- }
145
- }),
146
- getState && import_view.keymap.of([
147
- {
148
- key: "ctrl-r",
149
- run: (view) => {
150
- const state2 = getState(view.state.facet(documentId));
151
- if (state2) {
152
- view.dispatch(createEditorStateTransaction(view.state, state2));
153
- }
154
- return true;
155
- }
156
- }
157
- ])
158
- ].filter(import_util.isNotFalsy);
159
- };
160
- // Annotate the CommonJS export names for ESM import in node:
161
- 0 && (module.exports = {
162
- Cursor,
163
- createEditorStateTransaction,
164
- documentId,
165
- localStorageStateStoreAdapter,
166
- singleValueFacet,
167
- state
168
- });
169
- //# sourceMappingURL=chunk-GZWIENFM.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/state/util.ts", "../../../src/state/cursor.ts", "../../../src/state/doc.ts", "../../../src/state/state.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = (\n state: EditorState,\n { scrollTo, selection }: EditorSelectionState,\n): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(view.state, state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_state", "singleValueFacet", "defaultValue", "Facet", "define", "combine", "providers", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "documentId", "stateRestoreAnnotation", "keyPrefix", "localStorageStateStoreAdapter", "getState", "id", "invariant", "localStorage", "getItem", "JSON", "parse", "setState", "setItem", "stringify", "createEditorStateTransaction", "scrollTo", "selection", "scrollIntoView", "effects", "EditorView", "yMargin", "annotations", "Transaction", "userEvent", "of", "setStateDebounced", "debounce", "updateListener", "view", "transactions", "some", "tr", "isUserEvent", "scrollTop", "scrollDOM", "pos", "posAtCoords", "x", "y", "anchor", "head", "main", "keymap", "key", "run", "dispatch", "filter", "isNotFalsy"]
7
- }