@widgetstools/angular-dock-manager 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, ViewChild, Output, Input, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
|
|
2
|
+
import { EventEmitter, createComponent, ViewChild, Output, Input, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
|
|
3
3
|
import { DockviewComponent } from '@widgetstools/dock-manager-core';
|
|
4
|
-
export { DockviewApi, DockviewComponent, EventEmitter, clearLocalStorage, createDefaultState, deserialize, dockReducer, draculaDark, exportToFile, findAllTabGroups, findFirstTabGroup, findTabGroupById, findTabGroupForPanel, forestDark, getThemeByName, getThemesByMode, githubLight, importFromFile, lavenderLight, loadFromLocalStorage, midnightDark, mintLight, nordDark, saveToLocalStorage, sepiaLight, serialize, slateDark, solarizedDark, solarizedLight, themes, validateState, vsCodeDark, vsCodeLight, warmLight } from '@widgetstools/dock-manager-core';
|
|
4
|
+
export { DockviewApi, DockviewComponent, EventEmitter, clearLocalStorage, createDefaultState, createTheme, deserialize, dockReducer, draculaDark, exportToFile, findAllTabGroups, findFirstTabGroup, findTabGroupById, findTabGroupForPanel, forestDark, getThemeByName, getThemesByMode, githubLight, importFromFile, lavenderLight, loadFromLocalStorage, midnightDark, mintLight, nordDark, saveToLocalStorage, sepiaLight, serialize, slateDark, solarizedDark, solarizedLight, themes, validateState, vsCodeDark, vsCodeLight, warmLight } from '@widgetstools/dock-manager-core';
|
|
5
5
|
import { BehaviorSubject } from 'rxjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -15,9 +15,18 @@ import { BehaviorSubject } from 'rxjs';
|
|
|
15
15
|
*/
|
|
16
16
|
class DockManagerCoreComponent {
|
|
17
17
|
cdr;
|
|
18
|
+
appRef;
|
|
19
|
+
envInjector;
|
|
18
20
|
/** Initial state for the dock manager */
|
|
19
21
|
initialState;
|
|
20
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Widget registry: maps panel.widgetType strings to Angular component classes.
|
|
24
|
+
* When provided, panels are automatically rendered using createComponent().
|
|
25
|
+
* Each widget component should accept `api` and `panel` inputs.
|
|
26
|
+
*/
|
|
27
|
+
widgets;
|
|
28
|
+
/** Content renderer — called when a panel needs content mounted into a container.
|
|
29
|
+
* Used as fallback when `widgets` registry doesn't match the panel's widgetType. */
|
|
21
30
|
createContent;
|
|
22
31
|
/** Optional custom tab renderer */
|
|
23
32
|
createTab;
|
|
@@ -25,6 +34,10 @@ class DockManagerCoreComponent {
|
|
|
25
34
|
createHeaderActions;
|
|
26
35
|
/** Theme: 'light', 'dark', or a DockTheme object */
|
|
27
36
|
theme = 'light';
|
|
37
|
+
/** Whether to show edge dock indicators. Defaults to true. */
|
|
38
|
+
allowRootDock;
|
|
39
|
+
/** Emits when the dock manager is initialized with the DockviewApi for programmatic control */
|
|
40
|
+
ready = new EventEmitter();
|
|
28
41
|
/** Emits when state changes */
|
|
29
42
|
stateChange = new EventEmitter();
|
|
30
43
|
/** Emits before a panel close (preventable) */
|
|
@@ -33,17 +46,34 @@ class DockManagerCoreComponent {
|
|
|
33
46
|
willDrop = new EventEmitter();
|
|
34
47
|
containerRef;
|
|
35
48
|
dock = null;
|
|
36
|
-
constructor(cdr) {
|
|
49
|
+
constructor(cdr, appRef, envInjector) {
|
|
37
50
|
this.cdr = cdr;
|
|
51
|
+
this.appRef = appRef;
|
|
52
|
+
this.envInjector = envInjector;
|
|
38
53
|
}
|
|
39
54
|
ngAfterViewInit() {
|
|
40
55
|
const options = {
|
|
41
56
|
initialState: this.initialState,
|
|
42
57
|
theme: this.theme,
|
|
58
|
+
allowRootDock: this.allowRootDock,
|
|
43
59
|
createContent: (panelId, container, api) => {
|
|
44
|
-
|
|
45
|
-
this.
|
|
46
|
-
|
|
60
|
+
// Try widget registry first
|
|
61
|
+
// Note: this.dock may be null during initial construction, so fall back to initialState
|
|
62
|
+
const state = this.dock?.getState() ?? this.initialState;
|
|
63
|
+
const panel = state?.panels[panelId];
|
|
64
|
+
const widgetType = panel?.widgetType || '';
|
|
65
|
+
const WidgetClass = this.widgets?.[widgetType];
|
|
66
|
+
if (WidgetClass) {
|
|
67
|
+
return this.mountComponent(WidgetClass, container, api, panel);
|
|
68
|
+
}
|
|
69
|
+
// Fall back to createContent callback
|
|
70
|
+
if (this.createContent) {
|
|
71
|
+
const disposable = this.createContent(panelId, container, api);
|
|
72
|
+
this.cdr.markForCheck();
|
|
73
|
+
return disposable;
|
|
74
|
+
}
|
|
75
|
+
// Nothing to render
|
|
76
|
+
return { dispose: () => { } };
|
|
47
77
|
},
|
|
48
78
|
createTab: this.createTab
|
|
49
79
|
? (panelId, container, isActive) => {
|
|
@@ -73,11 +103,19 @@ class DockManagerCoreComponent {
|
|
|
73
103
|
},
|
|
74
104
|
};
|
|
75
105
|
this.dock = new DockviewComponent(this.containerRef.nativeElement, options);
|
|
106
|
+
// Emit the API for easy programmatic access
|
|
107
|
+
this.ready.emit(this.dock.api);
|
|
76
108
|
}
|
|
77
109
|
ngOnChanges(changes) {
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
}
|
|
110
|
+
if (!this.dock)
|
|
111
|
+
return;
|
|
112
|
+
const updates = {};
|
|
113
|
+
if (changes['theme'] && !changes['theme'].firstChange)
|
|
114
|
+
updates.theme = this.theme;
|
|
115
|
+
if (changes['allowRootDock'] && !changes['allowRootDock'].firstChange)
|
|
116
|
+
updates.allowRootDock = this.allowRootDock;
|
|
117
|
+
if (Object.keys(updates).length > 0)
|
|
118
|
+
this.dock.updateOptions(updates);
|
|
81
119
|
}
|
|
82
120
|
ngOnDestroy() {
|
|
83
121
|
this.dock?.dispose();
|
|
@@ -95,13 +133,40 @@ class DockManagerCoreComponent {
|
|
|
95
133
|
getInstance() {
|
|
96
134
|
return this.dock;
|
|
97
135
|
}
|
|
98
|
-
|
|
99
|
-
|
|
136
|
+
/** Get the DockviewApi for programmatic control */
|
|
137
|
+
getApi() {
|
|
138
|
+
return this.dock?.api ?? null;
|
|
139
|
+
}
|
|
140
|
+
/** Mount an Angular component into a container element */
|
|
141
|
+
mountComponent(componentClass, container, api, panel) {
|
|
142
|
+
const hostEl = document.createElement('div');
|
|
143
|
+
hostEl.style.cssText = 'width:100%;height:100%;color:inherit';
|
|
144
|
+
container.appendChild(hostEl);
|
|
145
|
+
const ref = createComponent(componentClass, {
|
|
146
|
+
hostElement: hostEl,
|
|
147
|
+
environmentInjector: this.envInjector,
|
|
148
|
+
});
|
|
149
|
+
ref.setInput('api', api);
|
|
150
|
+
ref.setInput('panel', panel);
|
|
151
|
+
this.appRef.attachView(ref.hostView);
|
|
152
|
+
queueMicrotask(() => ref.changeDetectorRef.detectChanges());
|
|
153
|
+
return {
|
|
154
|
+
dispose: () => {
|
|
155
|
+
this.appRef.detachView(ref.hostView);
|
|
156
|
+
ref.destroy();
|
|
157
|
+
container.innerHTML = '';
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockManagerCoreComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ApplicationRef }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Component });
|
|
162
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: DockManagerCoreComponent, isStandalone: true, selector: "dock-manager-core", inputs: { initialState: "initialState", widgets: "widgets", createContent: "createContent", createTab: "createTab", createHeaderActions: "createHeaderActions", theme: "theme", allowRootDock: "allowRootDock" }, outputs: { ready: "ready", stateChange: "stateChange", willClose: "willClose", willDrop: "willDrop" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `<div #container style="width:100%;height:100%"></div>`, isInline: true, styles: [":host{display:block;width:100%;height:100%;overflow:hidden}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
100
163
|
}
|
|
101
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockManagerCoreComponent, decorators: [{
|
|
102
165
|
type: Component,
|
|
103
166
|
args: [{ selector: 'dock-manager-core', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `<div #container style="width:100%;height:100%"></div>`, styles: [":host{display:block;width:100%;height:100%;overflow:hidden}\n"] }]
|
|
104
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { initialState: [{
|
|
167
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ApplicationRef }, { type: i0.EnvironmentInjector }], propDecorators: { initialState: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], widgets: [{
|
|
105
170
|
type: Input
|
|
106
171
|
}], createContent: [{
|
|
107
172
|
type: Input
|
|
@@ -111,6 +176,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.2", ngImpor
|
|
|
111
176
|
type: Input
|
|
112
177
|
}], theme: [{
|
|
113
178
|
type: Input
|
|
179
|
+
}], allowRootDock: [{
|
|
180
|
+
type: Input
|
|
181
|
+
}], ready: [{
|
|
182
|
+
type: Output
|
|
114
183
|
}], stateChange: [{
|
|
115
184
|
type: Output
|
|
116
185
|
}], willClose: [{
|
|
@@ -174,10 +243,10 @@ class DockThemeService {
|
|
|
174
243
|
this.mediaQueryList.removeEventListener('change', this.mediaQueryListener);
|
|
175
244
|
}
|
|
176
245
|
}
|
|
177
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.
|
|
178
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.
|
|
246
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
247
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockThemeService, providedIn: 'root' });
|
|
179
248
|
}
|
|
180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockThemeService, decorators: [{
|
|
181
250
|
type: Injectable,
|
|
182
251
|
args: [{
|
|
183
252
|
providedIn: 'root',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widgetstools-angular-dock-manager.mjs","sources":["../../../packages/angular-dock-manager/src/lib/components/dock-manager-core/dock-manager-core.component.ts","../../../packages/angular-dock-manager/src/lib/services/dock-theme.service.ts","../../../packages/angular-dock-manager/src/public-api.ts","../../../packages/angular-dock-manager/src/widgetstools-angular-dock-manager.ts"],"sourcesContent":["/**\n * Thin Angular wrapper around the core DockviewComponent.\n *\n * All DOM rendering, event handling, and layout logic lives in core.\n * Angular only provides panel content via dynamic component creation.\n *\n * Zoneless: Uses ChangeDetectorRef.markForCheck() instead of NgZone.\n * Compatible with both zone.js and zoneless (provideZonelessChangeDetection).\n */\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport type {\n DockManagerState,\n DockPosition,\n PreventableDockEvent,\n DockviewComponentOptions,\n IDisposable,\n DockTheme,\n} from '@widgetstools/dock-manager-core';\nimport {\n DockviewComponent,\n PanelApi,\n} from '@widgetstools/dock-manager-core';\nimport type { DockAction } from '@widgetstools/dock-manager-core';\n\n/**\n * Content renderer function type.\n * Called by the core when a panel needs content.\n * @param api - PanelApi instance for widget-to-header communication.\n * Returns a dispose function to clean up when the panel is hidden/removed.\n */\nexport type ContentRenderer = (panelId: string, container: HTMLElement, api: PanelApi) => IDisposable;\nexport type TabRenderer = (panelId: string, container: HTMLElement, isActive: boolean) => IDisposable;\nexport type HeaderActionsRenderer = (slot: 'left' | 'right' | 'prefix', tabGroupId: string, container: HTMLElement) => IDisposable;\n\n@Component({\n selector: 'dock-manager-core',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div #container style=\"width:100%;height:100%\"></div>`,\n styles: [`:host { display: block; width: 100%; height: 100%; overflow: hidden; }`],\n})\nexport class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnChanges {\n /** Initial state for the dock manager */\n @Input() initialState!: DockManagerState;\n\n /** Content renderer — called when a panel needs content mounted into a container */\n @Input() createContent!: ContentRenderer;\n\n /** Optional custom tab renderer */\n @Input() createTab?: TabRenderer;\n\n /** Optional header actions renderer */\n @Input() createHeaderActions?: HeaderActionsRenderer;\n\n /** Theme: 'light', 'dark', or a DockTheme object */\n @Input() theme: 'light' | 'dark' | DockTheme = 'light';\n\n /** Emits when state changes */\n @Output() stateChange = new EventEmitter<DockManagerState>();\n\n /** Emits before a panel close (preventable) */\n @Output() willClose = new EventEmitter<{ event: PreventableDockEvent; panelId: string }>();\n\n /** Emits before a drop (preventable) */\n @Output() willDrop = new EventEmitter<{\n event: PreventableDockEvent;\n sourceId: string;\n targetId: string;\n position: DockPosition;\n }>();\n\n @ViewChild('container', { static: true }) containerRef!: ElementRef<HTMLDivElement>;\n\n private dock: DockviewComponent | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n const options: DockviewComponentOptions = {\n initialState: this.initialState,\n theme: this.theme,\n\n createContent: (panelId: string, container: HTMLElement, api: PanelApi): IDisposable => {\n const disposable = this.createContent(panelId, container, api);\n this.cdr.markForCheck();\n return disposable;\n },\n\n createTab: this.createTab\n ? (panelId: string, container: HTMLElement, isActive: boolean): IDisposable => {\n const disposable = this.createTab!(panelId, container, isActive);\n this.cdr.markForCheck();\n return disposable;\n }\n : undefined,\n\n createHeaderActions: this.createHeaderActions\n ? (slot, tabGroupId, container): IDisposable => {\n const disposable = this.createHeaderActions!(slot, tabGroupId, container);\n this.cdr.markForCheck();\n return disposable;\n }\n : undefined,\n\n onStateChange: (state: DockManagerState) => {\n this.stateChange.emit(state);\n this.cdr.markForCheck();\n },\n\n onWillClose: (event: PreventableDockEvent, panelId: string) => {\n this.willClose.emit({ event, panelId });\n this.cdr.markForCheck();\n },\n\n onWillDrop: (event, sourceId, targetId, position) => {\n this.willDrop.emit({ event, sourceId, targetId, position });\n this.cdr.markForCheck();\n },\n };\n\n this.dock = new DockviewComponent(this.containerRef.nativeElement, options);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['theme'] && !changes['theme'].firstChange && this.dock) {\n this.dock.updateOptions({ theme: this.theme });\n }\n }\n\n ngOnDestroy(): void {\n this.dock?.dispose();\n this.dock = null;\n }\n\n /** Dispatch an action to the dock manager */\n dispatch(action: DockAction): void {\n this.dock?.dispatch(action);\n }\n\n /** Get current state */\n getState(): DockManagerState | null {\n return this.dock?.getState() ?? null;\n }\n\n /** Get the underlying DockviewComponent instance */\n getInstance(): DockviewComponent | null {\n return this.dock;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DockThemeService {\n private themeModeSubject = new BehaviorSubject<ThemeMode>('light');\n private mediaQueryList: MediaQueryList | null = null;\n private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\n\n themeMode$: Observable<ThemeMode> = this.themeModeSubject.asObservable();\n\n constructor() {\n this.initializeSystemModeListener();\n }\n\n setThemeMode(mode: ThemeMode): void {\n this.themeModeSubject.next(mode);\n this.applyTheme(mode);\n }\n\n getThemeMode(): ThemeMode {\n return this.themeModeSubject.getValue();\n }\n\n private applyTheme(mode: ThemeMode): void {\n const root = document.documentElement;\n const isDark = mode === 'dark' || (mode === 'system' && this.isSystemDark());\n\n if (isDark) {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }\n\n private isSystemDark(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n private initializeSystemModeListener(): void {\n if (typeof window === 'undefined') return;\n\n try {\n this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n this.mediaQueryListener = (e) => {\n const currentMode = this.themeModeSubject.getValue();\n if (currentMode === 'system') {\n this.applyTheme('system');\n }\n };\n this.mediaQueryList.addEventListener('change', this.mediaQueryListener);\n } catch (e) {\n console.warn('System theme detection not supported', e);\n }\n }\n\n ngOnDestroy(): void {\n if (this.mediaQueryList && this.mediaQueryListener) {\n this.mediaQueryList.removeEventListener('change', this.mediaQueryListener);\n }\n }\n}\n","// Core-owned DOM architecture\nexport * from './lib/components/dock-manager-core/dock-manager-core.component';\n\n// Services\nexport * from './lib/services/dock-theme.service';\n\n// Re-export core types and utilities for convenience\nexport {\n DockviewComponent, DockviewApi, EventEmitter,\n dockReducer, createDefaultState, validateState,\n findTabGroupForPanel, findFirstTabGroup, findTabGroupById, findAllTabGroups,\n serialize, deserialize, saveToLocalStorage, loadFromLocalStorage, clearLocalStorage, exportToFile, importFromFile,\n themes, vsCodeLight, githubLight, warmLight, solarizedLight, sepiaLight, mintLight, lavenderLight,\n vsCodeDark, draculaDark, nordDark, solarizedDark, midnightDark, forestDark, slateDark,\n getThemeByName, getThemesByMode,\n} from '@widgetstools/dock-manager-core';\nexport type {\n DockviewComponentOptions, IDisposable, DockAction,\n AddPanelOptions, FloatPanelOptions, MovePanelOptions,\n SplitDirection, DockPosition, DockEdge, PanelConfig, TabGroupNode,\n SplitNode, LayoutNode, FloatingPanel, PopoutPanel, UnpinnedPanel,\n DockManagerState, PreventableDockEvent, HeaderPosition,\n DockTheme, DockThemeColors,\n} from '@widgetstools/dock-manager-core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"widgetstools-angular-dock-manager.mjs","sources":["../../../packages/angular-dock-manager/src/lib/components/dock-manager-core/dock-manager-core.component.ts","../../../packages/angular-dock-manager/src/lib/services/dock-theme.service.ts","../../../packages/angular-dock-manager/src/public-api.ts","../../../packages/angular-dock-manager/src/widgetstools-angular-dock-manager.ts"],"sourcesContent":["/**\n * Thin Angular wrapper around the core DockviewComponent.\n *\n * All DOM rendering, event handling, and layout logic lives in core.\n * Angular only provides panel content via dynamic component creation.\n *\n * Zoneless: Uses ChangeDetectorRef.markForCheck() instead of NgZone.\n * Compatible with both zone.js and zoneless (provideZonelessChangeDetection).\n */\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ApplicationRef,\n EnvironmentInjector,\n Type,\n createComponent,\n} from '@angular/core';\nimport type {\n DockManagerState,\n DockPosition,\n PreventableDockEvent,\n DockviewComponentOptions,\n IDisposable,\n DockTheme,\n} from '@widgetstools/dock-manager-core';\nimport {\n DockviewComponent,\n DockviewApi,\n PanelApi,\n} from '@widgetstools/dock-manager-core';\nimport type { DockAction } from '@widgetstools/dock-manager-core';\n\n/**\n * Content renderer function type.\n * Called by the core when a panel needs content.\n * @param api - PanelApi instance for widget-to-header communication.\n * Returns a dispose function to clean up when the panel is hidden/removed.\n */\nexport type ContentRenderer = (panelId: string, container: HTMLElement, api: PanelApi) => IDisposable;\nexport type TabRenderer = (panelId: string, container: HTMLElement, isActive: boolean) => IDisposable;\nexport type HeaderActionsRenderer = (slot: 'left' | 'right' | 'prefix', tabGroupId: string, container: HTMLElement) => IDisposable;\n\n@Component({\n selector: 'dock-manager-core',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div #container style=\"width:100%;height:100%\"></div>`,\n styles: [`:host { display: block; width: 100%; height: 100%; overflow: hidden; }`],\n})\nexport class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnChanges {\n /** Initial state for the dock manager */\n @Input() initialState!: DockManagerState;\n\n /**\n * Widget registry: maps panel.widgetType strings to Angular component classes.\n * When provided, panels are automatically rendered using createComponent().\n * Each widget component should accept `api` and `panel` inputs.\n */\n @Input() widgets?: Record<string, Type<any>>;\n\n /** Content renderer — called when a panel needs content mounted into a container.\n * Used as fallback when `widgets` registry doesn't match the panel's widgetType. */\n @Input() createContent?: ContentRenderer;\n\n /** Optional custom tab renderer */\n @Input() createTab?: TabRenderer;\n\n /** Optional header actions renderer */\n @Input() createHeaderActions?: HeaderActionsRenderer;\n\n /** Theme: 'light', 'dark', or a DockTheme object */\n @Input() theme: 'light' | 'dark' | DockTheme = 'light';\n\n /** Whether to show edge dock indicators. Defaults to true. */\n @Input() allowRootDock?: boolean;\n\n /** Emits when the dock manager is initialized with the DockviewApi for programmatic control */\n @Output() ready = new EventEmitter<DockviewApi>();\n\n /** Emits when state changes */\n @Output() stateChange = new EventEmitter<DockManagerState>();\n\n /** Emits before a panel close (preventable) */\n @Output() willClose = new EventEmitter<{ event: PreventableDockEvent; panelId: string }>();\n\n /** Emits before a drop (preventable) */\n @Output() willDrop = new EventEmitter<{\n event: PreventableDockEvent;\n sourceId: string;\n targetId: string;\n position: DockPosition;\n }>();\n\n @ViewChild('container', { static: true }) containerRef!: ElementRef<HTMLDivElement>;\n\n private dock: DockviewComponent | null = null;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private appRef: ApplicationRef,\n private envInjector: EnvironmentInjector,\n ) {}\n\n ngAfterViewInit(): void {\n const options: DockviewComponentOptions = {\n initialState: this.initialState,\n theme: this.theme,\n allowRootDock: this.allowRootDock,\n\n createContent: (panelId: string, container: HTMLElement, api: PanelApi): IDisposable => {\n // Try widget registry first\n // Note: this.dock may be null during initial construction, so fall back to initialState\n const state = this.dock?.getState() ?? this.initialState;\n const panel = state?.panels[panelId];\n const widgetType = panel?.widgetType || '';\n const WidgetClass = this.widgets?.[widgetType];\n\n if (WidgetClass) {\n return this.mountComponent(WidgetClass, container, api, panel);\n }\n\n // Fall back to createContent callback\n if (this.createContent) {\n const disposable = this.createContent(panelId, container, api);\n this.cdr.markForCheck();\n return disposable;\n }\n\n // Nothing to render\n return { dispose: () => {} };\n },\n\n createTab: this.createTab\n ? (panelId: string, container: HTMLElement, isActive: boolean): IDisposable => {\n const disposable = this.createTab!(panelId, container, isActive);\n this.cdr.markForCheck();\n return disposable;\n }\n : undefined,\n\n createHeaderActions: this.createHeaderActions\n ? (slot, tabGroupId, container): IDisposable => {\n const disposable = this.createHeaderActions!(slot, tabGroupId, container);\n this.cdr.markForCheck();\n return disposable;\n }\n : undefined,\n\n onStateChange: (state: DockManagerState) => {\n this.stateChange.emit(state);\n this.cdr.markForCheck();\n },\n\n onWillClose: (event: PreventableDockEvent, panelId: string) => {\n this.willClose.emit({ event, panelId });\n this.cdr.markForCheck();\n },\n\n onWillDrop: (event, sourceId, targetId, position) => {\n this.willDrop.emit({ event, sourceId, targetId, position });\n this.cdr.markForCheck();\n },\n };\n\n this.dock = new DockviewComponent(this.containerRef.nativeElement, options);\n\n // Emit the API for easy programmatic access\n this.ready.emit(this.dock.api);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.dock) return;\n const updates: Partial<DockviewComponentOptions> = {};\n if (changes['theme'] && !changes['theme'].firstChange) updates.theme = this.theme;\n if (changes['allowRootDock'] && !changes['allowRootDock'].firstChange) updates.allowRootDock = this.allowRootDock;\n if (Object.keys(updates).length > 0) this.dock.updateOptions(updates);\n }\n\n ngOnDestroy(): void {\n this.dock?.dispose();\n this.dock = null;\n }\n\n /** Dispatch an action to the dock manager */\n dispatch(action: DockAction): void {\n this.dock?.dispatch(action);\n }\n\n /** Get current state */\n getState(): DockManagerState | null {\n return this.dock?.getState() ?? null;\n }\n\n /** Get the underlying DockviewComponent instance */\n getInstance(): DockviewComponent | null {\n return this.dock;\n }\n\n /** Get the DockviewApi for programmatic control */\n getApi(): DockviewApi | null {\n return this.dock?.api ?? null;\n }\n\n /** Mount an Angular component into a container element */\n private mountComponent(componentClass: Type<any>, container: HTMLElement, api: PanelApi, panel: any): IDisposable {\n const hostEl = document.createElement('div');\n hostEl.style.cssText = 'width:100%;height:100%;color:inherit';\n container.appendChild(hostEl);\n\n const ref = createComponent(componentClass, {\n hostElement: hostEl,\n environmentInjector: this.envInjector,\n });\n\n ref.setInput('api', api);\n ref.setInput('panel', panel);\n\n this.appRef.attachView(ref.hostView);\n queueMicrotask(() => ref.changeDetectorRef.detectChanges());\n\n return {\n dispose: () => {\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n container.innerHTML = '';\n },\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DockThemeService {\n private themeModeSubject = new BehaviorSubject<ThemeMode>('light');\n private mediaQueryList: MediaQueryList | null = null;\n private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\n\n themeMode$: Observable<ThemeMode> = this.themeModeSubject.asObservable();\n\n constructor() {\n this.initializeSystemModeListener();\n }\n\n setThemeMode(mode: ThemeMode): void {\n this.themeModeSubject.next(mode);\n this.applyTheme(mode);\n }\n\n getThemeMode(): ThemeMode {\n return this.themeModeSubject.getValue();\n }\n\n private applyTheme(mode: ThemeMode): void {\n const root = document.documentElement;\n const isDark = mode === 'dark' || (mode === 'system' && this.isSystemDark());\n\n if (isDark) {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }\n\n private isSystemDark(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n private initializeSystemModeListener(): void {\n if (typeof window === 'undefined') return;\n\n try {\n this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');\n this.mediaQueryListener = (e) => {\n const currentMode = this.themeModeSubject.getValue();\n if (currentMode === 'system') {\n this.applyTheme('system');\n }\n };\n this.mediaQueryList.addEventListener('change', this.mediaQueryListener);\n } catch (e) {\n console.warn('System theme detection not supported', e);\n }\n }\n\n ngOnDestroy(): void {\n if (this.mediaQueryList && this.mediaQueryListener) {\n this.mediaQueryList.removeEventListener('change', this.mediaQueryListener);\n }\n }\n}\n","// Core-owned DOM architecture\nexport * from './lib/components/dock-manager-core/dock-manager-core.component';\n\n// Services\nexport * from './lib/services/dock-theme.service';\n\n// Re-export core types and utilities for convenience\nexport {\n DockviewComponent, DockviewApi, EventEmitter,\n dockReducer, createDefaultState, validateState,\n findTabGroupForPanel, findFirstTabGroup, findTabGroupById, findAllTabGroups,\n serialize, deserialize, saveToLocalStorage, loadFromLocalStorage, clearLocalStorage, exportToFile, importFromFile,\n createTheme, themes, vsCodeLight, githubLight, warmLight, solarizedLight, sepiaLight, mintLight, lavenderLight,\n vsCodeDark, draculaDark, nordDark, solarizedDark, midnightDark, forestDark, slateDark,\n getThemeByName, getThemesByMode,\n} from '@widgetstools/dock-manager-core';\nexport type {\n DockviewComponentOptions, IDisposable, DockAction,\n AddPanelOptions, FloatPanelOptions, MovePanelOptions,\n SplitDirection, DockPosition, DockEdge, PanelConfig, TabGroupNode,\n SplitNode, LayoutNode, FloatingPanel, PopoutPanel, UnpinnedPanel,\n DockManagerState, PreventableDockEvent, HeaderPosition,\n DockTheme, DockThemeColors,\n} from '@widgetstools/dock-manager-core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { AfterViewInit, OnDestroy, OnChanges, EventEmitter, ElementRef, ChangeDetectorRef, SimpleChanges } from '@angular/core';
|
|
3
|
-
import { PanelApi, IDisposable, DockManagerState, DockTheme, PreventableDockEvent, DockPosition, DockAction, DockviewComponent } from '@widgetstools/dock-manager-core';
|
|
4
|
-
export { AddPanelOptions, DockAction, DockEdge, DockManagerState, DockPosition, DockTheme, DockThemeColors, DockviewApi, DockviewComponent, DockviewComponentOptions, EventEmitter, FloatPanelOptions, FloatingPanel, HeaderPosition, IDisposable, LayoutNode, MovePanelOptions, PanelConfig, PopoutPanel, PreventableDockEvent, SplitDirection, SplitNode, TabGroupNode, UnpinnedPanel, clearLocalStorage, createDefaultState, deserialize, dockReducer, draculaDark, exportToFile, findAllTabGroups, findFirstTabGroup, findTabGroupById, findTabGroupForPanel, forestDark, getThemeByName, getThemesByMode, githubLight, importFromFile, lavenderLight, loadFromLocalStorage, midnightDark, mintLight, nordDark, saveToLocalStorage, sepiaLight, serialize, slateDark, solarizedDark, solarizedLight, themes, validateState, vsCodeDark, vsCodeLight, warmLight } from '@widgetstools/dock-manager-core';
|
|
2
|
+
import { AfterViewInit, OnDestroy, OnChanges, Type, EventEmitter, ElementRef, ChangeDetectorRef, ApplicationRef, EnvironmentInjector, SimpleChanges } from '@angular/core';
|
|
3
|
+
import { PanelApi, IDisposable, DockManagerState, DockTheme, DockviewApi, PreventableDockEvent, DockPosition, DockAction, DockviewComponent } from '@widgetstools/dock-manager-core';
|
|
4
|
+
export { AddPanelOptions, DockAction, DockEdge, DockManagerState, DockPosition, DockTheme, DockThemeColors, DockviewApi, DockviewComponent, DockviewComponentOptions, EventEmitter, FloatPanelOptions, FloatingPanel, HeaderPosition, IDisposable, LayoutNode, MovePanelOptions, PanelConfig, PopoutPanel, PreventableDockEvent, SplitDirection, SplitNode, TabGroupNode, UnpinnedPanel, clearLocalStorage, createDefaultState, createTheme, deserialize, dockReducer, draculaDark, exportToFile, findAllTabGroups, findFirstTabGroup, findTabGroupById, findTabGroupForPanel, forestDark, getThemeByName, getThemesByMode, githubLight, importFromFile, lavenderLight, loadFromLocalStorage, midnightDark, mintLight, nordDark, saveToLocalStorage, sepiaLight, serialize, slateDark, solarizedDark, solarizedLight, themes, validateState, vsCodeDark, vsCodeLight, warmLight } from '@widgetstools/dock-manager-core';
|
|
5
5
|
import { Observable } from 'rxjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -25,16 +25,29 @@ type TabRenderer = (panelId: string, container: HTMLElement, isActive: boolean)
|
|
|
25
25
|
type HeaderActionsRenderer = (slot: 'left' | 'right' | 'prefix', tabGroupId: string, container: HTMLElement) => IDisposable;
|
|
26
26
|
declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnChanges {
|
|
27
27
|
private cdr;
|
|
28
|
+
private appRef;
|
|
29
|
+
private envInjector;
|
|
28
30
|
/** Initial state for the dock manager */
|
|
29
31
|
initialState: DockManagerState;
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Widget registry: maps panel.widgetType strings to Angular component classes.
|
|
34
|
+
* When provided, panels are automatically rendered using createComponent().
|
|
35
|
+
* Each widget component should accept `api` and `panel` inputs.
|
|
36
|
+
*/
|
|
37
|
+
widgets?: Record<string, Type<any>>;
|
|
38
|
+
/** Content renderer — called when a panel needs content mounted into a container.
|
|
39
|
+
* Used as fallback when `widgets` registry doesn't match the panel's widgetType. */
|
|
40
|
+
createContent?: ContentRenderer;
|
|
32
41
|
/** Optional custom tab renderer */
|
|
33
42
|
createTab?: TabRenderer;
|
|
34
43
|
/** Optional header actions renderer */
|
|
35
44
|
createHeaderActions?: HeaderActionsRenderer;
|
|
36
45
|
/** Theme: 'light', 'dark', or a DockTheme object */
|
|
37
46
|
theme: 'light' | 'dark' | DockTheme;
|
|
47
|
+
/** Whether to show edge dock indicators. Defaults to true. */
|
|
48
|
+
allowRootDock?: boolean;
|
|
49
|
+
/** Emits when the dock manager is initialized with the DockviewApi for programmatic control */
|
|
50
|
+
ready: EventEmitter<DockviewApi>;
|
|
38
51
|
/** Emits when state changes */
|
|
39
52
|
stateChange: EventEmitter<DockManagerState>;
|
|
40
53
|
/** Emits before a panel close (preventable) */
|
|
@@ -51,7 +64,7 @@ declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnCh
|
|
|
51
64
|
}>;
|
|
52
65
|
containerRef: ElementRef<HTMLDivElement>;
|
|
53
66
|
private dock;
|
|
54
|
-
constructor(cdr: ChangeDetectorRef);
|
|
67
|
+
constructor(cdr: ChangeDetectorRef, appRef: ApplicationRef, envInjector: EnvironmentInjector);
|
|
55
68
|
ngAfterViewInit(): void;
|
|
56
69
|
ngOnChanges(changes: SimpleChanges): void;
|
|
57
70
|
ngOnDestroy(): void;
|
|
@@ -61,8 +74,12 @@ declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnCh
|
|
|
61
74
|
getState(): DockManagerState | null;
|
|
62
75
|
/** Get the underlying DockviewComponent instance */
|
|
63
76
|
getInstance(): DockviewComponent | null;
|
|
77
|
+
/** Get the DockviewApi for programmatic control */
|
|
78
|
+
getApi(): DockviewApi | null;
|
|
79
|
+
/** Mount an Angular component into a container element */
|
|
80
|
+
private mountComponent;
|
|
64
81
|
static ɵfac: i0.ɵɵFactoryDeclaration<DockManagerCoreComponent, never>;
|
|
65
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DockManagerCoreComponent, "dock-manager-core", never, { "initialState": { "alias": "initialState"; "required": false; }; "createContent": { "alias": "createContent"; "required": false; }; "createTab": { "alias": "createTab"; "required": false; }; "createHeaderActions": { "alias": "createHeaderActions"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; }, { "stateChange": "stateChange"; "willClose": "willClose"; "willDrop": "willDrop"; }, never, never, true, never>;
|
|
82
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DockManagerCoreComponent, "dock-manager-core", never, { "initialState": { "alias": "initialState"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; "createContent": { "alias": "createContent"; "required": false; }; "createTab": { "alias": "createTab"; "required": false; }; "createHeaderActions": { "alias": "createHeaderActions"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "allowRootDock": { "alias": "allowRootDock"; "required": false; }; }, { "ready": "ready"; "stateChange": "stateChange"; "willClose": "willClose"; "willDrop": "willDrop"; }, never, never, true, never>;
|
|
66
83
|
}
|
|
67
84
|
|
|
68
85
|
type ThemeMode = 'light' | 'dark' | 'system';
|