dockview-core 5.1.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 +8 -1
  17. package/dist/cjs/dockview/components/tab/tab.js +94 -6
  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 +67 -0
  26. package/dist/cjs/dockview/components/titlebar/tabs.js +1464 -34
  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 +97 -2
  40. package/dist/cjs/dockview/options.js +10 -5
  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 +5188 -729
  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 +5186 -727
  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 +8 -1
  75. package/dist/esm/dockview/components/tab/tab.js +96 -6
  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 +67 -0
  83. package/dist/esm/dockview/components/titlebar/tabs.js +1212 -25
  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 +97 -2
  97. package/dist/esm/dockview/options.js +5 -0
  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 +5182 -753
  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 +5168 -753
  116. package/dist/styles/dockview.css +1968 -195
  117. package/package.json +5 -1
@@ -9,6 +9,7 @@ import { DockviewHeaderDirection } from '../../options';
9
9
  export interface TabDropIndexEvent {
10
10
  readonly event: DragEvent;
11
11
  readonly index: number;
12
+ readonly targetTabGroupId?: string | null;
12
13
  }
13
14
  export interface TabDragEvent {
14
15
  readonly nativeEvent: DragEvent;
@@ -41,6 +42,8 @@ export interface ITabsContainer extends IDisposable {
41
42
  show(): void;
42
43
  hide(): void;
43
44
  updateDragAndDropState(): void;
45
+ updateTabGroups(): void;
46
+ refreshTabGroupAccent(): void;
44
47
  }
45
48
  export declare class TabsContainer extends CompositeDisposable implements ITabsContainer {
46
49
  private readonly accessor;
@@ -58,6 +61,7 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
58
61
  private _direction;
59
62
  private dropdownPart;
60
63
  private _overflowTabs;
64
+ private _overflowTabGroups;
61
65
  private readonly _dropdownDisposable;
62
66
  private readonly _onDrop;
63
67
  readonly onDrop: Event<TabDropIndexEvent>;
@@ -89,4 +93,6 @@ export declare class TabsContainer extends CompositeDisposable implements ITabsC
89
93
  private updateClassnames;
90
94
  private toggleDropdown;
91
95
  updateDragAndDropState(): void;
96
+ updateTabGroups(): void;
97
+ refreshTabGroupAccent(): void;
92
98
  }
@@ -35,6 +35,7 @@ var events_2 = require("../../events");
35
35
  var dataTransfer_1 = require("../../../dnd/dataTransfer");
36
36
  var tabs_1 = require("./tabs");
37
37
  var tabOverflowControl_1 = require("./tabOverflowControl");
38
+ var tabGroupAccent_1 = require("../../tabGroupAccent");
38
39
  var TabsContainer = /** @class */ (function (_super) {
39
40
  __extends(TabsContainer, _super);
40
41
  function TabsContainer(accessor, group) {
@@ -45,6 +46,7 @@ var TabsContainer = /** @class */ (function (_super) {
45
46
  _this._direction = 'horizontal';
46
47
  _this.dropdownPart = null;
47
48
  _this._overflowTabs = [];
49
+ _this._overflowTabGroups = [];
48
50
  _this._dropdownDisposable = new lifecycle_1.MutableDisposable();
49
51
  _this._onDrop = new events_1.Emitter();
50
52
  _this.onDrop = _this._onDrop.event;
@@ -65,11 +67,13 @@ var TabsContainer = /** @class */ (function (_super) {
65
67
  showTabsOverflowControl: !accessor.options.disableTabsOverflowList,
66
68
  });
67
69
  _this.voidContainer = new voidContainer_1.VoidContainer(_this.accessor, _this.group);
70
+ _this.tabs.voidContainer = _this.voidContainer.element;
68
71
  _this._element.appendChild(_this.preActionsContainer);
69
72
  _this._element.appendChild(_this.tabs.element);
70
73
  _this._element.appendChild(_this.leftActionsContainer);
71
74
  _this._element.appendChild(_this.voidContainer.element);
72
75
  _this._element.appendChild(_this.rightActionsContainer);
76
+ _this.tabs.setExtendedDropZone(_this._element);
73
77
  _this.addDisposables(_this.tabs.onDrop(function (e) { return _this._onDrop.fire(e); }), _this.tabs.onWillShowOverlay(function (e) { return _this._onWillShowOverlay.fire(e); }), accessor.onDidOptionsChange(function () {
74
78
  _this.tabs.showTabsOverflowControl =
75
79
  !accessor.options.disableTabsOverflowList;
@@ -81,6 +85,10 @@ var TabsContainer = /** @class */ (function (_super) {
81
85
  group: _this.group,
82
86
  });
83
87
  }), _this.voidContainer.onDrop(function (event) {
88
+ // If an active group drag is in progress, let Tabs handle it
89
+ if (_this.tabs.handleVoidDrop()) {
90
+ return;
91
+ }
84
92
  _this._onDrop.fire({
85
93
  event: event.nativeEvent,
86
94
  index: _this.tabs.size,
@@ -93,6 +101,25 @@ var TabsContainer = /** @class */ (function (_super) {
93
101
  group: _this.group,
94
102
  getData: dataTransfer_1.getPanelData,
95
103
  }));
104
+ }), (0, events_1.addDisposableListener)(_this.leftActionsContainer, 'dragleave', function (event) {
105
+ var related = event.relatedTarget;
106
+ if (!_this.leftActionsContainer.contains(related) &&
107
+ !_this._element.contains(related)) {
108
+ // Left the header entirely
109
+ _this.tabs.clearExternalAnimState();
110
+ }
111
+ }), (0, events_1.addDisposableListener)(_this.voidContainer.element, 'dragleave', function (event) {
112
+ var related = event.relatedTarget;
113
+ if (!_this.voidContainer.element.contains(related)) {
114
+ if (_this._element.contains(related)) {
115
+ // Moved to another part of the header — keep state
116
+ _this.tabs.setExternalInsertionIndex(null);
117
+ }
118
+ else {
119
+ // Left the header entirely
120
+ _this.tabs.clearExternalAnimState();
121
+ }
122
+ }
96
123
  }), (0, events_1.addDisposableListener)(_this.voidContainer.element, 'pointerdown', function (event) {
97
124
  if (event.defaultPrevented) {
98
125
  return;
@@ -100,7 +127,8 @@ var TabsContainer = /** @class */ (function (_super) {
100
127
  var isFloatingGroupsEnabled = !_this.accessor.options.disableFloatingGroups;
101
128
  if (isFloatingGroupsEnabled &&
102
129
  event.shiftKey &&
103
- _this.group.api.location.type !== 'floating') {
130
+ _this.group.api.location.type !== 'floating' &&
131
+ _this.group.api.location.type !== 'edge') {
104
132
  event.preventDefault();
105
133
  var _a = _this.element.getBoundingClientRect(), top_1 = _a.top, left = _a.left;
106
134
  var _b = _this.accessor.element.getBoundingClientRect(), rootTop = _b.top, rootLeft = _b.left;
@@ -249,19 +277,22 @@ var TabsContainer = /** @class */ (function (_super) {
249
277
  TabsContainer.prototype.toggleDropdown = function (options) {
250
278
  var _this = this;
251
279
  var tabs = options.reset ? [] : options.tabs;
280
+ var tabGroups = options.reset ? [] : options.tabGroups;
252
281
  this._overflowTabs = tabs;
253
- if (this._overflowTabs.length > 0 && this.dropdownPart) {
254
- this.dropdownPart.update({ tabs: tabs.length });
282
+ this._overflowTabGroups = tabGroups;
283
+ var totalCount = this._overflowTabs.length;
284
+ if (totalCount > 0 && this.dropdownPart) {
285
+ this.dropdownPart.update({ tabs: totalCount });
255
286
  return;
256
287
  }
257
- if (this._overflowTabs.length === 0) {
288
+ if (totalCount === 0) {
258
289
  this._dropdownDisposable.dispose();
259
290
  return;
260
291
  }
261
292
  var root = document.createElement('div');
262
293
  root.className = 'dv-tabs-overflow-dropdown-root';
263
294
  var part = (0, tabOverflowControl_1.createDropdownElementHandle)();
264
- part.update({ tabs: tabs.length });
295
+ part.update({ tabs: totalCount });
265
296
  this.dropdownPart = part;
266
297
  root.appendChild(part.element);
267
298
  this.rightActionsContainer.prepend(root);
@@ -273,11 +304,82 @@ var TabsContainer = /** @class */ (function (_super) {
273
304
  }), (0, events_1.addDisposableListener)(root, 'pointerdown', function (event) {
274
305
  event.preventDefault();
275
306
  }, { capture: true }), (0, events_1.addDisposableListener)(root, 'click', function (event) {
276
- var e_1, _a;
307
+ var e_1, _a, e_2, _b, e_3, _c;
277
308
  var el = document.createElement('div');
278
309
  el.style.overflow = 'auto';
279
310
  el.className = 'dv-tabs-overflow-container';
311
+ // Build lookup: panelId → tabGroup for overflow groups
312
+ var overflowGroupSet = new Set(_this._overflowTabGroups);
313
+ var allTabGroups = _this.group.model.getTabGroups();
314
+ var panelToGroup = new Map();
315
+ try {
316
+ for (var allTabGroups_1 = __values(allTabGroups), allTabGroups_1_1 = allTabGroups_1.next(); !allTabGroups_1_1.done; allTabGroups_1_1 = allTabGroups_1.next()) {
317
+ var tg = allTabGroups_1_1.value;
318
+ if (overflowGroupSet.has(tg.id)) {
319
+ try {
320
+ for (var _d = (e_2 = void 0, __values(tg.panelIds)), _e = _d.next(); !_e.done; _e = _d.next()) {
321
+ var pid = _e.value;
322
+ panelToGroup.set(pid, tg);
323
+ }
324
+ }
325
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
326
+ finally {
327
+ try {
328
+ if (_e && !_e.done && (_b = _d.return)) _b.call(_d);
329
+ }
330
+ finally { if (e_2) throw e_2.error; }
331
+ }
332
+ }
333
+ }
334
+ }
335
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
336
+ finally {
337
+ try {
338
+ if (allTabGroups_1_1 && !allTabGroups_1_1.done && (_a = allTabGroups_1.return)) _a.call(allTabGroups_1);
339
+ }
340
+ finally { if (e_1) throw e_1.error; }
341
+ }
342
+ // Track which groups have already been rendered
343
+ var renderedGroups = new Set();
280
344
  var _loop_1 = function (tab) {
345
+ var tg = panelToGroup.get(tab.panel.id);
346
+ // If this tab belongs to an overflow group, render the
347
+ // group header before its first member tab.
348
+ if (tg && !renderedGroups.has(tg.id)) {
349
+ renderedGroups.add(tg.id);
350
+ var groupHeader = document.createElement('div');
351
+ groupHeader.className = 'dv-tabs-overflow-group-header';
352
+ var colorDot = document.createElement('span');
353
+ colorDot.className = 'dv-tabs-overflow-group-color';
354
+ (0, tabGroupAccent_1.applyTabGroupAccent)(colorDot, tg.color, _this.accessor.tabGroupColorPalette);
355
+ groupHeader.appendChild(colorDot);
356
+ var labelSpan = document.createElement('span');
357
+ labelSpan.className = 'dv-tabs-overflow-group-label';
358
+ labelSpan.textContent = tg.label || tg.id;
359
+ groupHeader.appendChild(labelSpan);
360
+ if (tg.collapsed) {
361
+ var badge = document.createElement('span');
362
+ badge.className =
363
+ 'dv-tabs-overflow-group-collapsed-badge';
364
+ badge.textContent = "".concat(tg.panelIds.length);
365
+ groupHeader.appendChild(badge);
366
+ }
367
+ groupHeader.addEventListener('click', function () {
368
+ _this.accessor
369
+ .getPopupServiceForGroup(_this.group)
370
+ .close();
371
+ if (tg.collapsed) {
372
+ tg.expand();
373
+ }
374
+ // Activate the first panel in the group
375
+ var firstPanelId = tg.panelIds[0];
376
+ if (firstPanelId) {
377
+ var panel = _this.group.panels.find(function (p) { return p.id === firstPanelId; });
378
+ panel === null || panel === void 0 ? void 0 : panel.api.setActive();
379
+ }
380
+ });
381
+ el.appendChild(groupHeader);
382
+ }
281
383
  var panelObject = _this.group.panels.find(function (panel) { return panel === tab.panel; });
282
384
  var tabComponent = panelObject.view.createTabRenderer('headerOverflow');
283
385
  var child = tabComponent.element;
@@ -285,11 +387,19 @@ var TabsContainer = /** @class */ (function (_super) {
285
387
  (0, dom_1.toggleClass)(wrapper, 'dv-tab', true);
286
388
  (0, dom_1.toggleClass)(wrapper, 'dv-active-tab', panelObject.api.isActive);
287
389
  (0, dom_1.toggleClass)(wrapper, 'dv-inactive-tab', !panelObject.api.isActive);
390
+ if (tg) {
391
+ (0, dom_1.toggleClass)(wrapper, 'dv-tab--grouped', true);
392
+ }
288
393
  wrapper.addEventListener('click', function (event) {
289
- _this.accessor.popupService.close();
394
+ _this.accessor
395
+ .getPopupServiceForGroup(_this.group)
396
+ .close();
290
397
  if (event.defaultPrevented) {
291
398
  return;
292
399
  }
400
+ if (tg === null || tg === void 0 ? void 0 : tg.collapsed) {
401
+ tg.expand();
402
+ }
293
403
  tab.element.scrollIntoView();
294
404
  tab.panel.api.setActive();
295
405
  });
@@ -297,22 +407,24 @@ var TabsContainer = /** @class */ (function (_super) {
297
407
  el.appendChild(wrapper);
298
408
  };
299
409
  try {
300
- for (var _b = __values(_this.tabs.tabs.filter(function (tab) {
410
+ for (var _f = __values(_this.tabs.tabs.filter(function (tab) {
301
411
  return _this._overflowTabs.includes(tab.panel.id);
302
- })), _c = _b.next(); !_c.done; _c = _b.next()) {
303
- var tab = _c.value;
412
+ })), _g = _f.next(); !_g.done; _g = _f.next()) {
413
+ var tab = _g.value;
304
414
  _loop_1(tab);
305
415
  }
306
416
  }
307
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
417
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
308
418
  finally {
309
419
  try {
310
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
420
+ if (_g && !_g.done && (_c = _f.return)) _c.call(_f);
311
421
  }
312
- finally { if (e_1) throw e_1.error; }
422
+ finally { if (e_3) throw e_3.error; }
313
423
  }
314
424
  var relativeParent = (0, dom_1.findRelativeZIndexParent)(root);
315
- _this.accessor.popupService.openPopover(el, {
425
+ _this.accessor
426
+ .getPopupServiceForGroup(_this.group)
427
+ .openPopover(el, {
316
428
  x: event.clientX,
317
429
  y: event.clientY,
318
430
  zIndex: (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)
@@ -325,6 +437,12 @@ var TabsContainer = /** @class */ (function (_super) {
325
437
  this.tabs.updateDragAndDropState();
326
438
  this.voidContainer.updateDragAndDropState();
327
439
  };
440
+ TabsContainer.prototype.updateTabGroups = function () {
441
+ this.tabs.updateTabGroups();
442
+ };
443
+ TabsContainer.prototype.refreshTabGroupAccent = function () {
444
+ this.tabs.refreshTabGroupAccent();
445
+ };
328
446
  return TabsContainer;
329
447
  }(lifecycle_1.CompositeDisposable));
330
448
  exports.TabsContainer = TabsContainer;
@@ -0,0 +1,10 @@
1
+ import { DockviewComponent } from './dockviewComponent';
2
+ import { DockviewGroupPanel } from './dockviewGroupPanel';
3
+ import { IDockviewPanel } from './dockviewPanel';
4
+ import { ITabGroup } from './tabGroup';
5
+ export declare class ContextMenuController {
6
+ private readonly accessor;
7
+ constructor(accessor: DockviewComponent);
8
+ show(panel: IDockviewPanel, group: DockviewGroupPanel, event: MouseEvent): void;
9
+ showForChip(tabGroup: ITabGroup, group: DockviewGroupPanel, event: MouseEvent): void;
10
+ }
@@ -0,0 +1,298 @@
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.ContextMenuController = void 0;
40
+ var dom_1 = require("../dom");
41
+ function popoverZIndexFor(target) {
42
+ if (!(target instanceof HTMLElement)) {
43
+ return undefined;
44
+ }
45
+ // Floating overlays live in the shell as siblings of the popover anchor
46
+ // and the AriaLevelTracker sets their inline z-index. Without this, a
47
+ // popover opened from inside a floating group would render behind it
48
+ // because they share the shell stacking context.
49
+ var relativeParent = (0, dom_1.findRelativeZIndexParent)(target);
50
+ return (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)
51
+ ? "calc(".concat(relativeParent.style.zIndex, " * 2)")
52
+ : undefined;
53
+ }
54
+ var _nextId = 0;
55
+ var nextContextMenuItemId = function () { return "dv-ctx-menu-item-".concat(_nextId++); };
56
+ function isItemConfig(item) {
57
+ return typeof item === 'object';
58
+ }
59
+ function buildItem(label, close, action, disabled) {
60
+ var el = document.createElement('div');
61
+ el.className = 'dv-context-menu-item';
62
+ el.setAttribute('role', 'menuitem');
63
+ if (disabled) {
64
+ el.classList.add('dv-context-menu-item--disabled');
65
+ el.setAttribute('aria-disabled', 'true');
66
+ }
67
+ el.textContent = label;
68
+ if (!disabled) {
69
+ el.addEventListener('click', function () {
70
+ action();
71
+ close();
72
+ });
73
+ }
74
+ return el;
75
+ }
76
+ function buildSeparator() {
77
+ var el = document.createElement('div');
78
+ el.className = 'dv-context-menu-separator';
79
+ el.setAttribute('role', 'separator');
80
+ return el;
81
+ }
82
+ function buildRenameInput(tabGroup) {
83
+ var wrapper = document.createElement('div');
84
+ wrapper.className = 'dv-context-menu-rename';
85
+ var input = document.createElement('input');
86
+ input.className = 'dv-context-menu-rename-input';
87
+ input.type = 'text';
88
+ input.placeholder = 'Name This Group';
89
+ input.value = tabGroup.label;
90
+ input.addEventListener('input', function () {
91
+ tabGroup.setLabel(input.value);
92
+ });
93
+ input.addEventListener('keydown', function (e) {
94
+ if (e.key !== 'Escape' && e.key !== 'Enter') {
95
+ e.stopPropagation();
96
+ }
97
+ });
98
+ input.addEventListener('click', function (e) {
99
+ e.stopPropagation();
100
+ });
101
+ wrapper.appendChild(input);
102
+ requestAnimationFrame(function () {
103
+ input.focus();
104
+ input.select();
105
+ });
106
+ return wrapper;
107
+ }
108
+ function buildColorPicker(tabGroup, palette) {
109
+ var e_1, _a;
110
+ var wrapper = document.createElement('div');
111
+ wrapper.className = 'dv-context-menu-color-picker';
112
+ if (!palette.enabled) {
113
+ // Opt-out: render no swatches. Returning a wrapper rather than null
114
+ // keeps the call site simple; the wrapper is empty and visually inert.
115
+ return wrapper;
116
+ }
117
+ var _loop_1 = function (entry) {
118
+ var swatch = document.createElement('div');
119
+ swatch.className = 'dv-context-menu-color-swatch';
120
+ // Use a CSS custom property rather than setting `backgroundColor`
121
+ // directly: the IDL setter validates the value against a color
122
+ // grammar and rejects `var(...)` references in some environments
123
+ // (notably jsdom; some browsers have historically had similar
124
+ // quirks). The matching SCSS rule reads the var at use time.
125
+ swatch.style.setProperty('--dv-tab-group-color', entry.value);
126
+ if (entry.label) {
127
+ swatch.title = entry.label;
128
+ }
129
+ if (tabGroup.color === entry.id) {
130
+ swatch.classList.add('dv-context-menu-color-swatch--selected');
131
+ }
132
+ swatch.addEventListener('click', function () {
133
+ tabGroup.setColor(entry.id);
134
+ });
135
+ wrapper.appendChild(swatch);
136
+ };
137
+ try {
138
+ for (var _b = __values(palette.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
139
+ var entry = _c.value;
140
+ _loop_1(entry);
141
+ }
142
+ }
143
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
144
+ finally {
145
+ try {
146
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
147
+ }
148
+ finally { if (e_1) throw e_1.error; }
149
+ }
150
+ return wrapper;
151
+ }
152
+ var ContextMenuController = /** @class */ (function () {
153
+ function ContextMenuController(accessor) {
154
+ this.accessor = accessor;
155
+ }
156
+ ContextMenuController.prototype.show = function (panel, group, event) {
157
+ var e_2, _a;
158
+ var _b, _c;
159
+ if (!this.accessor.options.getTabContextMenuItems) {
160
+ return;
161
+ }
162
+ var items = this.accessor.options.getTabContextMenuItems({
163
+ panel: panel,
164
+ group: group,
165
+ api: this.accessor.api,
166
+ event: event,
167
+ });
168
+ if (items.length === 0) {
169
+ return;
170
+ }
171
+ event.preventDefault();
172
+ var popupService = this.accessor.getPopupServiceForGroup(group);
173
+ var close = function () { return popupService.close(); };
174
+ var menuEl = document.createElement('div');
175
+ menuEl.className = 'dv-context-menu';
176
+ menuEl.setAttribute('role', 'menu');
177
+ var _loop_2 = function (item) {
178
+ if (item === 'separator') {
179
+ menuEl.appendChild(buildSeparator());
180
+ }
181
+ else if (item === 'close') {
182
+ menuEl.appendChild(buildItem('Close', close, function () { return panel.api.close(); }));
183
+ }
184
+ else if (item === 'closeOthers') {
185
+ menuEl.appendChild(buildItem('Close Others', close, function () {
186
+ group.panels
187
+ .filter(function (p) { return p !== panel; })
188
+ .forEach(function (p) { return p.api.close(); });
189
+ }));
190
+ }
191
+ else if (item === 'closeAll') {
192
+ menuEl.appendChild(buildItem('Close All', close, function () {
193
+ __spreadArray([], __read(group.panels), false).forEach(function (p) { return p.api.close(); });
194
+ }));
195
+ }
196
+ else if (isItemConfig(item) && item.element) {
197
+ menuEl.appendChild(item.element);
198
+ }
199
+ else if (isItemConfig(item) && item.component) {
200
+ var renderer = (_c = (_b = this_1.accessor.options).createContextMenuItemComponent) === null || _c === void 0 ? void 0 : _c.call(_b, {
201
+ id: nextContextMenuItemId(),
202
+ component: item.component,
203
+ });
204
+ if (renderer) {
205
+ renderer.init({
206
+ panel: panel,
207
+ group: group,
208
+ api: this_1.accessor.api,
209
+ close: close,
210
+ componentProps: item.componentProps,
211
+ });
212
+ menuEl.appendChild(renderer.element);
213
+ }
214
+ }
215
+ else if (isItemConfig(item) && item.label) {
216
+ menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
217
+ }
218
+ };
219
+ var this_1 = this;
220
+ try {
221
+ for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
222
+ var item = items_1_1.value;
223
+ _loop_2(item);
224
+ }
225
+ }
226
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
227
+ finally {
228
+ try {
229
+ if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
230
+ }
231
+ finally { if (e_2) throw e_2.error; }
232
+ }
233
+ popupService.openPopover(menuEl, {
234
+ x: event.clientX,
235
+ y: event.clientY,
236
+ zIndex: popoverZIndexFor(event.target),
237
+ });
238
+ };
239
+ ContextMenuController.prototype.showForChip = function (tabGroup, group, event) {
240
+ var e_3, _a;
241
+ if (!this.accessor.options.getTabGroupChipContextMenuItems) {
242
+ return;
243
+ }
244
+ var items = this.accessor.options.getTabGroupChipContextMenuItems({
245
+ tabGroup: tabGroup,
246
+ group: group,
247
+ api: this.accessor.api,
248
+ event: event,
249
+ });
250
+ if (items.length === 0) {
251
+ return;
252
+ }
253
+ event.preventDefault();
254
+ var popupService = this.accessor.getPopupServiceForGroup(group);
255
+ var close = function () { return popupService.close(); };
256
+ var menuEl = document.createElement('div');
257
+ menuEl.className = 'dv-context-menu';
258
+ menuEl.setAttribute('role', 'menu');
259
+ var _loop_3 = function (item) {
260
+ if (item === 'separator') {
261
+ menuEl.appendChild(buildSeparator());
262
+ }
263
+ else if (item === 'rename') {
264
+ menuEl.appendChild(buildRenameInput(tabGroup));
265
+ }
266
+ else if (item === 'colorPicker') {
267
+ menuEl.appendChild(buildColorPicker(tabGroup, this_2.accessor.tabGroupColorPalette));
268
+ }
269
+ else if (isItemConfig(item) && item.element) {
270
+ menuEl.appendChild(item.element);
271
+ }
272
+ else if (isItemConfig(item) && item.label) {
273
+ menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
274
+ }
275
+ };
276
+ var this_2 = this;
277
+ try {
278
+ for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
279
+ var item = items_2_1.value;
280
+ _loop_3(item);
281
+ }
282
+ }
283
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
284
+ finally {
285
+ try {
286
+ if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
287
+ }
288
+ finally { if (e_3) throw e_3.error; }
289
+ }
290
+ popupService.openPopover(menuEl, {
291
+ x: event.clientX,
292
+ y: event.clientY,
293
+ zIndex: popoverZIndexFor(event.target),
294
+ });
295
+ };
296
+ return ContextMenuController;
297
+ }());
298
+ exports.ContextMenuController = ContextMenuController;