@adecore/editor-react 0.31.11 → 0.32.0

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 (137) hide show
  1. package/dist/AnchoredPopup.js +73 -19
  2. package/dist/AttributionCard.js +162 -4
  3. package/dist/BaselineStatus.js +62 -8
  4. package/dist/CallHierarchyPanel.js +977 -60
  5. package/dist/ChangeReview.js +76 -25
  6. package/dist/CodeAuthorsCard.js +314 -14
  7. package/dist/CompletionPopup.js +490 -83
  8. package/dist/DiffView.js +548 -181
  9. package/dist/EditorContextMenu.js +352 -34
  10. package/dist/EditorView.js +276 -99
  11. package/dist/FindReplace.js +525 -67
  12. package/dist/HoverCard.js +378 -38
  13. package/dist/HoverSections.js +367 -56
  14. package/dist/LanguagePopups.js +95 -34
  15. package/dist/Markdown.js +41 -6
  16. package/dist/PanelResizeHandle.js +199 -66
  17. package/dist/PathText.js +49 -7
  18. package/dist/PeekPanel.js +675 -72
  19. package/dist/PickPopup.js +304 -34
  20. package/dist/RenameCard.js +679 -85
  21. package/dist/RenderedDocs.js +329 -58
  22. package/dist/SignatureCard.js +91 -7
  23. package/dist/SplitDiffView.js +344 -254
  24. package/dist/SymbolPicker.js +440 -85
  25. package/dist/call-hierarchy-model.js +102 -68
  26. package/dist/call-hierarchy.js +458 -359
  27. package/dist/code-actions-model.js +88 -76
  28. package/dist/code-actions.js +372 -283
  29. package/dist/code-authors.js +64 -55
  30. package/dist/code-vision-model.js +134 -127
  31. package/dist/code-vision.js +224 -206
  32. package/dist/completion-call.js +94 -67
  33. package/dist/completion-model.js +334 -244
  34. package/dist/completion.js +840 -649
  35. package/dist/conflict-model.js +35 -29
  36. package/dist/context-menu-rows.js +42 -17
  37. package/dist/context-menu.js +64 -46
  38. package/dist/definition-link.js +88 -85
  39. package/dist/diagnostics-model.js +74 -55
  40. package/dist/diagnostics.js +121 -100
  41. package/dist/diff-expansion.js +38 -35
  42. package/dist/diff-overlays.js +144 -22
  43. package/dist/diff-syntax.js +65 -42
  44. package/dist/diff-wordmarks.js +26 -23
  45. package/dist/doc-comment-model.js +265 -216
  46. package/dist/editor-language.js +177 -152
  47. package/dist/error-message.js +2 -2
  48. package/dist/find-query.js +49 -36
  49. package/dist/folding.js +81 -62
  50. package/dist/format-on-type.js +86 -67
  51. package/dist/highlight-layers.js +19 -20
  52. package/dist/highlights.js +105 -83
  53. package/dist/history.js +44 -38
  54. package/dist/holder.js +18 -18
  55. package/dist/host-types.js +1 -1
  56. package/dist/hover-content.js +167 -129
  57. package/dist/hover.js +285 -245
  58. package/dist/index.js +10 -10
  59. package/dist/inlay-hints.js +369 -324
  60. package/dist/key-priority.js +34 -31
  61. package/dist/language-ids.js +45 -42
  62. package/dist/line-edits.js +74 -28
  63. package/dist/line-text.js +18 -3
  64. package/dist/locales/en.json +38 -38
  65. package/dist/locales/nl.json +41 -41
  66. package/dist/models.js +1 -1
  67. package/dist/navigation-history.js +40 -41
  68. package/dist/navigation.js +141 -123
  69. package/dist/panel-size.js +8 -8
  70. package/dist/patch-decorations.js +236 -160
  71. package/dist/patch-layout.js +331 -262
  72. package/dist/paths.js +3 -3
  73. package/dist/peek-model.js +86 -69
  74. package/dist/peek.js +254 -192
  75. package/dist/pick.js +164 -157
  76. package/dist/popup-focus.js +5 -5
  77. package/dist/popup-placement.js +36 -21
  78. package/dist/popups.js +13 -13
  79. package/dist/project-language.js +228 -211
  80. package/dist/project-problems.js +81 -69
  81. package/dist/proposal-model.js +163 -126
  82. package/dist/recent-choices.js +25 -25
  83. package/dist/refresher.js +44 -49
  84. package/dist/rename-model.js +113 -113
  85. package/dist/rename.js +321 -233
  86. package/dist/rendered-docs.d.ts +4 -2
  87. package/dist/rendered-docs.js +384 -318
  88. package/dist/rendering-context.js +5 -3
  89. package/dist/rendering.js +22 -4
  90. package/dist/review-group.js +42 -39
  91. package/dist/row-host.d.ts +4 -2
  92. package/dist/row-host.js +90 -78
  93. package/dist/selection-ranges.js +21 -17
  94. package/dist/semantic-delta.js +22 -19
  95. package/dist/semantic-model.js +86 -73
  96. package/dist/semantic-tokens.js +201 -162
  97. package/dist/shortcut-keys.js +16 -10
  98. package/dist/signature-model.js +34 -28
  99. package/dist/signature.js +177 -129
  100. package/dist/snippet-field-transforms.js +118 -106
  101. package/dist/snippet-indent.js +48 -43
  102. package/dist/snippet-range-order.js +11 -11
  103. package/dist/snippet-session.js +703 -667
  104. package/dist/snippet-transform-client.js +59 -59
  105. package/dist/snippet-transform-format.js +285 -263
  106. package/dist/snippet-transform-protocol.js +1 -1
  107. package/dist/snippet-transform-queue.js +163 -153
  108. package/dist/snippet-transform-worker.js +42 -35
  109. package/dist/snippet-variable-names.js +1 -36
  110. package/dist/snippet-variables.js +53 -63
  111. package/dist/snippet.js +477 -405
  112. package/dist/split-alignment.js +47 -35
  113. package/dist/split-scroll.js +42 -40
  114. package/dist/symbol-links.js +33 -25
  115. package/dist/symbol-picker-model.js +126 -116
  116. package/dist/symbol-picker.js +98 -59
  117. package/dist/symbols.js +117 -88
  118. package/dist/testing.js +248 -165
  119. package/dist/timers.js +35 -30
  120. package/dist/use-panel-body.js +49 -8
  121. package/dist/use-problem-counts.js +29 -15
  122. package/dist/view-state.js +54 -33
  123. package/dist/word-diff.js +18 -18
  124. package/dist/workspace-edit.js +300 -249
  125. package/package.json +6 -6
  126. package/src/CallHierarchyPanel.tsx +2 -2
  127. package/src/DiffView.tsx +3 -3
  128. package/src/FindReplace.tsx +2 -2
  129. package/src/LanguagePopups.tsx +2 -0
  130. package/src/PeekPanel.tsx +3 -3
  131. package/src/RenderedDocs.tsx +9 -10
  132. package/src/SymbolPicker.tsx +2 -2
  133. package/src/diff-overlays.tsx +6 -4
  134. package/src/locales/en.json +38 -38
  135. package/src/locales/nl.json +41 -41
  136. package/src/rendered-docs.ts +14 -3
  137. package/src/row-host.ts +14 -3
