dockview-core 5.2.0 → 6.0.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 (117) hide show
  1. package/README.md +3 -1
  2. package/dist/cjs/api/component.api.d.ts +93 -1
  3. package/dist/cjs/api/component.api.js +146 -0
  4. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +26 -0
  5. package/dist/cjs/api/dockviewGroupPanelApi.js +21 -1
  6. package/dist/cjs/api/entryPoints.js +4 -5
  7. package/dist/cjs/array.js +7 -8
  8. package/dist/cjs/dnd/dataTransfer.d.ts +2 -1
  9. package/dist/cjs/dnd/dataTransfer.js +5 -4
  10. package/dist/cjs/dnd/droptarget.d.ts +12 -0
  11. package/dist/cjs/dnd/droptarget.js +38 -10
  12. package/dist/cjs/dnd/ghost.js +1 -2
  13. package/dist/cjs/dockview/components/panel/content.js +5 -1
  14. package/dist/cjs/dockview/components/popupService.d.ts +9 -2
  15. package/dist/cjs/dockview/components/popupService.js +24 -9
  16. package/dist/cjs/dockview/components/tab/tab.d.ts +6 -1
  17. package/dist/cjs/dockview/components/tab/tab.js +81 -9
  18. package/dist/cjs/dockview/components/titlebar/tabGroupChip.d.ts +30 -0
  19. package/dist/cjs/dockview/components/titlebar/tabGroupChip.js +95 -0
  20. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.d.ts +71 -0
  21. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +471 -0
  22. package/dist/cjs/dockview/components/titlebar/tabGroups.d.ts +57 -0
  23. package/dist/cjs/dockview/components/titlebar/tabGroups.js +612 -0
  24. package/dist/cjs/dockview/components/titlebar/tabOverflowControl.js +1 -2
  25. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +59 -0
  26. package/dist/cjs/dockview/components/titlebar/tabs.js +1227 -144
  27. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +6 -0
  28. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +132 -14
  29. package/dist/cjs/dockview/contextMenu.d.ts +10 -0
  30. package/dist/cjs/dockview/contextMenu.js +298 -0
  31. package/dist/cjs/dockview/dockviewComponent.d.ts +60 -3
  32. package/dist/cjs/dockview/dockviewComponent.js +712 -126
  33. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +83 -0
  34. package/dist/cjs/dockview/dockviewGroupPanelModel.js +619 -27
  35. package/dist/cjs/dockview/dockviewShell.d.ts +128 -0
  36. package/dist/cjs/dockview/dockviewShell.js +681 -0
  37. package/dist/cjs/dockview/events.d.ts +9 -0
  38. package/dist/cjs/dockview/framework.d.ts +14 -0
  39. package/dist/cjs/dockview/options.d.ts +92 -10
  40. package/dist/cjs/dockview/options.js +10 -7
  41. package/dist/cjs/dockview/tabGroup.d.ts +99 -0
  42. package/dist/cjs/dockview/tabGroup.js +219 -0
  43. package/dist/cjs/dockview/tabGroupAccent.d.ts +65 -0
  44. package/dist/cjs/dockview/tabGroupAccent.js +128 -0
  45. package/dist/cjs/dockview/theme.d.ts +56 -1
  46. package/dist/cjs/dockview/theme.js +103 -6
  47. package/dist/cjs/dockview/types.d.ts +2 -0
  48. package/dist/cjs/dom.js +19 -19
  49. package/dist/cjs/events.js +2 -2
  50. package/dist/cjs/gridview/baseComponentGridview.d.ts +1 -0
  51. package/dist/cjs/gridview/baseComponentGridview.js +6 -3
  52. package/dist/cjs/gridview/gridview.js +7 -7
  53. package/dist/cjs/index.d.ts +8 -5
  54. package/dist/cjs/index.js +6 -1
  55. package/dist/cjs/popoutWindow.js +3 -3
  56. package/dist/cjs/splitview/splitviewPanel.d.ts +1 -1
  57. package/dist/dockview-core.js +6942 -2777
  58. package/dist/dockview-core.min.js +2 -2
  59. package/dist/dockview-core.min.js.map +1 -1
  60. package/dist/dockview-core.min.noStyle.js +2 -2
  61. package/dist/dockview-core.min.noStyle.js.map +1 -1
  62. package/dist/dockview-core.noStyle.js +6940 -2775
  63. package/dist/esm/api/component.api.d.ts +93 -1
  64. package/dist/esm/api/component.api.js +118 -0
  65. package/dist/esm/api/dockviewGroupPanelApi.d.ts +26 -0
  66. package/dist/esm/api/dockviewGroupPanelApi.js +21 -1
  67. package/dist/esm/dnd/dataTransfer.d.ts +2 -1
  68. package/dist/esm/dnd/dataTransfer.js +2 -1
  69. package/dist/esm/dnd/droptarget.d.ts +12 -0
  70. package/dist/esm/dnd/droptarget.js +33 -5
  71. package/dist/esm/dockview/components/panel/content.js +5 -1
  72. package/dist/esm/dockview/components/popupService.d.ts +9 -2
  73. package/dist/esm/dockview/components/popupService.js +23 -9
  74. package/dist/esm/dockview/components/tab/tab.d.ts +6 -1
  75. package/dist/esm/dockview/components/tab/tab.js +83 -9
  76. package/dist/esm/dockview/components/titlebar/tabGroupChip.d.ts +30 -0
  77. package/dist/esm/dockview/components/titlebar/tabGroupChip.js +68 -0
  78. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.d.ts +71 -0
  79. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +354 -0
  80. package/dist/esm/dockview/components/titlebar/tabGroups.d.ts +57 -0
  81. package/dist/esm/dockview/components/titlebar/tabGroups.js +406 -0
  82. package/dist/esm/dockview/components/titlebar/tabs.d.ts +59 -0
  83. package/dist/esm/dockview/components/titlebar/tabs.js +1011 -99
  84. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +6 -0
  85. package/dist/esm/dockview/components/titlebar/tabsContainer.js +105 -7
  86. package/dist/esm/dockview/contextMenu.d.ts +10 -0
  87. package/dist/esm/dockview/contextMenu.js +213 -0
  88. package/dist/esm/dockview/dockviewComponent.d.ts +60 -3
  89. package/dist/esm/dockview/dockviewComponent.js +460 -35
  90. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +83 -0
  91. package/dist/esm/dockview/dockviewGroupPanelModel.js +460 -4
  92. package/dist/esm/dockview/dockviewShell.d.ts +128 -0
  93. package/dist/esm/dockview/dockviewShell.js +621 -0
  94. package/dist/esm/dockview/events.d.ts +9 -0
  95. package/dist/esm/dockview/framework.d.ts +14 -0
  96. package/dist/esm/dockview/options.d.ts +92 -10
  97. package/dist/esm/dockview/options.js +5 -2
  98. package/dist/esm/dockview/tabGroup.d.ts +99 -0
  99. package/dist/esm/dockview/tabGroup.js +144 -0
  100. package/dist/esm/dockview/tabGroupAccent.d.ts +65 -0
  101. package/dist/esm/dockview/tabGroupAccent.js +116 -0
  102. package/dist/esm/dockview/theme.d.ts +56 -1
  103. package/dist/esm/dockview/theme.js +102 -5
  104. package/dist/esm/dockview/types.d.ts +2 -0
  105. package/dist/esm/dom.js +1 -1
  106. package/dist/esm/gridview/baseComponentGridview.d.ts +1 -0
  107. package/dist/esm/gridview/baseComponentGridview.js +4 -1
  108. package/dist/esm/index.d.ts +8 -5
  109. package/dist/esm/index.js +2 -1
  110. package/dist/esm/popoutWindow.js +1 -1
  111. package/dist/esm/splitview/splitviewPanel.d.ts +1 -1
  112. package/dist/package/main.cjs.js +6936 -2801
  113. package/dist/package/main.cjs.min.js +2 -2
  114. package/dist/package/main.esm.min.mjs +2 -2
  115. package/dist/package/main.esm.mjs +6922 -2800
  116. package/dist/styles/dockview.css +1945 -196
  117. package/package.json +5 -1
