dockview-core 4.13.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +56 -8
  2. package/dist/cjs/api/dockviewGroupPanelApi.d.ts +5 -0
  3. package/dist/cjs/api/dockviewGroupPanelApi.js +13 -1
  4. package/dist/cjs/api/dockviewPanelApi.js +1 -1
  5. package/dist/cjs/constants.js +6 -1
  6. package/dist/cjs/dnd/abstractDragHandler.js +3 -1
  7. package/dist/cjs/dnd/droptarget.js +2 -2
  8. package/dist/cjs/dockview/components/popupService.js +2 -0
  9. package/dist/cjs/dockview/components/titlebar/tabs.d.ts +5 -0
  10. package/dist/cjs/dockview/components/titlebar/tabs.js +31 -4
  11. package/dist/cjs/dockview/components/titlebar/tabsContainer.d.ts +5 -0
  12. package/dist/cjs/dockview/components/titlebar/tabsContainer.js +21 -0
  13. package/dist/cjs/dockview/deserializer.js +1 -1
  14. package/dist/cjs/dockview/dockviewComponent.d.ts +2 -1
  15. package/dist/cjs/dockview/dockviewComponent.js +73 -47
  16. package/dist/cjs/dockview/dockviewGroupPanel.js +16 -13
  17. package/dist/cjs/dockview/dockviewGroupPanelModel.d.ts +11 -1
  18. package/dist/cjs/dockview/dockviewGroupPanelModel.js +62 -5
  19. package/dist/cjs/dockview/framework.d.ts +2 -0
  20. package/dist/cjs/dockview/options.d.ts +3 -0
  21. package/dist/cjs/dockview/options.js +1 -0
  22. package/dist/cjs/dom.js +9 -1
  23. package/dist/cjs/framwork.d.ts +1 -1
  24. package/dist/cjs/lifecycle.d.ts +2 -1
  25. package/dist/cjs/lifecycle.js +6 -3
  26. package/dist/cjs/overlay/overlay.js +2 -1
  27. package/dist/cjs/overlay/overlayRenderContainer.js +8 -0
  28. package/dist/cjs/scrollbar.d.ts +5 -2
  29. package/dist/cjs/scrollbar.js +88 -26
  30. package/dist/dockview-core.js +273 -66
  31. package/dist/dockview-core.min.js +2 -2
  32. package/dist/dockview-core.min.js.map +1 -1
  33. package/dist/dockview-core.min.noStyle.js +2 -2
  34. package/dist/dockview-core.min.noStyle.js.map +1 -1
  35. package/dist/dockview-core.noStyle.js +272 -65
  36. package/dist/esm/api/dockviewGroupPanelApi.d.ts +5 -0
  37. package/dist/esm/api/dockviewGroupPanelApi.js +14 -2
  38. package/dist/esm/api/dockviewPanelApi.js +1 -1
  39. package/dist/esm/constants.js +6 -1
  40. package/dist/esm/dnd/abstractDragHandler.js +3 -1
  41. package/dist/esm/dnd/droptarget.js +2 -2
  42. package/dist/esm/dockview/components/popupService.js +2 -0
  43. package/dist/esm/dockview/components/titlebar/tabs.d.ts +5 -0
  44. package/dist/esm/dockview/components/titlebar/tabs.js +28 -5
  45. package/dist/esm/dockview/components/titlebar/tabsContainer.d.ts +5 -0
  46. package/dist/esm/dockview/components/titlebar/tabsContainer.js +18 -1
  47. package/dist/esm/dockview/deserializer.js +1 -1
  48. package/dist/esm/dockview/dockviewComponent.d.ts +2 -1
  49. package/dist/esm/dockview/dockviewComponent.js +15 -3
  50. package/dist/esm/dockview/dockviewGroupPanel.js +17 -14
  51. package/dist/esm/dockview/dockviewGroupPanelModel.d.ts +11 -1
  52. package/dist/esm/dockview/dockviewGroupPanelModel.js +61 -8
  53. package/dist/esm/dockview/framework.d.ts +2 -0
  54. package/dist/esm/dockview/options.d.ts +3 -0
  55. package/dist/esm/dockview/options.js +1 -0
  56. package/dist/esm/dom.js +9 -1
  57. package/dist/esm/framwork.d.ts +1 -1
  58. package/dist/esm/lifecycle.d.ts +2 -1
  59. package/dist/esm/lifecycle.js +6 -3
  60. package/dist/esm/overlay/overlay.js +2 -1
  61. package/dist/esm/overlay/overlayRenderContainer.js +8 -0
  62. package/dist/esm/scrollbar.d.ts +5 -2
  63. package/dist/esm/scrollbar.js +85 -27
  64. package/dist/{dockview-core.cjs.js → package/main.cjs.js} +273 -66
  65. package/dist/package/main.cjs.min.js +7 -0
  66. package/dist/package/main.esm.min.mjs +7 -0
  67. package/dist/{dockview-core.esm.js → package/main.esm.mjs} +273 -66
  68. package/dist/styles/dockview.css +63 -7
  69. package/package.json +63 -53
  70. package/dist/dockview-core.amd.js +0 -11373
  71. package/dist/dockview-core.amd.js.map +0 -1
  72. package/dist/dockview-core.amd.min.js +0 -8
  73. package/dist/dockview-core.amd.min.js.map +0 -1
  74. package/dist/dockview-core.amd.min.noStyle.js +0 -8
  75. package/dist/dockview-core.amd.min.noStyle.js.map +0 -1
  76. package/dist/dockview-core.amd.noStyle.js +0 -11343
  77. package/dist/dockview-core.amd.noStyle.js.map +0 -1
  78. package/dist/dockview-core.cjs.js.map +0 -1
  79. package/dist/dockview-core.esm.js.map +0 -1
  80. package/dist/dockview-core.esm.min.js +0 -8
  81. package/dist/dockview-core.esm.min.js.map +0 -1
  82. package/dist/dockview-core.js.map +0 -1
  83. package/dist/dockview-core.noStyle.js.map +0 -1