@@ -1,276 +1,366 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
1
  import { useLayoutEffect, useMemo, useRef, useState } from 'react';
3
2
  import { useTranslation } from 'react-i18next';
4
3
  import { parseChord } from '@adecore/editor/keymap';
5
- import { DiffOverlays } from './diff-overlays.js';
4
+ import { DiffOverlays } from "./diff-overlays.js";
6
5
  import { wordMarks } from './diff-wordmarks.js';
7
6
  import { RowHost, LineActionHost } from './row-host.js';
8
7
  import { splitAlignment } from './split-alignment.js';
9
8
  import { SplitScroll } from './split-scroll.js';
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  const SIDES = ['old', 'new'];
11
- export function SplitDiffView({ engine, document, display, unfold, blocked, theme, tokens, wrap = true, fill = false, maxHeight, label, className, ref, onMount }) {
12
- const { t } = useTranslation('editor');
13
- const emphasis = useMemo(() => wordMarks(document), [document]);
14
- const oldElement = useRef(null);
15
- const newElement = useRef(null);
16
- const current = useRef({ display, tokens, theme, wrap, label });
17
- const applied = useRef({ theme, wrap, label });
18
- const [failure, setFailure] = useState(null);
19
- const [mounted, setMounted] = useState(null);
20
- const [height, setHeight] = useState(0);
21
- useLayoutEffect(() => {
22
- current.current = { display, tokens, theme, wrap, label };
11
+ export function SplitDiffView({
12
+ engine,
13
+ document,
14
+ display,
15
+ unfold,
16
+ blocked,
17
+ theme,
18
+ tokens,
19
+ wrap = true,
20
+ fill = false,
21
+ maxHeight,
22
+ label,
23
+ className,
24
+ ref,
25
+ onMount
26
+ }) {
27
+ const {
28
+ t
29
+ } = useTranslation('editor');
30
+ const emphasis = useMemo(() => wordMarks(document), [document]);
31
+ const oldElement = useRef(null);
32
+ const newElement = useRef(null);
33
+ const current = useRef({
34
+ display,
35
+ tokens,
36
+ theme,
37
+ wrap,
38
+ label
39
+ });
40
+ const applied = useRef({
41
+ theme,
42
+ wrap,
43
+ label
44
+ });
45
+ const [failure, setFailure] = useState(null);
46
+ const [mounted, setMounted] = useState(null);
47
+ const [height, setHeight] = useState(0);
48
+ useLayoutEffect(() => {
49
+ current.current = {
50
+ display,
51
+ tokens,
52
+ theme,
53
+ wrap,
54
+ label
55
+ };
56
+ });
57
+ useLayoutEffect(() => {
58
+ const oldHost = oldElement.current;
59
+ const newHost = newElement.current;
60
+ if (oldHost === null || newHost === null) {
61
+ return;
62
+ }
63
+ const initial = current.current;
64
+ applied.current = {
65
+ theme: initial.theme,
66
+ wrap: initial.wrap,
67
+ label: initial.label
68
+ };
69
+ const mount = (side, host) => {
70
+ const initial_0 = current.current;
71
+ const editor = engine.mount(host, {
72
+ text: initial_0.display[side].text,
73
+ theme: initial_0.theme,
74
+ wrap: initial_0.wrap,
75
+ label: initial_0.label,
76
+ readOnly: true,
77
+ guides: false,
78
+ folding: false,
79
+ foldOutline: 'off',
80
+ handBack: [parseChord('Mod+Enter')]
81
+ });
82
+ editor.setBlocks([]);
83
+ editor.setLineTokens(line => {
84
+ const row = current.current.display[side].rows[line];
85
+ return row === undefined ? null : current.current.tokens?.get(side, row[side].index);
86
+ });
87
+ return {
88
+ engine,
89
+ editor,
90
+ rows: new RowHost(editor, 'diff-alignment'),
91
+ actions: new LineActionHost(editor, 'diff-status')
92
+ };
93
+ };
94
+ const old = mount('old', oldHost);
95
+ let fresh;
96
+ try {
97
+ fresh = mount('new', newHost);
98
+ } catch (error) {
99
+ old.editor.dispose();
100
+ throw error;
101
+ }
102
+ const sides = {
103
+ old,
104
+ new: fresh
105
+ };
106
+ let stopped = false;
107
+ let pending = false;
108
+ let failed = false;
109
+ const scroll = new SplitScroll({
110
+ old: old.editor,
111
+ new: fresh.editor
23
112
  });
24
- useLayoutEffect(() => {
25
- const oldHost = oldElement.current;
26
- const newHost = newElement.current;
27
- if (oldHost === null || newHost === null) {
28
- return;
113
+ let aligning = false;
114
+ let updating = false;
115
+ const fail = error_0 => {
116
+ failed = true;
117
+ setFailure({
118
+ error: error_0
119
+ });
120
+ };
121
+ const measure = () => setHeight(Math.max(sides.old.editor.getContentHeight(), sides.new.editor.getContentHeight()));
122
+ const align = () => {
123
+ if (pending || stopped || failed) {
124
+ return;
125
+ }
126
+ pending = true;
127
+ // Intrinsic measurements arrive after each render; align both editors before the next paint.
128
+ queueMicrotask(() => {
129
+ pending = false;
130
+ if (stopped || failed) {
131
+ return;
29
132
  }
30
- const initial = current.current;
31
- applied.current = { theme: initial.theme, wrap: initial.wrap, label: initial.label };
32
- const mount = (side, host) => {
33
- const initial = current.current;
34
- const editor = engine.mount(host, {
35
- text: initial.display[side].text,
36
- theme: initial.theme,
37
- wrap: initial.wrap,
38
- label: initial.label,
39
- readOnly: true,
40
- guides: false,
41
- folding: false,
42
- foldOutline: 'off',
43
- handBack: [parseChord('Mod+Enter')]
44
- });
45
- editor.setBlocks([]);
46
- editor.setLineTokens((line) => {
47
- const row = current.current.display[side].rows[line];
48
- return row === undefined ? null : current.current.tokens?.get(side, row[side].index);
49
- });
50
- return { engine, editor, rows: new RowHost(editor, 'diff-alignment'), actions: new LineActionHost(editor, 'diff-status') };
51
- };
52
- const old = mount('old', oldHost);
53
- let fresh;
133
+ aligning = true;
54
134
  try {
55
- fresh = mount('new', newHost);
135
+ const rows = splitAlignment(current.current.display.aligned, line_0 => sides.old.editor.getLineHeight(line_0), line_1 => sides.new.editor.getLineHeight(line_1));
136
+ sides.old.rows.set(rows.old);
137
+ sides.new.rows.set(rows.new);
138
+ } catch (error_1) {
139
+ fail(error_1);
140
+ return;
141
+ } finally {
142
+ aligning = false;
56
143
  }
57
- catch (error) {
58
- old.editor.dispose();
59
- throw error;
144
+ try {
145
+ measure();
146
+ scroll.sync();
147
+ } catch (error_2) {
148
+ fail(error_2);
60
149
  }
61
- const sides = { old, new: fresh };
62
- let stopped = false;
63
- let pending = false;
64
- let failed = false;
65
- const scroll = new SplitScroll({ old: old.editor, new: fresh.editor });
66
- let aligning = false;
67
- let updating = false;
68
- const fail = (error) => {
69
- failed = true;
70
- setFailure({ error });
71
- };
72
- const measure = () => setHeight(Math.max(sides.old.editor.getContentHeight(), sides.new.editor.getContentHeight()));
73
- const align = () => {
74
- if (pending || stopped || failed) {
75
- return;
76
- }
77
- pending = true;
78
- // Intrinsic measurements arrive after each render; align both editors before the next paint.
79
- queueMicrotask(() => {
80
- pending = false;
81
- if (stopped || failed) {
82
- return;
83
- }
84
- aligning = true;
85
- try {
86
- const rows = splitAlignment(current.current.display.aligned, (line) => sides.old.editor.getLineHeight(line), (line) => sides.new.editor.getLineHeight(line));
87
- sides.old.rows.set(rows.old);
88
- sides.new.rows.set(rows.new);
89
- }
90
- catch (error) {
91
- fail(error);
92
- return;
93
- }
94
- finally {
95
- aligning = false;
96
- }
97
- try {
98
- measure();
99
- scroll.sync();
100
- }
101
- catch (error) {
102
- fail(error);
103
- }
104
- });
105
- };
106
- const update = (run) => {
107
- updating = true;
108
- try {
109
- run();
110
- }
111
- finally {
112
- updating = false;
113
- }
114
- align();
115
- };
116
- const stops = SIDES.flatMap((side) => [
117
- sides[side].editor.onLineHeights(align),
118
- sides[side].editor.onViewChange(() => {
119
- if (stopped || failed || aligning || updating) {
120
- return;
121
- }
122
- try {
123
- measure();
124
- scroll.changed(side);
125
- }
126
- catch (error) {
127
- fail(error);
128
- }
129
- })
130
- ]);
131
- setMounted({ old: sides.old, new: sides.new, align, update, drive: (side) => scroll.drive(side) });
150
+ });
151
+ };
152
+ const update = run => {
153
+ updating = true;
154
+ try {
155
+ run();
156
+ } finally {
157
+ updating = false;
158
+ }
159
+ align();
160
+ };
161
+ const stops = SIDES.flatMap(side_0 => [sides[side_0].editor.onLineHeights(align), sides[side_0].editor.onViewChange(() => {
162
+ if (stopped || failed || aligning || updating) {
163
+ return;
164
+ }
165
+ try {
132
166
  measure();
133
- return () => {
134
- stopped = true;
135
- for (const stop of stops) {
136
- stop();
137
- }
138
- for (const side of SIDES) {
139
- sides[side].editor.dispose();
140
- }
141
- };
142
- }, [engine]);
143
- useLayoutEffect(() => {
144
- if (mounted === null || mounted.old.engine !== engine) {
145
- return;
167
+ scroll.changed(side_0);
168
+ } catch (error_3) {
169
+ fail(error_3);
170
+ }
171
+ })]);
172
+ setMounted({
173
+ old: sides.old,
174
+ new: sides.new,
175
+ align,
176
+ update,
177
+ drive: side_1 => scroll.drive(side_1)
178
+ });
179
+ measure();
180
+ return () => {
181
+ stopped = true;
182
+ for (const stop of stops) {
183
+ stop();
184
+ }
185
+ for (const side_2 of SIDES) {
186
+ sides[side_2].editor.dispose();
187
+ }
188
+ };
189
+ }, [engine]);
190
+ useLayoutEffect(() => {
191
+ if (mounted === null || mounted.old.engine !== engine) {
192
+ return;
193
+ }
194
+ mounted.update(() => {
195
+ for (const side_3 of SIDES) {
196
+ const {
197
+ editor: editor_0,
198
+ actions
199
+ } = mounted[side_3];
200
+ editor_0.setText(display[side_3].text);
201
+ editor_0.setLineNumbers(line_2 => {
202
+ const row_0 = current.current.display[side_3].rows[line_2];
203
+ return row_0 === undefined ? null : String(row_0[side_3].number);
204
+ });
205
+ const highlights = [];
206
+ for (const [index, row_1] of display[side_3].rows.entries()) {
207
+ if (row_1.change === 'context') {
208
+ continue;
209
+ }
210
+ highlights.push({
211
+ startLine: index + 1,
212
+ endLine: index + 1,
213
+ color: side_3 === 'old' ? '--editor-deleted' : '--editor-added',
214
+ bar: side_3 === 'old' ? 'hatched' : 'solid',
215
+ emphasis: [emphasis[side_3].get(row_1[side_3].index) ?? []]
216
+ });
146
217
  }
147
- mounted.update(() => {
148
- for (const side of SIDES) {
149
- const { editor, actions } = mounted[side];
150
- editor.setText(display[side].text);
151
- editor.setLineNumbers((line) => {
152
- const row = current.current.display[side].rows[line];
153
- return row === undefined ? null : String(row[side].number);
154
- });
155
- const highlights = [];
156
- for (const [index, row] of display[side].rows.entries()) {
157
- if (row.change === 'context') {
158
- continue;
159
- }
160
- highlights.push({
161
- startLine: index + 1,
162
- endLine: index + 1,
163
- color: side === 'old' ? '--editor-deleted' : '--editor-added',
164
- bar: side === 'old' ? 'hatched' : 'solid',
165
- emphasis: [emphasis[side].get(row[side].index) ?? []]
166
- });
167
- }
168
- editor.setLineHighlights(highlights);
169
- editor.setChangeMarks(highlights.map((highlight) => ({ startLine: highlight.startLine, endLine: highlight.endLine, kind: side === 'old' ? 'deleted' : 'added' })));
170
- actions.set(display[side].rows.flatMap((row, line) => (row.noNewline === undefined ? [] : [{ id: `no-newline-${line}`, line }])));
171
- }
218
+ editor_0.setLineHighlights(highlights);
219
+ editor_0.setChangeMarks(highlights.map(highlight => ({
220
+ startLine: highlight.startLine,
221
+ endLine: highlight.endLine,
222
+ kind: side_3 === 'old' ? 'deleted' : 'added'
223
+ })));
224
+ actions.set(display[side_3].rows.flatMap((row_2, line_3) => row_2.noNewline === undefined ? [] : [{
225
+ id: `no-newline-${line_3}`,
226
+ line: line_3
227
+ }]));
228
+ }
229
+ });
230
+ }, [mounted, engine, display, emphasis]);
231
+ useLayoutEffect(() => {
232
+ if (mounted === null || mounted.old.engine !== engine) {
233
+ return;
234
+ }
235
+ for (const side_4 of SIDES) {
236
+ mounted[side_4].editor.setLineLabels(line_4 => {
237
+ const row_3 = display[side_4].rows[line_4];
238
+ if (row_3 === undefined || row_3.change === 'context') {
239
+ return null;
240
+ }
241
+ return t(side_4 === 'old' ? 'diff.removed' : 'diff.added', {
242
+ number: row_3[side_4].number
172
243
  });
173
- }, [mounted, engine, display, emphasis]);
174
- useLayoutEffect(() => {
175
- if (mounted === null || mounted.old.engine !== engine) {
176
- return;
244
+ });
245
+ }
246
+ }, [mounted, engine, display, t]);
247
+ useLayoutEffect(() => {
248
+ if (mounted === null || mounted.old.engine !== engine) {
249
+ return;
250
+ }
251
+ mounted.update(() => {
252
+ for (const side_5 of SIDES) {
253
+ const previous = applied.current;
254
+ if (previous.theme !== theme) {
255
+ mounted[side_5].editor.setTheme(theme);
177
256
  }
178
- for (const side of SIDES) {
179
- mounted[side].editor.setLineLabels((line) => {
180
- const row = display[side].rows[line];
181
- if (row === undefined || row.change === 'context') {
182
- return null;
183
- }
184
- return t(side === 'old' ? 'diff.removed' : 'diff.added', { number: row[side].number });
185
- });
257
+ if (previous.wrap !== wrap) {
258
+ mounted[side_5].editor.setWrap(wrap);
186
259
  }
187
- }, [mounted, engine, display, t]);
188
- useLayoutEffect(() => {
189
- if (mounted === null || mounted.old.engine !== engine) {
190
- return;
260
+ if (previous.label !== label) {
261
+ mounted[side_5].editor.setLabel(label);
191
262
  }
192
- mounted.update(() => {
193
- for (const side of SIDES) {
194
- const previous = applied.current;
195
- if (previous.theme !== theme) {
196
- mounted[side].editor.setTheme(theme);
197
- }
198
- if (previous.wrap !== wrap) {
199
- mounted[side].editor.setWrap(wrap);
200
- }
201
- if (previous.label !== label) {
202
- mounted[side].editor.setLabel(label);
203
- }
204
- }
263
+ }
264
+ });
265
+ applied.current = {
266
+ theme,
267
+ wrap,
268
+ label
269
+ };
270
+ }, [mounted, engine, theme, wrap, label]);
271
+ useLayoutEffect(() => {
272
+ if (mounted === null || mounted.old.engine !== engine) {
273
+ return;
274
+ }
275
+ const refresh = () => {
276
+ for (const side_6 of SIDES) {
277
+ mounted[side_6].editor.setLineTokens(line_5 => {
278
+ const row_4 = current.current.display[side_6].rows[line_5];
279
+ return row_4 === undefined ? null : current.current.tokens?.get(side_6, row_4[side_6].index);
205
280
  });
206
- applied.current = { theme, wrap, label };
207
- }, [mounted, engine, theme, wrap, label]);
208
- useLayoutEffect(() => {
209
- if (mounted === null || mounted.old.engine !== engine) {
210
- return;
211
- }
212
- const refresh = () => {
213
- for (const side of SIDES) {
214
- mounted[side].editor.setLineTokens((line) => {
215
- const row = current.current.display[side].rows[line];
216
- return row === undefined ? null : current.current.tokens?.get(side, row[side].index);
217
- });
218
- }
219
- };
220
- refresh();
221
- const ownerWindow = oldElement.current?.ownerDocument.defaultView;
222
- let frame;
223
- let pending = false;
224
- let stopped = false;
225
- const schedule = () => {
226
- if (pending) {
227
- return;
228
- }
229
- pending = true;
230
- const paint = () => {
231
- pending = false;
232
- if (!stopped) {
233
- refresh();
234
- }
235
- };
236
- if (ownerWindow?.requestAnimationFrame !== undefined) {
237
- frame = ownerWindow.requestAnimationFrame(paint);
238
- }
239
- else {
240
- queueMicrotask(paint);
241
- }
242
- };
243
- const stop = tokens?.subscribe(schedule);
244
- return () => {
245
- stopped = true;
246
- stop?.();
247
- if (frame !== undefined) {
248
- ownerWindow?.cancelAnimationFrame?.(frame);
249
- }
250
- };
251
- }, [mounted, engine, display, tokens]);
252
- useLayoutEffect(() => {
253
- if (mounted === null || mounted.old.engine !== engine) {
254
- return;
281
+ }
282
+ };
283
+ refresh();
284
+ const ownerWindow = oldElement.current?.ownerDocument.defaultView;
285
+ let frame;
286
+ let pending_0 = false;
287
+ let stopped_0 = false;
288
+ const schedule = () => {
289
+ if (pending_0) {
290
+ return;
291
+ }
292
+ pending_0 = true;
293
+ const paint = () => {
294
+ pending_0 = false;
295
+ if (!stopped_0) {
296
+ refresh();
255
297
  }
256
- const stops = SIDES.map((side) => onMount?.(mounted[side].editor, side));
257
- return () => {
258
- for (const stop of stops) {
259
- stop?.();
260
- }
261
- };
262
- }, [mounted, engine, onMount]);
263
- const limit = maxHeight !== undefined && Number.isFinite(maxHeight) && maxHeight > 0 ? maxHeight : Infinity;
264
- if (failure !== null) {
265
- throw failure.error;
298
+ };
299
+ if (ownerWindow?.requestAnimationFrame !== undefined) {
300
+ frame = ownerWindow.requestAnimationFrame(paint);
301
+ } else {
302
+ queueMicrotask(paint);
303
+ }
304
+ };
305
+ const stop_0 = tokens?.subscribe(schedule);
306
+ return () => {
307
+ stopped_0 = true;
308
+ stop_0?.();
309
+ if (frame !== undefined) {
310
+ ownerWindow?.cancelAnimationFrame?.(frame);
311
+ }
312
+ };
313
+ }, [mounted, engine, display, tokens]);
314
+ useLayoutEffect(() => {
315
+ if (mounted === null || mounted.old.engine !== engine) {
316
+ return;
266
317
  }
267
- return (_jsx("div", { className: `adecore-editor-diff adecore-editor-diff-split ${className ?? ''}`, ref: ref, role: "group", "aria-label": label, "data-scroll": fill || height > limit, style: { height: fill ? '100%' : Math.min(height, limit) }, children: SIDES.map((side) => (_jsxs("div", { className: "adecore-editor-diff-side", "data-side": side, role: "group", "aria-label": t(`diff.${side}Side`), onWheelCapture: () => {
268
- mounted?.drive(side);
269
- }, onFocusCapture: () => {
270
- mounted?.drive(side);
271
- }, onPointerDownCapture: () => {
272
- mounted?.drive(side);
273
- }, onKeyDownCapture: () => {
274
- mounted?.drive(side);
275
- }, children: [_jsx("div", { ref: side === 'old' ? oldElement : newElement, className: "adecore-editor-diff-surface" }), mounted !== null && mounted[side].engine === engine && (_jsx(DiffOverlays, { mounted: mounted[side], display: display[side], unfold: unfold, blocked: blocked }))] }, side))) }));
276
- }
318
+ const stops_0 = SIDES.map(side_7 => onMount?.(mounted[side_7].editor, side_7));
319
+ return () => {
320
+ for (const stop_1 of stops_0) {
321
+ stop_1?.();
322
+ }
323
+ };
324
+ }, [mounted, engine, onMount]);
325
+ const limit = maxHeight !== undefined && Number.isFinite(maxHeight) && maxHeight > 0 ? maxHeight : Infinity;
326
+ if (failure !== null) {
327
+ throw failure.error;
328
+ }
329
+ return /*#__PURE__*/_jsx("div", {
330
+ className: `adecore-editor-diff adecore-editor-diff-split ${className ?? ''}`,
331
+ ref: ref,
332
+ role: "group",
333
+ "aria-label": label,
334
+ "data-scroll": fill || height > limit,
335
+ style: {
336
+ height: fill ? '100%' : Math.min(height, limit)
337
+ },
338
+ children: SIDES.map(side_8 => /*#__PURE__*/_jsxs("div", {
339
+ className: "adecore-editor-diff-side",
340
+ "data-side": side_8,
341
+ role: "group",
342
+ "aria-label": t(`diff.${side_8}Side`),
343
+ onWheelCapture: () => {
344
+ mounted?.drive(side_8);
345
+ },
346
+ onFocusCapture: () => {
347
+ mounted?.drive(side_8);
348
+ },
349
+ onPointerDownCapture: () => {
350
+ mounted?.drive(side_8);
351
+ },
352
+ onKeyDownCapture: () => {
353
+ mounted?.drive(side_8);
354
+ },
355
+ children: [/*#__PURE__*/_jsx("div", {
356
+ ref: side_8 === 'old' ? oldElement : newElement,
357
+ className: "adecore-editor-diff-surface"
358
+ }), mounted !== null && mounted[side_8].engine === engine && /*#__PURE__*/_jsx(DiffOverlays, {
359
+ mounted: mounted[side_8],
360
+ display: display[side_8],
361
+ unfold: unfold,
362
+ blocked: blocked
363
+ })]
364
+ }, side_8))
365
+ });
366
+ }