@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.20",
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": ">=0.1.20"
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 };