@@ -29,6 +29,8 @@ export interface ViewFactoryData {
29
29
  content: string;
30
30
  tab?: string;
31
31
  }
32
+ export type DockviewHeaderPosition = 'top' | 'bottom' | 'left' | 'right';
33
+ export type DockviewHeaderDirection = 'horizontal' | 'vertical';
32
34
  export interface DockviewOptions {
33
35
  /**
34
36
  * Disable the auto-resizing which is controlled through a `ResizeObserver`.
@@ -44,6 +46,7 @@ export interface DockviewOptions {
44
46
  };
45
47
  popoutUrl?: string;
46
48
  defaultRenderer?: DockviewPanelRenderer;
49
+ defaultHeaderPosition?: DockviewHeaderPosition;
47
50
  debug?: boolean;
48
51
  dndEdges?: false | DroptargetOverlayModel;
49
52
  /**
@@ -22,6 +22,7 @@ export const PROPERTY_KEYS_DOCKVIEW = (() => {
22
22
  floatingGroupBounds: undefined,
23
23
  popoutUrl: undefined,
24
24
  defaultRenderer: undefined,
25
+ defaultHeaderPosition: undefined,
25
26
  debug: undefined,
26
27
  rootOverlayModel: undefined,
27
28
  locked: undefined,
package/dist/esm/dom.js CHANGED
@@ -267,9 +267,9 @@ export class Classnames {
267
267
  }
268
268
  const DEBOUCE_DELAY = 100;
269
269
  export function isChildEntirelyVisibleWithinParent(child, parent) {
270
- //
271
270
  const childPosition = getDomNodePagePosition(child);
272
271
  const parentPosition = getDomNodePagePosition(parent);
272
+ // Check horizontal visibility
273
273
  if (childPosition.left < parentPosition.left) {
274
274
  return false;
275
275
  }
@@ -277,6 +277,14 @@ export function isChildEntirelyVisibleWithinParent(child, parent) {
277
277
  parentPosition.left + parentPosition.width) {
278
278
  return false;
279
279
  }
280
+ // Check vertical visibility
281
+ if (childPosition.top < parentPosition.top) {
282
+ return false;
283
+ }
284
+ if (childPosition.top + childPosition.height >
285
+ parentPosition.top + parentPosition.height) {
286
+ return false;
287
+ }
280
288
  return true;
281
289
  }
282
290
  export function onDidWindowMoveEnd(window) {
@@ -1,4 +1,4 @@
1
- import { Parameters } from "./panel/types";
1
+ import { Parameters } from './panel/types';
2
2
  export interface PanelParameters<T extends {} = Parameters> {
3
3
  params: T;
4
4
  }
@@ -10,11 +10,12 @@ export declare namespace Disposable {
10
10
  function from(func: () => void): IDisposable;
11
11
  }
12
12
  export declare class CompositeDisposable {
13
- private _disposables;
13
+ private readonly _disposables;
14
14
  private _isDisposed;
15
15
  get isDisposed(): boolean;
16
16
  constructor(...args: IDisposable[]);
17
17
  addDisposables(...args: IDisposable[]): void;
18
+ removeDisposable(disposable: IDisposable): void;
18
19
  dispose(): void;
19
20
  }
20
21
  export declare class MutableDisposable implements IDisposable {
@@ -20,10 +20,13 @@ export class CompositeDisposable {
20
20
  }
21
21
  constructor(...args) {
22
22
  this._isDisposed = false;
23
- this._disposables = args;
23
+ this._disposables = new Set(args);
24
24
  }
25
25
  addDisposables(...args) {
26
- args.forEach((arg) => this._disposables.push(arg));
26
+ args.forEach((arg) => this._disposables.add(arg));
27
+ }
28
+ removeDisposable(disposable) {
29
+ this._disposables.delete(disposable);
27
30
  }
28
31
  dispose() {
29
32
  if (this._isDisposed) {
@@ -31,7 +34,7 @@ export class CompositeDisposable {
31
34
  }
32
35
  this._isDisposed = true;
33
36
  this._disposables.forEach((arg) => arg.dispose());
34
- this._disposables = [];
37
+ this._disposables.clear();
35
38
  }
36
39
  }
37
40
  export class MutableDisposable {
@@ -20,7 +20,8 @@ class AriaLevelTracker {
20
20
  update() {
21
21
  for (let i = 0; i < this._orderedList.length; i++) {
22
22
  this._orderedList[i].setAttribute('aria-level', `${i}`);
23
- this._orderedList[i].style.zIndex = `calc(var(--dv-overlay-z-index, 999) + ${i * 2})`;
23
+ this._orderedList[i].style.zIndex =
24
+ `calc(var(--dv-overlay-z-index, 999) + ${i * 2})`;
24
25
  }
25
26
  }
26
27
  }
@@ -79,6 +79,9 @@ export class OverlayRenderContainer extends CompositeDisposable {
79
79
  if (!this.map[panel.api.id]) {
80
80
  const element = createFocusableElement();
81
81
  element.className = 'dv-render-overlay';
82
+ // Hide until the first RAF-based position is applied to prevent a
83
+ // one-frame flash at position 0,0 when the element is first attached.
84
+ element.style.visibility = 'hidden';
82
85
  this.map[panel.api.id] = {
83
86
  panel,
84
87
  disposable: Disposable.NONE,
@@ -115,6 +118,11 @@ export class OverlayRenderContainer extends CompositeDisposable {
115
118
  focusContainer.style.top = `${top}px`;
116
119
  focusContainer.style.width = `${width}px`;
117
120
  focusContainer.style.height = `${height}px`;
121
+ // Reveal after the first position is applied (was hidden to
122
+ // prevent a flash at 0,0 before the initial layout fires).
123
+ if (focusContainer.style.visibility === 'hidden') {
124
+ focusContainer.style.visibility = '';
125
+ }
118
126
  toggleClass(focusContainer, 'dv-render-overlay-float', panel.group.api.location.type === 'floating');
119
127
  });
120
128
  };
@@ -2,11 +2,14 @@ import { CompositeDisposable } from './lifecycle';
2
2
  export declare class Scrollbar extends CompositeDisposable {
3
3
  private readonly scrollableElement;
4
4
  private readonly _element;
5
- private readonly _horizontalScrollbar;
6
- private _scrollLeft;
5
+ private readonly _scrollbar;
6
+ private _scrollOffset;
7
7
  private _animationTimer;
8
+ private _orientation;
8
9
  static MouseWheelSpeed: number;
9
10
  get element(): HTMLElement;
11
+ get orientation(): 'horizontal' | 'vertical';
12
+ set orientation(value: 'horizontal' | 'vertical');
10
13
  constructor(scrollableElement: HTMLElement);
11
14
  private calculateScrollbarStyles;
12
15
  }
@@ -1,4 +1,4 @@
1
- import { toggleClass, watchElementResize } from './dom';
1
+ import { addClasses, removeClasses, toggleClass, watchElementResize, } from './dom';
2
2
  import { addDisposableListener } from './events';
3
3
  import { CompositeDisposable } from './lifecycle';
4
4
  import { clamp } from './math';
@@ -6,30 +6,56 @@ export class Scrollbar extends CompositeDisposable {
6
6
  get element() {
7
7
  return this._element;
8
8
  }
9
+ get orientation() {
10
+ return this._orientation;
11
+ }
12
+ set orientation(value) {
13
+ if (this._orientation === value) {
14
+ return;
15
+ }
16
+ this._scrollOffset = 0;
17
+ this._orientation = value;
18
+ removeClasses(this._scrollbar, 'dv-scrollbar-vertical', 'dv-scrollbar-horizontal');
19
+ if (value === 'vertical') {
20
+ addClasses(this._scrollbar, 'dv-scrollbar-vertical');
21
+ }
22
+ else {
23
+ addClasses(this._scrollbar, 'dv-scrollbar-horizontal');
24
+ }
25
+ }
9
26
  constructor(scrollableElement) {
10
27
  super();
11
28
  this.scrollableElement = scrollableElement;
12
- this._scrollLeft = 0;
29
+ this._scrollOffset = 0;
30
+ this._orientation = 'horizontal';
13
31
  this._element = document.createElement('div');
14
32
  this._element.className = 'dv-scrollable';
15
- this._horizontalScrollbar = document.createElement('div');
16
- this._horizontalScrollbar.className = 'dv-scrollbar-horizontal';
33
+ this._scrollbar = document.createElement('div');
34
+ this._scrollbar.className = 'dv-scrollbar dv-scrollbar-horizontal';
17
35
  this.element.appendChild(scrollableElement);
18
- this.element.appendChild(this._horizontalScrollbar);
36
+ this.element.appendChild(this._scrollbar);
19
37
  this.addDisposables(addDisposableListener(this.element, 'wheel', (event) => {
20
- this._scrollLeft += event.deltaY * Scrollbar.MouseWheelSpeed;
38
+ this._scrollOffset += event.deltaY * Scrollbar.MouseWheelSpeed;
21
39
  this.calculateScrollbarStyles();
22
- }), addDisposableListener(this._horizontalScrollbar, 'pointerdown', (event) => {
40
+ }), addDisposableListener(this._scrollbar, 'pointerdown', (event) => {
23
41
  event.preventDefault();
24
42
  toggleClass(this.element, 'dv-scrollable-scrolling', true);
25
- const originalClientX = event.clientX;
26
- const originalScrollLeft = this._scrollLeft;
43
+ const originalClient = this._orientation === 'horizontal'
44
+ ? event.clientX
45
+ : event.clientY;
46
+ const originalScrollOffset = this._scrollOffset;
27
47
  const onPointerMove = (event) => {
28
- const deltaX = event.clientX - originalClientX;
29
- const { clientWidth } = this.element;
30
- const { scrollWidth } = this.scrollableElement;
31
- const p = clientWidth / scrollWidth;
32
- this._scrollLeft = originalScrollLeft + deltaX / p;
48
+ const delta = this._orientation === 'horizontal'
49
+ ? event.clientX - originalClient
50
+ : event.clientY - originalClient;
51
+ const clientSize = this._orientation === 'horizontal'
52
+ ? this.element.clientWidth
53
+ : this.element.clientHeight;
54
+ const scrollSize = this._orientation === 'horizontal'
55
+ ? this.scrollableElement.scrollWidth
56
+ : this.scrollableElement.scrollHeight;
57
+ const p = clientSize / scrollSize;
58
+ this._scrollOffset = originalScrollOffset + delta / p;
33
59
  this.calculateScrollbarStyles();
34
60
  };
35
61
  const onEnd = () => {
@@ -44,7 +70,10 @@ export class Scrollbar extends CompositeDisposable {
44
70
  }), addDisposableListener(this.element, 'scroll', () => {
45
71
  this.calculateScrollbarStyles();
46
72
  }), addDisposableListener(this.scrollableElement, 'scroll', () => {
47
- this._scrollLeft = this.scrollableElement.scrollLeft;
73
+ this._scrollOffset =
74
+ this._orientation === 'horizontal'
75
+ ? this.scrollableElement.scrollLeft
76
+ : this.scrollableElement.scrollTop;
48
77
  this.calculateScrollbarStyles();
49
78
  }), watchElementResize(this.element, () => {
50
79
  toggleClass(this.element, 'dv-scrollable-resizing', true);
@@ -59,21 +88,50 @@ export class Scrollbar extends CompositeDisposable {
59
88
  }));
60
89
  }
61
90
  calculateScrollbarStyles() {
62
- const { clientWidth } = this.element;
63
- const { scrollWidth } = this.scrollableElement;
64
- const hasScrollbar = scrollWidth > clientWidth;
91
+ const clientSize = this._orientation === 'horizontal'
92
+ ? this.element.clientWidth
93
+ : this.element.clientHeight;
94
+ const scrollSize = this._orientation === 'horizontal'
95
+ ? this.scrollableElement.scrollWidth
96
+ : this.scrollableElement.scrollHeight;
97
+ const hasScrollbar = scrollSize > clientSize;
65
98
  if (hasScrollbar) {
66
- const px = clientWidth * (clientWidth / scrollWidth);
67
- this._horizontalScrollbar.style.width = `${px}px`;
68
- this._scrollLeft = clamp(this._scrollLeft, 0, this.scrollableElement.scrollWidth - clientWidth);
69
- this.scrollableElement.scrollLeft = this._scrollLeft;
70
- const percentageComplete = this._scrollLeft / (scrollWidth - clientWidth);
71
- this._horizontalScrollbar.style.left = `${(clientWidth - px) * percentageComplete}px`;
99
+ const px = clientSize * (clientSize / scrollSize);
100
+ if (this._orientation === 'horizontal') {
101
+ this._scrollbar.style.width = `${px}px`;
102
+ this._scrollbar.style.height = '';
103
+ }
104
+ else {
105
+ this._scrollbar.style.height = `${px}px`;
106
+ this._scrollbar.style.width = '';
107
+ }
108
+ this._scrollOffset = clamp(this._scrollOffset, 0, scrollSize - clientSize);
109
+ if (this._orientation === 'horizontal') {
110
+ this.scrollableElement.scrollLeft = this._scrollOffset;
111
+ }
112
+ else {
113
+ this.scrollableElement.scrollTop = this._scrollOffset;
114
+ }
115
+ const percentageComplete = this._scrollOffset / (scrollSize - clientSize);
116
+ if (this._orientation === 'horizontal') {
117
+ this._scrollbar.style.left = `${(clientSize - px) * percentageComplete}px`;
118
+ this._scrollbar.style.top = '';
119
+ }
120
+ else {
121
+ this._scrollbar.style.top = `${(clientSize - px) * percentageComplete}px`;
122
+ this._scrollbar.style.left = '';
123
+ }
72
124
  }
73
125
  else {
74
- this._horizontalScrollbar.style.width = `0px`;
75
- this._horizontalScrollbar.style.left = `0px`;
76
- this._scrollLeft = 0;
126
+ if (this._orientation === 'horizontal') {
127
+ this._scrollbar.style.width = '0px';
128
+ this._scrollbar.style.left = '0px';
129
+ }
130
+ else {
131
+ this._scrollbar.style.height = '0px';
132
+ this._scrollbar.style.top = '0px';
133
+ }
134
+ this._scrollOffset = 0;
77
135
  }
78
136
  }
79
137
  }