@widgetstools/angular-dock-manager 0.1.0 → 0.1.3

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
- /** Content renderer — called when a panel needs content mounted into a container */
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
- const disposable = this.createContent(panelId, container, api);
45
- this.cdr.markForCheck();
46
- return disposable;
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 (changes['theme'] && !changes['theme'].firstChange && this.dock) {
79
- this.dock.updateOptions({ theme: this.theme });
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
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: DockManagerCoreComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
99
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.2", type: DockManagerCoreComponent, isStandalone: true, selector: "dock-manager-core", inputs: { initialState: "initialState", createContent: "createContent", createTab: "createTab", createHeaderActions: "createHeaderActions", theme: "theme" }, outputs: { 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 });
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.2", ngImport: i0, type: DockManagerCoreComponent, decorators: [{
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.2", ngImport: i0, type: DockThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
178
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.2", ngImport: i0, type: DockThemeService, providedIn: 'root' });
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.2", ngImport: i0, type: DockThemeService, decorators: [{
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,11 +1,12 @@
1
1
  {
2
2
  "name": "@widgetstools/angular-dock-manager",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Angular dock manager — thin wrapper around dock-manager-core",
5
5
  "peerDependencies": {
6
6
  "@angular/common": ">=21.0.0",
7
7
  "@angular/core": ">=21.0.0",
8
- "rxjs": "^7.8.0"
8
+ "rxjs": "^7.8.0",
9
+ "@widgetstools/dock-manager-core": ">=0.1.3"
9
10
  },
10
11
  "dependencies": {
11
12
  "tslib": "^2.3.0"
@@ -0,0 +1,151 @@
1
+ /* PrimeNG Theme Bridge for Dock Manager */
2
+
3
+ /* Map PrimeNG light theme to dock properties */
4
+ :root.p-light {
5
+ --dock-bg: 220 20% 96%;
6
+ --dock-surface: 0 0% 100%;
7
+ --dock-surface-alt: 220 14% 95%;
8
+ --dock-panel-header: 220 14% 95%;
9
+ --dock-tab-bar: 220 14% 93%;
10
+ --dock-tab-active: 0 0% 100%;
11
+ --dock-tab-text: 0 0% 30%;
12
+ --dock-tab-text-active: 217 91% 50%;
13
+ --dock-text: 0 0% 15%;
14
+ --dock-text-secondary: 0 0% 40%;
15
+ --dock-text-muted: 0 0% 55%;
16
+ --dock-border: 220 13% 87%;
17
+ --dock-splitter: 220 13% 87%;
18
+ --dock-splitter-hover: 217 91% 60%;
19
+ --dock-hover: 220 14% 93%;
20
+ --dock-float-shadow: 0 0% 0%;
21
+ --dock-unpinned-bg: 220 14% 95%;
22
+ }
23
+
24
+ /* Map PrimeNG dark theme to dock properties */
25
+ :root.p-dark,
26
+ :root.dark {
27
+ --dock-bg: 222 47% 7%;
28
+ --dock-surface: 222 47% 10%;
29
+ --dock-surface-alt: 222 47% 12%;
30
+ --dock-panel-header: 222 47% 13%;
31
+ --dock-tab-bar: 222 47% 11%;
32
+ --dock-tab-active: 222 47% 10%;
33
+ --dock-tab-text: 215 20% 60%;
34
+ --dock-tab-text-active: 217 91% 70%;
35
+ --dock-text: 210 40% 96%;
36
+ --dock-text-secondary: 215 20% 65%;
37
+ --dock-text-muted: 215 15% 45%;
38
+ --dock-border: 217 33% 20%;
39
+ --dock-splitter: 217 33% 20%;
40
+ --dock-splitter-hover: 217 91% 60%;
41
+ --dock-hover: 217 33% 16%;
42
+ --dock-float-shadow: 0 0% 0%;
43
+ --dock-unpinned-bg: 222 47% 12%;
44
+ }
45
+
46
+ /* PrimeNG Lara theme (light variant) */
47
+ :root.p-lara.p-light {
48
+ --dock-bg: 220 20% 96%;
49
+ --dock-surface: 0 0% 100%;
50
+ --dock-surface-alt: 220 14% 95%;
51
+ --dock-panel-header: 220 14% 95%;
52
+ --dock-tab-bar: 220 14% 93%;
53
+ --dock-tab-active: 0 0% 100%;
54
+ --dock-tab-text: 0 0% 30%;
55
+ --dock-tab-text-active: 217 91% 50%;
56
+ --dock-text: 0 0% 15%;
57
+ --dock-text-secondary: 0 0% 40%;
58
+ --dock-text-muted: 0 0% 55%;
59
+ --dock-border: 220 13% 87%;
60
+ --dock-splitter: 220 13% 87%;
61
+ --dock-splitter-hover: 217 91% 60%;
62
+ --dock-hover: 220 14% 93%;
63
+ --dock-float-shadow: 0 0% 0%;
64
+ --dock-unpinned-bg: 220 14% 95%;
65
+ }
66
+
67
+ /* PrimeNG Lara theme (dark variant) */
68
+ :root.p-lara.p-dark,
69
+ :root.p-lara.dark {
70
+ --dock-bg: 222 47% 7%;
71
+ --dock-surface: 222 47% 10%;
72
+ --dock-surface-alt: 222 47% 12%;
73
+ --dock-panel-header: 222 47% 13%;
74
+ --dock-tab-bar: 222 47% 11%;
75
+ --dock-tab-active: 222 47% 10%;
76
+ --dock-tab-text: 215 20% 60%;
77
+ --dock-tab-text-active: 217 91% 70%;
78
+ --dock-text: 210 40% 96%;
79
+ --dock-text-secondary: 215 20% 65%;
80
+ --dock-text-muted: 215 15% 45%;
81
+ --dock-border: 217 33% 20%;
82
+ --dock-splitter: 217 33% 20%;
83
+ --dock-splitter-hover: 217 91% 60%;
84
+ --dock-hover: 217 33% 16%;
85
+ --dock-float-shadow: 0 0% 0%;
86
+ --dock-unpinned-bg: 222 47% 12%;
87
+ }
88
+
89
+ /* PrimeNG Soho theme (light variant) */
90
+ :root.p-soho.p-light {
91
+ --dock-bg: 220 20% 96%;
92
+ --dock-surface: 0 0% 100%;
93
+ --dock-surface-alt: 220 14% 95%;
94
+ --dock-panel-header: 220 14% 95%;
95
+ --dock-tab-bar: 220 14% 93%;
96
+ --dock-tab-active: 0 0% 100%;
97
+ --dock-tab-text: 0 0% 30%;
98
+ --dock-tab-text-active: 217 91% 50%;
99
+ --dock-text: 0 0% 15%;
100
+ --dock-text-secondary: 0 0% 40%;
101
+ --dock-text-muted: 0 0% 55%;
102
+ --dock-border: 220 13% 87%;
103
+ --dock-splitter: 220 13% 87%;
104
+ --dock-splitter-hover: 217 91% 60%;
105
+ --dock-hover: 220 14% 93%;
106
+ --dock-float-shadow: 0 0% 0%;
107
+ --dock-unpinned-bg: 220 14% 95%;
108
+ }
109
+
110
+ /* PrimeNG Soho theme (dark variant) */
111
+ :root.p-soho.p-dark,
112
+ :root.p-soho.dark {
113
+ --dock-bg: 222 47% 7%;
114
+ --dock-surface: 222 47% 10%;
115
+ --dock-surface-alt: 222 47% 12%;
116
+ --dock-panel-header: 222 47% 13%;
117
+ --dock-tab-bar: 222 47% 11%;
118
+ --dock-tab-active: 222 47% 10%;
119
+ --dock-tab-text: 215 20% 60%;
120
+ --dock-tab-text-active: 217 91% 70%;
121
+ --dock-text: 210 40% 96%;
122
+ --dock-text-secondary: 215 20% 65%;
123
+ --dock-text-muted: 215 15% 45%;
124
+ --dock-border: 217 33% 20%;
125
+ --dock-splitter: 217 33% 20%;
126
+ --dock-splitter-hover: 217 91% 60%;
127
+ --dock-hover: 217 33% 16%;
128
+ --dock-float-shadow: 0 0% 0%;
129
+ --dock-unpinned-bg: 222 47% 12%;
130
+ }
131
+
132
+ /* Ensure backward compatibility with direct dark class */
133
+ .dark {
134
+ --dock-bg: 222 47% 7%;
135
+ --dock-surface: 222 47% 10%;
136
+ --dock-surface-alt: 222 47% 12%;
137
+ --dock-panel-header: 222 47% 13%;
138
+ --dock-tab-bar: 222 47% 11%;
139
+ --dock-tab-active: 222 47% 10%;
140
+ --dock-tab-text: 215 20% 60%;
141
+ --dock-tab-text-active: 217 91% 70%;
142
+ --dock-text: 210 40% 96%;
143
+ --dock-text-secondary: 215 20% 65%;
144
+ --dock-text-muted: 215 15% 45%;
145
+ --dock-border: 217 33% 20%;
146
+ --dock-splitter: 217 33% 20%;
147
+ --dock-splitter-hover: 217 91% 60%;
148
+ --dock-hover: 217 33% 16%;
149
+ --dock-float-shadow: 0 0% 0%;
150
+ --dock-unpinned-bg: 222 47% 12%;
151
+ }
@@ -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
- /** Content renderer — called when a panel needs content mounted into a container */
31
- createContent: ContentRenderer;
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';