@pictogrammers/components 0.5.14 → 0.5.17

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 (153) hide show
  1. package/package.json +1 -1
  2. package/pg/autocompleteItem/__examples__/basic/basic.html +3 -0
  3. package/pg/autocompleteItem/autocompleteItem.css +55 -0
  4. package/pg/autocompleteItem/autocompleteItem.html +1 -0
  5. package/pg/autocompleteItem/autocompleteItem.ts +65 -0
  6. package/pg/button/button.css +5 -0
  7. package/pg/buttonMenu/buttonMenu.ts +1 -1
  8. package/pg/inputCombobox/__examples__/basic/basic.ts +33 -0
  9. package/pg/inputCombobox/inputCombobox.ts +158 -0
  10. package/pg/inputCombobox/inputCombobox.ts.tmp.44252.751480cb81cc +158 -0
  11. package/pg/inputCombobox/inputCombobox.ts.tmp.44252.dcea847c40a8 +156 -0
  12. package/pg/inputNumber/inputNumber.ts +31 -13
  13. package/pg/inputPill/inputPill.html +6 -0
  14. package/pg/inputPill/inputPill.html.tmp.26852.84ac63f4c46f +6 -0
  15. package/pg/inputPill/inputPill.ts +41 -0
  16. package/pg/inputPills/__examples__/basic/basic.html +9 -0
  17. package/pg/inputPills/__examples__/basic/basic.html.tmp.26852.4771e4cad5b7 +9 -0
  18. package/pg/inputPills/__examples__/basic/basic.ts.tmp.26852.d8fe41df18bd +0 -0
  19. package/pg/inputPixelEditor/README.md +104 -69
  20. package/pg/inputPixelEditor/README.md.tmp.42596.658de5f0a6f5 +0 -0
  21. package/pg/inputPixelEditor/__examples__/basic/basic.ts +6 -5
  22. package/pg/inputPixelEditor/inputPixelEditor.ts +95 -23
  23. package/pg/inputPixelEditor/inputPixelEditor.ts.tmp.38516.96529dd82670 +1703 -0
  24. package/pg/inputPixelEditor/inputPixelEditor.ts.tmp.42596.48ecc3ad9c72 +1724 -0
  25. package/pg/inputPixelEditor/utils/bitmapToMask.ts +113 -79
  26. package/pg/inputPixelEditor/utils/getLassoPixels.ts +51 -0
  27. package/pg/inputRange/inputRange.css +7 -0
  28. package/pg/inputSelect/__examples__/basic/basic.ts +2 -2
  29. package/pg/inputSelect/inputSelect.css +1 -1
  30. package/pg/inputSelect/inputSelect.ts +62 -5
  31. package/pg/inputText/README.md +6 -6
  32. package/pg/inputText/__examples__/basic/basic.ts +1 -1
  33. package/pg/inputText/inputText.css +2 -2
  34. package/pg/inputText copy/README.md +38 -0
  35. package/pg/inputText copy/inputText.css +41 -0
  36. package/pg/inputText copy/inputText.html +1 -0
  37. package/pg/inputText copy/inputText.spec.ts +59 -0
  38. package/pg/inputText copy/inputText.ts +67 -0
  39. package/pg/inputTextarea/README.md +39 -0
  40. package/pg/inputTextarea/__examples__/basic/basic.html +9 -0
  41. package/pg/inputTextarea/__examples__/basic/basic.ts +30 -0
  42. package/pg/inputTextarea/inputTextarea.ts +121 -0
  43. package/pg/inputTextarea copy/README.md +39 -0
  44. package/pg/inputTextarea copy/inputTextarea.css +41 -0
  45. package/pg/inputTextarea copy/inputTextarea.html +1 -0
  46. package/pg/inputTextarea copy/inputTextarea.spec.ts +59 -0
  47. package/pg/inputTextarea copy/inputTextarea.ts +79 -0
  48. package/pg/inputTextareaAutocomplete/README.md +70 -0
  49. package/pg/inputTextareaAutocomplete/__examples__/basic/basic.ts +67 -0
  50. package/pg/inputTextareaAutocomplete/inputTextareaAutocomplete.ts +267 -0
  51. package/pg/node/README.md +35 -0
  52. package/pg/node/__examples__/basic/basic.ts +34 -0
  53. package/pg/node/index.ts +3 -0
  54. package/pg/node/node.css +53 -0
  55. package/pg/node/node.html +5 -0
  56. package/pg/node/node.ts +270 -0
  57. package/pg/nodeEditorLink/nodeEditorLink.css +69 -0
  58. package/pg/nodeEditorLink/nodeEditorLink.css.tmp.1408.09e961fd0dcc +69 -0
  59. package/pg/nodeEditorLink/nodeEditorLink.html +9 -0
  60. package/pg/nodeEditorNumber/nodeEditorNumber.css +59 -0
  61. package/pg/nodeEditorNumber/nodeEditorNumber.ts +57 -0
  62. package/pg/nodeEditorRange/nodeEditorRange.css +23 -0
  63. package/pg/nodeEditorRange/nodeEditorRange.ts +69 -0
  64. package/pg/nodeEditorText/__examples__/basic/basic.html +9 -0
  65. package/pg/nodeEditorText/__examples__/basic/basic.ts +30 -0
  66. package/pg/nodeEditorText/nodeEditorText.css +17 -0
  67. package/pg/nodeEditorText/nodeEditorText.html +4 -0
  68. package/pg/nodeEditorText/nodeEditorText.ts +57 -0
  69. package/pg/nodeEditorText copy/README.md +35 -0
  70. package/pg/nodeEditorText copy/nodeEditorText.css +49 -0
  71. package/pg/nodeEditorText copy/nodeEditorText.html +4 -0
  72. package/pg/nodeEditorText copy/nodeEditorText.ts +50 -0
  73. package/pg/nodeEditorTextArray/nodeEditorTextArray.css +68 -0
  74. package/pg/nodeEditorTextArray/nodeEditorTextArray.html +9 -0
  75. package/pg/nodeEditorTextArray/nodeEditorTextArray.ts +162 -0
  76. package/pg/nodeEntry/nodeEntry.css +61 -0
  77. package/pg/nodeEntry/nodeEntry.ts +164 -0
  78. package/pg/nodeEntry/nodeEntry.ts.tmp.28724.dda67762bca5 +164 -0
  79. package/pg/nodeInputText/nodeInputText.css +75 -0
  80. package/pg/nodeInputText/nodeInputText.html +4 -0
  81. package/pg/nodeInputText/nodeInputText.ts +105 -0
  82. package/pg/nodeOutput/nodeOutput.css +32 -0
  83. package/pg/nodeResize/README.md +3 -0
  84. package/pg/nodeResize/THINKING.md +81 -0
  85. package/pg/nodeResize/THINKING.md.tmp.24812.99a70ba81062 +81 -0
  86. package/pg/nodeResize/basic/basic.ts +17 -0
  87. package/pg/nodeResize/dragUtil.ts +105 -0
  88. package/pg/nodeResize/dragUtil.ts.tmp.34372.787464c73309 +75 -0
  89. package/pg/nodeResize/nodeResize.css +187 -0
  90. package/pg/nodeResize/nodeResize.html +9 -0
  91. package/pg/nodeResize/nodeResize.ts +156 -0
  92. package/pg/nodes/README.md +177 -0
  93. package/pg/nodes/__examples__/basic/basic.html +33 -0
  94. package/pg/nodes/__examples__/basic/basic.ts +716 -0
  95. package/pg/nodes/__examples__/basic/exampleNodes.ts +129 -0
  96. package/pg/nodes/__examples__/basic/exampleScripts.ts +129 -0
  97. package/pg/nodes/__examples__/basic/keystore.ts +38 -0
  98. package/pg/nodes/executeInSandbox.ts +32 -0
  99. package/pg/nodes/index.ts +3 -0
  100. package/pg/nodes/nodes.css +69 -0
  101. package/pg/nodes/nodes.html +6 -0
  102. package/pg/nodes/nodes.ts +1240 -0
  103. package/pg/nodes copy/nodes.css +41 -0
  104. package/pg/nodes copy/nodes.html +1 -0
  105. package/pg/overlayContextMenu/__examples__/filter/filter.ts +87 -0
  106. package/pg/overlayContextMenu/overlayContextMenu.css +14 -0
  107. package/pg/overlayContextMenu/overlayContextMenu.html +4 -3
  108. package/pg/overlayContextMenu/overlayContextMenu.ts +6 -2
  109. package/pg/overlayContextMenu/overlayContextMenu.ts.tmp.37088.530ff1c0a321 +0 -0
  110. package/pg/overlayMenu/overlayMenu.css +3 -1
  111. package/pg/overlayMenu/overlayMenu.ts +11 -2
  112. package/pg/overlayMenu/overlayMenu.ts.tmp.44252.9bb22fd59ede +80 -0
  113. package/pg/overlaySelectMenu/overlaySelectMenu.css +2 -0
  114. package/pg/overlaySubMenu/overlaySubMenu.css +8 -6
  115. package/pg/poco/README.md +22 -0
  116. package/pg/poco/__examples__/basic/basic.html +11 -0
  117. package/pg/poco/__examples__/basic/basic.ts +95 -0
  118. package/pg/poco/__examples__/basic/examples.ts +258 -0
  119. package/pg/poco/__examples__/basic/myFont.ts +1300 -0
  120. package/pg/poco/index.ts +3 -0
  121. package/pg/poco/mockPoco.ts +640 -0
  122. package/pg/poco/poco.css +7 -0
  123. package/pg/poco/poco.html +1 -0
  124. package/pg/poco/poco.ts +75 -0
  125. package/pg/popover/README.md +47 -0
  126. package/pg/popover/__examples__/basic/basic.html +3 -0
  127. package/pg/popover/popover.html +3 -0
  128. package/pg/popover/popover.ts +44 -0
  129. package/pg/popoverAutocomplete/__examples__/basic/basic.html +4 -0
  130. package/pg/popoverAutocomplete/__examples__/basic/basic.ts +46 -0
  131. package/pg/popoverAutocomplete/popoverAutocomplete.css +25 -0
  132. package/pg/popoverAutocomplete/popoverAutocomplete.html +1 -0
  133. package/pg/popoverAutocomplete/popoverAutocomplete.ts +134 -0
  134. package/pg/popoverAutocompleteItem/popoverAutocompleteItem.css +69 -0
  135. package/pg/popoverAutocompleteItem/popoverAutocompleteItem.ts +90 -0
  136. package/pg/table/__examples__/basic/basic.ts +1 -0
  137. package/pg/tableCellFileLocal/tableCellFileLocal.html +3 -0
  138. package/pg/tableCellFileLocal/tableCellFileLocal.html.tmp.20484.68ee2e30710e +3 -0
  139. package/pg/tableCellFileLocal/tableCellFileLocal.ts +44 -0
  140. package/pg/tableCellSelect/tableCellSelect.html +3 -0
  141. package/pg/tableCellSelect/tableCellSelect.html.tmp.41808.99c1a6f14340 +3 -0
  142. package/pg/tableCellSelect/tableCellSelect.ts +51 -0
  143. package/pg/tree/__examples__/basic/basic.ts +12 -5
  144. package/pg/tree/tree.html +1 -1
  145. package/pg/tree/tree.ts +385 -227
  146. package/pg/tree/tree.ts.tmp.38376.07d376a04f41 +343 -0
  147. package/pg/tree/tree.ts.tmp.38376.2a04599ade9f +361 -0
  148. package/pg/tree/tree.ts.tmp.38376.6cb2c663d476 +0 -0
  149. package/pg/tree/tree.ts.tmp.38376.ac5af1aff2b0 +393 -0
  150. package/pg/tree/tree.ts.tmp.38376.ac9acfc4f95f +324 -0
  151. package/pg/treeItem/treeItem.ts +536 -558
  152. package/pg/treeItem/treeItem.ts.tmp.38376.145d3121d648 +530 -0
  153. package/pg/treeItem/treeItem.ts.tmp.38376.b5224d48e5c0 +0 -0
