dockview-core 6.6.1 → 7.0.2

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/README.md +8 -1
  2. package/dist/cjs/api/component.api.d.ts +42 -21
  3. package/dist/cjs/api/component.api.js +111 -20
  4. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +23 -8
  5. package/dist/cjs/api/dockviewGroupPanelApi.js +23 -0
  6. package/dist/cjs/api/dockviewPanelApi.d.ts +4 -3
  7. package/dist/cjs/api/dockviewPanelApi.js +8 -0
  8. package/dist/cjs/dnd/droptarget.d.ts +8 -0
  9. package/dist/cjs/dnd/droptarget.js +28 -0
  10. package/dist/cjs/dockview/accessibilityMessages.d.ts +32 -0
  11. package/dist/cjs/dockview/accessibilityMessages.js +51 -0
  12. package/dist/cjs/dockview/allModules.d.ts +8 -0
  13. package/dist/cjs/dockview/allModules.js +25 -0
  14. package/dist/cjs/dockview/components/panel/content.d.ts +2 -0
  15. package/dist/cjs/dockview/components/panel/content.js +35 -4
  16. package/dist/cjs/dockview/components/tab/tab.js +33 -5
  17. package/dist/cjs/dockview/components/titlebar/floatingTitleBar.d.ts +35 -0
  18. package/dist/cjs/dockview/components/titlebar/floatingTitleBar.js +95 -0
  19. package/dist/cjs/dockview/components/titlebar/groupDragSource.d.ts +52 -0
  20. package/dist/cjs/dockview/components/titlebar/groupDragSource.js +218 -0
  21. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.d.ts +2 -1
  22. package/dist/cjs/dockview/components/titlebar/tabGroupIndicator.js +31 -24
  23. package/dist/cjs/dockview/components/titlebar/tabGroups.js +1 -0
  24. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +12 -0
  25. package/dist/cjs/dockview/components/titlebar/tabs.js +105 -2
  26. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +4 -0
  27. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +13 -3
  28. package/dist/cjs/dockview/components/titlebar/voidContainer.d.ts +1 -4
  29. package/dist/cjs/dockview/components/titlebar/voidContainer.js +31 -155
  30. package/dist/cjs/dockview/dockviewComponent.d.ts +299 -44
  31. package/dist/cjs/dockview/dockviewComponent.js +1787 -1041
  32. package/dist/cjs/dockview/dockviewFloatingGroupPanel.d.ts +33 -2
  33. package/dist/cjs/dockview/dockviewFloatingGroupPanel.js +39 -3
  34. package/dist/cjs/dockview/dockviewGroupPanel.d.ts +0 -1
  35. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +36 -14
  36. package/dist/cjs/dockview/dockviewGroupPanelModel.js +133 -101
  37. package/dist/cjs/dockview/dockviewPanel.d.ts +2 -2
  38. package/dist/cjs/dockview/edgeGroupService.d.ts +38 -0
  39. package/dist/cjs/dockview/edgeGroupService.js +128 -0
  40. package/dist/cjs/dockview/floatingGroupService.d.ts +37 -0
  41. package/dist/cjs/dockview/floatingGroupService.js +231 -0
  42. package/dist/cjs/dockview/headerActionsService.d.ts +32 -0
  43. package/dist/cjs/dockview/headerActionsService.js +149 -0
  44. package/dist/cjs/dockview/liveRegionService.d.ts +53 -0
  45. package/dist/cjs/dockview/liveRegionService.js +185 -0
  46. package/dist/cjs/dockview/moduleContracts.d.ts +119 -0
  47. package/dist/cjs/dockview/moduleContracts.js +2 -0
  48. package/dist/cjs/dockview/modules.d.ts +110 -0
  49. package/dist/cjs/dockview/modules.js +304 -0
  50. package/dist/cjs/dockview/options.d.ts +159 -6
  51. package/dist/cjs/dockview/options.js +8 -1
  52. package/dist/cjs/dockview/popoutWindowService.d.ts +95 -0
  53. package/dist/cjs/dockview/popoutWindowService.js +261 -0
  54. package/dist/cjs/dockview/rootDropTargetService.d.ts +35 -0
  55. package/dist/cjs/dockview/rootDropTargetService.js +87 -0
  56. package/dist/cjs/dockview/watermarkService.d.ts +30 -0
  57. package/dist/cjs/dockview/watermarkService.js +61 -0
  58. package/dist/cjs/gridview/baseComponentGridview.d.ts +1 -1
  59. package/dist/cjs/gridview/baseComponentGridview.js +3 -2
  60. package/dist/cjs/gridview/gridviewComponent.d.ts +3 -3
  61. package/dist/cjs/gridview/gridviewPanel.d.ts +1 -1
  62. package/dist/cjs/index.d.ts +11 -4
  63. package/dist/cjs/index.js +14 -1
  64. package/dist/cjs/overlay/overlay.d.ts +43 -1
  65. package/dist/cjs/overlay/overlay.js +57 -8
  66. package/dist/cjs/paneview/draggablePaneviewPanel.d.ts +2 -2
  67. package/dist/cjs/paneview/draggablePaneviewPanel.js +4 -4
  68. package/dist/cjs/paneview/paneviewComponent.d.ts +3 -3
  69. package/dist/cjs/paneview/paneviewComponent.js +5 -5
  70. package/dist/dockview-core.js +3201 -1280
  71. package/dist/dockview-core.min.js +2 -2
  72. package/dist/dockview-core.min.js.map +1 -1
  73. package/dist/dockview-core.min.noStyle.js +2 -2
  74. package/dist/dockview-core.min.noStyle.js.map +1 -1
  75. package/dist/dockview-core.noStyle.js +3200 -1279
  76. package/dist/esm/api/component.api.d.ts +42 -21
  77. package/dist/esm/api/component.api.js +63 -18
  78. package/dist/esm/api/dockviewGroupPanelApi.d.ts +23 -8
  79. package/dist/esm/api/dockviewGroupPanelApi.js +19 -0
  80. package/dist/esm/api/dockviewPanelApi.d.ts +4 -3
  81. package/dist/esm/api/dockviewPanelApi.js +7 -0
  82. package/dist/esm/dnd/droptarget.d.ts +8 -0
  83. package/dist/esm/dnd/droptarget.js +28 -0
  84. package/dist/esm/dockview/accessibilityMessages.d.ts +32 -0
  85. package/dist/esm/dockview/accessibilityMessages.js +30 -0
  86. package/dist/esm/dockview/allModules.d.ts +8 -0
  87. package/dist/esm/dockview/allModules.js +22 -0
  88. package/dist/esm/dockview/components/panel/content.d.ts +2 -0
  89. package/dist/esm/dockview/components/panel/content.js +36 -5
  90. package/dist/esm/dockview/components/tab/tab.js +33 -5
  91. package/dist/esm/dockview/components/titlebar/floatingTitleBar.d.ts +35 -0
  92. package/dist/esm/dockview/components/titlebar/floatingTitleBar.js +65 -0
  93. package/dist/esm/dockview/components/titlebar/groupDragSource.d.ts +52 -0
  94. package/dist/esm/dockview/components/titlebar/groupDragSource.js +178 -0
  95. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.d.ts +2 -1
  96. package/dist/esm/dockview/components/titlebar/tabGroupIndicator.js +31 -24
  97. package/dist/esm/dockview/components/titlebar/tabGroups.js +1 -0
  98. package/dist/esm/dockview/components/titlebar/tabs.d.ts +12 -0
  99. package/dist/esm/dockview/components/titlebar/tabs.js +102 -2
  100. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +4 -0
  101. package/dist/esm/dockview/components/titlebar/tabsContainer.js +8 -2
  102. package/dist/esm/dockview/components/titlebar/voidContainer.d.ts +1 -4
  103. package/dist/esm/dockview/components/titlebar/voidContainer.js +33 -145
  104. package/dist/esm/dockview/dockviewComponent.d.ts +299 -44
  105. package/dist/esm/dockview/dockviewComponent.js +1420 -743
  106. package/dist/esm/dockview/dockviewFloatingGroupPanel.d.ts +33 -2
  107. package/dist/esm/dockview/dockviewFloatingGroupPanel.js +35 -3
  108. package/dist/esm/dockview/dockviewGroupPanel.d.ts +0 -1
  109. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +36 -14
  110. package/dist/esm/dockview/dockviewGroupPanelModel.js +109 -93
  111. package/dist/esm/dockview/dockviewPanel.d.ts +2 -2
  112. package/dist/esm/dockview/edgeGroupService.d.ts +38 -0
  113. package/dist/esm/dockview/edgeGroupService.js +63 -0
  114. package/dist/esm/dockview/floatingGroupService.d.ts +37 -0
  115. package/dist/esm/dockview/floatingGroupService.js +150 -0
  116. package/dist/esm/dockview/headerActionsService.d.ts +32 -0
  117. package/dist/esm/dockview/headerActionsService.js +86 -0
  118. package/dist/esm/dockview/liveRegionService.d.ts +53 -0
  119. package/dist/esm/dockview/liveRegionService.js +159 -0
  120. package/dist/esm/dockview/moduleContracts.d.ts +119 -0
  121. package/dist/esm/dockview/moduleContracts.js +1 -0
  122. package/dist/esm/dockview/modules.d.ts +110 -0
  123. package/dist/esm/dockview/modules.js +170 -0
  124. package/dist/esm/dockview/options.d.ts +159 -6
  125. package/dist/esm/dockview/options.js +8 -1
  126. package/dist/esm/dockview/popoutWindowService.d.ts +95 -0
  127. package/dist/esm/dockview/popoutWindowService.js +175 -0
  128. package/dist/esm/dockview/rootDropTargetService.d.ts +35 -0
  129. package/dist/esm/dockview/rootDropTargetService.js +82 -0
  130. package/dist/esm/dockview/watermarkService.d.ts +30 -0
  131. package/dist/esm/dockview/watermarkService.js +56 -0
  132. package/dist/esm/gridview/baseComponentGridview.d.ts +1 -1
  133. package/dist/esm/gridview/baseComponentGridview.js +2 -2
  134. package/dist/esm/gridview/gridviewComponent.d.ts +3 -3
  135. package/dist/esm/gridview/gridviewPanel.d.ts +1 -1
  136. package/dist/esm/index.d.ts +11 -4
  137. package/dist/esm/index.js +4 -0
  138. package/dist/esm/overlay/overlay.d.ts +43 -1
  139. package/dist/esm/overlay/overlay.js +53 -8
  140. package/dist/esm/paneview/draggablePaneviewPanel.d.ts +2 -2
  141. package/dist/esm/paneview/draggablePaneviewPanel.js +4 -4
  142. package/dist/esm/paneview/paneviewComponent.d.ts +3 -3
  143. package/dist/esm/paneview/paneviewComponent.js +5 -5
  144. package/dist/package/main.cjs.js +3236 -1315
  145. package/dist/package/main.cjs.min.js +2 -2
  146. package/dist/package/main.esm.min.mjs +2 -2
  147. package/dist/package/main.esm.mjs +3191 -1281
  148. package/dist/styles/dockview.css +275 -13
  149. package/package.json +10 -1
  150. package/dist/cjs/dockview/contextMenu.d.ts +0 -10
  151. package/dist/cjs/dockview/contextMenu.js +0 -313
  152. package/dist/esm/dockview/contextMenu.d.ts +0 -10
  153. package/dist/esm/dockview/contextMenu.js +0 -228
