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
@@ -0,0 +1,95 @@
1
+ import { IDisposable } from '../lifecycle';
2
+ import { Event } from '../events';
3
+ import { PopupService } from './components/popupService';
4
+ import { PopoutWindow } from '../popoutWindow';
5
+ import { DockviewGroupPanel } from './dockviewGroupPanel';
6
+ import { SerializedPopoutGroup } from './dockviewComponent';
7
+ import { Gridview } from '../gridview/gridview';
8
+ import { OverlayRenderContainer } from '../overlay/overlayRenderContainer';
9
+ import { DropTargetAnchorContainer } from '../dnd/dropTargetAnchorContainer';
10
+ export interface PopoutGroupEntry {
11
+ window: PopoutWindow;
12
+ popoutGroup: DockviewGroupPanel;
13
+ referenceGroup?: string;
14
+ /**
15
+ * The popout window hosts its own gridview so it can hold a nested
16
+ * splitview layout of groups. `popoutGroup` is the window's anchor group.
17
+ */
18
+ gridview: Gridview;
19
+ /**
20
+ * Render / drop-target containers and window accessor for this popout, so
21
+ * groups relocated into the window can be wired to its own document.
22
+ */
23
+ overlayRenderContainer: OverlayRenderContainer;
24
+ dropTargetContainer: DropTargetAnchorContainer;
25
+ getWindow: () => Window;
26
+ popoutUrl?: string;
27
+ disposable: {
28
+ dispose: () => DockviewGroupPanel | undefined;
29
+ };
30
+ }
31
+ /**
32
+ * Narrow callback surface the PopoutWindowService needs from its host.
33
+ */
34
+ export interface IPopoutWindowHost {
35
+ readonly isDisposed: boolean;
36
+ }
37
+ export interface IPopoutWindowService extends IDisposable {
38
+ readonly entries: readonly PopoutGroupEntry[];
39
+ readonly onDidRemove: Event<PopoutGroupEntry>;
40
+ add(entry: PopoutGroupEntry): void;
41
+ remove(entry: PopoutGroupEntry): void;
42
+ findByGroup(group: DockviewGroupPanel): PopoutGroupEntry | undefined;
43
+ findReferenceGroupId(group: DockviewGroupPanel): string | undefined;
44
+ observeGridviewSize(popoutWindow: PopoutWindow, gridview: Gridview, overlayRenderContainer: OverlayRenderContainer): IDisposable | undefined;
45
+ getPopupService(groupId: string): PopupService | undefined;
46
+ setPopupService(groupId: string, service: PopupService): void;
47
+ deletePopupService(groupId: string): void;
48
+ readonly restorationPromise: Promise<void>;
49
+ scheduleRestoration(delayMs: number, work: () => void, onCancel?: () => void): Promise<void>;
50
+ finishRestoration(promises: Promise<void>[]): void;
51
+ cancelPendingRestorations(): void;
52
+ serialize(): SerializedPopoutGroup[];
53
+ disposeAll(): void;
54
+ }
55
+ export declare class PopoutWindowService implements IPopoutWindowService {
56
+ private readonly _host;
57
+ private readonly _entries;
58
+ private readonly _popupServices;
59
+ private readonly _restorationCleanups;
60
+ private _restorationPromise;
61
+ private readonly _onDidRemove;
62
+ readonly onDidRemove: Event<PopoutGroupEntry>;
63
+ constructor(host: IPopoutWindowHost);
64
+ get entries(): readonly PopoutGroupEntry[];
65
+ get restorationPromise(): Promise<void>;
66
+ add(entry: PopoutGroupEntry): void;
67
+ remove(entry: PopoutGroupEntry): void;
68
+ findByGroup(group: DockviewGroupPanel): PopoutGroupEntry | undefined;
69
+ findReferenceGroupId(group: DockviewGroupPanel): string | undefined;
70
+ /**
71
+ * The popout window's innerWidth/innerHeight are often 0/stale until it has
72
+ * painted, and the nested gridview lays its children out to the size passed
73
+ * to layout() (a plain group fills via CSS instead). To stop content
74
+ * rendering into a zero box until a manual resize — and to avoid the race a
75
+ * fixed number of animation frames had — observe the gridview element with
76
+ * a ResizeObserver created in the POPOUT window's OWN realm. A parent-realm
77
+ * observer fires unreliably across the window boundary; a same-realm one
78
+ * fires reliably, including the initial observation once the window is
79
+ * sized.
80
+ *
81
+ * @returns a disposable that disconnects the observer, or `undefined` when
82
+ * the popout realm has no ResizeObserver (e.g. jsdom).
83
+ */
84
+ observeGridviewSize(popoutWindow: PopoutWindow, gridview: Gridview, overlayRenderContainer: OverlayRenderContainer): IDisposable | undefined;
85
+ getPopupService(groupId: string): PopupService | undefined;
86
+ setPopupService(groupId: string, service: PopupService): void;
87
+ deletePopupService(groupId: string): void;
88
+ scheduleRestoration(delayMs: number, work: () => void, onCancel?: () => void): Promise<void>;
89
+ finishRestoration(promises: Promise<void>[]): void;
90
+ cancelPendingRestorations(): void;
91
+ serialize(): SerializedPopoutGroup[];
92
+ disposeAll(): void;
93
+ dispose(): void;
94
+ }
95
+ export declare const PopoutWindowModule: import("./modules").DockviewModule<IPopoutWindowHost>;
@@ -0,0 +1,175 @@
1
+ import { Emitter } from '../events';
2
+ import { remove } from '../array';
3
+ import { defineModule } from './modules';
4
+ export class PopoutWindowService {
5
+ constructor(host) {
6
+ this._entries = [];
7
+ this._popupServices = new Map();
8
+ this._restorationCleanups = new Set();
9
+ this._restorationPromise = Promise.resolve();
10
+ this._onDidRemove = new Emitter();
11
+ this.onDidRemove = this._onDidRemove.event;
12
+ this._host = host;
13
+ }
14
+ get entries() {
15
+ return this._entries;
16
+ }
17
+ get restorationPromise() {
18
+ return this._restorationPromise;
19
+ }
20
+ add(entry) {
21
+ this._entries.push(entry);
22
+ }
23
+ remove(entry) {
24
+ // Fire only on a genuine removal, and not while the host component is
25
+ // tearing down (consumers don't want popout-removed events during
26
+ // dispose).
27
+ if (remove(this._entries, entry) && !this._host.isDisposed) {
28
+ this._onDidRemove.fire(entry);
29
+ }
30
+ }
31
+ findByGroup(group) {
32
+ // A popout window may host several groups in a nested gridview, so
33
+ // match by membership (DOM containment) rather than only the anchor.
34
+ return this._entries.find((entry) => entry.popoutGroup === group ||
35
+ entry.gridview.element.contains(group.element));
36
+ }
37
+ findReferenceGroupId(group) {
38
+ var _a;
39
+ return (_a = this._entries.find((entry) => entry.popoutGroup === group)) === null || _a === void 0 ? void 0 : _a.referenceGroup;
40
+ }
41
+ /**
42
+ * The popout window's innerWidth/innerHeight are often 0/stale until it has
43
+ * painted, and the nested gridview lays its children out to the size passed
44
+ * to layout() (a plain group fills via CSS instead). To stop content
45
+ * rendering into a zero box until a manual resize — and to avoid the race a
46
+ * fixed number of animation frames had — observe the gridview element with
47
+ * a ResizeObserver created in the POPOUT window's OWN realm. A parent-realm
48
+ * observer fires unreliably across the window boundary; a same-realm one
49
+ * fires reliably, including the initial observation once the window is
50
+ * sized.
51
+ *
52
+ * @returns a disposable that disconnects the observer, or `undefined` when
53
+ * the popout realm has no ResizeObserver (e.g. jsdom).
54
+ */
55
+ observeGridviewSize(popoutWindow, gridview, overlayRenderContainer) {
56
+ var _a;
57
+ const PopoutResizeObserver = (_a = popoutWindow.window) === null || _a === void 0 ? void 0 : _a.ResizeObserver;
58
+ if (!PopoutResizeObserver) {
59
+ return undefined;
60
+ }
61
+ let lastWidth = -1;
62
+ let lastHeight = -1;
63
+ const relayout = () => {
64
+ const win = popoutWindow.window;
65
+ if (this._host.isDisposed || !win || win.closed) {
66
+ return;
67
+ }
68
+ const width = Math.round(gridview.element.clientWidth);
69
+ const height = Math.round(gridview.element.clientHeight);
70
+ if (width === lastWidth && height === lastHeight) {
71
+ return;
72
+ }
73
+ lastWidth = width;
74
+ lastHeight = height;
75
+ if (width > 0 && height > 0) {
76
+ gridview.layout(width, height);
77
+ }
78
+ overlayRenderContainer.updateAllPositions();
79
+ };
80
+ const observer = new PopoutResizeObserver(() => {
81
+ var _a;
82
+ // Defer out of the observer callback into the popout's own frame to
83
+ // size against the settled layout and to avoid resize-loop warnings.
84
+ const raf = (_a = popoutWindow.window) === null || _a === void 0 ? void 0 : _a.requestAnimationFrame;
85
+ if (raf) {
86
+ raf.call(popoutWindow.window, relayout);
87
+ }
88
+ else {
89
+ relayout();
90
+ }
91
+ });
92
+ observer.observe(gridview.element);
93
+ return { dispose: () => observer.disconnect() };
94
+ }
95
+ getPopupService(groupId) {
96
+ return this._popupServices.get(groupId);
97
+ }
98
+ setPopupService(groupId, service) {
99
+ this._popupServices.set(groupId, service);
100
+ }
101
+ deletePopupService(groupId) {
102
+ this._popupServices.delete(groupId);
103
+ }
104
+ scheduleRestoration(delayMs, work, onCancel) {
105
+ return new Promise((resolve) => {
106
+ const cleanup = () => {
107
+ this._restorationCleanups.delete(cleanup);
108
+ clearTimeout(handle);
109
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
110
+ resolve();
111
+ };
112
+ const handle = setTimeout(() => {
113
+ this._restorationCleanups.delete(cleanup);
114
+ // Guard against the component being disposed before this
115
+ // timer fires. Under React StrictMode the component is
116
+ // mounted -> disposed -> remounted, and without this guard
117
+ // the first instance's queued restoration would open a
118
+ // second popout window. See issue #851.
119
+ if (this._host.isDisposed) {
120
+ resolve();
121
+ return;
122
+ }
123
+ work();
124
+ resolve();
125
+ }, delayMs);
126
+ this._restorationCleanups.add(cleanup);
127
+ });
128
+ }
129
+ finishRestoration(promises) {
130
+ this._restorationPromise = Promise.all(promises).then(() => void 0);
131
+ }
132
+ cancelPendingRestorations() {
133
+ for (const cleanup of [...this._restorationCleanups]) {
134
+ cleanup();
135
+ }
136
+ this._restorationCleanups.clear();
137
+ }
138
+ serialize() {
139
+ return this._entries.map((entry) => {
140
+ const grid = entry.gridview.serialize();
141
+ const root = grid.root;
142
+ const url = entry.popoutGroup.api.location.type === 'popout'
143
+ ? entry.popoutGroup.api.location.popoutUrl
144
+ : undefined;
145
+ const base = {
146
+ gridReferenceGroup: entry.referenceGroup,
147
+ position: entry.window.dimensions(),
148
+ url,
149
+ };
150
+ // Single-group window keeps the legacy `data` shape so layouts
151
+ // round-trip byte-stably and older readers keep working.
152
+ if (root.type === 'branch' &&
153
+ root.data.length === 1 &&
154
+ root.data[0].type === 'leaf') {
155
+ return Object.assign(Object.assign({}, base), { data: root.data[0].data });
156
+ }
157
+ return Object.assign(Object.assign({}, base), { grid });
158
+ });
159
+ }
160
+ disposeAll() {
161
+ for (const entry of [...this._entries]) {
162
+ entry.disposable.dispose();
163
+ }
164
+ }
165
+ dispose() {
166
+ this.cancelPendingRestorations();
167
+ this.disposeAll();
168
+ this._onDidRemove.dispose();
169
+ }
170
+ }
171
+ export const PopoutWindowModule = defineModule({
172
+ name: 'PopoutWindow',
173
+ serviceKey: 'popoutWindowService',
174
+ create: (host) => new PopoutWindowService(host),
175
+ });
@@ -0,0 +1,35 @@
1
+ import { IDisposable } from '../lifecycle';
2
+ import { Event } from '../events';
3
+ import { DroptargetEvent, DropTargetTargetModel, Position, WillShowOverlayEvent } from '../dnd/droptarget';
4
+ import { DockviewComponentOptions } from './options';
5
+ export interface IRootDropTargetHost {
6
+ readonly id: string;
7
+ readonly element: HTMLElement;
8
+ readonly options: DockviewComponentOptions;
9
+ isGridEmpty(): boolean;
10
+ rootDropTargetOverrideTarget(): DropTargetTargetModel | undefined;
11
+ /**
12
+ * Build, fire, and return the verdict for an unhandled-drag-over event.
13
+ * Implemented on the component side so the service stays free of
14
+ * circular imports with the event class declared in dockviewComponent.
15
+ */
16
+ dispatchUnhandledDragOver(nativeEvent: DragEvent | PointerEvent, position: Position): boolean;
17
+ }
18
+ export interface IRootDropTargetService extends IDisposable {
19
+ /** Merged stream from both DnD backends. */
20
+ readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
21
+ /** Merged stream from both DnD backends. */
22
+ readonly onDrop: Event<DroptargetEvent>;
23
+ /** Apply changed options (dndEdges). */
24
+ setOptions(options: Partial<DockviewComponentOptions>): void;
25
+ }
26
+ export declare class RootDropTargetService implements IRootDropTargetService {
27
+ private readonly _html5Target;
28
+ private readonly _pointerTarget;
29
+ readonly onWillShowOverlay: Event<WillShowOverlayEvent>;
30
+ readonly onDrop: Event<DroptargetEvent>;
31
+ constructor(host: IRootDropTargetHost);
32
+ setOptions(options: Partial<DockviewComponentOptions>): void;
33
+ dispose(): void;
34
+ }
35
+ export declare const RootDropTargetModule: import("./modules").DockviewModule<IRootDropTargetHost>;
@@ -0,0 +1,82 @@
1
+ import { Event } from '../events';
2
+ import { html5Backend, pointerBackend } from '../dnd/backend';
3
+ import { getPanelData } from '../dnd/dataTransfer';
4
+ import { defineModule } from './modules';
5
+ const DEFAULT_ROOT_OVERLAY_MODEL = {
6
+ activationSize: { type: 'pixels', value: 10 },
7
+ size: { type: 'pixels', value: 20 },
8
+ };
9
+ export class RootDropTargetService {
10
+ constructor(host) {
11
+ const canDisplayOverlay = (event, position) => {
12
+ const data = getPanelData();
13
+ if (data) {
14
+ if (data.viewId !== host.id) {
15
+ return false;
16
+ }
17
+ if (position === 'center') {
18
+ // center drop target only allowed if no panels in primary
19
+ // grid; floating panels are allowed
20
+ return host.isGridEmpty();
21
+ }
22
+ return true;
23
+ }
24
+ if (position === 'center' && !host.isGridEmpty()) {
25
+ // for external events only show the four-corner drag overlays,
26
+ // disable center so external drag events can fall through to
27
+ // the group and panel drop target handlers
28
+ return false;
29
+ }
30
+ return host.dispatchUnhandledDragOver(event, position);
31
+ };
32
+ const overlayModel = typeof host.options.dndEdges === 'object' &&
33
+ host.options.dndEdges !== null
34
+ ? host.options.dndEdges
35
+ : DEFAULT_ROOT_OVERLAY_MODEL;
36
+ this._html5Target = html5Backend.createDropTarget(host.element, {
37
+ className: 'dv-drop-target-edge',
38
+ canDisplayOverlay,
39
+ acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
40
+ overlayModel,
41
+ getOverrideTarget: () => host.rootDropTargetOverrideTarget(),
42
+ });
43
+ this._pointerTarget = pointerBackend.createDropTarget(host.element, {
44
+ className: 'dv-drop-target-edge',
45
+ canDisplayOverlay,
46
+ acceptedTargetZones: ['top', 'bottom', 'left', 'right', 'center'],
47
+ overlayModel,
48
+ getOverrideTarget: () => host.rootDropTargetOverrideTarget(),
49
+ });
50
+ this.onWillShowOverlay = Event.any(this._html5Target.onWillShowOverlay, this._pointerTarget.onWillShowOverlay);
51
+ this.onDrop = Event.any(this._html5Target.onDrop, this._pointerTarget.onDrop);
52
+ // Apply initial-state options now that the targets exist; setOptions
53
+ // handles dndEdges (disable + overlay model) and late changes.
54
+ this.setOptions(host.options);
55
+ }
56
+ setOptions(options) {
57
+ if ('dndEdges' in options) {
58
+ const disabled = typeof options.dndEdges === 'boolean' &&
59
+ options.dndEdges === false;
60
+ this._html5Target.disabled = disabled;
61
+ this._pointerTarget.disabled = disabled;
62
+ if (typeof options.dndEdges === 'object' &&
63
+ options.dndEdges !== null) {
64
+ this._html5Target.setOverlayModel(options.dndEdges);
65
+ this._pointerTarget.setOverlayModel(options.dndEdges);
66
+ }
67
+ else {
68
+ this._html5Target.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
69
+ this._pointerTarget.setOverlayModel(DEFAULT_ROOT_OVERLAY_MODEL);
70
+ }
71
+ }
72
+ }
73
+ dispose() {
74
+ this._html5Target.dispose();
75
+ this._pointerTarget.dispose();
76
+ }
77
+ }
78
+ export const RootDropTargetModule = defineModule({
79
+ name: 'RootDropTarget',
80
+ serviceKey: 'rootDropTargetService',
81
+ create: (host) => new RootDropTargetService(host),
82
+ });
@@ -0,0 +1,30 @@
1
+ import { IDisposable } from '../lifecycle';
2
+ import { Event } from '../events';
3
+ import { IWatermarkRenderer } from './types';
4
+ import { DockviewApi } from '../api/component.api';
5
+ import { DockviewGroupPanel } from './dockviewGroupPanel';
6
+ export interface IWatermarkHost {
7
+ readonly api: DockviewApi;
8
+ readonly mountElement: HTMLElement;
9
+ createWatermarkComponent(): IWatermarkRenderer;
10
+ hasVisibleGridGroup(): boolean;
11
+ readonly onDidAdd: Event<DockviewGroupPanel>;
12
+ readonly onDidRemove: Event<DockviewGroupPanel>;
13
+ readonly onDidViewVisibilityChangeMicroTaskQueue: Event<unknown>;
14
+ }
15
+ export interface IWatermarkService extends IDisposable {
16
+ /** Mount or unmount the watermark based on current grid state. */
17
+ update(): void;
18
+ /** Tear down the current watermark and re-evaluate. Used when the watermark factory option changes. */
19
+ refresh(): void;
20
+ }
21
+ export declare class WatermarkService implements IWatermarkService {
22
+ private readonly _host;
23
+ private _watermark;
24
+ constructor(host: IWatermarkHost);
25
+ update(): void;
26
+ refresh(): void;
27
+ private _unmount;
28
+ dispose(): void;
29
+ }
30
+ export declare const WatermarkModule: import("./modules").DockviewModule<IWatermarkHost>;
@@ -0,0 +1,56 @@
1
+ import { CompositeDisposable } from '../lifecycle';
2
+ import { addTestId } from '../dom';
3
+ import { Event } from '../events';
4
+ import { defineModule } from './modules';
5
+ export class WatermarkService {
6
+ constructor(host) {
7
+ this._watermark = null;
8
+ this._host = host;
9
+ }
10
+ update() {
11
+ if (this._host.hasVisibleGridGroup()) {
12
+ this._unmount();
13
+ return;
14
+ }
15
+ if (this._watermark) {
16
+ return;
17
+ }
18
+ this._watermark = this._host.createWatermarkComponent();
19
+ this._watermark.init({ containerApi: this._host.api });
20
+ const container = document.createElement('div');
21
+ container.className = 'dv-watermark-container';
22
+ addTestId(container, 'watermark-component');
23
+ container.appendChild(this._watermark.element);
24
+ this._host.mountElement.appendChild(container);
25
+ }
26
+ refresh() {
27
+ this._unmount();
28
+ this.update();
29
+ }
30
+ _unmount() {
31
+ var _a, _b;
32
+ if (!this._watermark) {
33
+ return;
34
+ }
35
+ this._watermark.element.parentElement.remove();
36
+ (_b = (_a = this._watermark).dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
37
+ this._watermark = null;
38
+ }
39
+ dispose() {
40
+ this._unmount();
41
+ }
42
+ }
43
+ export const WatermarkModule = defineModule({
44
+ name: 'Watermark',
45
+ serviceKey: 'watermarkService',
46
+ create: (host) => new WatermarkService(host),
47
+ init: (host, service) => {
48
+ // Initial evaluation reflects the watermark state at construction time.
49
+ service.update();
50
+ return new CompositeDisposable(Event.any(host.onDidAdd, host.onDidRemove)(() => {
51
+ service.update();
52
+ }), host.onDidViewVisibilityChangeMicroTaskQueue(() => {
53
+ service.update();
54
+ }));
55
+ },
56
+ });
@@ -95,7 +95,7 @@ export declare abstract class BaseGrid<T extends IGridPanelView> extends Resizab
95
95
  isMaximizedGroup(panel: T): boolean;
96
96
  exitMaximizedGroup(): void;
97
97
  hasMaximizedGroup(): boolean;
98
- protected doAddGroup(group: T, location?: number[], size?: number): void;
98
+ protected doAddGroup(group: T, location?: number[], size?: number, gridview?: Gridview): void;
99
99
  protected doRemoveGroup(group: T, options?: {
100
100
  skipActive?: boolean;
101
101
  skipDispose?: boolean;
@@ -145,8 +145,8 @@ export class BaseGrid extends Resizable {
145
145
  hasMaximizedGroup() {
146
146
  return this.gridview.hasMaximizedView();
147
147
  }
148
- doAddGroup(group, location = [0], size) {
149
- this.gridview.addView(group, size !== null && size !== void 0 ? size : Sizing.Distribute, location);
148
+ doAddGroup(group, location = [0], size, gridview = this.gridview) {
149
+ gridview.addView(group, size !== null && size !== void 0 ? size : Sizing.Distribute, location);
150
150
  this._onDidAdd.fire(group);
151
151
  }
152
152
  doRemoveGroup(group, options) {
@@ -11,7 +11,7 @@ export interface SerializedGridviewComponent {
11
11
  grid: SerializedGridview<GridPanelViewState>;
12
12
  activePanel?: string;
13
13
  }
14
- export interface AddComponentOptions<T extends object = Parameters> extends BaseComponentOptions<T> {
14
+ export interface AddGridviewComponentOptions<T extends object = Parameters> extends BaseComponentOptions<T> {
15
15
  minimumWidth?: number;
16
16
  maximumWidth?: number;
17
17
  minimumHeight?: number;
@@ -29,7 +29,7 @@ export interface IGridviewComponent extends IBaseGrid<GridviewPanel> {
29
29
  readonly orientation: Orientation;
30
30
  readonly onDidLayoutFromJSON: Event<void>;
31
31
  updateOptions(options: Partial<GridviewComponentOptions>): void;
32
- addPanel<T extends object = Parameters>(options: AddComponentOptions<T>): IGridviewPanel;
32
+ addPanel<T extends object = Parameters>(options: AddGridviewComponentOptions<T>): IGridviewPanel;
33
33
  removePanel(panel: IGridviewPanel, sizing?: Sizing): void;
34
34
  focus(): void;
35
35
  fromJSON(serializedGridview: SerializedGridviewComponent): void;
@@ -80,7 +80,7 @@ export declare class GridviewComponent extends BaseGrid<GridviewPanel> implement
80
80
  reference: string;
81
81
  size?: number;
82
82
  }): void;
83
- addPanel<T extends object = Parameters>(options: AddComponentOptions<T>): IGridviewPanel;
83
+ addPanel<T extends object = Parameters>(options: AddGridviewComponentOptions<T>): IGridviewPanel;
84
84
  private registerPanel;
85
85
  moveGroup(referenceGroup: IGridPanelComponentView, groupId: string, target: Position): void;
86
86
  removeGroup(group: GridviewPanel): void;
@@ -6,7 +6,7 @@ import { LayoutPriority } from '../splitview/splitview';
6
6
  import { Event } from '../events';
7
7
  import { IViewSize } from './gridview';
8
8
  import { BaseGrid, IGridPanelView } from './baseComponentGridview';
9
- export interface Contraints {
9
+ export interface Constraints {
10
10
  minimumWidth?: number;
11
11
  maximumWidth?: number;
12
12
  minimumHeight?: number;
@@ -13,11 +13,11 @@ export * from './paneview/paneview';
13
13
  export * from './gridview/gridview';
14
14
  export { GridviewComponentOptions, GridviewOptions, GridviewFrameworkOptions, PROPERTY_KEYS_GRIDVIEW, } from './gridview/options';
15
15
  export * from './gridview/baseComponentGridview';
16
- export { DraggablePaneviewPanel, PaneviewDidDropEvent as PaneviewDropEvent, } from './paneview/draggablePaneviewPanel';
16
+ export { DraggablePaneviewPanel, PaneviewDidDropEvent, } from './paneview/draggablePaneviewPanel';
17
17
  export * from './dockview/components/panel/content';
18
18
  export * from './dockview/components/tab/tab';
19
- export { DockviewGroupPanelModel, DockviewDidDropEvent, DockviewWillDropEvent, DockviewGroupChangeEvent, DockviewGroupLocation, } from './dockview/dockviewGroupPanelModel';
20
- export { DockviewWillShowOverlayLocationEvent, DockviewTabGroupChangeEvent, DockviewTabGroupCollapsedChangeEvent, DockviewTabGroupPanelChangeEvent, } from './dockview/events';
19
+ export { DockviewGroupPanelModel, DockviewDidDropEvent, DockviewWillDropEvent, DockviewGroupChangeEvent, DockviewGroupActivePanelChangeEvent, DockviewGroupLocation, } from './dockview/dockviewGroupPanelModel';
20
+ export { DockviewWillShowOverlayLocationEvent, DockviewTabGroupChangeEvent, DockviewTabGroupCollapsedChangeEvent, DockviewTabGroupPanelChangeEvent, DockviewGroupDropLocation, } from './dockview/events';
21
21
  export { TabDragEvent, GroupDragEvent, } from './dockview/components/titlebar/tabsContainer';
22
22
  export * from './dockview/types';
23
23
  export * from './dockview/dockviewGroupPanel';
@@ -39,6 +39,7 @@ export * from './gridview/gridviewPanel';
39
39
  export { SplitviewPanel, ISplitviewPanel } from './splitview/splitviewPanel';
40
40
  export * from './paneview/paneviewPanel';
41
41
  export * from './dockview/types';
42
+ export { Box, AnchorPosition, AnchoredBox } from './types';
42
43
  export { DockviewPanelRenderer } from './overlay/overlayRenderContainer';
43
44
  export { Position, positionToDirection, directionToPosition, MeasuredValue, DroptargetOverlayModel, } from './dnd/droptarget';
44
45
  export { FocusEvent, PanelDimensionChangeEvent, VisibilityEvent, ActiveEvent, PanelApi, } from './api/panelApi';
@@ -46,6 +47,12 @@ export { SizeEvent, GridviewPanelApi, GridConstraintChangeEvent, } from './api/g
46
47
  export { TitleEvent, RendererChangedEvent, DockviewPanelApi, DockviewPanelMoveParams, } from './api/dockviewPanelApi';
47
48
  export { PanelSizeEvent, PanelConstraintChangeEvent, SplitviewPanelApi, } from './api/splitviewPanelApi';
48
49
  export { ExpansionEvent, PaneviewPanelApi } from './api/paneviewPanelApi';
49
- export { DockviewGroupPanelApi, DockviewGroupPanelFloatingChangeEvent, DockviewGroupPanelCollapsedChangeEvent, DockviewGroupMoveParams, } from './api/dockviewGroupPanelApi';
50
+ export { DockviewGroupPanelApi, DockviewGroupPanelLocationChangeEvent, DockviewGroupPanelCollapsedChangeEvent, DockviewGroupMoveParams, } from './api/dockviewGroupPanelApi';
50
51
  export { CommonApi, SplitviewApi, PaneviewApi, GridviewApi, DockviewApi, DockviewGetTabGroupsOptions, } from './api/component.api';
51
52
  export { createDockview, createGridview, createPaneview, createSplitview, } from './api/entryPoints';
53
+ export { registerModules, getRegisteredModules, clearRegisteredModules, markDockviewPackageLoaded, isDockviewPackageLoaded, defineModule, DockviewModule, ServiceCollection, } from './dockview/modules';
54
+ export { IAccessibilityHost, IAccessibilityService, IAdvancedDnDHost, IAdvancedDnDService, IContextMenuHost, IContextMenuService, IKeyboardDockingService, ITabGroupChipsHost, ITabGroupChipsService, } from './dockview/moduleContracts';
55
+ export { resolveMessages } from './dockview/accessibilityMessages';
56
+ export { findRelativeZIndexParent } from './dom';
57
+ export { IDragGhostSpec } from './dnd/backend';
58
+ export { LiveRegionModule } from './dockview/liveRegionService';
package/dist/esm/index.js CHANGED
@@ -38,3 +38,7 @@ export * from './dockview/types';
38
38
  export { positionToDirection, directionToPosition, } from './dnd/droptarget';
39
39
  export { SplitviewApi, PaneviewApi, GridviewApi, DockviewApi, } from './api/component.api';
40
40
  export { createDockview, createGridview, createPaneview, createSplitview, } from './api/entryPoints';
41
+ export { registerModules, getRegisteredModules, clearRegisteredModules, markDockviewPackageLoaded, isDockviewPackageLoaded, defineModule, } from './dockview/modules';
42
+ export { resolveMessages } from './dockview/accessibilityMessages';
43
+ export { findRelativeZIndexParent } from './dom';
44
+ export { LiveRegionModule } from './dockview/liveRegionService';
@@ -1,6 +1,21 @@
1
1
  import { Event } from '../events';
2
2
  import { CompositeDisposable } from '../lifecycle';
3
- import { AnchoredBox } from '../types';
3
+ import { AnchoredBox, Box } from '../types';
4
+ /**
5
+ * Context handed to {@link OverlayOptions.transformDragPosition} each
6
+ * pointer-move frame while a floating overlay is being dragged.
7
+ */
8
+ export interface OverlayDragContext {
9
+ /** Proposed top-left + size this frame, in container pixels (pre-clamp). */
10
+ readonly proposed: Box;
11
+ /** Size of the container the overlay is dragged within. */
12
+ readonly container: {
13
+ width: number;
14
+ height: number;
15
+ };
16
+ /** Bounds of the sibling overlays, snapshotted at drag start. */
17
+ readonly others: readonly Box[];
18
+ }
4
19
  export declare class Overlay extends CompositeDisposable {
5
20
  private readonly options;
6
21
  private readonly _element;
@@ -22,11 +37,38 @@ export declare class Overlay extends CompositeDisposable {
22
37
  set minimumInViewportHeight(value: number | undefined);
23
38
  get element(): HTMLElement;
24
39
  get isVisible(): boolean;
40
+ /**
41
+ * Height of the optional drag-handle header, or 0 when none is present.
42
+ * Used to translate between the overlay's outer box and the content area
43
+ * available to the group beneath the header.
44
+ */
45
+ get headerHeight(): number;
25
46
  constructor(options: AnchoredBox & {
26
47
  container: HTMLElement;
27
48
  content: HTMLElement;
49
+ /**
50
+ * Optional dedicated drag handle rendered above the content (a
51
+ * floating window title bar). When provided the resize container
52
+ * lays its children out as a flex column so the content shrinks
53
+ * to fit beneath the handle.
54
+ */
55
+ header?: HTMLElement;
28
56
  minimumInViewportWidth?: number;
29
57
  minimumInViewportHeight?: number;
58
+ /**
59
+ * Adjust the proposed top-left each drag frame (before the
60
+ * container clamp). Return an adjusted position or nothing to leave
61
+ * it unchanged. Used to implement snapping / custom bounds.
62
+ */
63
+ transformDragPosition?: (context: OverlayDragContext) => {
64
+ top: number;
65
+ left: number;
66
+ } | void;
67
+ /**
68
+ * Snapshot the sibling overlays' boxes at drag start, supplied to
69
+ * `transformDragPosition` as `context.others`.
70
+ */
71
+ getSiblingBoxes?: () => readonly Box[];
30
72
  });
31
73
  setVisible(isVisible: boolean): void;
32
74
  bringToFront(): void;