@@ -0,0 +1,324 @@
1
+ import { Component, Prop, Part, forEach, getProxyValue } from '@pictogrammers/element';
2
+
3
+ import PgTreeItem from '../treeItem/treeItem';
4
+
5
+ import template from './tree.html';
6
+ import style from './tree.css';
7
+
8
+ export type SelectedTreeItem = {
9
+ indexes: number[];
10
+ remove: () => void;
11
+ getData: () => any;
12
+ getParentData: () => any;
13
+ move: (item: SelectedTreeItem, position: string) => void;
14
+ }
15
+
16
+ @Component({
17
+ selector: 'pg-tree',
18
+ style,
19
+ template
20
+ })
21
+ export default class PgTree extends HTMLElement {
22
+ @Prop() items: any[] = [];
23
+
24
+ @Part() $items: HTMLDivElement;
25
+
26
+ #selectedIndexes = new Map();
27
+ #lastSelectedIndexes: number[] | null = null;
28
+
29
+ connectedCallback() {
30
+ forEach({
31
+ container: this.$items,
32
+ items: this.items,
33
+ type: () => PgTreeItem
34
+ });
35
+ this.$items.addEventListener('action', (e: any) => {
36
+ e.stopPropagation();
37
+ this.dispatchEvent(new CustomEvent('action', {
38
+ detail: {
39
+ actionIndex: e.detail.actionIndex,
40
+ item: this.#wrap(e.detail.indexes),
41
+ }
42
+ }));
43
+ });
44
+ this.$items.addEventListener('move', (e: any) => {
45
+ e.stopPropagation();
46
+ this.dispatchEvent(new CustomEvent('move', {
47
+ detail: {
48
+ item: this.#wrap(e.detail.indexes),
49
+ position: e.detail.position,
50
+ }
51
+ }));
52
+ });
53
+ this.$items.addEventListener('rename', (e: any) => {
54
+ e.stopPropagation();
55
+ this.dispatchEvent(new CustomEvent('rename', {
56
+ detail: {
57
+ item: this.#wrap(e.detail.indexes),
58
+ label: e.detail.label,
59
+ }
60
+ }));
61
+ });
62
+ this.$items.addEventListener('toggle', (e: any) => {
63
+ const item = this.#getItem(e.detail.indexes);
64
+ item.expanded = !item.expanded;
65
+ });
66
+ this.$items.addEventListener('expand', (e: any) => {
67
+ this.#getItem(e.detail.indexes).expanded = true;
68
+ });
69
+ this.$items.addEventListener('menu', (e: any) => {
70
+ e.stopPropagation();
71
+ this.dispatchEvent(new CustomEvent('menu', {
72
+ detail: {
73
+ item: this.#wrap(e.detail.indexes),
74
+ x: e.detail.x,
75
+ y: e.detail.y,
76
+ }
77
+ }));
78
+ });
79
+ this.$items.addEventListener('select', (e: any) => {
80
+ e.stopPropagation();
81
+ const { indexes, type, ctrlKey, shiftKey } = e.detail;
82
+ const item = this.#getItem(indexes);
83
+ const unproxyItem = getProxyValue(item);
84
+
85
+ if (shiftKey && this.#lastSelectedIndexes) {
86
+ const visible = this.#getVisibleIndexes();
87
+ const lastPos = visible.findIndex(v => v.join(',') === this.#lastSelectedIndexes!.join(','));
88
+ const currPos = visible.findIndex(v => v.join(',') === indexes.join(','));
89
+ this.#selectedIndexes.forEach((x: any) => this.#getItem(x).selected = false);
90
+ this.#selectedIndexes.clear();
91
+ const start = Math.min(lastPos, currPos);
92
+ const end = Math.max(lastPos, currPos);
93
+ for (let i = start; i <= end; i++) {
94
+ const rangeItem = this.#getItem(visible[i]);
95
+ rangeItem.selected = true;
96
+ this.#selectedIndexes.set(getProxyValue(rangeItem), visible[i]);
97
+ }
98
+ } else {
99
+ if (!ctrlKey && this.#selectedIndexes.size && !this.#selectedIndexes.has(unproxyItem)) {
100
+ this.#selectedIndexes.forEach((x: any) => this.#getItem(x).selected = false);
101
+ this.#selectedIndexes.clear();
102
+ }
103
+ item.selected = type === 'rename' ? true : !item.selected;
104
+ if (item.selected) {
105
+ this.#selectedIndexes.set(unproxyItem, indexes);
106
+ this.#lastSelectedIndexes = indexes;
107
+ } else {
108
+ this.#selectedIndexes.delete(unproxyItem);
109
+ }
110
+ }
111
+
112
+ this.dispatchEvent(new CustomEvent('select', {
113
+ detail: {
114
+ items: [...this.#selectedIndexes.values()].map((idxs: any) => this.#wrap(idxs)),
115
+ }
116
+ }));
117
+ });
118
+ this.$items.addEventListener('up', (e: any) => {
119
+ e.stopPropagation();
120
+ const visible = this.#getVisibleIndexes();
121
+ const idx = visible.findIndex(v => v.join(',') === e.detail.indexes.join(','));
122
+ if (idx > 0) {
123
+ this.#focusItem(visible[idx - 1]);
124
+ }
125
+ });
126
+ this.$items.addEventListener('down', (e: any) => {
127
+ e.stopPropagation();
128
+ const visible = this.#getVisibleIndexes();
129
+ const idx = visible.findIndex(v => v.join(',') === e.detail.indexes.join(','));
130
+ if (idx < visible.length - 1) {
131
+ this.#focusItem(visible[idx + 1]);
132
+ }
133
+ });
134
+ this.$items.addEventListener('keydown', (e: any) => {
135
+ if (e.key === 'Delete') {
136
+ const toRemove = [...this.#selectedIndexes.values()] as number[][];
137
+ // Remove higher sibling indexes first to avoid index shifts
138
+ toRemove.sort((a, b) => {
139
+ for (let i = 0; i < Math.max(a.length, b.length); i++) {
140
+ const ai = i < a.length ? a[i] : -1;
141
+ const bi = i < b.length ? b[i] : -1;
142
+ if (ai !== bi) return bi - ai;
143
+ }
144
+ return 0;
145
+ });
146
+ toRemove.forEach((indexes: number[]) => this.#removeItem(indexes));
147
+ this.#selectedIndexes.clear();
148
+ this.#lastSelectedIndexes = null;
149
+ }
150
+ });
151
+ this.$items.addEventListener('itemdragstart', (e: any) => {
152
+ const { indexes, callback, ctrlKey } = e.detail;
153
+ const item = this.#getItem(indexes);
154
+ const unproxyItem = getProxyValue(item);
155
+ if (!ctrlKey && this.#selectedIndexes.size && !this.#selectedIndexes.has(unproxyItem)) {
156
+ this.#selectedIndexes.forEach((x: any) => this.#getItem(x).selected = false);
157
+ this.#selectedIndexes.clear();
158
+ }
159
+ item.selected = true;
160
+ this.#selectedIndexes.set(unproxyItem, indexes);
161
+ let count = 0;
162
+ this.#selectedIndexes.forEach((idxs: any) => {
163
+ count = this.#getDragCount(this.#getItem(idxs), count);
164
+ });
165
+ callback(count);
166
+ this.$items.classList.toggle('dragging', true);
167
+ // Sync selection to consumers so #selectedItems reflects the dragged item
168
+ this.dispatchEvent(new CustomEvent('select', {
169
+ detail: {
170
+ items: [...this.#selectedIndexes.values()].map((idxs: any) => this.#wrap(idxs)),
171
+ }
172
+ }));
173
+ });
174
+ this.$items.addEventListener('itemdragend', () => {
175
+ this.$items.classList.toggle('dragging', false);
176
+ this.#clearDropHighlights(this.$items);
177
+ });
178
+ this.$items.addEventListener('itemdropenter', this.#handleDropEnter.bind(this));
179
+ }
180
+
181
+ #getDragCount(item: any, count: number): number {
182
+ count += 1;
183
+ if (item.items?.length) {
184
+ item.items.forEach((itm: any) => {
185
+ count = this.#getDragCount(itm, count);
186
+ });
187
+ }
188
+ return count;
189
+ }
190
+
191
+ #handleDropEnter(e: any) {
192
+ const { indexes, callback } = e.detail;
193
+ const excludes = this.#calculateDragExcludes();
194
+ const joined = indexes.join(',') as string;
195
+ // Use comma-terminated prefix to prevent "0,1" from matching "0,10"
196
+ const isInvalid = excludes.some(ex => joined === ex || joined.startsWith(ex + ','));
197
+ callback(!isInvalid);
198
+ }
199
+
200
+ #removeItem(indexes: number[]) {
201
+ const deleteIndex = indexes[indexes.length - 1];
202
+ const parentIndexes = indexes.slice(0, indexes.length - 1);
203
+ const parent = parentIndexes.reduce((acc: any, i) => acc.items[i], this);
204
+ parent.items.splice(deleteIndex, 1);
205
+ }
206
+
207
+ #getItem(indexes: number[]) {
208
+ return indexes.reduce((acc: any, i) => acc.items[i], this);
209
+ }
210
+
211
+ #getItemElement(indexes: number[]): PgTreeItem | null {
212
+ let container: HTMLElement = this.$items;
213
+ let element: PgTreeItem | null = null;
214
+ for (const i of indexes) {
215
+ element = container.children[i] as PgTreeItem;
216
+ if (!element) return null;
217
+ container = (element as any).$items;
218
+ if (!container) return null;
219
+ }
220
+ return element;
221
+ }
222
+
223
+ #focusItem(indexes: number[]) {
224
+ const element = this.#getItemElement(indexes);
225
+ if (element) {
226
+ (element as any).$labelButton.focus();
227
+ }
228
+ }
229
+
230
+ #getVisibleIndexes(): number[][] {
231
+ const result: number[][] = [];
232
+ const traverse = (items: any[], prefix: number[]) => {
233
+ items.forEach((item: any, i: number) => {
234
+ const indexes = [...prefix, i];
235
+ result.push(indexes);
236
+ if (item.expanded && item.items?.length) {
237
+ traverse(item.items, indexes);
238
+ }
239
+ });
240
+ };
241
+ traverse(this.items, []);
242
+ return result;
243
+ }
244
+
245
+ #clearDropHighlights(container: HTMLElement) {
246
+ Array.from(container.children).forEach((child: any) => {
247
+ if (child.$dropabove) {
248
+ child.$dropabove.classList.remove('drop');
249
+ child.$dropon.classList.remove('drop');
250
+ child.$dropbelow.classList.remove('drop');
251
+ }
252
+ if (child.$items) {
253
+ this.#clearDropHighlights(child.$items);
254
+ }
255
+ });
256
+ }
257
+
258
+ #wrap(indexes: number[]): SelectedTreeItem {
259
+ return {
260
+ indexes,
261
+ remove: () => {
262
+ this.#removeItem(indexes);
263
+ this.#selectedIndexes.clear();
264
+ this.#lastSelectedIndexes = null;
265
+ },
266
+ getData: () => this.#getItem(indexes),
267
+ getParentData: () => {
268
+ const parent = indexes.slice(0, indexes.length - 1);
269
+ return parent.length === 0 ? this : this.#getItem(parent);
270
+ },
271
+ move: (item: SelectedTreeItem, position: string) => {
272
+ // After removing the dragged item, siblings at higher indexes shift down by one.
273
+ // Adjust the target index if it's a sibling that comes after the dragged item.
274
+ const adjustedTarget = [...item.indexes];
275
+ const draggedParent = indexes.slice(0, indexes.length - 1).join(',');
276
+ const targetParent = item.indexes.slice(0, item.indexes.length - 1).join(',');
277
+ if (draggedParent === targetParent &&
278
+ indexes[indexes.length - 1] < item.indexes[item.indexes.length - 1]) {
279
+ adjustedTarget[adjustedTarget.length - 1]--;
280
+ }
281
+ const adjustedIndex = adjustedTarget[adjustedTarget.length - 1];
282
+ const adjustedParent = adjustedTarget.slice(0, adjustedTarget.length - 1);
283
+
284
+ const cache = this.#getItem(indexes);
285
+ this.#removeItem(indexes);
286
+
287
+ if (position === 'on') {
288
+ const target = this.#getItem(adjustedTarget);
289
+ if (!Array.isArray(target.items)) {
290
+ target.items = [];
291
+ }
292
+ target.items.push(cache);
293
+ target.expanded = true;
294
+ } else if (adjustedParent.length === 0) {
295
+ this.items.splice(position === 'after' ? adjustedIndex + 1 : adjustedIndex, 0, cache);
296
+ } else {
297
+ this.#getItem(adjustedParent).items.splice(
298
+ position === 'after' ? adjustedIndex + 1 : adjustedIndex,
299
+ 0,
300
+ cache
301
+ );
302
+ }
303
+ this.#selectedIndexes.clear();
304
+ this.#lastSelectedIndexes = null;
305
+ this.$items.classList.toggle('dragging', false);
306
+ }
307
+ };
308
+ }
309
+
310
+ unselect(indexes: number[]) {
311
+ const item = this.#getItem(indexes);
312
+ const unproxyItem = getProxyValue(item);
313
+ item.selected = false;
314
+ this.#selectedIndexes.delete(unproxyItem);
315
+ }
316
+
317
+ #calculateDragExcludes(): string[] {
318
+ const exclude: string[] = [];
319
+ this.#selectedIndexes.forEach((indexes: number[]) => {
320
+ exclude.push(indexes.join(','));
321
+ });
322
+ return exclude;
323
+ }
324
+ }