@@ -0,0 +1,612 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ var __read = (this && this.__read) || function (o, n) {
14
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
15
+ if (!m) return o;
16
+ var i = m.call(o), r, ar = [], e;
17
+ try {
18
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
19
+ }
20
+ catch (error) { e = { error: error }; }
21
+ finally {
22
+ try {
23
+ if (r && !r.done && (m = i["return"])) m.call(i);
24
+ }
25
+ finally { if (e) throw e.error; }
26
+ }
27
+ return ar;
28
+ };
29
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
30
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
31
+ if (ar || !(i in from)) {
32
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
33
+ ar[i] = from[i];
34
+ }
35
+ }
36
+ return to.concat(ar || Array.prototype.slice.call(from));
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.TabGroupManager = void 0;
40
+ var dom_1 = require("../../../dom");
41
+ var events_1 = require("../../../events");
42
+ var lifecycle_1 = require("../../../lifecycle");
43
+ var tabGroupAccent_1 = require("../../tabGroupAccent");
44
+ var tabGroupChip_1 = require("./tabGroupChip");
45
+ var tabGroupIndicator_1 = require("./tabGroupIndicator");
46
+ var EMPTY_MAP = new Map();
47
+ var TabGroupManager = /** @class */ (function () {
48
+ function TabGroupManager(_ctx, _callbacks) {
49
+ this._ctx = _ctx;
50
+ this._callbacks = _callbacks;
51
+ this._chipRenderers = new Map();
52
+ this._indicator = null;
53
+ this._skipNextCollapseAnimation = false;
54
+ this._pendingTransitionCleanups = new Map();
55
+ }
56
+ Object.defineProperty(TabGroupManager.prototype, "chipRenderers", {
57
+ get: function () {
58
+ return this._chipRenderers;
59
+ },
60
+ enumerable: false,
61
+ configurable: true
62
+ });
63
+ Object.defineProperty(TabGroupManager.prototype, "groupUnderlines", {
64
+ get: function () {
65
+ var _a, _b;
66
+ return (_b = (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.underlines) !== null && _b !== void 0 ? _b : EMPTY_MAP;
67
+ },
68
+ enumerable: false,
69
+ configurable: true
70
+ });
71
+ Object.defineProperty(TabGroupManager.prototype, "skipNextCollapseAnimation", {
72
+ get: function () {
73
+ return this._skipNextCollapseAnimation;
74
+ },
75
+ set: function (value) {
76
+ this._skipNextCollapseAnimation = value;
77
+ },
78
+ enumerable: false,
79
+ configurable: true
80
+ });
81
+ /**
82
+ * Synchronize chip elements and CSS classes for all tab groups
83
+ * in the parent group model. Call after any tab group mutation.
84
+ */
85
+ TabGroupManager.prototype.update = function () {
86
+ var e_1, _a, e_2, _b;
87
+ var model = this._ctx.group.model;
88
+ var tabGroups = model.getTabGroups();
89
+ // Track which group IDs are still active
90
+ var activeGroupIds = new Set();
91
+ try {
92
+ for (var tabGroups_1 = __values(tabGroups), tabGroups_1_1 = tabGroups_1.next(); !tabGroups_1_1.done; tabGroups_1_1 = tabGroups_1.next()) {
93
+ var tabGroup = tabGroups_1_1.value;
94
+ activeGroupIds.add(tabGroup.id);
95
+ this._ensureChipForGroup(tabGroup);
96
+ this._positionChipForGroup(tabGroup);
97
+ }
98
+ }
99
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
100
+ finally {
101
+ try {
102
+ if (tabGroups_1_1 && !tabGroups_1_1.done && (_a = tabGroups_1.return)) _a.call(tabGroups_1);
103
+ }
104
+ finally { if (e_1) throw e_1.error; }
105
+ }
106
+ try {
107
+ // Remove chips for dissolved/destroyed groups
108
+ for (var _c = __values(this._chipRenderers), _d = _c.next(); !_d.done; _d = _c.next()) {
109
+ var _e = __read(_d.value, 2), groupId = _e[0], entry = _e[1];
110
+ if (!activeGroupIds.has(groupId)) {
111
+ entry.chip.element.remove();
112
+ entry.chip.dispose();
113
+ entry.disposable.dispose();
114
+ this._chipRenderers.delete(groupId);
115
+ }
116
+ }
117
+ }
118
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
119
+ finally {
120
+ try {
121
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
122
+ }
123
+ finally { if (e_2) throw e_2.error; }
124
+ }
125
+ // Update CSS classes on all tabs
126
+ this._updateTabGroupClasses();
127
+ };
128
+ /**
129
+ * Re-read the active palette and re-apply colors to chips, tabs and
130
+ * the indicator. Called when `tabGroupColors` / `tabGroupAccent`
131
+ * options change at runtime.
132
+ */
133
+ TabGroupManager.prototype.refreshAccents = function () {
134
+ var e_3, _a;
135
+ var _b, _c;
136
+ try {
137
+ for (var _d = __values(this._ctx.group.model.getTabGroups()), _e = _d.next(); !_e.done; _e = _d.next()) {
138
+ var tabGroup = _e.value;
139
+ var entry = this._chipRenderers.get(tabGroup.id);
140
+ (_c = entry === null || entry === void 0 ? void 0 : (_b = entry.chip).update) === null || _c === void 0 ? void 0 : _c.call(_b, { tabGroup: tabGroup });
141
+ }
142
+ }
143
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
144
+ finally {
145
+ try {
146
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
147
+ }
148
+ finally { if (e_3) throw e_3.error; }
149
+ }
150
+ this._updateTabGroupClasses();
151
+ };
152
+ TabGroupManager.prototype.positionAllChips = function () {
153
+ var e_4, _a;
154
+ if (this._chipRenderers.size === 0) {
155
+ return;
156
+ }
157
+ try {
158
+ for (var _b = __values(this._ctx.group.model.getTabGroups()), _c = _b.next(); !_c.done; _c = _b.next()) {
159
+ var tabGroup = _c.value;
160
+ this._positionChipForGroup(tabGroup);
161
+ }
162
+ }
163
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
164
+ finally {
165
+ try {
166
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
167
+ }
168
+ finally { if (e_4) throw e_4.error; }
169
+ }
170
+ };
171
+ TabGroupManager.prototype.snapshotChipWidths = function () {
172
+ var e_5, _a;
173
+ var widths = new Map();
174
+ try {
175
+ for (var _b = __values(this._chipRenderers), _c = _b.next(); !_c.done; _c = _b.next()) {
176
+ var _d = __read(_c.value, 2), groupId = _d[0], entry = _d[1];
177
+ widths.set(groupId, entry.chip.element.getBoundingClientRect().width);
178
+ }
179
+ }
180
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
181
+ finally {
182
+ try {
183
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
184
+ }
185
+ finally { if (e_5) throw e_5.error; }
186
+ }
187
+ return widths;
188
+ };
189
+ TabGroupManager.prototype.positionUnderlines = function () {
190
+ var _a;
191
+ (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.positionUnderlines();
192
+ };
193
+ TabGroupManager.prototype.trackUnderlines = function () {
194
+ var _a;
195
+ (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.trackUnderlines();
196
+ };
197
+ TabGroupManager.prototype.setGroupDragImage = function (event, tabGroup, chipEl) {
198
+ if (!event.dataTransfer) {
199
+ return;
200
+ }
201
+ var isVertical = this._ctx.getDirection() === 'vertical';
202
+ // Clone the entire tabs list so cloned nodes inherit all
203
+ // theme styles, CSS variables and class-based rules.
204
+ var clone = this._ctx.tabsList.cloneNode(true);
205
+ if (isVertical) {
206
+ // Force horizontal orientation for the drag ghost by
207
+ // removing vertical CSS classes and overriding writing-mode.
208
+ clone.classList.remove('dv-tabs-container-vertical', 'dv-vertical');
209
+ clone.classList.add('dv-horizontal');
210
+ clone.style.writingMode = 'horizontal-tb';
211
+ clone.style.height = "".concat(this._ctx.tabsList.offsetWidth, "px");
212
+ }
213
+ else {
214
+ clone.style.height = "".concat(this._ctx.tabsList.offsetHeight, "px");
215
+ }
216
+ clone.style.width = 'auto';
217
+ clone.style.overflow = 'visible';
218
+ clone.style.pointerEvents = 'none';
219
+ // Remove all elements except the chip so the drag ghost
220
+ // shows only the chip regardless of the group's expanded state.
221
+ var children = Array.from(clone.children);
222
+ var realChildren = Array.from(this._ctx.tabsList.children);
223
+ for (var i = children.length - 1; i >= 0; i--) {
224
+ var real = realChildren[i];
225
+ if (real === chipEl) {
226
+ continue; // keep the chip only
227
+ }
228
+ children[i].remove();
229
+ }
230
+ // Wrap the clone in a minimal ancestor chain so that CSS
231
+ // selectors like `.dv-groupview.dv-active-group > .dv-tabs-and-actions-container .dv-tabs-container > .dv-tab`
232
+ // match the cloned tabs and apply correct color/background.
233
+ var wrapper = document.createElement('div');
234
+ wrapper.className = 'dv-groupview dv-active-group';
235
+ wrapper.style.position = 'fixed';
236
+ wrapper.style.top = '-10000px';
237
+ wrapper.style.left = '0px';
238
+ wrapper.style.height = 'auto';
239
+ wrapper.style.width = 'auto';
240
+ wrapper.style.pointerEvents = 'none';
241
+ var actionsWrapper = document.createElement('div');
242
+ actionsWrapper.className = 'dv-tabs-and-actions-container';
243
+ actionsWrapper.style.height = 'auto';
244
+ actionsWrapper.style.width = 'auto';
245
+ wrapper.appendChild(actionsWrapper);
246
+ actionsWrapper.appendChild(clone);
247
+ // Append inside the dockview root so CSS variables are inherited
248
+ this._ctx.accessor.element.appendChild(wrapper);
249
+ // Compute cursor offset relative to the wrapper element.
250
+ // The cloned chip is the first .dv-tab-group-chip in the clone.
251
+ var clonedChip = clone.querySelector('.dv-tab-group-chip');
252
+ var chipRect = chipEl.getBoundingClientRect();
253
+ var cursorInChipX = event.clientX - chipRect.left;
254
+ var cursorInChipY = event.clientY - chipRect.top;
255
+ if (clonedChip) {
256
+ var clonedChipRect = clonedChip.getBoundingClientRect();
257
+ var wrapperRect = wrapper.getBoundingClientRect();
258
+ var offsetX = clonedChipRect.left - wrapperRect.left + cursorInChipX;
259
+ var offsetY = clonedChipRect.top - wrapperRect.top + cursorInChipY;
260
+ event.dataTransfer.setDragImage(wrapper, offsetX, offsetY);
261
+ }
262
+ else {
263
+ event.dataTransfer.setDragImage(wrapper, cursorInChipX, cursorInChipY);
264
+ }
265
+ // Clean up after the browser captures the image
266
+ requestAnimationFrame(function () {
267
+ wrapper.remove();
268
+ });
269
+ };
270
+ TabGroupManager.prototype.cleanupTransition = function (panelId) {
271
+ var _a;
272
+ (_a = this._pendingTransitionCleanups.get(panelId)) === null || _a === void 0 ? void 0 : _a();
273
+ this._pendingTransitionCleanups.delete(panelId);
274
+ };
275
+ TabGroupManager.prototype.disposeAll = function () {
276
+ var e_6, _a, e_7, _b;
277
+ var _c;
278
+ (_c = this._indicator) === null || _c === void 0 ? void 0 : _c.dispose();
279
+ this._indicator = null;
280
+ try {
281
+ for (var _d = __values(this._pendingTransitionCleanups), _e = _d.next(); !_e.done; _e = _d.next()) {
282
+ var _f = __read(_e.value, 2), cleanup = _f[1];
283
+ cleanup();
284
+ }
285
+ }
286
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
287
+ finally {
288
+ try {
289
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
290
+ }
291
+ finally { if (e_6) throw e_6.error; }
292
+ }
293
+ this._pendingTransitionCleanups.clear();
294
+ try {
295
+ for (var _g = __values(this._chipRenderers), _h = _g.next(); !_h.done; _h = _g.next()) {
296
+ var _j = __read(_h.value, 2), entry = _j[1];
297
+ entry.chip.element.remove();
298
+ entry.chip.dispose();
299
+ entry.disposable.dispose();
300
+ }
301
+ }
302
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
303
+ finally {
304
+ try {
305
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
306
+ }
307
+ finally { if (e_7) throw e_7.error; }
308
+ }
309
+ this._chipRenderers.clear();
310
+ };
311
+ TabGroupManager.prototype._ensureIndicator = function () {
312
+ var _this = this;
313
+ var _a, _b;
314
+ var mode = (_b = (_a = this._ctx.accessor.options.theme) === null || _a === void 0 ? void 0 : _a.tabGroupIndicator) !== null && _b !== void 0 ? _b : 'wrap';
315
+ var Ctor = mode === 'none' ? tabGroupIndicator_1.NoneTabGroupIndicator : tabGroupIndicator_1.WrapTabGroupIndicator;
316
+ // Re-create if the indicator type changed (e.g. theme switch)
317
+ if (this._indicator && !(this._indicator instanceof Ctor)) {
318
+ this._indicator.dispose();
319
+ this._indicator = null;
320
+ }
321
+ if (!this._indicator) {
322
+ this._indicator = new Ctor({
323
+ tabsList: this._ctx.tabsList,
324
+ getTabGroups: function () { return _this._ctx.group.model.getTabGroups(); },
325
+ getActivePanelId: function () { var _a; return (_a = _this._ctx.group.activePanel) === null || _a === void 0 ? void 0 : _a.id; },
326
+ getTabMap: function () { return _this._ctx.getTabMap(); },
327
+ getChipElement: function (id) { var _a; return (_a = _this._chipRenderers.get(id)) === null || _a === void 0 ? void 0 : _a.chip.element; },
328
+ getDirection: function () { return _this._ctx.getDirection(); },
329
+ getColorPalette: function () { return _this._ctx.accessor.tabGroupColorPalette; },
330
+ });
331
+ }
332
+ };
333
+ TabGroupManager.prototype._ensureChipForGroup = function (tabGroup) {
334
+ var _this = this;
335
+ if (this._chipRenderers.has(tabGroup.id)) {
336
+ return;
337
+ }
338
+ var createChip = this._ctx.accessor.options.createTabGroupChipComponent;
339
+ var chip = createChip
340
+ ? createChip(tabGroup)
341
+ : new tabGroupChip_1.TabGroupChip(this._ctx.accessor.tabGroupColorPalette);
342
+ chip.init({ tabGroup: tabGroup, api: this._ctx.accessor.api });
343
+ var disposables = [
344
+ tabGroup.onDidChange(function () {
345
+ var _a;
346
+ (_a = chip.update) === null || _a === void 0 ? void 0 : _a.call(chip, { tabGroup: tabGroup });
347
+ _this._updateTabGroupClasses();
348
+ }),
349
+ tabGroup.onDidPanelChange(function () {
350
+ _this._positionChipForGroup(tabGroup);
351
+ _this._updateTabGroupClasses();
352
+ }),
353
+ tabGroup.onDidCollapseChange(function () {
354
+ _this._updateTabGroupClasses();
355
+ }),
356
+ ];
357
+ // Wire chip context menu and drag for all chip renderers
358
+ if (chip instanceof tabGroupChip_1.TabGroupChip) {
359
+ disposables.push(chip.onContextMenu(function (event) {
360
+ _this._callbacks.onChipContextMenu(tabGroup, event);
361
+ }), chip.onDragStart(function (event) {
362
+ _this._callbacks.onChipDragStart(tabGroup, chip, event);
363
+ }));
364
+ }
365
+ else {
366
+ disposables.push((0, events_1.addDisposableListener)(chip.element, 'contextmenu', function (event) {
367
+ _this._callbacks.onChipContextMenu(tabGroup, event);
368
+ }), (0, events_1.addDisposableListener)(chip.element, 'dragstart', function (event) {
369
+ _this._callbacks.onChipDragStart(tabGroup, chip, event);
370
+ }));
371
+ }
372
+ var disposable = new (lifecycle_1.CompositeDisposable.bind.apply(lifecycle_1.CompositeDisposable, __spreadArray([void 0], __read(disposables), false)))();
373
+ this._chipRenderers.set(tabGroup.id, { chip: chip, disposable: disposable });
374
+ // Group is born collapsed (cross-group drop, layout restore, etc.):
375
+ // its tabs are about to be added without the collapsed class. Skip
376
+ // the animation in the upcoming _updateTabGroupClasses call so they
377
+ // apply the class instantly instead of transitioning from expanded.
378
+ if (tabGroup.collapsed) {
379
+ this._skipNextCollapseAnimation = true;
380
+ }
381
+ };
382
+ TabGroupManager.prototype._positionChipForGroup = function (tabGroup) {
383
+ var entry = this._chipRenderers.get(tabGroup.id);
384
+ if (!entry) {
385
+ return;
386
+ }
387
+ var chipEl = entry.chip.element;
388
+ var panelIds = tabGroup.panelIds;
389
+ if (panelIds.length === 0) {
390
+ chipEl.remove();
391
+ return;
392
+ }
393
+ // Find the first tab element of this group
394
+ var firstPanelId = panelIds[0];
395
+ var firstTabEntry = this._ctx.getTabMap().get(firstPanelId);
396
+ if (!firstTabEntry) {
397
+ chipEl.remove();
398
+ return;
399
+ }
400
+ // Insert chip before the first tab of the group
401
+ var firstTabEl = firstTabEntry.value.element;
402
+ if (chipEl.nextSibling !== firstTabEl) {
403
+ this._ctx.tabsList.insertBefore(chipEl, firstTabEl);
404
+ }
405
+ };
406
+ TabGroupManager.prototype._updateTabGroupClasses = function () {
407
+ var e_8, _a, e_9, _b, e_10, _c, e_11, _d, e_12, _e, e_13, _f, e_14, _g;
408
+ var _this = this;
409
+ var _h;
410
+ var model = this._ctx.group.model;
411
+ var tabGroups = model.getTabGroups();
412
+ var tabs = this._ctx.getTabs();
413
+ var tabMap = this._ctx.getTabMap();
414
+ var hasAnimation = false;
415
+ // Build a lookup: panelId → tabGroup
416
+ var panelGroupMap = new Map();
417
+ try {
418
+ for (var tabGroups_2 = __values(tabGroups), tabGroups_2_1 = tabGroups_2.next(); !tabGroups_2_1.done; tabGroups_2_1 = tabGroups_2.next()) {
419
+ var tg = tabGroups_2_1.value;
420
+ try {
421
+ for (var _j = (e_9 = void 0, __values(tg.panelIds)), _k = _j.next(); !_k.done; _k = _j.next()) {
422
+ var pid = _k.value;
423
+ panelGroupMap.set(pid, tg);
424
+ }
425
+ }
426
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
427
+ finally {
428
+ try {
429
+ if (_k && !_k.done && (_b = _j.return)) _b.call(_j);
430
+ }
431
+ finally { if (e_9) throw e_9.error; }
432
+ }
433
+ }
434
+ }
435
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
436
+ finally {
437
+ try {
438
+ if (tabGroups_2_1 && !tabGroups_2_1.done && (_a = tabGroups_2.return)) _a.call(tabGroups_2);
439
+ }
440
+ finally { if (e_8) throw e_8.error; }
441
+ }
442
+ var _loop_1 = function (tabEntry) {
443
+ var tab = tabEntry.value;
444
+ var panelId = tab.panel.id;
445
+ var tg = panelGroupMap.get(panelId);
446
+ var isGrouped = !!tg;
447
+ (0, dom_1.toggleClass)(tab.element, 'dv-tab--grouped', isGrouped);
448
+ if (tg) {
449
+ var ids = tg.panelIds;
450
+ var isFirst = ids[0] === panelId;
451
+ var isLast = ids[ids.length - 1] === panelId;
452
+ (0, dom_1.toggleClass)(tab.element, 'dv-tab--group-first', isFirst);
453
+ (0, dom_1.toggleClass)(tab.element, 'dv-tab--group-last', isLast);
454
+ // Expose the resolved group color as a CSS custom property
455
+ // so pure-CSS themes can use it for borders, backgrounds, etc.
456
+ (0, tabGroupAccent_1.applyTabGroupAccent)(tab.element, tg.color, this_1._ctx.accessor.tabGroupColorPalette);
457
+ // Collapse / expand with animation
458
+ var isCollapsed = tab.element.classList.contains('dv-tab--group-collapsed');
459
+ if (!tg.collapsed && isCollapsed) {
460
+ // Collapsed → expanding: animate back
461
+ hasAnimation = true;
462
+ tab.element.classList.remove('dv-tab--group-collapsed');
463
+ tab.element.classList.add('dv-tab--group-expanding');
464
+ // Clean up any previous transitionend listener
465
+ // from a rapid collapse/expand cycle
466
+ (_h = this_1._pendingTransitionCleanups.get(panelId)) === null || _h === void 0 ? void 0 : _h();
467
+ var onEnd_1 = function () {
468
+ tab.element.classList.remove('dv-tab--group-expanding');
469
+ tab.element.style.removeProperty('width');
470
+ tab.element.removeEventListener('transitionend', onEnd_1);
471
+ clearTimeout(fallbackTimer_1);
472
+ _this._pendingTransitionCleanups.delete(panelId);
473
+ };
474
+ // Fallback in case transitionend never fires
475
+ // (e.g. element removed from DOM mid-transition)
476
+ var fallbackTimer_1 = setTimeout(onEnd_1, 300);
477
+ this_1._pendingTransitionCleanups.set(panelId, onEnd_1);
478
+ tab.element.addEventListener('transitionend', onEnd_1);
479
+ }
480
+ }
481
+ else {
482
+ (0, dom_1.toggleClass)(tab.element, 'dv-tab--group-first', false);
483
+ (0, dom_1.toggleClass)(tab.element, 'dv-tab--group-last', false);
484
+ tab.element.classList.remove('dv-tab--group-collapsed', 'dv-tab--group-expanding');
485
+ tab.element.style.removeProperty('width');
486
+ tab.element.style.removeProperty('--dv-tab-group-color');
487
+ }
488
+ };
489
+ var this_1 = this;
490
+ try {
491
+ for (var tabs_1 = __values(tabs), tabs_1_1 = tabs_1.next(); !tabs_1_1.done; tabs_1_1 = tabs_1.next()) {
492
+ var tabEntry = tabs_1_1.value;
493
+ _loop_1(tabEntry);
494
+ }
495
+ }
496
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
497
+ finally {
498
+ try {
499
+ if (tabs_1_1 && !tabs_1_1.done && (_c = tabs_1.return)) _c.call(tabs_1);
500
+ }
501
+ finally { if (e_10) throw e_10.error; }
502
+ }
503
+ // Track active group IDs for underline/collapse handling
504
+ var activeGroupIds = new Set();
505
+ try {
506
+ // Handle collapse animation per group
507
+ for (var tabGroups_3 = __values(tabGroups), tabGroups_3_1 = tabGroups_3.next(); !tabGroups_3_1.done; tabGroups_3_1 = tabGroups_3.next()) {
508
+ var tg = tabGroups_3_1.value;
509
+ activeGroupIds.add(tg.id);
510
+ // Collapse animation
511
+ var hasNewCollapse = tg.collapsed &&
512
+ tg.panelIds.some(function (pid) {
513
+ var te = tabMap.get(pid);
514
+ return (te &&
515
+ !te.value.element.classList.contains('dv-tab--group-collapsed'));
516
+ });
517
+ if (hasNewCollapse) {
518
+ if (this._skipNextCollapseAnimation) {
519
+ // Apply collapsed state instantly (no animation).
520
+ // Disable transitions so the CSS transition on
521
+ // dv-tab--group-collapsed doesn't fire.
522
+ var affected = [];
523
+ try {
524
+ for (var _l = (e_12 = void 0, __values(tg.panelIds)), _m = _l.next(); !_m.done; _m = _l.next()) {
525
+ var pid = _m.value;
526
+ var te = tabMap.get(pid);
527
+ if (te) {
528
+ te.value.element.style.transition = 'none';
529
+ te.value.element.classList.add('dv-tab--group-collapsed');
530
+ affected.push(te.value.element);
531
+ }
532
+ }
533
+ }
534
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
535
+ finally {
536
+ try {
537
+ if (_m && !_m.done && (_e = _l.return)) _e.call(_l);
538
+ }
539
+ finally { if (e_12) throw e_12.error; }
540
+ }
541
+ if (affected.length > 0) {
542
+ void affected[0].offsetHeight; // single reflow
543
+ try {
544
+ for (var affected_1 = (e_13 = void 0, __values(affected)), affected_1_1 = affected_1.next(); !affected_1_1.done; affected_1_1 = affected_1.next()) {
545
+ var el = affected_1_1.value;
546
+ el.style.removeProperty('transition');
547
+ }
548
+ }
549
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
550
+ finally {
551
+ try {
552
+ if (affected_1_1 && !affected_1_1.done && (_f = affected_1.return)) _f.call(affected_1);
553
+ }
554
+ finally { if (e_13) throw e_13.error; }
555
+ }
556
+ }
557
+ }
558
+ else {
559
+ hasAnimation = true;
560
+ var isVert = this._ctx.getDirection() === 'vertical';
561
+ try {
562
+ for (var _o = (e_14 = void 0, __values(tg.panelIds)), _p = _o.next(); !_p.done; _p = _o.next()) {
563
+ var pid = _p.value;
564
+ var te = tabMap.get(pid);
565
+ if (te &&
566
+ !te.value.element.classList.contains('dv-tab--group-collapsed')) {
567
+ var rect = te.value.element.getBoundingClientRect();
568
+ if (isVert) {
569
+ te.value.element.style.height = "".concat(rect.height, "px");
570
+ }
571
+ else {
572
+ te.value.element.style.width = "".concat(rect.width, "px");
573
+ }
574
+ void te.value.element.offsetHeight; // force reflow
575
+ te.value.element.classList.add('dv-tab--group-collapsed');
576
+ }
577
+ }
578
+ }
579
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
580
+ finally {
581
+ try {
582
+ if (_p && !_p.done && (_g = _o.return)) _g.call(_o);
583
+ }
584
+ finally { if (e_14) throw e_14.error; }
585
+ }
586
+ }
587
+ }
588
+ }
589
+ }
590
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
591
+ finally {
592
+ try {
593
+ if (tabGroups_3_1 && !tabGroups_3_1.done && (_d = tabGroups_3.return)) _d.call(tabGroups_3);
594
+ }
595
+ finally { if (e_11) throw e_11.error; }
596
+ }
597
+ this._skipNextCollapseAnimation = false;
598
+ // Sync indicator underlines and position them
599
+ this._ensureIndicator();
600
+ if (this._indicator) {
601
+ this._indicator.syncUnderlineElements(activeGroupIds);
602
+ if (hasAnimation) {
603
+ this._indicator.trackUnderlines();
604
+ }
605
+ else {
606
+ this._indicator.positionUnderlines();
607
+ }
608
+ }
609
+ };
610
+ return TabGroupManager;
611
+ }());
612
+ exports.TabGroupManager = TabGroupManager;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createDropdownElementHandle = void 0;
3
+ exports.createDropdownElementHandle = createDropdownElementHandle;
4
4
  var svg_1 = require("../../../svg");
5
5
  function createDropdownElementHandle() {
6
6
  var el = document.createElement('div');
@@ -17,4 +17,3 @@ function createDropdownElementHandle() {
17
17
  },
18
18
  };
19
19
  }
20
- exports.createDropdownElementHandle = createDropdownElementHandle;