dockview-core 1.15.3 → 1.16.1

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 (99) hide show
  1. package/dist/cjs/api/component.api.d.ts +32 -6
  2. package/dist/cjs/api/component.api.js +42 -6
  3. package/dist/cjs/api/dockviewPanelApi.d.ts +1 -1
  4. package/dist/cjs/api/entryPoints.d.ts +9 -0
  5. package/dist/cjs/api/entryPoints.js +28 -0
  6. package/dist/cjs/dnd/abstractDragHandler.js +2 -65
  7. package/dist/cjs/dockview/components/titlebar/voidContainer.js +1 -1
  8. package/dist/cjs/dockview/dockviewComponent.d.ts +4 -2
  9. package/dist/cjs/dockview/dockviewComponent.js +60 -17
  10. package/dist/cjs/dockview/dockviewFloatingGroupPanel.d.ts +1 -1
  11. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +1 -1
  12. package/dist/cjs/dockview/dockviewGroupPanelModel.js +1 -1
  13. package/dist/cjs/dockview/dockviewPanel.d.ts +1 -1
  14. package/dist/cjs/dockview/dockviewPanel.js +1 -1
  15. package/dist/cjs/dockview/options.d.ts +2 -2
  16. package/dist/cjs/dockview/options.js +1 -0
  17. package/dist/cjs/dockview/types.d.ts +1 -1
  18. package/dist/cjs/dom.d.ts +3 -0
  19. package/dist/cjs/dom.js +66 -1
  20. package/dist/cjs/gridview/baseComponentGridview.d.ts +5 -2
  21. package/dist/cjs/gridview/baseComponentGridview.js +54 -3
  22. package/dist/cjs/gridview/gridviewComponent.d.ts +3 -4
  23. package/dist/cjs/gridview/gridviewComponent.js +4 -2
  24. package/dist/cjs/gridview/options.d.ts +1 -1
  25. package/dist/cjs/index.d.ts +2 -1
  26. package/dist/cjs/index.js +6 -1
  27. package/dist/cjs/{dnd → overlay}/overlay.d.ts +3 -0
  28. package/dist/cjs/{dnd → overlay}/overlay.js +41 -82
  29. package/dist/cjs/{overlayRenderContainer.d.ts → overlay/overlayRenderContainer.d.ts} +7 -5
  30. package/dist/cjs/{overlayRenderContainer.js → overlay/overlayRenderContainer.js} +41 -6
  31. package/dist/cjs/paneview/options.d.ts +1 -1
  32. package/dist/cjs/paneview/paneviewComponent.d.ts +2 -1
  33. package/dist/cjs/paneview/paneviewComponent.js +68 -19
  34. package/dist/cjs/splitview/options.d.ts +1 -1
  35. package/dist/cjs/splitview/splitview.js +64 -71
  36. package/dist/cjs/splitview/splitviewComponent.d.ts +5 -5
  37. package/dist/cjs/splitview/splitviewComponent.js +70 -21
  38. package/dist/dockview-core.amd.js +301 -98
  39. package/dist/dockview-core.amd.js.map +1 -1
  40. package/dist/dockview-core.amd.min.js +2 -2
  41. package/dist/dockview-core.amd.min.js.map +1 -1
  42. package/dist/dockview-core.amd.min.noStyle.js +2 -2
  43. package/dist/dockview-core.amd.min.noStyle.js.map +1 -1
  44. package/dist/dockview-core.amd.noStyle.js +300 -97
  45. package/dist/dockview-core.amd.noStyle.js.map +1 -1
  46. package/dist/dockview-core.cjs.js +301 -98
  47. package/dist/dockview-core.cjs.js.map +1 -1
  48. package/dist/dockview-core.esm.js +298 -99
  49. package/dist/dockview-core.esm.js.map +1 -1
  50. package/dist/dockview-core.esm.min.js +2 -2
  51. package/dist/dockview-core.esm.min.js.map +1 -1
  52. package/dist/dockview-core.js +301 -98
  53. package/dist/dockview-core.js.map +1 -1
  54. package/dist/dockview-core.min.js +2 -2
  55. package/dist/dockview-core.min.js.map +1 -1
  56. package/dist/dockview-core.min.noStyle.js +2 -2
  57. package/dist/dockview-core.min.noStyle.js.map +1 -1
  58. package/dist/dockview-core.noStyle.js +300 -97
  59. package/dist/dockview-core.noStyle.js.map +1 -1
  60. package/dist/esm/api/component.api.d.ts +32 -6
  61. package/dist/esm/api/component.api.js +42 -6
  62. package/dist/esm/api/dockviewPanelApi.d.ts +1 -1
  63. package/dist/esm/api/entryPoints.d.ts +9 -0
  64. package/dist/esm/api/entryPoints.js +21 -0
  65. package/dist/esm/dnd/abstractDragHandler.js +3 -11
  66. package/dist/esm/dockview/components/panel/content.js +1 -1
  67. package/dist/esm/dockview/components/titlebar/voidContainer.js +1 -1
  68. package/dist/esm/dockview/dockviewComponent.d.ts +4 -2
  69. package/dist/esm/dockview/dockviewComponent.js +48 -13
  70. package/dist/esm/dockview/dockviewFloatingGroupPanel.d.ts +1 -1
  71. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +1 -1
  72. package/dist/esm/dockview/dockviewGroupPanelModel.js +1 -1
  73. package/dist/esm/dockview/dockviewPanel.d.ts +1 -1
  74. package/dist/esm/dockview/dockviewPanel.js +1 -1
  75. package/dist/esm/dockview/options.d.ts +2 -2
  76. package/dist/esm/dockview/options.js +1 -0
  77. package/dist/esm/dockview/types.d.ts +1 -1
  78. package/dist/esm/dom.d.ts +3 -0
  79. package/dist/esm/dom.js +20 -0
  80. package/dist/esm/gridview/baseComponentGridview.d.ts +5 -2
  81. package/dist/esm/gridview/baseComponentGridview.js +19 -0
  82. package/dist/esm/gridview/gridviewComponent.d.ts +3 -4
  83. package/dist/esm/gridview/gridviewComponent.js +4 -2
  84. package/dist/esm/gridview/options.d.ts +1 -1
  85. package/dist/esm/index.d.ts +2 -1
  86. package/dist/esm/index.js +1 -0
  87. package/dist/esm/{dnd → overlay}/overlay.d.ts +3 -0
  88. package/dist/esm/{dnd → overlay}/overlay.js +36 -32
  89. package/dist/esm/{overlayRenderContainer.d.ts → overlay/overlayRenderContainer.d.ts} +7 -5
  90. package/dist/esm/{overlayRenderContainer.js → overlay/overlayRenderContainer.js} +39 -6
  91. package/dist/esm/paneview/options.d.ts +1 -1
  92. package/dist/esm/paneview/paneviewComponent.d.ts +2 -1
  93. package/dist/esm/paneview/paneviewComponent.js +19 -2
  94. package/dist/esm/splitview/options.d.ts +1 -1
  95. package/dist/esm/splitview/splitview.js +37 -27
  96. package/dist/esm/splitview/splitviewComponent.d.ts +5 -5
  97. package/dist/esm/splitview/splitviewComponent.js +19 -2
  98. package/dist/styles/dockview.css +78 -82
  99. package/package.json +1 -1
