@widgetstools/angular-dock-manager 0.1.20 → 0.1.33
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.
|
@@ -32,6 +32,8 @@ class DockManagerCoreComponent {
|
|
|
32
32
|
createTab;
|
|
33
33
|
/** Optional header actions renderer */
|
|
34
34
|
createHeaderActions;
|
|
35
|
+
/** Optional watermark renderer for empty tab groups */
|
|
36
|
+
createWatermark;
|
|
35
37
|
/** Theme: 'light', 'dark', or a DockTheme object */
|
|
36
38
|
theme = 'light';
|
|
37
39
|
/** Whether to show edge dock indicators. Defaults to true. */
|
|
@@ -89,6 +91,13 @@ class DockManagerCoreComponent {
|
|
|
89
91
|
return disposable;
|
|
90
92
|
}
|
|
91
93
|
: undefined,
|
|
94
|
+
createWatermark: this.createWatermark
|
|
95
|
+
? (container) => {
|
|
96
|
+
const disposable = this.createWatermark(container);
|
|
97
|
+
this.cdr.markForCheck();
|
|
98
|
+
return disposable;
|
|
99
|
+
}
|
|
100
|
+
: undefined,
|
|
92
101
|
onStateChange: (state) => {
|
|
93
102
|
this.stateChange.emit(state);
|
|
94
103
|
this.cdr.markForCheck();
|
|
@@ -159,7 +168,7 @@ class DockManagerCoreComponent {
|
|
|
159
168
|
};
|
|
160
169
|
}
|
|
161
170
|
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 });
|
|
171
|
+
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", createWatermark: "createWatermark", 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 });
|
|
163
172
|
}
|
|
164
173
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DockManagerCoreComponent, decorators: [{
|
|
165
174
|
type: Component,
|
|
@@ -174,6 +183,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
|
|
|
174
183
|
type: Input
|
|
175
184
|
}], createHeaderActions: [{
|
|
176
185
|
type: Input
|
|
186
|
+
}], createWatermark: [{
|
|
187
|
+
type: Input
|
|
177
188
|
}], theme: [{
|
|
178
189
|
type: Input
|
|
179
190
|
}], allowRootDock: [{
|
|
@@ -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 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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"}
|
|
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;\nexport type WatermarkRenderer = (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 /** Optional watermark renderer for empty tab groups */\n @Input() createWatermark?: WatermarkRenderer;\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 createWatermark: this.createWatermark\n ? (container): IDisposable => {\n const disposable = this.createWatermark!(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,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@widgetstools/angular-dock-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.33",
|
|
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
8
|
"rxjs": "^7.8.0",
|
|
9
|
-
"@widgetstools/dock-manager-core": "
|
|
9
|
+
"@widgetstools/dock-manager-core": "^0.1.33"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"tslib": "^2.3.0"
|
|
@@ -23,6 +23,7 @@ import { Observable } from 'rxjs';
|
|
|
23
23
|
type ContentRenderer = (panelId: string, container: HTMLElement, api: PanelApi) => IDisposable;
|
|
24
24
|
type TabRenderer = (panelId: string, container: HTMLElement, isActive: boolean) => IDisposable;
|
|
25
25
|
type HeaderActionsRenderer = (slot: 'left' | 'right' | 'prefix', tabGroupId: string, container: HTMLElement) => IDisposable;
|
|
26
|
+
type WatermarkRenderer = (container: HTMLElement) => IDisposable;
|
|
26
27
|
declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnChanges {
|
|
27
28
|
private cdr;
|
|
28
29
|
private appRef;
|
|
@@ -42,6 +43,8 @@ declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnCh
|
|
|
42
43
|
createTab?: TabRenderer;
|
|
43
44
|
/** Optional header actions renderer */
|
|
44
45
|
createHeaderActions?: HeaderActionsRenderer;
|
|
46
|
+
/** Optional watermark renderer for empty tab groups */
|
|
47
|
+
createWatermark?: WatermarkRenderer;
|
|
45
48
|
/** Theme: 'light', 'dark', or a DockTheme object */
|
|
46
49
|
theme: 'light' | 'dark' | DockTheme;
|
|
47
50
|
/** Whether to show edge dock indicators. Defaults to true. */
|
|
@@ -79,7 +82,7 @@ declare class DockManagerCoreComponent implements AfterViewInit, OnDestroy, OnCh
|
|
|
79
82
|
/** Mount an Angular component into a container element */
|
|
80
83
|
private mountComponent;
|
|
81
84
|
static ɵfac: i0.ɵɵFactoryDeclaration<DockManagerCoreComponent, 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>;
|
|
85
|
+
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; }; "createWatermark": { "alias": "createWatermark"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "allowRootDock": { "alias": "allowRootDock"; "required": false; }; }, { "ready": "ready"; "stateChange": "stateChange"; "willClose": "willClose"; "willDrop": "willDrop"; }, never, never, true, never>;
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
type ThemeMode = 'light' | 'dark' | 'system';
|
|
@@ -100,4 +103,4 @@ declare class DockThemeService {
|
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
export { DockManagerCoreComponent, DockThemeService };
|
|
103
|
-
export type { ContentRenderer, HeaderActionsRenderer, TabRenderer, ThemeMode };
|
|
106
|
+
export type { ContentRenderer, HeaderActionsRenderer, TabRenderer, ThemeMode, WatermarkRenderer };
|