@@ -1,10 +0,0 @@
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
- }
@@ -1,313 +0,0 @@
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 isCoarsePrimaryInput() {
83
- if (typeof window === 'undefined' || !window.matchMedia) {
84
- return false;
85
- }
86
- var coarse = window.matchMedia('(pointer: coarse)').matches;
87
- var fine = window.matchMedia('(pointer: fine)').matches;
88
- return coarse && !fine;
89
- }
90
- function buildRenameInput(tabGroup) {
91
- var wrapper = document.createElement('div');
92
- wrapper.className = 'dv-context-menu-rename';
93
- var input = document.createElement('input');
94
- input.className = 'dv-context-menu-rename-input';
95
- input.type = 'text';
96
- input.placeholder = 'Name This Group';
97
- input.value = tabGroup.label;
98
- input.addEventListener('input', function () {
99
- tabGroup.setLabel(input.value);
100
- });
101
- input.addEventListener('keydown', function (e) {
102
- if (e.key !== 'Escape' && e.key !== 'Enter') {
103
- e.stopPropagation();
104
- }
105
- });
106
- input.addEventListener('click', function (e) {
107
- e.stopPropagation();
108
- });
109
- wrapper.appendChild(input);
110
- // Skip auto-focus on touch-primary devices: focusing the input pops the
111
- // on-screen keyboard, which fires `window resize`, which `PopupService`
112
- // listens to and uses to dismiss the popover — so the menu opens, the
113
- // keyboard appears, and the menu immediately closes before the user can
114
- // type. The user can still tap the input to focus it intentionally.
115
- if (!isCoarsePrimaryInput()) {
116
- requestAnimationFrame(function () {
117
- input.focus();
118
- input.select();
119
- });
120
- }
121
- return wrapper;
122
- }
123
- function buildColorPicker(tabGroup, palette) {
124
- var e_1, _a;
125
- var wrapper = document.createElement('div');
126
- wrapper.className = 'dv-context-menu-color-picker';
127
- if (!palette.enabled) {
128
- // Opt-out: render no swatches. Returning a wrapper rather than null
129
- // keeps the call site simple; the wrapper is empty and visually inert.
130
- return wrapper;
131
- }
132
- var _loop_1 = function (entry) {
133
- var swatch = document.createElement('div');
134
- swatch.className = 'dv-context-menu-color-swatch';
135
- // Use a CSS custom property rather than setting `backgroundColor`
136
- // directly: the IDL setter validates the value against a color
137
- // grammar and rejects `var(...)` references in some environments
138
- // (notably jsdom; some browsers have historically had similar
139
- // quirks). The matching SCSS rule reads the var at use time.
140
- swatch.style.setProperty('--dv-tab-group-color', entry.value);
141
- if (entry.label) {
142
- swatch.title = entry.label;
143
- }
144
- if (tabGroup.color === entry.id) {
145
- swatch.classList.add('dv-context-menu-color-swatch--selected');
146
- }
147
- swatch.addEventListener('click', function () {
148
- tabGroup.setColor(entry.id);
149
- });
150
- wrapper.appendChild(swatch);
151
- };
152
- try {
153
- for (var _b = __values(palette.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
154
- var entry = _c.value;
155
- _loop_1(entry);
156
- }
157
- }
158
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
159
- finally {
160
- try {
161
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
162
- }
163
- finally { if (e_1) throw e_1.error; }
164
- }
165
- return wrapper;
166
- }
167
- var ContextMenuController = /** @class */ (function () {
168
- function ContextMenuController(accessor) {
169
- this.accessor = accessor;
170
- }
171
- ContextMenuController.prototype.show = function (panel, group, event) {
172
- var e_2, _a;
173
- var _b, _c;
174
- if (!this.accessor.options.getTabContextMenuItems) {
175
- return;
176
- }
177
- var items = this.accessor.options.getTabContextMenuItems({
178
- panel: panel,
179
- group: group,
180
- api: this.accessor.api,
181
- event: event,
182
- });
183
- if (items.length === 0) {
184
- return;
185
- }
186
- event.preventDefault();
187
- var popupService = this.accessor.getPopupServiceForGroup(group);
188
- var close = function () { return popupService.close(); };
189
- var menuEl = document.createElement('div');
190
- menuEl.className = 'dv-context-menu';
191
- menuEl.setAttribute('role', 'menu');
192
- var _loop_2 = function (item) {
193
- if (item === 'separator') {
194
- menuEl.appendChild(buildSeparator());
195
- }
196
- else if (item === 'close') {
197
- menuEl.appendChild(buildItem('Close', close, function () { return panel.api.close(); }));
198
- }
199
- else if (item === 'closeOthers') {
200
- menuEl.appendChild(buildItem('Close Others', close, function () {
201
- group.panels
202
- .filter(function (p) { return p !== panel; })
203
- .forEach(function (p) { return p.api.close(); });
204
- }));
205
- }
206
- else if (item === 'closeAll') {
207
- menuEl.appendChild(buildItem('Close All', close, function () {
208
- __spreadArray([], __read(group.panels), false).forEach(function (p) { return p.api.close(); });
209
- }));
210
- }
211
- else if (isItemConfig(item) && item.element) {
212
- menuEl.appendChild(item.element);
213
- }
214
- else if (isItemConfig(item) && item.component) {
215
- var renderer = (_c = (_b = this_1.accessor.options).createContextMenuItemComponent) === null || _c === void 0 ? void 0 : _c.call(_b, {
216
- id: nextContextMenuItemId(),
217
- component: item.component,
218
- });
219
- if (renderer) {
220
- renderer.init({
221
- panel: panel,
222
- group: group,
223
- api: this_1.accessor.api,
224
- close: close,
225
- componentProps: item.componentProps,
226
- });
227
- menuEl.appendChild(renderer.element);
228
- }
229
- }
230
- else if (isItemConfig(item) && item.label) {
231
- menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
232
- }
233
- };
234
- var this_1 = this;
235
- try {
236
- for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
237
- var item = items_1_1.value;
238
- _loop_2(item);
239
- }
240
- }
241
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
242
- finally {
243
- try {
244
- if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
245
- }
246
- finally { if (e_2) throw e_2.error; }
247
- }
248
- popupService.openPopover(menuEl, {
249
- x: event.clientX,
250
- y: event.clientY,
251
- zIndex: popoverZIndexFor(event.target),
252
- });
253
- };
254
- ContextMenuController.prototype.showForChip = function (tabGroup, group, event) {
255
- var e_3, _a;
256
- if (!this.accessor.options.getTabGroupChipContextMenuItems) {
257
- return;
258
- }
259
- var items = this.accessor.options.getTabGroupChipContextMenuItems({
260
- tabGroup: tabGroup,
261
- group: group,
262
- api: this.accessor.api,
263
- event: event,
264
- });
265
- if (items.length === 0) {
266
- return;
267
- }
268
- event.preventDefault();
269
- var popupService = this.accessor.getPopupServiceForGroup(group);
270
- var close = function () { return popupService.close(); };
271
- var menuEl = document.createElement('div');
272
- menuEl.className = 'dv-context-menu';
273
- menuEl.setAttribute('role', 'menu');
274
- var _loop_3 = function (item) {
275
- if (item === 'separator') {
276
- menuEl.appendChild(buildSeparator());
277
- }
278
- else if (item === 'rename') {
279
- menuEl.appendChild(buildRenameInput(tabGroup));
280
- }
281
- else if (item === 'colorPicker') {
282
- menuEl.appendChild(buildColorPicker(tabGroup, this_2.accessor.tabGroupColorPalette));
283
- }
284
- else if (isItemConfig(item) && item.element) {
285
- menuEl.appendChild(item.element);
286
- }
287
- else if (isItemConfig(item) && item.label) {
288
- menuEl.appendChild(buildItem(item.label, close, function () { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
289
- }
290
- };
291
- var this_2 = this;
292
- try {
293
- for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
294
- var item = items_2_1.value;
295
- _loop_3(item);
296
- }
297
- }
298
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
299
- finally {
300
- try {
301
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
302
- }
303
- finally { if (e_3) throw e_3.error; }
304
- }
305
- popupService.openPopover(menuEl, {
306
- x: event.clientX,
307
- y: event.clientY,
308
- zIndex: popoverZIndexFor(event.target),
309
- });
310
- };
311
- return ContextMenuController;
312
- }());
313
- exports.ContextMenuController = ContextMenuController;
@@ -1,10 +0,0 @@
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
- }
@@ -1,228 +0,0 @@
1
- import { findRelativeZIndexParent } from '../dom';
2
- function popoverZIndexFor(target) {
3
- if (!(target instanceof HTMLElement)) {
4
- return undefined;
5
- }
6
- // Floating overlays live in the shell as siblings of the popover anchor
7
- // and the AriaLevelTracker sets their inline z-index. Without this, a
8
- // popover opened from inside a floating group would render behind it
9
- // because they share the shell stacking context.
10
- const relativeParent = findRelativeZIndexParent(target);
11
- return (relativeParent === null || relativeParent === void 0 ? void 0 : relativeParent.style.zIndex)
12
- ? `calc(${relativeParent.style.zIndex} * 2)`
13
- : undefined;
14
- }
15
- let _nextId = 0;
16
- const nextContextMenuItemId = () => `dv-ctx-menu-item-${_nextId++}`;
17
- function isItemConfig(item) {
18
- return typeof item === 'object';
19
- }
20
- function buildItem(label, close, action, disabled) {
21
- const el = document.createElement('div');
22
- el.className = 'dv-context-menu-item';
23
- el.setAttribute('role', 'menuitem');
24
- if (disabled) {
25
- el.classList.add('dv-context-menu-item--disabled');
26
- el.setAttribute('aria-disabled', 'true');
27
- }
28
- el.textContent = label;
29
- if (!disabled) {
30
- el.addEventListener('click', () => {
31
- action();
32
- close();
33
- });
34
- }
35
- return el;
36
- }
37
- function buildSeparator() {
38
- const el = document.createElement('div');
39
- el.className = 'dv-context-menu-separator';
40
- el.setAttribute('role', 'separator');
41
- return el;
42
- }
43
- function isCoarsePrimaryInput() {
44
- if (typeof window === 'undefined' || !window.matchMedia) {
45
- return false;
46
- }
47
- const coarse = window.matchMedia('(pointer: coarse)').matches;
48
- const fine = window.matchMedia('(pointer: fine)').matches;
49
- return coarse && !fine;
50
- }
51
- function buildRenameInput(tabGroup) {
52
- const wrapper = document.createElement('div');
53
- wrapper.className = 'dv-context-menu-rename';
54
- const input = document.createElement('input');
55
- input.className = 'dv-context-menu-rename-input';
56
- input.type = 'text';
57
- input.placeholder = 'Name This Group';
58
- input.value = tabGroup.label;
59
- input.addEventListener('input', () => {
60
- tabGroup.setLabel(input.value);
61
- });
62
- input.addEventListener('keydown', (e) => {
63
- if (e.key !== 'Escape' && e.key !== 'Enter') {
64
- e.stopPropagation();
65
- }
66
- });
67
- input.addEventListener('click', (e) => {
68
- e.stopPropagation();
69
- });
70
- wrapper.appendChild(input);
71
- // Skip auto-focus on touch-primary devices: focusing the input pops the
72
- // on-screen keyboard, which fires `window resize`, which `PopupService`
73
- // listens to and uses to dismiss the popover — so the menu opens, the
74
- // keyboard appears, and the menu immediately closes before the user can
75
- // type. The user can still tap the input to focus it intentionally.
76
- if (!isCoarsePrimaryInput()) {
77
- requestAnimationFrame(() => {
78
- input.focus();
79
- input.select();
80
- });
81
- }
82
- return wrapper;
83
- }
84
- function buildColorPicker(tabGroup, palette) {
85
- const wrapper = document.createElement('div');
86
- wrapper.className = 'dv-context-menu-color-picker';
87
- if (!palette.enabled) {
88
- // Opt-out: render no swatches. Returning a wrapper rather than null
89
- // keeps the call site simple; the wrapper is empty and visually inert.
90
- return wrapper;
91
- }
92
- for (const entry of palette.entries()) {
93
- const swatch = document.createElement('div');
94
- swatch.className = 'dv-context-menu-color-swatch';
95
- // Use a CSS custom property rather than setting `backgroundColor`
96
- // directly: the IDL setter validates the value against a color
97
- // grammar and rejects `var(...)` references in some environments
98
- // (notably jsdom; some browsers have historically had similar
99
- // quirks). The matching SCSS rule reads the var at use time.
100
- swatch.style.setProperty('--dv-tab-group-color', entry.value);
101
- if (entry.label) {
102
- swatch.title = entry.label;
103
- }
104
- if (tabGroup.color === entry.id) {
105
- swatch.classList.add('dv-context-menu-color-swatch--selected');
106
- }
107
- swatch.addEventListener('click', () => {
108
- tabGroup.setColor(entry.id);
109
- });
110
- wrapper.appendChild(swatch);
111
- }
112
- return wrapper;
113
- }
114
- export class ContextMenuController {
115
- constructor(accessor) {
116
- this.accessor = accessor;
117
- }
118
- show(panel, group, event) {
119
- var _a, _b;
120
- if (!this.accessor.options.getTabContextMenuItems) {
121
- return;
122
- }
123
- const items = this.accessor.options.getTabContextMenuItems({
124
- panel,
125
- group,
126
- api: this.accessor.api,
127
- event,
128
- });
129
- if (items.length === 0) {
130
- return;
131
- }
132
- event.preventDefault();
133
- const popupService = this.accessor.getPopupServiceForGroup(group);
134
- const close = () => popupService.close();
135
- const menuEl = document.createElement('div');
136
- menuEl.className = 'dv-context-menu';
137
- menuEl.setAttribute('role', 'menu');
138
- for (const item of items) {
139
- if (item === 'separator') {
140
- menuEl.appendChild(buildSeparator());
141
- }
142
- else if (item === 'close') {
143
- menuEl.appendChild(buildItem('Close', close, () => panel.api.close()));
144
- }
145
- else if (item === 'closeOthers') {
146
- menuEl.appendChild(buildItem('Close Others', close, () => {
147
- group.panels
148
- .filter((p) => p !== panel)
149
- .forEach((p) => p.api.close());
150
- }));
151
- }
152
- else if (item === 'closeAll') {
153
- menuEl.appendChild(buildItem('Close All', close, () => {
154
- [...group.panels].forEach((p) => p.api.close());
155
- }));
156
- }
157
- else if (isItemConfig(item) && item.element) {
158
- menuEl.appendChild(item.element);
159
- }
160
- else if (isItemConfig(item) && item.component) {
161
- const renderer = (_b = (_a = this.accessor.options).createContextMenuItemComponent) === null || _b === void 0 ? void 0 : _b.call(_a, {
162
- id: nextContextMenuItemId(),
163
- component: item.component,
164
- });
165
- if (renderer) {
166
- renderer.init({
167
- panel,
168
- group,
169
- api: this.accessor.api,
170
- close,
171
- componentProps: item.componentProps,
172
- });
173
- menuEl.appendChild(renderer.element);
174
- }
175
- }
176
- else if (isItemConfig(item) && item.label) {
177
- menuEl.appendChild(buildItem(item.label, close, () => { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
178
- }
179
- }
180
- popupService.openPopover(menuEl, {
181
- x: event.clientX,
182
- y: event.clientY,
183
- zIndex: popoverZIndexFor(event.target),
184
- });
185
- }
186
- showForChip(tabGroup, group, event) {
187
- if (!this.accessor.options.getTabGroupChipContextMenuItems) {
188
- return;
189
- }
190
- const items = this.accessor.options.getTabGroupChipContextMenuItems({
191
- tabGroup,
192
- group,
193
- api: this.accessor.api,
194
- event,
195
- });
196
- if (items.length === 0) {
197
- return;
198
- }
199
- event.preventDefault();
200
- const popupService = this.accessor.getPopupServiceForGroup(group);
201
- const close = () => popupService.close();
202
- const menuEl = document.createElement('div');
203
- menuEl.className = 'dv-context-menu';
204
- menuEl.setAttribute('role', 'menu');
205
- for (const item of items) {
206
- if (item === 'separator') {
207
- menuEl.appendChild(buildSeparator());
208
- }
209
- else if (item === 'rename') {
210
- menuEl.appendChild(buildRenameInput(tabGroup));
211
- }
212
- else if (item === 'colorPicker') {
213
- menuEl.appendChild(buildColorPicker(tabGroup, this.accessor.tabGroupColorPalette));
214
- }
215
- else if (isItemConfig(item) && item.element) {
216
- menuEl.appendChild(item.element);
217
- }
218
- else if (isItemConfig(item) && item.label) {
219
- menuEl.appendChild(buildItem(item.label, close, () => { var _a; return (_a = item.action) === null || _a === void 0 ? void 0 : _a.call(item); }, item.disabled));
220
- }
221
- }
222
- popupService.openPopover(menuEl, {
223
- x: event.clientX,
224
- y: event.clientY,
225
- zIndex: popoverZIndexFor(event.target),
226
- });
227
- }
228
- }