@@ -25,11 +25,10 @@ export interface AddComponentOptions<T extends object = Parameters> extends Base
25
25
  export interface IGridPanelComponentView extends IGridPanelView {
26
26
  init: (params: GridviewInitParameters) => void;
27
27
  }
28
- export type GridviewComponentUpdateOptions = Pick<GridviewComponentOptions, 'orientation' | 'components' | 'frameworkComponents'>;
29
28
  export interface IGridviewComponent extends IBaseGrid<GridviewPanel> {
30
29
  readonly orientation: Orientation;
31
30
  readonly onDidLayoutFromJSON: Event<void>;
32
- updateOptions(options: Partial<GridviewComponentUpdateOptions>): void;
31
+ updateOptions(options: Partial<GridviewComponentOptions>): void;
33
32
  addPanel<T extends object = Parameters>(options: AddComponentOptions<T>): IGridviewPanel;
34
33
  removePanel(panel: IGridviewPanel, sizing?: Sizing): void;
35
34
  focus(): void;
@@ -62,8 +61,8 @@ export declare class GridviewComponent extends BaseGrid<GridviewPanel> implement
62
61
  get options(): GridviewComponentOptions;
63
62
  get deserializer(): IPanelDeserializer | undefined;
64
63
  set deserializer(value: IPanelDeserializer | undefined);
65
- constructor(options: GridviewComponentOptions);
66
- updateOptions(options: Partial<GridviewComponentUpdateOptions>): void;
64
+ constructor(parentElement: HTMLElement, options: GridviewComponentOptions);
65
+ updateOptions(options: Partial<GridviewComponentOptions>): void;
67
66
  removePanel(panel: GridviewPanel): void;
68
67
  /**
69
68
  * Serialize the current state of the layout
@@ -20,13 +20,14 @@ export class GridviewComponent extends BaseGrid {
20
20
  set deserializer(value) {
21
21
  this._deserializer = value;
22
22
  }
23
- constructor(options) {
23
+ constructor(parentElement, options) {
24
24
  super({
25
- parentElement: options.parentElement,
25
+ parentElement: parentElement,
26
26
  proportionalLayout: options.proportionalLayout,
27
27
  orientation: options.orientation,
28
28
  styles: options.styles,
29
29
  disableAutoResizing: options.disableAutoResizing,
30
+ className: options.className,
30
31
  });
31
32
  this._onDidLayoutfromJSON = new Emitter();
32
33
  this.onDidLayoutFromJSON = this._onDidLayoutfromJSON.event;
@@ -52,6 +53,7 @@ export class GridviewComponent extends BaseGrid {
52
53
  }
53
54
  }
54
55
  updateOptions(options) {
56
+ super.updateOptions(options);
55
57
  const hasOrientationChanged = typeof options.orientation === 'string' &&
56
58
  this.gridview.orientation !== options.orientation;
57
59
  this._options = Object.assign(Object.assign({}, this.options), options);
@@ -13,5 +13,5 @@ export interface GridviewComponentOptions {
13
13
  };
14
14
  frameworkComponentFactory?: FrameworkFactory<GridviewPanel>;
15
15
  styles?: ISplitviewStyles;
16
- parentElement: HTMLElement;
16
+ className?: string;
17
17
  }
@@ -35,7 +35,7 @@ export * from './gridview/gridviewPanel';
35
35
  export * from './splitview/splitviewPanel';
36
36
  export * from './paneview/paneviewPanel';
37
37
  export * from './dockview/types';
38
- export { DockviewPanelRenderer } from './overlayRenderContainer';
38
+ export { DockviewPanelRenderer } from './overlay/overlayRenderContainer';
39
39
  export { Position, positionToDirection, directionToPosition, MeasuredValue, DroptargetOverlayModel, } from './dnd/droptarget';
40
40
  export { FocusEvent, PanelDimensionChangeEvent, VisibilityEvent, ActiveEvent, PanelApi, } from './api/panelApi';
41
41
  export { SizeEvent, GridviewPanelApi, GridConstraintChangeEvent, } from './api/gridviewPanelApi';
@@ -44,3 +44,4 @@ export { PanelSizeEvent, PanelConstraintChangeEvent, SplitviewPanelApi, } from '
44
44
  export { ExpansionEvent, PaneviewPanelApi } from './api/paneviewPanelApi';
45
45
  export { DockviewGroupPanelApi, DockviewGroupPanelFloatingChangeEvent, } from './api/dockviewGroupPanelApi';
46
46
  export { CommonApi, SplitviewApi, PaneviewApi, GridviewApi, DockviewApi, } from './api/component.api';
47
+ export { createDockview, createGridview, createPaneview, createSplitview, } from './api/entryPoints';
package/dist/esm/index.js CHANGED
@@ -32,3 +32,4 @@ export * from './paneview/paneviewPanel';
32
32
  export * from './dockview/types';
33
33
  export { positionToDirection, directionToPosition, } from './dnd/droptarget';
34
34
  export { SplitviewApi, PaneviewApi, GridviewApi, DockviewApi, } from './api/component.api';
35
+ export { createDockview, createGridview, createPaneview, createSplitview, } from './api/entryPoints';
@@ -1,6 +1,7 @@
1
1
  import { Event } from '../events';
2
2
  import { CompositeDisposable } from '../lifecycle';
3
3
  import { AnchoredBox } from '../types';
4
+ export declare const DEFAULT_OVERLAY_Z_INDEX = 999;
4
5
  export declare class Overlay extends CompositeDisposable {
5
6
  private readonly options;
6
7
  private _element;
@@ -14,12 +15,14 @@ export declare class Overlay extends CompositeDisposable {
14
15
  private horiziontalAlignment;
15
16
  set minimumInViewportWidth(value: number | undefined);
16
17
  set minimumInViewportHeight(value: number | undefined);
18
+ get element(): HTMLElement;
17
19
  constructor(options: AnchoredBox & {
18
20
  container: HTMLElement;
19
21
  content: HTMLElement;
20
22
  minimumInViewportWidth?: number;
21
23
  minimumInViewportHeight?: number;
22
24
  });
25
+ bringToFront(): void;
23
26
  setBounds(bounds?: Partial<AnchoredBox>): void;
24
27
  toJSON(): AnchoredBox;
25
28
  setupDrag(dragTarget: HTMLElement, options?: {
@@ -1,18 +1,31 @@
1
- import { getElementsByTagName, quasiDefaultPrevented, toggleClass, } from '../dom';
1
+ import { disableIframePointEvents, quasiDefaultPrevented, toggleClass, } from '../dom';
2
2
  import { Emitter, addDisposableListener, addDisposableWindowListener, } from '../events';
3
3
  import { CompositeDisposable, MutableDisposable } from '../lifecycle';
4
4
  import { clamp } from '../math';
5
- const bringElementToFront = (() => {
6
- let previous = null;
7
- function pushToTop(element) {
8
- if (previous !== element && previous !== null) {
9
- toggleClass(previous, 'dv-bring-to-front', false);
5
+ export const DEFAULT_OVERLAY_Z_INDEX = 999;
6
+ class AriaLevelTracker {
7
+ constructor() {
8
+ this._orderedList = [];
9
+ }
10
+ push(element) {
11
+ this._orderedList = [
12
+ ...this._orderedList.filter((item) => item !== element),
13
+ element,
14
+ ];
15
+ this.update();
16
+ }
17
+ destroy(element) {
18
+ this._orderedList = this._orderedList.filter((item) => item !== element);
19
+ this.update();
20
+ }
21
+ update() {
22
+ for (let i = 0; i < this._orderedList.length; i++) {
23
+ this._orderedList[i].setAttribute('aria-level', `${i}`);
24
+ this._orderedList[i].style.zIndex = `${DEFAULT_OVERLAY_Z_INDEX + i * 2}`;
10
25
  }
11
- toggleClass(element, 'dv-bring-to-front', true);
12
- previous = element;
13
26
  }
14
- return pushToTop;
15
- })();
27
+ }
28
+ const arialLevelTracker = new AriaLevelTracker();
16
29
  export class Overlay extends CompositeDisposable {
17
30
  set minimumInViewportWidth(value) {
18
31
  this.options.minimumInViewportWidth = value;
@@ -20,6 +33,9 @@ export class Overlay extends CompositeDisposable {
20
33
  set minimumInViewportHeight(value) {
21
34
  this.options.minimumInViewportHeight = value;
22
35
  }
36
+ get element() {
37
+ return this._element;
38
+ }
23
39
  constructor(options) {
24
40
  super();
25
41
  this.options = options;
@@ -42,6 +58,10 @@ export class Overlay extends CompositeDisposable {
42
58
  this.options.container.appendChild(this._element);
43
59
  // if input bad resize within acceptable boundaries
44
60
  this.setBounds(Object.assign(Object.assign(Object.assign(Object.assign({ height: this.options.height, width: this.options.width }, ('top' in this.options && { top: this.options.top })), ('bottom' in this.options && { bottom: this.options.bottom })), ('left' in this.options && { left: this.options.left })), ('right' in this.options && { right: this.options.right })));
61
+ arialLevelTracker.push(this._element);
62
+ }
63
+ bringToFront() {
64
+ arialLevelTracker.push(this._element);
45
65
  }
46
66
  setBounds(bounds = {}) {
47
67
  if (typeof bounds.height === 'number') {
@@ -129,18 +149,10 @@ export class Overlay extends CompositeDisposable {
129
149
  const move = new MutableDisposable();
130
150
  const track = () => {
131
151
  let offset = null;
132
- const iframes = [
133
- ...getElementsByTagName('iframe'),
134
- ...getElementsByTagName('webview'),
135
- ];
136
- for (const iframe of iframes) {
137
- iframe.style.pointerEvents = 'none';
138
- }
152
+ const iframes = disableIframePointEvents();
139
153
  move.value = new CompositeDisposable({
140
154
  dispose: () => {
141
- for (const iframe of iframes) {
142
- iframe.style.pointerEvents = 'auto';
143
- }
155
+ iframes.release();
144
156
  },
145
157
  }, addDisposableWindowListener(window, 'mousemove', (e) => {
146
158
  const containerRect = this.options.container.getBoundingClientRect();
@@ -209,9 +221,8 @@ export class Overlay extends CompositeDisposable {
209
221
  track();
210
222
  }
211
223
  }), addDisposableListener(this.options.content, 'mousedown', () => {
212
- bringElementToFront(this._element);
224
+ arialLevelTracker.push(this._element);
213
225
  }, true));
214
- bringElementToFront(this._element);
215
226
  if (options.inDragMode) {
216
227
  track();
217
228
  }
@@ -224,13 +235,7 @@ export class Overlay extends CompositeDisposable {
224
235
  this.addDisposables(move, addDisposableListener(resizeHandleElement, 'mousedown', (e) => {
225
236
  e.preventDefault();
226
237
  let startPosition = null;
227
- const iframes = [
228
- ...getElementsByTagName('iframe'),
229
- ...getElementsByTagName('webview'),
230
- ];
231
- for (const iframe of iframes) {
232
- iframe.style.pointerEvents = 'none';
233
- }
238
+ const iframes = disableIframePointEvents();
234
239
  move.value = new CompositeDisposable(addDisposableWindowListener(window, 'mousemove', (e) => {
235
240
  const containerRect = this.options.container.getBoundingClientRect();
236
241
  const overlayRect = this._element.getBoundingClientRect();
@@ -353,9 +358,7 @@ export class Overlay extends CompositeDisposable {
353
358
  this.setBounds(bounds);
354
359
  }), {
355
360
  dispose: () => {
356
- for (const iframe of iframes) {
357
- iframe.style.pointerEvents = 'auto';
358
- }
361
+ iframes.release();
359
362
  },
360
363
  }, addDisposableWindowListener(window, 'mouseup', () => {
361
364
  move.dispose();
@@ -376,6 +379,7 @@ export class Overlay extends CompositeDisposable {
376
379
  return 0;
377
380
  }
378
381
  dispose() {
382
+ arialLevelTracker.destroy(this._element);
379
383
  this._element.remove();
380
384
  super.dispose();
381
385
  }
@@ -1,16 +1,18 @@
1
- import { Droptarget } from './dnd/droptarget';
2
- import { CompositeDisposable } from './lifecycle';
3
- import { IDockviewPanel } from './dockview/dockviewPanel';
1
+ import { Droptarget } from '../dnd/droptarget';
2
+ import { CompositeDisposable } from '../lifecycle';
3
+ import { IDockviewPanel } from '../dockview/dockviewPanel';
4
+ import { DockviewComponent } from '../dockview/dockviewComponent';
4
5
  export type DockviewPanelRenderer = 'onlyWhenVisible' | 'always';
5
6
  export interface IRenderable {
6
7
  readonly element: HTMLElement;
7
8
  readonly dropTarget: Droptarget;
8
9
  }
9
10
  export declare class OverlayRenderContainer extends CompositeDisposable {
10
- private readonly element;
11
+ readonly element: HTMLElement;
12
+ readonly accessor: DockviewComponent;
11
13
  private readonly map;
12
14
  private _disposed;
13
- constructor(element: HTMLElement);
15
+ constructor(element: HTMLElement, accessor: DockviewComponent);
14
16
  detatch(panel: IDockviewPanel): boolean;
15
17
  attach(options: {
16
18
  panel: IDockviewPanel;
@@ -1,15 +1,17 @@
1
- import { DragAndDropObserver } from './dnd/dnd';
2
- import { getDomNodePagePosition, toggleClass } from './dom';
3
- import { CompositeDisposable, Disposable } from './lifecycle';
1
+ import { DragAndDropObserver } from '../dnd/dnd';
2
+ import { getDomNodePagePosition, toggleClass } from '../dom';
3
+ import { CompositeDisposable, Disposable, MutableDisposable, } from '../lifecycle';
4
+ import { DEFAULT_OVERLAY_Z_INDEX } from './overlay';
4
5
  function createFocusableElement() {
5
6
  const element = document.createElement('div');
6
7
  element.tabIndex = -1;
7
8
  return element;
8
9
  }
9
10
  export class OverlayRenderContainer extends CompositeDisposable {
10
- constructor(element) {
11
+ constructor(element, accessor) {
11
12
  super();
12
13
  this.element = element;
14
+ this.accessor = accessor;
13
15
  this.map = {};
14
16
  this._disposed = false;
15
17
  this.addDisposables(Disposable.from(() => {
@@ -65,7 +67,35 @@ export class OverlayRenderContainer extends CompositeDisposable {
65
67
  }
66
68
  focusContainer.style.display = panel.api.isVisible ? '' : 'none';
67
69
  };
68
- const disposable = new CompositeDisposable(
70
+ const observerDisposable = new MutableDisposable();
71
+ const correctLayerPosition = () => {
72
+ if (panel.api.location.type === 'floating') {
73
+ queueMicrotask(() => {
74
+ const floatingGroup = this.accessor.floatingGroups.find((group) => group.group === panel.api.group);
75
+ if (!floatingGroup) {
76
+ return;
77
+ }
78
+ const element = floatingGroup.overlay.element;
79
+ const update = () => {
80
+ const level = Number(element.getAttribute('aria-level'));
81
+ focusContainer.style.zIndex = `${DEFAULT_OVERLAY_Z_INDEX + level * 2 + 1}`;
82
+ };
83
+ const observer = new MutationObserver(() => {
84
+ update();
85
+ });
86
+ observerDisposable.value = Disposable.from(() => observer.disconnect());
87
+ observer.observe(element, {
88
+ attributeFilter: ['aria-level'],
89
+ attributes: true,
90
+ });
91
+ update();
92
+ });
93
+ }
94
+ else {
95
+ focusContainer.style.zIndex = ''; // reset the z-index, perhaps CSS will take over here
96
+ }
97
+ };
98
+ const disposable = new CompositeDisposable(observerDisposable,
69
99
  /**
70
100
  * since container is positioned absoutely we must explicitly forward
71
101
  * the dnd events for the expect behaviours to continue to occur in terms of dnd
@@ -89,7 +119,7 @@ export class OverlayRenderContainer extends CompositeDisposable {
89
119
  onDragOver: (e) => {
90
120
  referenceContainer.dropTarget.dnd.onDragOver(e);
91
121
  },
92
- }), panel.api.onDidVisibilityChange((event) => {
122
+ }), panel.api.onDidVisibilityChange(() => {
93
123
  /**
94
124
  * Control the visibility of the content, however even when not visible (display: none)
95
125
  * the content is still maintained within the DOM hence DOM specific attributes
@@ -101,6 +131,8 @@ export class OverlayRenderContainer extends CompositeDisposable {
101
131
  return;
102
132
  }
103
133
  resize();
134
+ }), panel.api.onDidLocationChange(() => {
135
+ correctLayerPosition();
104
136
  }));
105
137
  this.map[panel.api.id].destroy = Disposable.from(() => {
106
138
  var _a;
@@ -109,6 +141,7 @@ export class OverlayRenderContainer extends CompositeDisposable {
109
141
  }
110
142
  (_a = focusContainer.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(focusContainer);
111
143
  });
144
+ correctLayerPosition();
112
145
  queueMicrotask(() => {
113
146
  if (this.isDisposed) {
114
147
  return;
@@ -21,5 +21,5 @@ export interface PaneviewComponentOptions {
21
21
  };
22
22
  disableDnd?: boolean;
23
23
  showDndOverlay?: (event: PaneviewDndOverlayEvent) => boolean;
24
- parentElement: HTMLElement;
24
+ className?: string;
25
25
  }
@@ -103,6 +103,7 @@ export declare class PaneviewComponent extends Resizable implements IPaneviewCom
103
103
  readonly onDidAddView: Event<PaneviewPanel>;
104
104
  private readonly _onDidRemoveView;
105
105
  readonly onDidRemoveView: Event<PaneviewPanel>;
106
+ private classNames;
106
107
  get id(): string;
107
108
  get panels(): PaneviewPanel[];
108
109
  set paneview(value: Paneview);
@@ -112,7 +113,7 @@ export declare class PaneviewComponent extends Resizable implements IPaneviewCom
112
113
  get height(): number;
113
114
  get width(): number;
114
115
  get options(): PaneviewComponentOptions;
115
- constructor(options: PaneviewComponentOptions);
116
+ constructor(parentElement: HTMLElement, options: PaneviewComponentOptions);
116
117
  setVisible(panel: PaneviewPanel, visible: boolean): void;
117
118
  focus(): void;
118
119
  updateOptions(options: Partial<PaneviewComponentOptions>): void;
@@ -8,6 +8,7 @@ import { DraggablePaneviewPanel, } from './draggablePaneviewPanel';
8
8
  import { DefaultHeader } from './defaultPaneviewHeader';
9
9
  import { sequentialNumberGenerator } from '../math';
10
10
  import { Resizable } from '../resizable';
11
+ import { toggleClass } from '../dom';
11
12
  const nextLayoutId = sequentialNumberGenerator();
12
13
  export class PaneFramework extends DraggablePaneviewPanel {
13
14
  constructor(options) {
@@ -56,8 +57,9 @@ export class PaneviewComponent extends Resizable {
56
57
  get options() {
57
58
  return this._options;
58
59
  }
59
- constructor(options) {
60
- super(options.parentElement, options.disableAutoResizing);
60
+ constructor(parentElement, options) {
61
+ var _a, _b;
62
+ super(parentElement, options.disableAutoResizing);
61
63
  this._id = nextLayoutId.next();
62
64
  this._disposable = new MutableDisposable();
63
65
  this._viewDisposables = new Map();
@@ -71,7 +73,12 @@ export class PaneviewComponent extends Resizable {
71
73
  this.onDidAddView = this._onDidAddView.event;
72
74
  this._onDidRemoveView = new Emitter();
73
75
  this.onDidRemoveView = this._onDidRemoveView.event;
76
+ this.classNames = [];
74
77
  this.addDisposables(this._onDidLayoutChange, this._onDidLayoutfromJSON, this._onDidDrop, this._onDidAddView, this._onDidRemoveView);
78
+ this.classNames = (_b = (_a = options.className) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
79
+ for (const className of this.classNames) {
80
+ toggleClass(this.element, className, true);
81
+ }
75
82
  this._options = options;
76
83
  if (!options.components) {
77
84
  options.components = {};
@@ -93,6 +100,16 @@ export class PaneviewComponent extends Resizable {
93
100
  //noop
94
101
  }
95
102
  updateOptions(options) {
103
+ var _a, _b;
104
+ if ('className' in options) {
105
+ for (const className of this.classNames) {
106
+ toggleClass(this.element, className, false);
107
+ }
108
+ this.classNames = (_b = (_a = options.className) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
109
+ for (const className of this.classNames) {
110
+ toggleClass(this.element, className, true);
111
+ }
112
+ }
96
113
  this._options = Object.assign(Object.assign({}, this.options), options);
97
114
  }
98
115
  addPanel(options) {
@@ -19,5 +19,5 @@ export interface SplitviewComponentOptions extends SplitViewOptions {
19
19
  [componentName: string]: any;
20
20
  };
21
21
  frameworkWrapper?: FrameworkFactory<SplitviewPanel>;
22
- parentElement: HTMLElement;
22
+ className?: string;
23
23
  }
@@ -2,7 +2,7 @@
2
2
  * Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:
3
3
  * https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { removeClasses, addClasses, toggleClass, getElementsByTagName, } from '../dom';
5
+ import { removeClasses, addClasses, toggleClass, disableIframePointEvents, } from '../dom';
6
6
  import { Emitter } from '../events';
7
7
  import { pushToStart, pushToEnd, firstIndex } from '../array';
8
8
  import { range, clamp } from '../math';
@@ -359,13 +359,7 @@ export class Splitview {
359
359
  for (const item of this.viewItems) {
360
360
  item.enabled = false;
361
361
  }
362
- const iframes = [
363
- ...getElementsByTagName('iframe'),
364
- ...getElementsByTagName('webview'),
365
- ];
366
- for (const iframe of iframes) {
367
- iframe.style.pointerEvents = 'none';
368
- }
362
+ const iframes = disableIframePointEvents();
369
363
  const start = this._orientation === Orientation.HORIZONTAL
370
364
  ? event.clientX
371
365
  : event.clientY;
@@ -427,9 +421,7 @@ export class Splitview {
427
421
  for (const item of this.viewItems) {
428
422
  item.enabled = true;
429
423
  }
430
- for (const iframe of iframes) {
431
- iframe.style.pointerEvents = 'auto';
432
- }
424
+ iframes.release();
433
425
  this.saveProportions();
434
426
  document.removeEventListener('pointermove', onPointerMove);
435
427
  document.removeEventListener('pointerup', end);
@@ -596,29 +588,47 @@ export class Splitview {
596
588
  if (this.viewItems.length === 0) {
597
589
  return;
598
590
  }
599
- const sashCount = this.viewItems.length - 1;
600
- const marginReducedSize = (this.margin * sashCount) / this.viewItems.length;
591
+ const visibleViewItems = this.viewItems.filter((i) => i.visible);
592
+ const sashCount = Math.max(0, visibleViewItems.length - 1);
593
+ const marginReducedSize = (this.margin * sashCount) / Math.max(1, visibleViewItems.length);
601
594
  let totalLeftOffset = 0;
602
595
  const viewLeftOffsets = [];
603
- for (let i = 0; i < this.viewItems.length - 1; i++) {
604
- totalLeftOffset += this.viewItems[i].size;
605
- viewLeftOffsets.push(totalLeftOffset);
606
- const offset = Math.min(Math.max(0, totalLeftOffset - 2), this.size - this.margin);
607
- if (this._orientation === Orientation.HORIZONTAL) {
608
- this.sashes[i].container.style.left = `${offset}px`;
609
- this.sashes[i].container.style.top = `0px`;
596
+ const sashWidth = 4; // hardcoded in css
597
+ const runningVisiblePanelCount = this.viewItems.reduce((arr, viewItem, i) => {
598
+ const flag = viewItem.visible ? 1 : 0;
599
+ if (i === 0) {
600
+ arr.push(flag);
610
601
  }
611
- if (this._orientation === Orientation.VERTICAL) {
612
- this.sashes[i].container.style.left = `0px`;
613
- this.sashes[i].container.style.top = `${offset}px`;
602
+ else {
603
+ arr.push(arr[i - 1] + flag);
614
604
  }
615
- }
605
+ return arr;
606
+ }, []);
607
+ // calculate both view and cash positions
616
608
  this.viewItems.forEach((view, i) => {
617
- const size = view.size - marginReducedSize;
618
- const offset = i === 0
609
+ totalLeftOffset += this.viewItems[i].size;
610
+ viewLeftOffsets.push(totalLeftOffset);
611
+ const size = view.visible ? view.size - marginReducedSize : 0;
612
+ const visiblePanelsBeforeThisView = Math.max(0, runningVisiblePanelCount[i] - 1);
613
+ const offset = i === 0 || visiblePanelsBeforeThisView === 0
619
614
  ? 0
620
615
  : viewLeftOffsets[i - 1] +
621
- (i / sashCount) * marginReducedSize;
616
+ (visiblePanelsBeforeThisView / sashCount) * marginReducedSize;
617
+ if (i < this.viewItems.length - 1) {
618
+ // calculate sash position
619
+ const newSize = view.visible
620
+ ? offset + size - sashWidth / 2 + this.margin / 2
621
+ : offset;
622
+ if (this._orientation === Orientation.HORIZONTAL) {
623
+ this.sashes[i].container.style.left = `${newSize}px`;
624
+ this.sashes[i].container.style.top = `0px`;
625
+ }
626
+ if (this._orientation === Orientation.VERTICAL) {
627
+ this.sashes[i].container.style.left = `0px`;
628
+ this.sashes[i].container.style.top = `${newSize}px`;
629
+ }
630
+ }
631
+ // calculate view position
622
632
  if (this._orientation === Orientation.HORIZONTAL) {
623
633
  view.container.style.width = `${size}px`;
624
634
  view.container.style.left = `${offset}px`;
@@ -1,5 +1,5 @@
1
1
  import { IDisposable } from '../lifecycle';
2
- import { IView, LayoutPriority, Orientation, Sizing, Splitview } from './splitview';
2
+ import { IView, LayoutPriority, Orientation, Sizing, Splitview, SplitViewOptions } from './splitview';
3
3
  import { SplitviewComponentOptions } from './options';
4
4
  import { BaseComponentOptions, Parameters } from '../panel/types';
5
5
  import { Event } from '../events';
@@ -31,7 +31,6 @@ export interface AddSplitviewComponentOptions<T extends Parameters = Parameters>
31
31
  minimumSize?: number;
32
32
  maximumSize?: number;
33
33
  }
34
- export type SplitviewComponentUpdateOptions = Pick<SplitviewComponentOptions, 'orientation' | 'components' | 'frameworkComponents'>;
35
34
  export interface ISplitviewComponent extends IDisposable {
36
35
  readonly minimumSize: number;
37
36
  readonly maximumSize: number;
@@ -43,7 +42,7 @@ export interface ISplitviewComponent extends IDisposable {
43
42
  readonly onDidRemoveView: Event<IView>;
44
43
  readonly onDidLayoutFromJSON: Event<void>;
45
44
  readonly panels: SplitviewPanel[];
46
- updateOptions(options: Partial<SplitviewComponentUpdateOptions>): void;
45
+ updateOptions(options: Partial<SplitViewOptions>): void;
47
46
  addPanel<T extends object = Parameters>(options: AddSplitviewComponentOptions<T>): ISplitviewPanel;
48
47
  layout(width: number, height: number): void;
49
48
  onDidLayoutChange: Event<void>;
@@ -73,6 +72,7 @@ export declare class SplitviewComponent extends Resizable implements ISplitviewC
73
72
  readonly onDidRemoveView: Event<IView>;
74
73
  private readonly _onDidLayoutChange;
75
74
  readonly onDidLayoutChange: Event<void>;
75
+ private classNames;
76
76
  get panels(): SplitviewPanel[];
77
77
  get options(): SplitviewComponentOptions;
78
78
  get length(): number;
@@ -83,8 +83,8 @@ export declare class SplitviewComponent extends Resizable implements ISplitviewC
83
83
  get maximumSize(): number;
84
84
  get height(): number;
85
85
  get width(): number;
86
- constructor(options: SplitviewComponentOptions);
87
- updateOptions(options: Partial<SplitviewComponentUpdateOptions>): void;
86
+ constructor(parentElement: HTMLElement, options: SplitviewComponentOptions);
87
+ updateOptions(options: Partial<SplitviewComponentOptions>): void;
88
88
  focus(): void;
89
89
  movePanel(from: number, to: number): void;
90
90
  setVisible(panel: SplitviewPanel, visible: boolean): void;
@@ -3,6 +3,7 @@ import { Orientation, Sizing, Splitview, } from './splitview';
3
3
  import { Emitter } from '../events';
4
4
  import { createComponent } from '../panel/componentFactory';
5
5
  import { Resizable } from '../resizable';
6
+ import { toggleClass } from '../dom';
6
7
  /**
7
8
  * A high-level implementation of splitview that works using 'panels'
8
9
  */
@@ -44,8 +45,9 @@ export class SplitviewComponent extends Resizable {
44
45
  ? this.splitview.size
45
46
  : this.splitview.orthogonalSize;
46
47
  }
47
- constructor(options) {
48
- super(options.parentElement, options.disableAutoResizing);
48
+ constructor(parentElement, options) {
49
+ var _a, _b;
50
+ super(parentElement, options.disableAutoResizing);
49
51
  this._splitviewChangeDisposable = new MutableDisposable();
50
52
  this._panels = new Map();
51
53
  this._onDidLayoutfromJSON = new Emitter();
@@ -56,6 +58,11 @@ export class SplitviewComponent extends Resizable {
56
58
  this.onDidRemoveView = this._onDidRemoveView.event;
57
59
  this._onDidLayoutChange = new Emitter();
58
60
  this.onDidLayoutChange = this._onDidLayoutChange.event;
61
+ this.classNames = [];
62
+ this.classNames = (_b = (_a = options.className) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
63
+ for (const className of this.classNames) {
64
+ toggleClass(this.element, className, true);
65
+ }
59
66
  this._options = options;
60
67
  if (!options.components) {
61
68
  options.components = {};
@@ -67,6 +74,16 @@ export class SplitviewComponent extends Resizable {
67
74
  this.addDisposables(this._onDidAddView, this._onDidLayoutfromJSON, this._onDidRemoveView, this._onDidLayoutChange);
68
75
  }
69
76
  updateOptions(options) {
77
+ var _a, _b;
78
+ if ('className' in options) {
79
+ for (const className of this.classNames) {
80
+ toggleClass(this.element, className, false);
81
+ }
82
+ this.classNames = (_b = (_a = options.className) === null || _a === void 0 ? void 0 : _a.split(' ')) !== null && _b !== void 0 ? _b : [];
83
+ for (const className of this.classNames) {
84
+ toggleClass(this.element, className, true);
85
+ }
86
+ }
70
87
  const hasOrientationChanged = typeof options.orientation === 'string' &&
71
88
  this.options.orientation !== options.orientation;
72
89
  this._options = Object.assign(Object.assign({}, this.options), options);