@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
package/dist/pick.js CHANGED
@@ -7,171 +7,178 @@ const PREVIEW_DELAY_MS = 120;
7
7
  * Escape, typing, a click elsewhere or a change of the text close it.
8
8
  */
9
9
  export class PickFeature {
10
- language;
11
- timers;
12
- spec = null;
13
- ids = [];
14
- active = '';
15
- previewTimer;
16
- controller = null;
17
- /* The rows that said why they cannot be taken, by id. */
18
- refusals = new Map();
19
- attempting = false;
20
- constructor(language, timers = realTimers) {
21
- this.language = language;
22
- this.timers = timers;
23
- const { editor } = language;
24
- const offs = [
25
- language.onKey((event) => this.key(event), KEY_PRIORITY.pick),
26
- editor.onTextChange(() => this.close()),
27
- editor.onCaret(() => this.close()),
28
- editor.onBlur(() => this.close())
29
- ];
30
- language.onDispose(() => {
31
- for (const off of offs) {
32
- off();
33
- }
34
- this.close();
35
- });
10
+ language;
11
+ timers;
12
+ spec = null;
13
+ ids = [];
14
+ active = '';
15
+ previewTimer;
16
+ controller = null;
17
+ /* The rows that said why they cannot be taken, by id. */
18
+ refusals = new Map();
19
+ attempting = false;
20
+ constructor(language, timers = realTimers) {
21
+ this.language = language;
22
+ this.timers = timers;
23
+ const {
24
+ editor
25
+ } = language;
26
+ const offs = [language.onKey(event => this.key(event), KEY_PRIORITY.pick), editor.onTextChange(() => this.close()), editor.onCaret(() => this.close()), editor.onBlur(() => this.close())];
27
+ language.onDispose(() => {
28
+ for (const off of offs) {
29
+ off();
30
+ }
31
+ this.close();
32
+ });
33
+ }
34
+ get isOpen() {
35
+ return this.spec !== null;
36
+ }
37
+ open(spec) {
38
+ this.close();
39
+ const ids = spec.groups.flatMap(group => group.rows.map(row => row.id));
40
+ if (ids.length === 0) {
41
+ return;
36
42
  }
37
- get isOpen() {
38
- return this.spec !== null;
43
+ this.spec = spec;
44
+ this.refusals = new Map();
45
+ this.ids = ids;
46
+ this.active = spec.active !== undefined && ids.includes(spec.active) ? spec.active : ids[0];
47
+ this.publish(null);
48
+ this.schedulePreview();
49
+ }
50
+ close() {
51
+ if (this.spec === null) {
52
+ return;
39
53
  }
40
- open(spec) {
41
- this.close();
42
- const ids = spec.groups.flatMap((group) => group.rows.map((row) => row.id));
43
- if (ids.length === 0) {
44
- return;
45
- }
46
- this.spec = spec;
47
- this.refusals = new Map();
48
- this.ids = ids;
49
- this.active = spec.active !== undefined && ids.includes(spec.active) ? spec.active : ids[0];
50
- this.publish(null);
51
- this.schedulePreview();
54
+ this.spec = null;
55
+ this.timers.clear(this.previewTimer);
56
+ this.controller?.abort();
57
+ this.controller = null;
58
+ this.language.popups.setState({
59
+ pick: null
60
+ });
61
+ }
62
+ move(delta) {
63
+ const index = this.ids.indexOf(this.active);
64
+ this.activate(this.ids[Math.max(0, Math.min(this.ids.length - 1, index + delta))]);
65
+ }
66
+ /* Takes a row, by a click or Enter. */
67
+ choose(id) {
68
+ const spec = this.spec;
69
+ if (spec === null || !this.ids.includes(id) || this.attempting) {
70
+ return;
52
71
  }
53
- close() {
54
- if (this.spec === null) {
55
- return;
56
- }
57
- this.spec = null;
58
- this.timers.clear(this.previewTimer);
59
- this.controller?.abort();
60
- this.controller = null;
61
- this.language.popups.setState({ pick: null });
72
+ if (spec.attempt === undefined) {
73
+ this.close();
74
+ spec.accept(id);
75
+ return;
62
76
  }
63
- move(delta) {
64
- const index = this.ids.indexOf(this.active);
65
- this.activate(this.ids[Math.max(0, Math.min(this.ids.length - 1, index + delta))]);
66
- }
67
- /* Takes a row, by a click or Enter. */
68
- choose(id) {
69
- const spec = this.spec;
70
- if (spec === null || !this.ids.includes(id) || this.attempting) {
71
- return;
72
- }
73
- if (spec.attempt === undefined) {
74
- this.close();
75
- spec.accept(id);
76
- return;
77
- }
78
- this.attempting = true;
79
- void spec
80
- .attempt(id)
81
- .catch(() => null)
82
- .then((reason) => {
83
- this.attempting = false;
84
- if (this.spec !== spec) {
85
- return;
86
- }
87
- if (reason === null) {
88
- this.close();
89
- spec.accept(id);
90
- return;
91
- }
92
- this.refusals.set(id, reason);
93
- this.publish(null);
94
- });
77
+ this.attempting = true;
78
+ void spec.attempt(id).catch(() => null).then(reason => {
79
+ this.attempting = false;
80
+ if (this.spec !== spec) {
81
+ return;
82
+ }
83
+ if (reason === null) {
84
+ this.close();
85
+ spec.accept(id);
86
+ return;
87
+ }
88
+ this.refusals.set(id, reason);
89
+ this.publish(null);
90
+ });
91
+ }
92
+ activate(id) {
93
+ if (id === this.active) {
94
+ return;
95
95
  }
96
- activate(id) {
97
- if (id === this.active) {
98
- return;
99
- }
100
- this.active = id;
101
- this.controller?.abort();
102
- this.publish(null);
103
- this.schedulePreview();
96
+ this.active = id;
97
+ this.controller?.abort();
98
+ this.publish(null);
99
+ this.schedulePreview();
100
+ }
101
+ key(event) {
102
+ if (this.spec === null || event.metaKey || event.ctrlKey || event.altKey) {
103
+ return false;
104
104
  }
105
- key(event) {
106
- if (this.spec === null || event.metaKey || event.ctrlKey || event.altKey) {
107
- return false;
108
- }
109
- switch (event.key) {
110
- case 'ArrowDown':
111
- this.move(1);
112
- return true;
113
- case 'ArrowUp':
114
- this.move(-1);
115
- return true;
116
- case 'PageDown':
117
- this.move(8);
118
- return true;
119
- case 'PageUp':
120
- this.move(-8);
121
- return true;
122
- case 'Home':
123
- this.activate(this.ids[0]);
124
- return true;
125
- case 'End':
126
- this.activate(this.ids[this.ids.length - 1]);
127
- return true;
128
- case 'Enter':
129
- this.choose(this.active);
130
- return true;
131
- case 'Tab': {
132
- const spec = this.spec;
133
- if (spec.onTab !== undefined) {
134
- this.close();
135
- spec.onTab(event.shiftKey);
136
- }
137
- else {
138
- this.choose(this.active);
139
- }
140
- return true;
141
- }
142
- case 'Escape':
143
- this.close();
144
- return true;
145
- default:
146
- return false;
105
+ switch (event.key) {
106
+ case 'ArrowDown':
107
+ this.move(1);
108
+ return true;
109
+ case 'ArrowUp':
110
+ this.move(-1);
111
+ return true;
112
+ case 'PageDown':
113
+ this.move(8);
114
+ return true;
115
+ case 'PageUp':
116
+ this.move(-8);
117
+ return true;
118
+ case 'Home':
119
+ this.activate(this.ids[0]);
120
+ return true;
121
+ case 'End':
122
+ this.activate(this.ids[this.ids.length - 1]);
123
+ return true;
124
+ case 'Enter':
125
+ this.choose(this.active);
126
+ return true;
127
+ case 'Tab':
128
+ {
129
+ const spec = this.spec;
130
+ if (spec.onTab !== undefined) {
131
+ this.close();
132
+ spec.onTab(event.shiftKey);
133
+ } else {
134
+ this.choose(this.active);
135
+ }
136
+ return true;
147
137
  }
138
+ case 'Escape':
139
+ this.close();
140
+ return true;
141
+ default:
142
+ return false;
148
143
  }
149
- schedulePreview() {
150
- const spec = this.spec;
151
- this.timers.clear(this.previewTimer);
152
- if (spec?.preview === undefined) {
153
- return;
154
- }
155
- const id = this.active;
156
- this.previewTimer = this.timers.set(() => {
157
- const controller = new AbortController();
158
- this.controller = controller;
159
- spec.preview(id, controller.signal)
160
- .then((preview) => {
161
- if (this.spec === spec && this.active === id && !controller.signal.aborted) {
162
- this.publish(preview);
163
- }
164
- })
165
- .catch(() => undefined);
166
- }, PREVIEW_DELAY_MS);
144
+ }
145
+ schedulePreview() {
146
+ const spec = this.spec;
147
+ this.timers.clear(this.previewTimer);
148
+ if (spec?.preview === undefined) {
149
+ return;
167
150
  }
168
- publish(preview) {
169
- const spec = this.spec;
170
- if (spec === null) {
171
- return;
151
+ const id = this.active;
152
+ this.previewTimer = this.timers.set(() => {
153
+ const controller = new AbortController();
154
+ this.controller = controller;
155
+ spec.preview(id, controller.signal).then(preview => {
156
+ if (this.spec === spec && this.active === id && !controller.signal.aborted) {
157
+ this.publish(preview);
172
158
  }
173
- const refusal = this.refusals.get(this.active);
174
- const shown = refusal === undefined ? preview : { removed: [], added: [], note: null, refusal };
175
- this.language.popups.setState({ pick: { anchor: spec.anchor, groups: spec.groups, active: this.active, preview: shown, title: spec.title ?? null } });
159
+ }).catch(() => undefined);
160
+ }, PREVIEW_DELAY_MS);
161
+ }
162
+ publish(preview) {
163
+ const spec = this.spec;
164
+ if (spec === null) {
165
+ return;
176
166
  }
177
- }
167
+ const refusal = this.refusals.get(this.active);
168
+ const shown = refusal === undefined ? preview : {
169
+ removed: [],
170
+ added: [],
171
+ note: null,
172
+ refusal
173
+ };
174
+ this.language.popups.setState({
175
+ pick: {
176
+ anchor: spec.anchor,
177
+ groups: spec.groups,
178
+ active: this.active,
179
+ preview: shown,
180
+ title: spec.title ?? null
181
+ }
182
+ });
183
+ }
184
+ }
@@ -5,8 +5,8 @@
5
5
  * text. A press on the list moves no focus, and a row that gets it anyway hands it straight back.
6
6
  */
7
7
  export function keepFocusOutOfList(focusBack) {
8
- return {
9
- onMouseDown: (event) => event.preventDefault(),
10
- onFocus: () => focusBack()
11
- };
12
- }
8
+ return {
9
+ onMouseDown: event => event.preventDefault(),
10
+ onFocus: () => focusBack()
11
+ };
12
+ }
@@ -5,30 +5,45 @@
5
5
  * are the page's own pixels, so a canvas's scale never enters.
6
6
  */
7
7
  export function placePopup(anchor, size, window, options = {}) {
8
- const gap = options.gap ?? 4;
9
- const margin = options.margin ?? 8;
10
- const roomBelow = window.height - margin - (anchor.bottom + gap);
11
- const roomAbove = anchor.top - gap - margin;
12
- const fitsBelow = size.height <= roomBelow;
13
- const fitsAbove = size.height <= roomAbove;
14
- const below = options.prefer === 'above' ? !fitsAbove && (fitsBelow || roomBelow >= roomAbove) : fitsBelow || (!fitsAbove && roomBelow >= roomAbove);
15
- const maxHeight = Math.max(0, below ? roomBelow : roomAbove);
16
- const height = Math.min(size.height, maxHeight);
17
- const left = Math.max(margin, Math.min(anchor.left, window.width - size.width - margin));
18
- return { left, top: below ? anchor.bottom + gap : anchor.top - gap - height, maxHeight, side: below ? 'below' : 'above' };
8
+ const gap = options.gap ?? 4;
9
+ const margin = options.margin ?? 8;
10
+ const roomBelow = window.height - margin - (anchor.bottom + gap);
11
+ const roomAbove = anchor.top - gap - margin;
12
+ const fitsBelow = size.height <= roomBelow;
13
+ const fitsAbove = size.height <= roomAbove;
14
+ const below = options.prefer === 'above' ? !fitsAbove && (fitsBelow || roomBelow >= roomAbove) : fitsBelow || !fitsAbove && roomBelow >= roomAbove;
15
+ const maxHeight = Math.max(0, below ? roomBelow : roomAbove);
16
+ const height = Math.min(size.height, maxHeight);
17
+ const left = Math.max(margin, Math.min(anchor.left, window.width - size.width - margin));
18
+ return {
19
+ left,
20
+ top: below ? anchor.bottom + gap : anchor.top - gap - height,
21
+ maxHeight,
22
+ side: below ? 'below' : 'above'
23
+ };
19
24
  }
20
25
  /*
21
26
  * A second box beside a first, such as the documentation of the highlighted suggestion: to the right
22
27
  * of it when it fits, to the left when only that fits, and under it, at its left edge, when neither does.
23
28
  */
24
29
  export function placeBeside(first, size, window, margin = 8, gap = 4) {
25
- const fitsRight = first.left + first.width + gap + size.width <= window.width - margin;
26
- const fitsLeft = first.left - gap - size.width >= margin;
27
- if (fitsRight || fitsLeft) {
28
- const top = Math.max(margin, Math.min(first.top, window.height - size.height - margin));
29
- return { left: fitsRight ? first.left + first.width + gap : first.left - gap - size.width, top, maxHeight: window.height - margin * 2, side: 'below' };
30
- }
31
- const top = first.top + first.height + gap;
32
- const maxHeight = Math.max(0, window.height - margin - top);
33
- return { left: Math.max(margin, Math.min(first.left, window.width - size.width - margin)), top, maxHeight, side: 'below' };
34
- }
30
+ const fitsRight = first.left + first.width + gap + size.width <= window.width - margin;
31
+ const fitsLeft = first.left - gap - size.width >= margin;
32
+ if (fitsRight || fitsLeft) {
33
+ const top = Math.max(margin, Math.min(first.top, window.height - size.height - margin));
34
+ return {
35
+ left: fitsRight ? first.left + first.width + gap : first.left - gap - size.width,
36
+ top,
37
+ maxHeight: window.height - margin * 2,
38
+ side: 'below'
39
+ };
40
+ }
41
+ const top = first.top + first.height + gap;
42
+ const maxHeight = Math.max(0, window.height - margin - top);
43
+ return {
44
+ left: Math.max(margin, Math.min(first.left, window.width - size.width - margin)),
45
+ top,
46
+ maxHeight,
47
+ side: 'below'
48
+ };
49
+ }
package/dist/popups.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { createStore } from 'zustand';
2
2
  export function createPopupStore() {
3
- return createStore(() => ({
4
- hover: null,
5
- completion: null,
6
- signature: null,
7
- pick: null,
8
- rename: null,
9
- peek: null,
10
- callHierarchy: null,
11
- symbols: null,
12
- menu: null,
13
- authors: null
14
- }));
15
- }
3
+ return createStore(() => ({
4
+ hover: null,
5
+ completion: null,
6
+ signature: null,
7
+ pick: null,
8
+ rename: null,
9
+ peek: null,
10
+ callHierarchy: null,
11
+ symbols: null,
12
+ menu: null,
13
+ authors: null
14
+ }));
15
+ }