chore: improve docs

This commit is contained in:
mathuo 2023-10-09 20:29:57 +01:00
parent 47f78ad649
commit 58e9f9b355
No known key found for this signature in database
GPG Key ID: C6EEDEFD6CA07281
22 changed files with 1359 additions and 886 deletions

View File

@ -15,7 +15,6 @@
"/packages/docs/sandboxes/floatinggroup-dockview", "/packages/docs/sandboxes/floatinggroup-dockview",
"/packages/docs/sandboxes/fullwidthtab-dockview", "/packages/docs/sandboxes/fullwidthtab-dockview",
"/packages/docs/sandboxes/headeractions-dockview", "/packages/docs/sandboxes/headeractions-dockview",
"/packages/docs/sandboxes/ide-example",
"/packages/docs/sandboxes/groupcontol-dockview", "/packages/docs/sandboxes/groupcontol-dockview",
"/packages/docs/sandboxes/iframe-dockview", "/packages/docs/sandboxes/iframe-dockview",
"/packages/docs/sandboxes/keyboard-dockview", "/packages/docs/sandboxes/keyboard-dockview",

View File

@ -56,132 +56,224 @@ export interface CommonApi<T = any> {
} }
export class SplitviewApi implements CommonApi<SerializedSplitview> { export class SplitviewApi implements CommonApi<SerializedSplitview> {
/**
* The minimum size the component can reach where size is measured in the direction of orientation provided.
*/
get minimumSize(): number { get minimumSize(): number {
return this.component.minimumSize; return this.component.minimumSize;
} }
/**
* The maximum size the component can reach where size is measured in the direction of orientation provided.
*/
get maximumSize(): number { get maximumSize(): number {
return this.component.maximumSize; return this.component.maximumSize;
} }
get height(): number { /**
return this.component.height; * Width of the component.
} */
get width(): number { get width(): number {
return this.component.width; return this.component.width;
} }
/**
* Height of the component.
*/
get height(): number {
return this.component.height;
}
/**
* The current number of panels.
*/
get length(): number { get length(): number {
return this.component.length; return this.component.length;
} }
/**
* The current orientation of the component.
*/
get orientation(): Orientation { get orientation(): Orientation {
return this.component.orientation; return this.component.orientation;
} }
/**
* The list of current panels.
*/
get panels(): ISplitviewPanel[] { get panels(): ISplitviewPanel[] {
return this.component.panels; return this.component.panels;
} }
/**
* Invoked after a layout is loaded through the `fromJSON` method.
*/
get onDidLayoutFromJSON(): Event<void> { get onDidLayoutFromJSON(): Event<void> {
return this.component.onDidLayoutFromJSON; return this.component.onDidLayoutFromJSON;
} }
/**
* Invoked whenever any aspect of the layout changes.
* If listening to this event it may be worth debouncing ouputs.
*/
get onDidLayoutChange(): Event<void> { get onDidLayoutChange(): Event<void> {
return this.component.onDidLayoutChange; return this.component.onDidLayoutChange;
} }
/**
* Invoked when a view is added.
*/
get onDidAddView(): Event<IView> { get onDidAddView(): Event<IView> {
return this.component.onDidAddView; return this.component.onDidAddView;
} }
/**
* Invoked when a view is removed.
*/
get onDidRemoveView(): Event<IView> { get onDidRemoveView(): Event<IView> {
return this.component.onDidRemoveView; return this.component.onDidRemoveView;
} }
constructor(private readonly component: ISplitviewComponent) {} constructor(private readonly component: ISplitviewComponent) {}
/**
* Update configuratable options.
*/
updateOptions(options: SplitviewComponentUpdateOptions): void { updateOptions(options: SplitviewComponentUpdateOptions): void {
this.component.updateOptions(options); this.component.updateOptions(options);
} }
/**
* Removes an existing panel and optionally provide a `Sizing` method
* for the subsequent resize.
*/
removePanel(panel: ISplitviewPanel, sizing?: Sizing): void { removePanel(panel: ISplitviewPanel, sizing?: Sizing): void {
this.component.removePanel(panel, sizing); this.component.removePanel(panel, sizing);
} }
/**
* Focus the component.
*/
focus(): void { focus(): void {
this.component.focus(); this.component.focus();
} }
/**
* Get the reference to a panel given it's `string` id.
*/
getPanel(id: string): ISplitviewPanel | undefined { getPanel(id: string): ISplitviewPanel | undefined {
return this.component.getPanel(id); return this.component.getPanel(id);
} }
/**
* Layout the panel with a width and height.
*/
layout(width: number, height: number): void { layout(width: number, height: number): void {
return this.component.layout(width, height); return this.component.layout(width, height);
} }
/**
* Add a new panel and return the created instance.
*/
addPanel<T extends object = Parameters>( addPanel<T extends object = Parameters>(
options: AddSplitviewComponentOptions<T> options: AddSplitviewComponentOptions<T>
): ISplitviewPanel { ): ISplitviewPanel {
return this.component.addPanel(options); return this.component.addPanel(options);
} }
/**
* Move a panel given it's current and desired index.
*/
movePanel(from: number, to: number): void { movePanel(from: number, to: number): void {
this.component.movePanel(from, to); this.component.movePanel(from, to);
} }
/**
* Deserialize a layout to built a splitivew.
*/
fromJSON(data: SerializedSplitview): void { fromJSON(data: SerializedSplitview): void {
this.component.fromJSON(data); this.component.fromJSON(data);
} }
/** Serialize a layout */
toJSON(): SerializedSplitview { toJSON(): SerializedSplitview {
return this.component.toJSON(); return this.component.toJSON();
} }
/**
* Remove all panels and clear the component.
*/
clear(): void { clear(): void {
this.component.clear(); this.component.clear();
} }
} }
export class PaneviewApi implements CommonApi<SerializedPaneview> { export class PaneviewApi implements CommonApi<SerializedPaneview> {
/**
* The minimum size the component can reach where size is measured in the direction of orientation provided.
*/
get minimumSize(): number { get minimumSize(): number {
return this.component.minimumSize; return this.component.minimumSize;
} }
/**
* The maximum size the component can reach where size is measured in the direction of orientation provided.
*/
get maximumSize(): number { get maximumSize(): number {
return this.component.maximumSize; return this.component.maximumSize;
} }
get height(): number { /**
return this.component.height; * Width of the component.
} */
get width(): number { get width(): number {
return this.component.width; return this.component.width;
} }
/**
* Height of the component.
*/
get height(): number {
return this.component.height;
}
/**
* All panel objects.
*/
get panels(): IPaneviewPanel[] { get panels(): IPaneviewPanel[] {
return this.component.panels; return this.component.panels;
} }
/**
* Invoked when any layout change occures, an aggregation of many events.
*/
get onDidLayoutChange(): Event<void> { get onDidLayoutChange(): Event<void> {
return this.component.onDidLayoutChange; return this.component.onDidLayoutChange;
} }
/**
* Invoked after a layout is deserialzied using the `fromJSON` method.
*/
get onDidLayoutFromJSON(): Event<void> { get onDidLayoutFromJSON(): Event<void> {
return this.component.onDidLayoutFromJSON; return this.component.onDidLayoutFromJSON;
} }
/**
* Invoked when a panel is added. May be called multiple times when moving panels.
*/
get onDidAddView(): Event<IPaneviewPanel> { get onDidAddView(): Event<IPaneviewPanel> {
return this.component.onDidAddView; return this.component.onDidAddView;
} }
/**
* Invoked when a panel is removed. May be called multiple times when moving panels.
*/
get onDidRemoveView(): Event<IPaneviewPanel> { get onDidRemoveView(): Event<IPaneviewPanel> {
return this.component.onDidRemoveView; return this.component.onDidRemoveView;
} }
/**
* Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.
*/
get onDidDrop(): Event<PaneviewDropEvent> { get onDidDrop(): Event<PaneviewDropEvent> {
const emitter = new Emitter<PaneviewDropEvent>(); const emitter = new Emitter<PaneviewDropEvent>();
@ -199,94 +291,160 @@ export class PaneviewApi implements CommonApi<SerializedPaneview> {
constructor(private readonly component: IPaneviewComponent) {} constructor(private readonly component: IPaneviewComponent) {}
/**
* Remove a panel given the panel object.
*/
removePanel(panel: IPaneviewPanel): void { removePanel(panel: IPaneviewPanel): void {
this.component.removePanel(panel); this.component.removePanel(panel);
} }
/**
* Get a panel object given a `string` id. May return `undefined`.
*/
getPanel(id: string): IPaneviewPanel | undefined { getPanel(id: string): IPaneviewPanel | undefined {
return this.component.getPanel(id); return this.component.getPanel(id);
} }
/**
* Move a panel given it's current and desired index.
*/
movePanel(from: number, to: number): void { movePanel(from: number, to: number): void {
this.component.movePanel(from, to); this.component.movePanel(from, to);
} }
/**
* Focus the component. Will try to focus an active panel if one exists.
*/
focus(): void { focus(): void {
this.component.focus(); this.component.focus();
} }
/**
* Force resize the component to an exact width and height. Read about auto-resizing before using.
*/
layout(width: number, height: number): void { layout(width: number, height: number): void {
this.component.layout(width, height); this.component.layout(width, height);
} }
/**
* Add a panel and return the created object.
*/
addPanel<T extends object = Parameters>( addPanel<T extends object = Parameters>(
options: AddPaneviewComponentOptions<T> options: AddPaneviewComponentOptions<T>
): IPaneviewPanel { ): IPaneviewPanel {
return this.component.addPanel(options); return this.component.addPanel(options);
} }
/**
* Create a component from a serialized object.
*/
fromJSON(data: SerializedPaneview): void { fromJSON(data: SerializedPaneview): void {
this.component.fromJSON(data); this.component.fromJSON(data);
} }
/**
* Create a serialized object of the current component.
*/
toJSON(): SerializedPaneview { toJSON(): SerializedPaneview {
return this.component.toJSON(); return this.component.toJSON();
} }
/**
* Reset the component back to an empty and default state.
*/
clear(): void { clear(): void {
this.component.clear(); this.component.clear();
} }
} }
export class GridviewApi implements CommonApi<SerializedGridviewComponent> { export class GridviewApi implements CommonApi<SerializedGridviewComponent> {
get minimumHeight(): number { /**
return this.component.minimumHeight; * Width of the component.
} */
get maximumHeight(): number {
return this.component.maximumHeight;
}
get minimumWidth(): number {
return this.component.minimumWidth;
}
get maximumWidth(): number {
return this.component.maximumWidth;
}
get width(): number { get width(): number {
return this.component.width; return this.component.width;
} }
/**
* Height of the component.
*/
get height(): number { get height(): number {
return this.component.height; return this.component.height;
} }
/**
* Minimum height of the component.
*/
get minimumHeight(): number {
return this.component.minimumHeight;
}
/**
* Maximum height of the component.
*/
get maximumHeight(): number {
return this.component.maximumHeight;
}
/**
* Minimum width of the component.
*/
get minimumWidth(): number {
return this.component.minimumWidth;
}
/**
* Maximum width of the component.
*/
get maximumWidth(): number {
return this.component.maximumWidth;
}
/**
* Invoked when any layout change occures, an aggregation of many events.
*/
get onDidLayoutChange(): Event<void> { get onDidLayoutChange(): Event<void> {
return this.component.onDidLayoutChange; return this.component.onDidLayoutChange;
} }
/**
* Invoked when a panel is added. May be called multiple times when moving panels.
*/
get onDidAddPanel(): Event<IGridviewPanel> { get onDidAddPanel(): Event<IGridviewPanel> {
return this.component.onDidAddGroup; return this.component.onDidAddGroup;
} }
/**
* Invoked when a panel is removed. May be called multiple times when moving panels.
*/
get onDidRemovePanel(): Event<IGridviewPanel> { get onDidRemovePanel(): Event<IGridviewPanel> {
return this.component.onDidRemoveGroup; return this.component.onDidRemoveGroup;
} }
/**
* Invoked when the active panel changes. May be undefined if no panel is active.
*/
get onDidActivePanelChange(): Event<IGridviewPanel | undefined> { get onDidActivePanelChange(): Event<IGridviewPanel | undefined> {
return this.component.onDidActiveGroupChange; return this.component.onDidActiveGroupChange;
} }
/**
* Invoked after a layout is deserialzied using the `fromJSON` method.
*/
get onDidLayoutFromJSON(): Event<void> { get onDidLayoutFromJSON(): Event<void> {
return this.component.onDidLayoutFromJSON; return this.component.onDidLayoutFromJSON;
} }
/**
* All panel objects.
*/
get panels(): IGridviewPanel[] { get panels(): IGridviewPanel[] {
return this.component.groups; return this.component.groups;
} }
/**
* Current orientation. Can be changed after initialization.
*/
get orientation(): Orientation { get orientation(): Orientation {
return this.component.orientation; return this.component.orientation;
} }
@ -297,24 +455,39 @@ export class GridviewApi implements CommonApi<SerializedGridviewComponent> {
constructor(private readonly component: IGridviewComponent) {} constructor(private readonly component: IGridviewComponent) {}
/**
* Focus the component. Will try to focus an active panel if one exists.
*/
focus(): void { focus(): void {
this.component.focus(); this.component.focus();
} }
/**
* Force resize the component to an exact width and height. Read about auto-resizing before using.
*/
layout(width: number, height: number, force = false): void { layout(width: number, height: number, force = false): void {
this.component.layout(width, height, force); this.component.layout(width, height, force);
} }
/**
* Add a panel and return the created object.
*/
addPanel<T extends object = Parameters>( addPanel<T extends object = Parameters>(
options: AddComponentOptions<T> options: AddComponentOptions<T>
): IGridviewPanel { ): IGridviewPanel {
return this.component.addPanel(options); return this.component.addPanel(options);
} }
/**
* Remove a panel given the panel object.
*/
removePanel(panel: IGridviewPanel, sizing?: Sizing): void { removePanel(panel: IGridviewPanel, sizing?: Sizing): void {
this.component.removePanel(panel, sizing); this.component.removePanel(panel, sizing);
} }
/**
* Move a panel in a particular direction relative to another panel.
*/
movePanel( movePanel(
panel: IGridviewPanel, panel: IGridviewPanel,
options: { direction: Direction; reference: string; size?: number } options: { direction: Direction; reference: string; size?: number }
@ -322,168 +495,274 @@ export class GridviewApi implements CommonApi<SerializedGridviewComponent> {
this.component.movePanel(panel, options); this.component.movePanel(panel, options);
} }
/**
* Get a panel object given a `string` id. May return `undefined`.
*/
getPanel(id: string): IGridviewPanel | undefined { getPanel(id: string): IGridviewPanel | undefined {
return this.component.getPanel(id); return this.component.getPanel(id);
} }
/**
* Create a component from a serialized object.
*/
fromJSON(data: SerializedGridviewComponent): void { fromJSON(data: SerializedGridviewComponent): void {
return this.component.fromJSON(data); return this.component.fromJSON(data);
} }
/**
* Create a serialized object of the current component.
*/
toJSON(): SerializedGridviewComponent { toJSON(): SerializedGridviewComponent {
return this.component.toJSON(); return this.component.toJSON();
} }
/**
* Reset the component back to an empty and default state.
*/
clear(): void { clear(): void {
this.component.clear(); this.component.clear();
} }
} }
export class DockviewApi implements CommonApi<SerializedDockview> { export class DockviewApi implements CommonApi<SerializedDockview> {
/**
* The unique identifier for this instance. Used to manage scope of Drag'n'Drop events.
*/
get id(): string { get id(): string {
return this.component.id; return this.component.id;
} }
/**
* Width of the component.
*/
get width(): number { get width(): number {
return this.component.width; return this.component.width;
} }
/**
* Height of the component.
*/
get height(): number { get height(): number {
return this.component.height; return this.component.height;
} }
/**
* Minimum height of the component.
*/
get minimumHeight(): number { get minimumHeight(): number {
return this.component.minimumHeight; return this.component.minimumHeight;
} }
/**
* Maximum height of the component.
*/
get maximumHeight(): number { get maximumHeight(): number {
return this.component.maximumHeight; return this.component.maximumHeight;
} }
/**
* Minimum width of the component.
*/
get minimumWidth(): number { get minimumWidth(): number {
return this.component.minimumWidth; return this.component.minimumWidth;
} }
/**
* Maximum width of the component.
*/
get maximumWidth(): number { get maximumWidth(): number {
return this.component.maximumWidth; return this.component.maximumWidth;
} }
/**
* Total number of groups.
*/
get size(): number { get size(): number {
return this.component.size; return this.component.size;
} }
/**
* Total number of panels.
*/
get totalPanels(): number { get totalPanels(): number {
return this.component.totalPanels; return this.component.totalPanels;
} }
/**
* Invoked when the active group changes. May be undefined if no group is active.
*/
get onDidActiveGroupChange(): Event<DockviewGroupPanel | undefined> { get onDidActiveGroupChange(): Event<DockviewGroupPanel | undefined> {
return this.component.onDidActiveGroupChange; return this.component.onDidActiveGroupChange;
} }
/**
* Invoked when a group is added. May be called multiple times when moving groups.
*/
get onDidAddGroup(): Event<DockviewGroupPanel> { get onDidAddGroup(): Event<DockviewGroupPanel> {
return this.component.onDidAddGroup; return this.component.onDidAddGroup;
} }
/**
* Invoked when a group is removed. May be called multiple times when moving groups.
*/
get onDidRemoveGroup(): Event<DockviewGroupPanel> { get onDidRemoveGroup(): Event<DockviewGroupPanel> {
return this.component.onDidRemoveGroup; return this.component.onDidRemoveGroup;
} }
/**
* Invoked when the active panel changes. May be undefined if no panel is active.
*/
get onDidActivePanelChange(): Event<IDockviewPanel | undefined> { get onDidActivePanelChange(): Event<IDockviewPanel | undefined> {
return this.component.onDidActivePanelChange; return this.component.onDidActivePanelChange;
} }
/**
* Invoked when a panel is added. May be called multiple times when moving panels.
*/
get onDidAddPanel(): Event<IDockviewPanel> { get onDidAddPanel(): Event<IDockviewPanel> {
return this.component.onDidAddPanel; return this.component.onDidAddPanel;
} }
/**
* Invoked when a panel is removed. May be called multiple times when moving panels.
*/
get onDidRemovePanel(): Event<IDockviewPanel> { get onDidRemovePanel(): Event<IDockviewPanel> {
return this.component.onDidRemovePanel; return this.component.onDidRemovePanel;
} }
/**
* Invoked after a layout is deserialzied using the `fromJSON` method.
*/
get onDidLayoutFromJSON(): Event<void> { get onDidLayoutFromJSON(): Event<void> {
return this.component.onDidLayoutFromJSON; return this.component.onDidLayoutFromJSON;
} }
/**
* Invoked when any layout change occures, an aggregation of many events.
*/
get onDidLayoutChange(): Event<void> { get onDidLayoutChange(): Event<void> {
return this.component.onDidLayoutChange; return this.component.onDidLayoutChange;
} }
/**
* Invoked when a Drag'n'Drop event occurs that the component was unable to handle. Exposed for custom Drag'n'Drop functionality.
*/
get onDidDrop(): Event<DockviewDropEvent> { get onDidDrop(): Event<DockviewDropEvent> {
return this.component.onDidDrop; return this.component.onDidDrop;
} }
/**
* Invoked before a group is dragged. Exposed for custom Drag'n'Drop functionality.
*/
get onWillDragGroup(): Event<GroupDragEvent> { get onWillDragGroup(): Event<GroupDragEvent> {
return this.component.onWillDragGroup; return this.component.onWillDragGroup;
} }
/**
* Invoked before a panel is dragged. Exposed for custom Drag'n'Drop functionality.
*/
get onWillDragPanel(): Event<TabDragEvent> { get onWillDragPanel(): Event<TabDragEvent> {
return this.component.onWillDragPanel; return this.component.onWillDragPanel;
} }
/**
* All panel objects.
*/
get panels(): IDockviewPanel[] { get panels(): IDockviewPanel[] {
return this.component.panels; return this.component.panels;
} }
/**
* All group objects.
*/
get groups(): DockviewGroupPanel[] { get groups(): DockviewGroupPanel[] {
return this.component.groups; return this.component.groups;
} }
/**
* Active panel object.
*/
get activePanel(): IDockviewPanel | undefined { get activePanel(): IDockviewPanel | undefined {
return this.component.activePanel; return this.component.activePanel;
} }
/**
* Active group object.
*/
get activeGroup(): DockviewGroupPanel | undefined { get activeGroup(): DockviewGroupPanel | undefined {
return this.component.activeGroup; return this.component.activeGroup;
} }
constructor(private readonly component: IDockviewComponent) {} constructor(private readonly component: IDockviewComponent) {}
/**
* Focus the component. Will try to focus an active panel if one exists.
*/
focus(): void { focus(): void {
this.component.focus(); this.component.focus();
} }
/**
* Get a panel object given a `string` id. May return `undefined`.
*/
getPanel(id: string): IDockviewPanel | undefined { getPanel(id: string): IDockviewPanel | undefined {
return this.component.getGroupPanel(id); return this.component.getGroupPanel(id);
} }
/**
* Force resize the component to an exact width and height. Read about auto-resizing before using.
*/
layout(width: number, height: number, force = false): void { layout(width: number, height: number, force = false): void {
this.component.layout(width, height, force); this.component.layout(width, height, force);
} }
/**
* Add a panel and return the created object.
*/
addPanel<T extends object = Parameters>( addPanel<T extends object = Parameters>(
options: AddPanelOptions<T> options: AddPanelOptions<T>
): IDockviewPanel { ): IDockviewPanel {
return this.component.addPanel(options); return this.component.addPanel(options);
} }
/**
* Remove a panel given the panel object.
*/
removePanel(panel: IDockviewPanel): void { removePanel(panel: IDockviewPanel): void {
this.component.removePanel(panel); this.component.removePanel(panel);
} }
/**
* Add a group and return the created object.
*/
addGroup(options?: AddGroupOptions): DockviewGroupPanel { addGroup(options?: AddGroupOptions): DockviewGroupPanel {
return this.component.addGroup(options); return this.component.addGroup(options);
} }
moveToNext(options?: MovementOptions): void { /**
this.component.moveToNext(options); * Close all groups and panels.
} */
moveToPrevious(options?: MovementOptions): void {
this.component.moveToPrevious(options);
}
closeAllGroups(): void { closeAllGroups(): void {
return this.component.closeAllGroups(); return this.component.closeAllGroups();
} }
/**
* Remove a group and any panels within the group.
*/
removeGroup(group: IDockviewGroupPanel): void { removeGroup(group: IDockviewGroupPanel): void {
this.component.removeGroup(<DockviewGroupPanel>group); this.component.removeGroup(<DockviewGroupPanel>group);
} }
/**
* Get a group object given a `string` id. May return undefined.
*/
getGroup(id: string): DockviewGroupPanel | undefined { getGroup(id: string): DockviewGroupPanel | undefined {
return this.component.getPanel(id); return this.component.getPanel(id);
} }
/**
* Add a floating group
*/
addFloatingGroup( addFloatingGroup(
item: IDockviewPanel | DockviewGroupPanel, item: IDockviewPanel | DockviewGroupPanel,
coord?: { x: number; y: number } coord?: { x: number; y: number }
@ -491,15 +770,38 @@ export class DockviewApi implements CommonApi<SerializedDockview> {
return this.component.addFloatingGroup(item, coord); return this.component.addFloatingGroup(item, coord);
} }
/**
* Create a component from a serialized object.
*/
fromJSON(data: SerializedDockview): void { fromJSON(data: SerializedDockview): void {
this.component.fromJSON(data); this.component.fromJSON(data);
} }
/**
* Create a serialized object of the current component.
*/
toJSON(): SerializedDockview { toJSON(): SerializedDockview {
return this.component.toJSON(); return this.component.toJSON();
} }
/**
* Reset the component back to an empty and default state.
*/
clear(): void { clear(): void {
this.component.clear(); this.component.clear();
} }
/**
* Move the focus progmatically to the next panel or group.
*/
moveToNext(options?: MovementOptions): void {
this.component.moveToNext(options);
}
/**
* Move the focus progmatically to the previous panel or group.
*/
moveToPrevious(options?: MovementOptions): void {
this.component.moveToPrevious(options);
}
} }

View File

@ -6,6 +6,8 @@ import {
MutableDisposable, MutableDisposable,
} from '../lifecycle'; } from '../lifecycle';
const CLONE_ELEMENT = true;
export abstract class DragHandler extends CompositeDisposable { export abstract class DragHandler extends CompositeDisposable {
private readonly dataDisposable = new MutableDisposable(); private readonly dataDisposable = new MutableDisposable();
private readonly pointerEventsDisposable = new MutableDisposable(); private readonly pointerEventsDisposable = new MutableDisposable();
@ -57,8 +59,24 @@ export abstract class DragHandler extends CompositeDisposable {
iframe.style.pointerEvents = 'none'; iframe.style.pointerEvents = 'none';
} }
this.el.classList.add('dv-dragged'); if (CLONE_ELEMENT && event.dataTransfer) {
setTimeout(() => this.el.classList.remove('dv-dragged'), 0); const clone = this.el.cloneNode(true) as HTMLElement;
const styles = window.getComputedStyle(this.el);
clone.style.cssText = Object.values(styles)
.map((key) => `${key}:${styles.getPropertyValue(key)}`)
.join(';');
clone.classList.add('dv-dragged');
document.body.append(clone);
setTimeout(() => {
// clone.parentElement?.removeChild(clone);
}, 0);
event.dataTransfer.setDragImage(clone, 0, 0);
} else {
this.el.classList.add('dv-dragged');
setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
}
this.dataDisposable.value = this.getData(event); this.dataDisposable.value = this.getData(event);
this._onDragStart.fire(event); this._onDragStart.fire(event);

View File

@ -24,6 +24,13 @@ class TabDragHandler extends DragHandler {
private readonly panel: IDockviewPanel private readonly panel: IDockviewPanel
) { ) {
super(element); super(element);
this.onDragStart((e) => {
this.accessor.removePanel(this.panel, {
skipDispose: true,
removeEmptyGroup: true,
});
});
} }
getData(event: DragEvent): IDisposable { getData(event: DragEvent): IDisposable {

View File

@ -27,7 +27,6 @@ import DockviewTabheight from '@site/sandboxes/tabheight-dockview/src/app';
import DockviewWithIFrames from '@site/sandboxes/iframe-dockview/src/app'; import DockviewWithIFrames from '@site/sandboxes/iframe-dockview/src/app';
import DockviewFloating from '@site/sandboxes/floatinggroup-dockview/src/app'; import DockviewFloating from '@site/sandboxes/floatinggroup-dockview/src/app';
import DockviewLockedGroup from '@site/sandboxes/lockedgroup-dockview/src/app'; import DockviewLockedGroup from '@site/sandboxes/lockedgroup-dockview/src/app';
import IDEExample from '@site/sandboxes/ide-example/src/app';
import DockviewKeyboard from '@site/sandboxes/keyboard-dockview/src/app'; import DockviewKeyboard from '@site/sandboxes/keyboard-dockview/src/app';
import { DocRef, Markdown } from '@site/src/components/ui/reference/docRef'; import { DocRef, Markdown } from '@site/src/components/ui/reference/docRef';
@ -862,14 +861,6 @@ Keyboard shortcuts
react={DockviewKeyboard} react={DockviewKeyboard}
/> />
## Application with sidebars
<MultiFrameworkContainer
height={600}
sandboxId="ide-example"
react={IDEExample}
/>
### Nested Dockviews ### Nested Dockviews
You can safely create multiple dockview instances within one page and nest dockviews within other dockviews. You can safely create multiple dockview instances within one page and nest dockviews within other dockviews.

View File

@ -318,14 +318,17 @@ const EventsDockview = (props: { theme?: string }) => {
height: '100%', height: '100%',
}} }}
> >
<label> <div>
<input <label>
type="checkbox" <input
checked={checked} type="checkbox"
onChange={(e) => setChecked(e.target.checked)} checked={checked}
/> onChange={(e) => setChecked(e.target.checked)}
<span>{'fromJSON'}</span> />
</label> <span>{'fromJSON'}</span>
</label>
<button onClick={() => setLines([])}>Clear logs</button>
</div>
<div style={{ flexGrow: 1 }}> <div style={{ flexGrow: 1 }}>
<DockviewReact <DockviewReact
components={components} components={components}
@ -333,7 +336,7 @@ const EventsDockview = (props: { theme?: string }) => {
className={`${props.theme || 'dockview-theme-abyss'}`} className={`${props.theme || 'dockview-theme-abyss'}`}
/> />
</div> </div>
<div style={{ flexGrow: 1, paddingTop: '5px' }}> <div style={{ height: '200px', paddingTop: '5px' }}>
<Console lines={lines} /> <Console lines={lines} />
</div> </div>
</div> </div>

View File

@ -20,7 +20,7 @@ export interface IConsoleProps {
} }
export const Console = (props: IConsoleProps) => { export const Console = (props: IConsoleProps) => {
const ref = React.useRef<HTMLDivElement>(); const ref = React.useRef<HTMLDivElement>(null);
React.useLayoutEffect(() => { React.useLayoutEffect(() => {
if (!ref.current) { if (!ref.current) {

View File

@ -1,32 +0,0 @@
{
"name": "ide-example",
"description": "",
"keywords": [
"dockview"
],
"version": "1.0.0",
"main": "src/index.tsx",
"dependencies": {
"dockview": "*",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
"typescript": "^4.9.5",
"react-scripts": "*"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
]
}

View File

@ -1,44 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

View File

@ -1,154 +0,0 @@
import {
GridviewReact,
GridviewReadyEvent,
IGridviewPanelProps,
GridviewComponent,
Orientation,
GridviewApi,
LayoutPriority,
} from 'dockview';
import * as React from 'react';
const components = {
'left-sidebar': (props: IGridviewPanelProps<{ title: string }>) => {
return (
<div
style={{
height: '100%',
padding: '20px',
background: 'var(--dv-group-view-background-color)',
}}
>
{props.params.title}
</div>
);
},
'middle-content': (props: IGridviewPanelProps<{ title: string }>) => {
return (
<div
style={{
height: '100%',
padding: '20px',
background: 'var(--dv-group-view-background-color)',
}}
>
{props.params.title}
</div>
);
},
'right-sidebar': (props: IGridviewPanelProps<{ title: string }>) => {
return (
<div
style={{
height: '100%',
padding: '20px',
background: 'var(--dv-group-view-background-color)',
}}
>
{props.params.title}
</div>
);
},
};
const App = (props: { theme?: string }) => {
const [api, setApi] = React.useState<GridviewApi>();
const onReady = (event: GridviewReadyEvent) => {
event.api.fromJSON({
grid: {
height: 1000,
width: 1000,
orientation: Orientation.HORIZONTAL,
root: {
type: 'branch',
data: [
{
type: 'leaf',
data: {
id: 'left-sidebar-id',
component: 'left-sidebar',
snap: true,
minimumWidth: 100,
},
size: 200,
},
{
type: 'leaf',
data: {
id: 'middle-content-id',
component: 'middle-content',
priority: LayoutPriority.High,
minimumWidth: 100,
},
size: 600,
},
{
type: 'leaf',
data: {
id: 'right-sidebar-id',
component: 'right-sidebar',
snap: true,
minimumWidth: 100,
},
size: 200,
},
],
},
},
});
setApi(event.api);
};
const onKeyPress = (event: React.KeyboardEvent) => {
if (!api) {
return;
}
if (event.ctrlKey) {
if (event.code === 'ArrowLeft') {
const leftSidebarPanel = api.getPanel('left-sidebar-id');
if (leftSidebarPanel) {
leftSidebarPanel.api.setVisible(false);
}
}
}
if (event.code === 'ArrowRight') {
const leftSidebarPanel = api.getPanel('left-sidebar-id');
if (leftSidebarPanel) {
leftSidebarPanel.api.setVisible(true);
}
}
};
return (
<div
tabIndex={-1}
style={{ height: '100%', display: 'flex', flexDirection: 'column' }}
onKeyDown={onKeyPress}
>
<div>
{'Use '}
<span>{'Ctrl+ArrowLeft'}</span>
{' and '}
<span>{'Ctrl+ArrowRight'}</span>
{
' to show and hide the left sidebar. The right sidebar can be hidden by dragging it to the right.'
}
</div>
<div style={{ flexGrow: 1 }}>
<GridviewReact
onReady={onReady}
components={components}
className={`${props.theme || 'dockview-theme-abyss'}`}
/>
</div>
</div>
);
};
export default App;

View File

@ -1,20 +0,0 @@
import { StrictMode } from 'react';
import * as ReactDOMClient from 'react-dom/client';
import './styles.css';
import 'dockview/dist/styles/dockview.css';
import App from './app';
const rootElement = document.getElementById('root');
if (rootElement) {
const root = ReactDOMClient.createRoot(rootElement);
root.render(
<StrictMode>
<div className="app">
<App />
</div>
</StrictMode>
);
}

View File

@ -1,15 +0,0 @@
body {
margin: 0px;
font-family: sans-serif;
text-align: center;
}
#root {
height: 100vh;
width: 100vw;
}
.app {
height: 100%;
}

View File

@ -1,18 +0,0 @@
{
"compilerOptions": {
"outDir": "build/dist",
"module": "esnext",
"target": "es5",
"lib": ["es6", "dom"],
"sourceMap": true,
"allowJs": true,
"jsx": "react-jsx",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true
}
}

View File

@ -37,4 +37,10 @@
} }
} }
} }
.doc-text {
font-size: 1em;
font-weight: 400;
margin-bottom: 8px;
}
} }

View File

@ -9,18 +9,66 @@ export interface DocRefProps {
import docsJson from '../../../generated/api.output.json'; import docsJson from '../../../generated/api.output.json';
type DocsContent = { kind: string; text: string; tag?: string }; type DocsContent = { kind: string; text: string; tag?: string };
type DocsTag = { tag: string; content: DocsContent[] };
type DocsComment = {
summary?: DocsContent[];
blockTags?: DocsTag[];
};
type DocsJson = { type DocsJson = {
[index: string]: Array<{ [index: string]: Array<{
name: string; name: string;
signature: string; signature: string;
comment?: { comment?: DocsComment;
summary?: DocsContent[];
blockTags?: Array<{ tag: string; content: DocsContent }>;
};
type: string; type: string;
}>; }>;
}; };
export const Text = (props: { content: DocsContent[] }) => {
return (
<div className="doc-text">
{props.content.map((piece, i) => {
switch (piece.kind) {
case 'text': {
return <span key={i}>{piece.text}</span>;
}
case 'code':
return (
<code key={i}>
{piece.text.substring(1, piece.text.length - 1)}
</code>
);
default:
throw new Error(`unhandled piece ${piece.kind}`);
}
})}
</div>
);
};
export const Tags = (props: { tags: DocsTag[] }) => {
return (
<div>
{props.tags.map((tag, i) => {
return (
<div key={i}>
<div>{tag.tag}</div>
<Text content={tag.content} />
</div>
);
})}
</div>
);
};
export const Summary = (props: { summary: DocsComment }) => {
return (
<div>
<Text content={props.summary.summary ?? []} />
{/* <Tags tags={props.summary.blockTags ?? []} /> */}
</div>
);
};
export const Markdown = (props: { children: string }) => { export const Markdown = (props: { children: string }) => {
return <span>{props.children}</span>; return <span>{props.children}</span>;
}; };
@ -94,6 +142,13 @@ export const DocRef = (props: DocRefProps) => {
> >
{/* <div>{'-'}</div> */} {/* <div>{'-'}</div> */}
<div> <div>
<div>
{doc.comment && (
<Summary
summary={doc.comment}
/>
)}
</div>
<CodeBlock language="tsx"> <CodeBlock language="tsx">
{doc.signature} {doc.signature}
</CodeBlock> </CodeBlock>

View File

@ -1,171 +0,0 @@
import { ReactPropDocsTable } from '../referenceTable';
import * as React from 'react';
export default () => (
<ReactPropDocsTable
title="Dockview API"
url="https://dockview.dev/typedocs/classes/dockview_core.DockviewApi.html"
data={[
{
property: 'id',
propertyDescription:
'The unique id associated with the dock instance',
type: 'string',
},
{
property: 'width',
type: 'number',
},
{
property: 'height',
type: 'number',
},
{
property: 'minimumHeight',
type: 'number',
},
{
property: 'maximumHeight',
type: 'number',
},
{
property: 'minimumWidth',
type: 'number',
},
{
property: 'maximumWidth',
type: 'number',
},
{
property: 'size',
propertyDescription: 'Total number of groups',
type: 'number',
},
{
property: 'totalPanels',
propertyDescription: 'Total number of panels',
type: 'number',
},
{
property: 'onDidActiveGroupChange',
type: 'Event<DockviewGroupPanel | undefined>',
},
{
property: 'onDidAddGroup',
type: 'Event<DockviewGroupPanel>',
},
{
property: 'onDidRemoveGroup',
type: 'Event<DockviewGroupPanel>',
},
{
property: 'onDidActivePanelChange',
type: 'Event<IDockviewPanel | undefined>',
},
{
property: 'onDidAddPanel',
type: 'Event<IDockviewPanel>',
},
{
property: 'onDidRemovePanel',
type: 'Event<IDockviewPanel>',
},
{
property: 'onDidLayoutFromJSON',
type: 'Event<void>',
},
{
property: 'onDidLayoutChange',
type: 'Event<void>',
},
{
property: 'onDidDrop',
type: 'Event<DockviewDropEvent>',
},
{
property: 'onWillDragGroup',
type: 'Event<GroupDragEvent>',
},
{
property: 'onWillDragPanel',
type: 'Event<TabDragEvent>',
},
{
property: 'panels',
type: 'IDockviewPanel[]',
},
{
property: 'groups',
type: 'DockviewGroupPanel[]',
},
{
property: 'activePanel',
type: 'IDockviewPanel | undefined',
},
{
property: 'activeGroup',
type: 'DockviewGroupPanel | undefined',
},
{
property: 'focus',
type: '(): void',
},
{
property: 'getPanel',
type: '(id: string): IDockviewPanel | undefined',
},
{
property: 'layout',
type: '(width: number, height: number): void',
},
{
property: 'addPanel',
type: 'addPanel(options: AddPanelOptions): void',
},
{
property: 'removePanel',
type: '(panel: IDockviewPanel): void',
},
{
property: 'addGroup',
type: '(options?: AddGroupOptions): DockviewGroupPanel',
},
{
property: 'moveToNext',
type: '(options?: MovementOptions): void',
},
{
property: 'moveToPrevious',
type: '(options?: MovementOptions): void',
},
{
property: 'closeAllGroups',
type: '(): void',
},
{
property: 'removeGroup',
type: '(group: IDockviewGroupPanel): void ',
},
{
property: 'getGroup',
type: '(id: string): DockviewGroupPanel | undefined',
},
{
property: 'addFloatingGroup',
type: '(item: IDockviewPanel | DockviewGroupPanel, coord?: { x: number, y: number }): void',
},
{
property: 'fromJSON',
type: '(data: SerializedDockview): void',
},
{
property: 'toJSON',
type: '(): SerializedDockview ',
},
{
property: 'clear',
type: '(): void',
},
]}
/>
);

View File

@ -1,103 +0,0 @@
import { ReactPropDocsTable } from '../referenceTable';
import * as React from 'react';
export default () => (
<ReactPropDocsTable
title="Dockview Panel API"
url="https://dockview.dev/typedocs/interfaces/dockview_core.DockviewPanelApi.html"
data={[
{
property: 'group',
type: 'DockviewGroupPanel',
},
{
property: 'isGroupActive',
type: 'boolean',
},
{
property: 'title',
type: 'string | undefined',
},
{
property: 'group',
type: 'DockviewGroupPanel',
},
{
property: 'onDidActiveGroupChange',
type: 'Event<void>',
},
{
property: 'onDidGroupChange',
type: 'Event<void>',
},
{
property: 'close',
type: '(): void',
},
{
property: 'setTitle',
type: '(title: string): void',
},
{
property: 'moveTo',
type: '(options: { group: DockviewGroupPanel, position?: Position, index?: number }): void',
},
{
property: 'setSize',
type: '(event: SizeEvent): void',
},
{
property: 'onDidDimensionsChange',
type: 'Event<PanelDimensionChangeEvent>',
},
{
property: 'onDidFocusChange',
type: 'Event<FocusEvent>',
},
{
property: 'onDidVisibilityChange',
type: 'Event<VisibilityEvent>',
},
{
property: 'onDidActiveChange',
type: 'Event<ActiveEvent>',
},
{
property: 'setVisible',
type: '(isVisible: boolean): void',
},
{
property: 'setActive',
type: '(): void',
},
{
property: 'updateParameters',
type: '(parameters: Parameters): void',
},
{
property: 'id',
type: 'string',
},
{
property: 'isFocused',
type: 'boolean',
},
{
property: 'isActive',
type: 'boolean',
},
{
property: 'isVisible',
type: 'boolean',
},
{
property: 'width',
type: 'number',
},
{
property: 'height',
type: 'number',
},
]}
/>
);

View File

@ -1,64 +0,0 @@
.ref-table {
font-size: 12px;
width: 100%;
border-collapse: collapse;
line-height: 20px;
button {
all: unset;
}
code {
padding: 0px 4px;
margin: 0px 4px;
}
.ref-table-icon {
cursor: pointer;
}
.ref-table-property {
width: 30%;
}
.ref-table-type {
width: 50%;
}
.ref-table-default {
width: 20%;
}
thead {
text-align: left;
background-color: inherit;
tr {
border: none;
}
}
th,
td {
border: none;
padding: none;
}
tr {
background-color: inherit !important;
}
}
.ref-table-popover {
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px,
hsl(206 22% 7% / 20%) 0px 10px 20px -15px;
animation-duration: 400ms;
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
will-change: transform, opacity;
background-color: var(--ifm-background-surface-color);
color: var(--ifm-font-color-base);
}

View File

@ -1,196 +0,0 @@
import * as React from 'react';
import './referenceTable.scss';
export interface ReferenceProps {
title?: string;
url?: string;
data: {
property: string;
propertyDescription?: string;
default?: string;
type: string;
typeDescription?: string;
}[];
}
import * as Popover from '@radix-ui/react-popover';
import { InfoCircledIcon } from '@radix-ui/react-icons';
export const ReactPropDocsTable = (props: ReferenceProps) => {
return (
<div>
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
{props.title && <span>{props.title}</span>}
{props.url && (
<button>
<a href={props.url}>{'See API documentation'}</a>
</button>
)}
</div>
<table className="ref-table">
<thead>
<tr>
<th className="ref-table-property">Property</th>
<th className="ref-table-type">Type</th>
<th className="ref-table-default">Default</th>
</tr>
</thead>
<tbody>
{props.data.map((item) => {
return (
<tr key={item.property}>
<td className="ref-table-property">
<span
style={{
display: 'flex',
alignItems: 'center',
}}
>
<code>{item.property}</code>
{item.propertyDescription && (
<Popover.Root>
<Popover.Trigger>
<InfoCircledIcon className="ref-table-icon" />
</Popover.Trigger>
<Popover.Portal>
<Popover.Content className="ref-table-popover">
<div>
{
item.propertyDescription
}
</div>
</Popover.Content>
</Popover.Portal>
</Popover.Root>
)}
</span>
</td>
<td className="ref-table-type">
<span
style={{
display: 'flex',
alignItems: 'center',
}}
>
<code>{item.type}</code>
{item.typeDescription && (
<Popover.Root>
<Popover.Trigger>
<InfoCircledIcon className="ref-table-icon" />
</Popover.Trigger>
<Popover.Portal>
<Popover.Content className="ref-table-popover">
<div>
<code>
{
item.typeDescription
}
</code>
</div>
</Popover.Content>
</Popover.Portal>
</Popover.Root>
)}
</span>
</td>
<td className="ref-table-default">
{item.default ? (
<code>{item.default}</code>
) : (
<span>{'-'}</span>
)}
</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
};
export const ClassDocsTable = (props: ReferenceProps) => {
return (
<div>
<div>{props.title && <span>{props.title}</span>}</div>
<table className="ref-table">
<thead>
<tr>
<th className="ref-table-property">Property</th>
<th className="ref-table-type">Type</th>
<th className="ref-table-default">Default</th>
</tr>
</thead>
<tbody>
{props.data.map((item) => {
return (
<tr key={item.property}>
<td className="ref-table-property">
<span
style={{
display: 'flex',
alignItems: 'center',
}}
>
<code>{item.property}</code>
{item.propertyDescription && (
<Popover.Root>
<Popover.Trigger>
<InfoCircledIcon className="ref-table-icon" />
</Popover.Trigger>
<Popover.Portal>
<Popover.Content className="ref-table-popover">
<div>
{
item.propertyDescription
}
</div>
</Popover.Content>
</Popover.Portal>
</Popover.Root>
)}
</span>
</td>
<td className="ref-table-type">
<span
style={{
display: 'flex',
alignItems: 'center',
}}
>
<code>{item.type}</code>
{item.typeDescription && (
<Popover.Root>
<Popover.Trigger>
<InfoCircledIcon className="ref-table-icon" />
</Popover.Trigger>
<Popover.Portal>
<Popover.Content className="ref-table-popover">
<div>
<code>
{
item.typeDescription
}
</code>
</div>
</Popover.Content>
</Popover.Portal>
</Popover.Root>
)}
</span>
</td>
<td className="ref-table-default">
{item.default ? (
<code>{item.default}</code>
) : (
<span>{'-'}</span>
)}
</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
};

File diff suppressed because it is too large Load Diff

View File

@ -27,7 +27,6 @@ import DockviewTabheight from '@site/sandboxes/tabheight-dockview/src/app';
import DockviewWithIFrames from '@site/sandboxes/iframe-dockview/src/app'; import DockviewWithIFrames from '@site/sandboxes/iframe-dockview/src/app';
import DockviewFloating from '@site/sandboxes/floatinggroup-dockview/src/app'; import DockviewFloating from '@site/sandboxes/floatinggroup-dockview/src/app';
import DockviewLockedGroup from '@site/sandboxes/lockedgroup-dockview/src/app'; import DockviewLockedGroup from '@site/sandboxes/lockedgroup-dockview/src/app';
import IDEExample from '@site/sandboxes/ide-example/src/app';
import DockviewKeyboard from '@site/sandboxes/keyboard-dockview/src/app'; import DockviewKeyboard from '@site/sandboxes/keyboard-dockview/src/app';
import { DocRef, Markdown } from '@site/src/components/ui/reference/docRef'; import { DocRef, Markdown } from '@site/src/components/ui/reference/docRef';
@ -862,14 +861,6 @@ Keyboard shortcuts
react={DockviewKeyboard} react={DockviewKeyboard}
/> />
## Application with sidebars
<MultiFrameworkContainer
height={600}
sandboxId="ide-example"
react={IDEExample}
/>
### Nested Dockviews ### Nested Dockviews
You can safely create multiple dockview instances within one page and nest dockviews within other dockviews. You can safely create multiple dockview instances within one page and nest dockviews within other dockviews.

View File

@ -288,11 +288,12 @@ function getFunction(
}; };
} }
case ReflectionKind.Method: { case ReflectionKind.Method: {
const { signatures, comment } = method; const { signatures } = method;
if (signatures.length > 1) { if (signatures.length > 1) {
throw new Error(`signatures.length > 1`); throw new Error(`signatures.length > 1`);
} }
const { name, parameters, type, typeParameter } = signatures[0]; const { name, parameters, type, typeParameter, comment } =
signatures[0];
let _typeParameter = ''; let _typeParameter = '';