@blorkfield/blork-tabs 0.3.0 → 0.4.0
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.
- package/README.md +138 -5
- package/dist/index.cjs +238 -69
- package/dist/index.d.cts +116 -4
- package/dist/index.d.ts +116 -4
- package/dist/index.js +234 -69
- package/dist/styles.css +66 -35
- package/package.json +1 -1
- package/src/AutoHideManager.ts +45 -2
- package/src/DebugPanel.ts +185 -15
- package/src/DragManager.ts +13 -13
- package/src/Panel.ts +37 -0
- package/src/SnapChain.ts +45 -0
- package/src/TabManager.ts +54 -71
- package/src/index.ts +6 -1
- package/src/types.ts +48 -0
package/dist/index.d.cts
CHANGED
|
@@ -52,6 +52,8 @@ interface PanelConfig {
|
|
|
52
52
|
title?: string;
|
|
53
53
|
/** Initial width (default: 300) */
|
|
54
54
|
width?: number;
|
|
55
|
+
/** Initial pin state (default: false) */
|
|
56
|
+
startPinned?: boolean;
|
|
55
57
|
/** Initial collapsed state (default: true) */
|
|
56
58
|
startCollapsed?: boolean;
|
|
57
59
|
/** Initial position (optional - will be auto-positioned if not provided) */
|
|
@@ -65,12 +67,16 @@ interface PanelConfig {
|
|
|
65
67
|
element?: HTMLDivElement;
|
|
66
68
|
/** Custom drag handle element */
|
|
67
69
|
dragHandle?: HTMLDivElement;
|
|
70
|
+
/** Custom pin button element */
|
|
71
|
+
pinButton?: HTMLButtonElement;
|
|
68
72
|
/** Custom collapse button element */
|
|
69
73
|
collapseButton?: HTMLButtonElement;
|
|
70
74
|
/** Custom content wrapper element */
|
|
71
75
|
contentWrapper?: HTMLDivElement;
|
|
72
76
|
/** Custom detach grip element */
|
|
73
77
|
detachGrip?: HTMLDivElement;
|
|
78
|
+
/** Whether panel can be pinned (default: false) */
|
|
79
|
+
pinnable?: boolean;
|
|
74
80
|
/** Whether panel can be collapsed (default: true) */
|
|
75
81
|
collapsible?: boolean;
|
|
76
82
|
/** Whether panel can be detached from group (default: true) */
|
|
@@ -111,12 +117,16 @@ interface PanelState {
|
|
|
111
117
|
element: HTMLDivElement;
|
|
112
118
|
/** Drag handle element */
|
|
113
119
|
dragHandle: HTMLDivElement;
|
|
120
|
+
/** Pin button element (if pinable) */
|
|
121
|
+
pinButton: HTMLButtonElement | null;
|
|
114
122
|
/** Collapse button element (if collapsible) */
|
|
115
123
|
collapseButton: HTMLButtonElement | null;
|
|
116
124
|
/** Content wrapper element */
|
|
117
125
|
contentWrapper: HTMLDivElement;
|
|
118
126
|
/** Detach grip element (if detachable) */
|
|
119
127
|
detachGrip: HTMLDivElement | null;
|
|
128
|
+
/** Whether panel is currently pinned */
|
|
129
|
+
isPinned: boolean;
|
|
120
130
|
/** Whether panel is currently collapsed */
|
|
121
131
|
isCollapsed: boolean;
|
|
122
132
|
/** ID of panel this is snapped to on its right (outgoing link) */
|
|
@@ -226,6 +236,8 @@ interface TabManagerEvents {
|
|
|
226
236
|
'snap:anchor': AnchorSnapEvent;
|
|
227
237
|
/** Fired when a panel is detached from group */
|
|
228
238
|
'panel:detached': PanelDetachedEvent;
|
|
239
|
+
/** Fired when panel pin state changes */
|
|
240
|
+
'panel:pin': PanelPinEvent;
|
|
229
241
|
/** Fired when panel collapse state changes */
|
|
230
242
|
'panel:collapse': PanelCollapseEvent;
|
|
231
243
|
/** Fired when a panel becomes visible (auto-hide) */
|
|
@@ -269,6 +281,10 @@ interface PanelDetachedEvent {
|
|
|
269
281
|
panel: PanelState;
|
|
270
282
|
previousGroup: PanelState[];
|
|
271
283
|
}
|
|
284
|
+
interface PanelPinEvent {
|
|
285
|
+
panel: PanelState;
|
|
286
|
+
isPinned: boolean;
|
|
287
|
+
}
|
|
272
288
|
interface PanelCollapseEvent {
|
|
273
289
|
panel: PanelState;
|
|
274
290
|
isCollapsed: boolean;
|
|
@@ -295,6 +311,7 @@ interface CSSClasses {
|
|
|
295
311
|
panelContent: string;
|
|
296
312
|
panelContentCollapsed: string;
|
|
297
313
|
detachGrip: string;
|
|
314
|
+
pinButton: string;
|
|
298
315
|
collapseButton: string;
|
|
299
316
|
snapPreview: string;
|
|
300
317
|
snapPreviewVisible: string;
|
|
@@ -324,6 +341,19 @@ interface DebugPanelConfig extends Omit<PanelConfig, 'content'> {
|
|
|
324
341
|
maxEntries?: number;
|
|
325
342
|
/** Show timestamps on entries (default: false) */
|
|
326
343
|
showTimestamps?: boolean;
|
|
344
|
+
/** Milliseconds to hover before enlarging (default: 5000, 0 = disable) */
|
|
345
|
+
hoverDelay?: number;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Configuration for creating an embeddable debug log
|
|
349
|
+
*/
|
|
350
|
+
interface DebugLogConfig {
|
|
351
|
+
/** Maximum log entries before oldest are removed (default: 50) */
|
|
352
|
+
maxEntries?: number;
|
|
353
|
+
/** Show timestamps on entries (default: false) */
|
|
354
|
+
showTimestamps?: boolean;
|
|
355
|
+
/** Milliseconds to hover before enlarging (default: 5000, 0 = disable) */
|
|
356
|
+
hoverDelay?: number;
|
|
327
357
|
}
|
|
328
358
|
/**
|
|
329
359
|
* Log level for debug entries
|
|
@@ -346,6 +376,21 @@ interface DebugPanel {
|
|
|
346
376
|
/** The underlying panel state */
|
|
347
377
|
panel: PanelState;
|
|
348
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* Interface for an embeddable debug log (without panel)
|
|
381
|
+
*/
|
|
382
|
+
interface DebugLog {
|
|
383
|
+
/** Log an event (alias for info) */
|
|
384
|
+
log(eventName: string, data?: Record<string, unknown>): void;
|
|
385
|
+
/** Log an info event (blue) */
|
|
386
|
+
info(eventName: string, data?: Record<string, unknown>): void;
|
|
387
|
+
/** Log a warning event (yellow) */
|
|
388
|
+
warn(eventName: string, data?: Record<string, unknown>): void;
|
|
389
|
+
/** Log an error event (red) */
|
|
390
|
+
error(eventName: string, data?: Record<string, unknown>): void;
|
|
391
|
+
/** Clear all log entries */
|
|
392
|
+
clear(): void;
|
|
393
|
+
}
|
|
349
394
|
|
|
350
395
|
/**
|
|
351
396
|
* @blorkfield/blork-tabs - TabManager
|
|
@@ -375,6 +420,7 @@ declare class TabManager {
|
|
|
375
420
|
*/
|
|
376
421
|
registerPanel(id: string, element: HTMLDivElement, options?: {
|
|
377
422
|
dragHandle?: HTMLDivElement;
|
|
423
|
+
pinButton?: HTMLButtonElement;
|
|
378
424
|
collapseButton?: HTMLButtonElement;
|
|
379
425
|
contentWrapper?: HTMLDivElement;
|
|
380
426
|
detachGrip?: HTMLDivElement;
|
|
@@ -396,6 +442,10 @@ declare class TabManager {
|
|
|
396
442
|
* Add a debug panel with built-in logging functionality
|
|
397
443
|
*/
|
|
398
444
|
addDebugPanel(config: DebugPanelConfig): DebugPanel;
|
|
445
|
+
/**
|
|
446
|
+
* Create an embeddable debug log in any container element
|
|
447
|
+
*/
|
|
448
|
+
createDebugLog(container: HTMLElement, config?: DebugLogConfig): DebugLog;
|
|
399
449
|
/**
|
|
400
450
|
* Set up event handlers for a panel
|
|
401
451
|
*/
|
|
@@ -666,6 +716,7 @@ declare class AutoHideManager {
|
|
|
666
716
|
private classes;
|
|
667
717
|
private callbacks;
|
|
668
718
|
private hideTimers;
|
|
719
|
+
private pausedPanels;
|
|
669
720
|
private boundActivityHandler;
|
|
670
721
|
private listenersAttached;
|
|
671
722
|
constructor(panels: Map<string, PanelState>, classes: CSSClasses, callbacks: AutoHideCallbacks);
|
|
@@ -680,11 +731,19 @@ declare class AutoHideManager {
|
|
|
680
731
|
/**
|
|
681
732
|
* Schedule a panel to hide after its delay
|
|
682
733
|
*/
|
|
683
|
-
|
|
734
|
+
scheduleHide(panel: PanelState): void;
|
|
684
735
|
/**
|
|
685
736
|
* Clear hide timer for a panel
|
|
686
737
|
*/
|
|
687
|
-
|
|
738
|
+
clearTimer(panelId: string): void;
|
|
739
|
+
/**
|
|
740
|
+
* Pause auto-hide timer for a panel (e.g., during debug hover)
|
|
741
|
+
*/
|
|
742
|
+
pauseTimer(panelId: string): void;
|
|
743
|
+
/**
|
|
744
|
+
* Resume auto-hide timer for a panel
|
|
745
|
+
*/
|
|
746
|
+
resumeTimer(panelId: string): void;
|
|
688
747
|
/**
|
|
689
748
|
* Show a panel
|
|
690
749
|
*/
|
|
@@ -693,6 +752,12 @@ declare class AutoHideManager {
|
|
|
693
752
|
* Hide a panel
|
|
694
753
|
*/
|
|
695
754
|
hide(panel: PanelState, trigger: 'timeout' | 'api'): void;
|
|
755
|
+
/**
|
|
756
|
+
* Called when a panel's pin state changes.
|
|
757
|
+
* Pinning cancels the hide timer and reveals the panel if hidden.
|
|
758
|
+
* Unpinning restarts the timer if the panel participates in auto-hide.
|
|
759
|
+
*/
|
|
760
|
+
onPanelPinChanged(panel: PanelState): void;
|
|
696
761
|
/**
|
|
697
762
|
* Initialize a newly added panel's auto-hide state
|
|
698
763
|
*/
|
|
@@ -724,9 +789,39 @@ declare function createDebugPanelContent(_config: DebugPanelConfig, classes: CSS
|
|
|
724
789
|
elements: DebugPanelElements;
|
|
725
790
|
};
|
|
726
791
|
/**
|
|
727
|
-
* Create the interface for interacting with a debug panel
|
|
792
|
+
* Create the interface for interacting with a debug panel.
|
|
793
|
+
* Uses the shared createDebugLogInterface internally.
|
|
728
794
|
*/
|
|
729
795
|
declare function createDebugPanelInterface(panel: PanelState, elements: DebugPanelElements, config: DebugPanelConfig, classes: CSSClasses): DebugPanel;
|
|
796
|
+
interface DebugLogSetup {
|
|
797
|
+
debugLog: DebugLog;
|
|
798
|
+
logContainer: HTMLDivElement;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Create an embeddable debug log in any container element
|
|
802
|
+
*/
|
|
803
|
+
declare function createDebugLog(container: HTMLElement, config: DebugLogConfig, classes: CSSClasses): DebugLogSetup;
|
|
804
|
+
interface HoverEnlargeConfig {
|
|
805
|
+
/** The log container element (.blork-tabs-debug-log) to enlarge */
|
|
806
|
+
logContainer: HTMLElement;
|
|
807
|
+
/** Hover delay in ms (0 = disable) */
|
|
808
|
+
hoverDelay: number;
|
|
809
|
+
/** Container to append backdrop to */
|
|
810
|
+
backdropContainer: HTMLElement;
|
|
811
|
+
/** CSS classes */
|
|
812
|
+
classes: CSSClasses;
|
|
813
|
+
/** Called when hovering starts */
|
|
814
|
+
onHoverStart?: () => void;
|
|
815
|
+
/** Called when hovering ends (without enlarging) */
|
|
816
|
+
onHoverEnd?: () => void;
|
|
817
|
+
/** Called when enlarged view is closed */
|
|
818
|
+
onClose?: () => void;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Set up hover-to-enlarge behavior for a debug log container.
|
|
822
|
+
* Works the same for both standalone debug panels and embedded logs.
|
|
823
|
+
*/
|
|
824
|
+
declare function setupHoverEnlarge(config: HoverEnlargeConfig): void;
|
|
730
825
|
|
|
731
826
|
/**
|
|
732
827
|
* @blorkfield/blork-tabs - Panel
|
|
@@ -739,6 +834,7 @@ declare function createDebugPanelInterface(panel: PanelState, elements: DebugPan
|
|
|
739
834
|
declare function createPanelElement(config: PanelConfig, classes: CSSClasses): {
|
|
740
835
|
element: HTMLDivElement;
|
|
741
836
|
dragHandle: HTMLDivElement;
|
|
837
|
+
pinButton: HTMLButtonElement | null;
|
|
742
838
|
collapseButton: HTMLButtonElement | null;
|
|
743
839
|
contentWrapper: HTMLDivElement;
|
|
744
840
|
detachGrip: HTMLDivElement | null;
|
|
@@ -754,6 +850,10 @@ declare function createPanelState(config: PanelConfig, classes: CSSClasses, glob
|
|
|
754
850
|
* Toggle panel collapse state
|
|
755
851
|
*/
|
|
756
852
|
declare function toggleCollapse(state: PanelState, classes: CSSClasses, collapsed?: boolean): boolean;
|
|
853
|
+
/**
|
|
854
|
+
* Toggle panel pin state
|
|
855
|
+
*/
|
|
856
|
+
declare function togglePin(state: PanelState, pinned?: boolean): boolean;
|
|
757
857
|
/**
|
|
758
858
|
* Show a hidden panel
|
|
759
859
|
*/
|
|
@@ -838,9 +938,21 @@ declare function areInSameChain(panel1: PanelState, panel2: PanelState, panels:
|
|
|
838
938
|
* Establish a snap relationship between two panels
|
|
839
939
|
*/
|
|
840
940
|
declare function snapPanels(leftPanel: PanelState, rightPanel: PanelState): void;
|
|
941
|
+
/**
|
|
942
|
+
* Get the subset of connected panels that should move when a panel is grabbed,
|
|
943
|
+
* stopping at any pinned panel in the chain.
|
|
944
|
+
*
|
|
945
|
+
* Pinned panels act as immoveable barriers — the chain splits at each one,
|
|
946
|
+
* and only the panels on the same side as the grabbed panel are returned.
|
|
947
|
+
* The snap bonds at each pin boundary are severed as a side effect.
|
|
948
|
+
*
|
|
949
|
+
* Example: chain [A, B, P(pinned), C, D], grab B → returns [A, B], unseats B↔P
|
|
950
|
+
* Example: chain [A, P(pinned), B, C], grab C → returns [B, C], unseats P↔B
|
|
951
|
+
*/
|
|
952
|
+
declare function getMovingGroupRespectingPins(grabbedPanel: PanelState, panels: Map<string, PanelState>): PanelState[];
|
|
841
953
|
/**
|
|
842
954
|
* Break the snap relationship between two specific panels
|
|
843
955
|
*/
|
|
844
956
|
declare function unsnap(leftPanel: PanelState, rightPanel: PanelState): void;
|
|
845
957
|
|
|
846
|
-
export { type AnchorConfig, AnchorManager, type AnchorPreset, type AnchorSnapEvent, type AnchorSnapResult, type AnchorState, type AutoHideCallbacks, AutoHideManager, type Bounds, type CSSClasses, type DebugLogLevel, type DebugPanel, type DebugPanelConfig, type DragEndEvent, DragManager, type DragMode, type DragMoveEvent, type DragStartEvent, type DragState, type EventListener, type PanelAddedEvent, type PanelCollapseEvent, type PanelConfig, type PanelDetachedEvent, type PanelHideEvent, type PanelRemovedEvent, type PanelShowEvent, type PanelSnapEvent, type PanelState, type Position, type ResolvedTabManagerConfig, SnapPreview, type SnapSide, type SnapTarget, TabManager, type TabManagerConfig, type TabManagerEvents, areInSameChain, createDebugPanelContent, createDebugPanelInterface, createPanelElement, createPanelState, createPresetAnchor, detachFromGroup, findSnapTarget, getConnectedGroup, getDefaultAnchorConfigs, getDefaultZIndex, getDragZIndex, getLeftmostPanel, getPanelDimensions, getPanelPosition, getRightmostPanel, hidePanel, setPanelPosition, setPanelZIndex, showPanel, snapPanels, snapPanelsToTarget, toggleCollapse, unsnap, updateSnappedPositions };
|
|
958
|
+
export { type AnchorConfig, AnchorManager, type AnchorPreset, type AnchorSnapEvent, type AnchorSnapResult, type AnchorState, type AutoHideCallbacks, AutoHideManager, type Bounds, type CSSClasses, type DebugLog, type DebugLogConfig, type DebugLogLevel, type DebugPanel, type DebugPanelConfig, type DragEndEvent, DragManager, type DragMode, type DragMoveEvent, type DragStartEvent, type DragState, type EventListener, type PanelAddedEvent, type PanelCollapseEvent, type PanelConfig, type PanelDetachedEvent, type PanelHideEvent, type PanelPinEvent, type PanelRemovedEvent, type PanelShowEvent, type PanelSnapEvent, type PanelState, type Position, type ResolvedTabManagerConfig, SnapPreview, type SnapSide, type SnapTarget, TabManager, type TabManagerConfig, type TabManagerEvents, areInSameChain, createDebugLog, createDebugPanelContent, createDebugPanelInterface, createPanelElement, createPanelState, createPresetAnchor, detachFromGroup, findSnapTarget, getConnectedGroup, getDefaultAnchorConfigs, getDefaultZIndex, getDragZIndex, getLeftmostPanel, getMovingGroupRespectingPins, getPanelDimensions, getPanelPosition, getRightmostPanel, hidePanel, setPanelPosition, setPanelZIndex, setupHoverEnlarge, showPanel, snapPanels, snapPanelsToTarget, toggleCollapse, togglePin, unsnap, updateSnappedPositions };
|
package/dist/index.d.ts
CHANGED
|
@@ -52,6 +52,8 @@ interface PanelConfig {
|
|
|
52
52
|
title?: string;
|
|
53
53
|
/** Initial width (default: 300) */
|
|
54
54
|
width?: number;
|
|
55
|
+
/** Initial pin state (default: false) */
|
|
56
|
+
startPinned?: boolean;
|
|
55
57
|
/** Initial collapsed state (default: true) */
|
|
56
58
|
startCollapsed?: boolean;
|
|
57
59
|
/** Initial position (optional - will be auto-positioned if not provided) */
|
|
@@ -65,12 +67,16 @@ interface PanelConfig {
|
|
|
65
67
|
element?: HTMLDivElement;
|
|
66
68
|
/** Custom drag handle element */
|
|
67
69
|
dragHandle?: HTMLDivElement;
|
|
70
|
+
/** Custom pin button element */
|
|
71
|
+
pinButton?: HTMLButtonElement;
|
|
68
72
|
/** Custom collapse button element */
|
|
69
73
|
collapseButton?: HTMLButtonElement;
|
|
70
74
|
/** Custom content wrapper element */
|
|
71
75
|
contentWrapper?: HTMLDivElement;
|
|
72
76
|
/** Custom detach grip element */
|
|
73
77
|
detachGrip?: HTMLDivElement;
|
|
78
|
+
/** Whether panel can be pinned (default: false) */
|
|
79
|
+
pinnable?: boolean;
|
|
74
80
|
/** Whether panel can be collapsed (default: true) */
|
|
75
81
|
collapsible?: boolean;
|
|
76
82
|
/** Whether panel can be detached from group (default: true) */
|
|
@@ -111,12 +117,16 @@ interface PanelState {
|
|
|
111
117
|
element: HTMLDivElement;
|
|
112
118
|
/** Drag handle element */
|
|
113
119
|
dragHandle: HTMLDivElement;
|
|
120
|
+
/** Pin button element (if pinable) */
|
|
121
|
+
pinButton: HTMLButtonElement | null;
|
|
114
122
|
/** Collapse button element (if collapsible) */
|
|
115
123
|
collapseButton: HTMLButtonElement | null;
|
|
116
124
|
/** Content wrapper element */
|
|
117
125
|
contentWrapper: HTMLDivElement;
|
|
118
126
|
/** Detach grip element (if detachable) */
|
|
119
127
|
detachGrip: HTMLDivElement | null;
|
|
128
|
+
/** Whether panel is currently pinned */
|
|
129
|
+
isPinned: boolean;
|
|
120
130
|
/** Whether panel is currently collapsed */
|
|
121
131
|
isCollapsed: boolean;
|
|
122
132
|
/** ID of panel this is snapped to on its right (outgoing link) */
|
|
@@ -226,6 +236,8 @@ interface TabManagerEvents {
|
|
|
226
236
|
'snap:anchor': AnchorSnapEvent;
|
|
227
237
|
/** Fired when a panel is detached from group */
|
|
228
238
|
'panel:detached': PanelDetachedEvent;
|
|
239
|
+
/** Fired when panel pin state changes */
|
|
240
|
+
'panel:pin': PanelPinEvent;
|
|
229
241
|
/** Fired when panel collapse state changes */
|
|
230
242
|
'panel:collapse': PanelCollapseEvent;
|
|
231
243
|
/** Fired when a panel becomes visible (auto-hide) */
|
|
@@ -269,6 +281,10 @@ interface PanelDetachedEvent {
|
|
|
269
281
|
panel: PanelState;
|
|
270
282
|
previousGroup: PanelState[];
|
|
271
283
|
}
|
|
284
|
+
interface PanelPinEvent {
|
|
285
|
+
panel: PanelState;
|
|
286
|
+
isPinned: boolean;
|
|
287
|
+
}
|
|
272
288
|
interface PanelCollapseEvent {
|
|
273
289
|
panel: PanelState;
|
|
274
290
|
isCollapsed: boolean;
|
|
@@ -295,6 +311,7 @@ interface CSSClasses {
|
|
|
295
311
|
panelContent: string;
|
|
296
312
|
panelContentCollapsed: string;
|
|
297
313
|
detachGrip: string;
|
|
314
|
+
pinButton: string;
|
|
298
315
|
collapseButton: string;
|
|
299
316
|
snapPreview: string;
|
|
300
317
|
snapPreviewVisible: string;
|
|
@@ -324,6 +341,19 @@ interface DebugPanelConfig extends Omit<PanelConfig, 'content'> {
|
|
|
324
341
|
maxEntries?: number;
|
|
325
342
|
/** Show timestamps on entries (default: false) */
|
|
326
343
|
showTimestamps?: boolean;
|
|
344
|
+
/** Milliseconds to hover before enlarging (default: 5000, 0 = disable) */
|
|
345
|
+
hoverDelay?: number;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Configuration for creating an embeddable debug log
|
|
349
|
+
*/
|
|
350
|
+
interface DebugLogConfig {
|
|
351
|
+
/** Maximum log entries before oldest are removed (default: 50) */
|
|
352
|
+
maxEntries?: number;
|
|
353
|
+
/** Show timestamps on entries (default: false) */
|
|
354
|
+
showTimestamps?: boolean;
|
|
355
|
+
/** Milliseconds to hover before enlarging (default: 5000, 0 = disable) */
|
|
356
|
+
hoverDelay?: number;
|
|
327
357
|
}
|
|
328
358
|
/**
|
|
329
359
|
* Log level for debug entries
|
|
@@ -346,6 +376,21 @@ interface DebugPanel {
|
|
|
346
376
|
/** The underlying panel state */
|
|
347
377
|
panel: PanelState;
|
|
348
378
|
}
|
|
379
|
+
/**
|
|
380
|
+
* Interface for an embeddable debug log (without panel)
|
|
381
|
+
*/
|
|
382
|
+
interface DebugLog {
|
|
383
|
+
/** Log an event (alias for info) */
|
|
384
|
+
log(eventName: string, data?: Record<string, unknown>): void;
|
|
385
|
+
/** Log an info event (blue) */
|
|
386
|
+
info(eventName: string, data?: Record<string, unknown>): void;
|
|
387
|
+
/** Log a warning event (yellow) */
|
|
388
|
+
warn(eventName: string, data?: Record<string, unknown>): void;
|
|
389
|
+
/** Log an error event (red) */
|
|
390
|
+
error(eventName: string, data?: Record<string, unknown>): void;
|
|
391
|
+
/** Clear all log entries */
|
|
392
|
+
clear(): void;
|
|
393
|
+
}
|
|
349
394
|
|
|
350
395
|
/**
|
|
351
396
|
* @blorkfield/blork-tabs - TabManager
|
|
@@ -375,6 +420,7 @@ declare class TabManager {
|
|
|
375
420
|
*/
|
|
376
421
|
registerPanel(id: string, element: HTMLDivElement, options?: {
|
|
377
422
|
dragHandle?: HTMLDivElement;
|
|
423
|
+
pinButton?: HTMLButtonElement;
|
|
378
424
|
collapseButton?: HTMLButtonElement;
|
|
379
425
|
contentWrapper?: HTMLDivElement;
|
|
380
426
|
detachGrip?: HTMLDivElement;
|
|
@@ -396,6 +442,10 @@ declare class TabManager {
|
|
|
396
442
|
* Add a debug panel with built-in logging functionality
|
|
397
443
|
*/
|
|
398
444
|
addDebugPanel(config: DebugPanelConfig): DebugPanel;
|
|
445
|
+
/**
|
|
446
|
+
* Create an embeddable debug log in any container element
|
|
447
|
+
*/
|
|
448
|
+
createDebugLog(container: HTMLElement, config?: DebugLogConfig): DebugLog;
|
|
399
449
|
/**
|
|
400
450
|
* Set up event handlers for a panel
|
|
401
451
|
*/
|
|
@@ -666,6 +716,7 @@ declare class AutoHideManager {
|
|
|
666
716
|
private classes;
|
|
667
717
|
private callbacks;
|
|
668
718
|
private hideTimers;
|
|
719
|
+
private pausedPanels;
|
|
669
720
|
private boundActivityHandler;
|
|
670
721
|
private listenersAttached;
|
|
671
722
|
constructor(panels: Map<string, PanelState>, classes: CSSClasses, callbacks: AutoHideCallbacks);
|
|
@@ -680,11 +731,19 @@ declare class AutoHideManager {
|
|
|
680
731
|
/**
|
|
681
732
|
* Schedule a panel to hide after its delay
|
|
682
733
|
*/
|
|
683
|
-
|
|
734
|
+
scheduleHide(panel: PanelState): void;
|
|
684
735
|
/**
|
|
685
736
|
* Clear hide timer for a panel
|
|
686
737
|
*/
|
|
687
|
-
|
|
738
|
+
clearTimer(panelId: string): void;
|
|
739
|
+
/**
|
|
740
|
+
* Pause auto-hide timer for a panel (e.g., during debug hover)
|
|
741
|
+
*/
|
|
742
|
+
pauseTimer(panelId: string): void;
|
|
743
|
+
/**
|
|
744
|
+
* Resume auto-hide timer for a panel
|
|
745
|
+
*/
|
|
746
|
+
resumeTimer(panelId: string): void;
|
|
688
747
|
/**
|
|
689
748
|
* Show a panel
|
|
690
749
|
*/
|
|
@@ -693,6 +752,12 @@ declare class AutoHideManager {
|
|
|
693
752
|
* Hide a panel
|
|
694
753
|
*/
|
|
695
754
|
hide(panel: PanelState, trigger: 'timeout' | 'api'): void;
|
|
755
|
+
/**
|
|
756
|
+
* Called when a panel's pin state changes.
|
|
757
|
+
* Pinning cancels the hide timer and reveals the panel if hidden.
|
|
758
|
+
* Unpinning restarts the timer if the panel participates in auto-hide.
|
|
759
|
+
*/
|
|
760
|
+
onPanelPinChanged(panel: PanelState): void;
|
|
696
761
|
/**
|
|
697
762
|
* Initialize a newly added panel's auto-hide state
|
|
698
763
|
*/
|
|
@@ -724,9 +789,39 @@ declare function createDebugPanelContent(_config: DebugPanelConfig, classes: CSS
|
|
|
724
789
|
elements: DebugPanelElements;
|
|
725
790
|
};
|
|
726
791
|
/**
|
|
727
|
-
* Create the interface for interacting with a debug panel
|
|
792
|
+
* Create the interface for interacting with a debug panel.
|
|
793
|
+
* Uses the shared createDebugLogInterface internally.
|
|
728
794
|
*/
|
|
729
795
|
declare function createDebugPanelInterface(panel: PanelState, elements: DebugPanelElements, config: DebugPanelConfig, classes: CSSClasses): DebugPanel;
|
|
796
|
+
interface DebugLogSetup {
|
|
797
|
+
debugLog: DebugLog;
|
|
798
|
+
logContainer: HTMLDivElement;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Create an embeddable debug log in any container element
|
|
802
|
+
*/
|
|
803
|
+
declare function createDebugLog(container: HTMLElement, config: DebugLogConfig, classes: CSSClasses): DebugLogSetup;
|
|
804
|
+
interface HoverEnlargeConfig {
|
|
805
|
+
/** The log container element (.blork-tabs-debug-log) to enlarge */
|
|
806
|
+
logContainer: HTMLElement;
|
|
807
|
+
/** Hover delay in ms (0 = disable) */
|
|
808
|
+
hoverDelay: number;
|
|
809
|
+
/** Container to append backdrop to */
|
|
810
|
+
backdropContainer: HTMLElement;
|
|
811
|
+
/** CSS classes */
|
|
812
|
+
classes: CSSClasses;
|
|
813
|
+
/** Called when hovering starts */
|
|
814
|
+
onHoverStart?: () => void;
|
|
815
|
+
/** Called when hovering ends (without enlarging) */
|
|
816
|
+
onHoverEnd?: () => void;
|
|
817
|
+
/** Called when enlarged view is closed */
|
|
818
|
+
onClose?: () => void;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Set up hover-to-enlarge behavior for a debug log container.
|
|
822
|
+
* Works the same for both standalone debug panels and embedded logs.
|
|
823
|
+
*/
|
|
824
|
+
declare function setupHoverEnlarge(config: HoverEnlargeConfig): void;
|
|
730
825
|
|
|
731
826
|
/**
|
|
732
827
|
* @blorkfield/blork-tabs - Panel
|
|
@@ -739,6 +834,7 @@ declare function createDebugPanelInterface(panel: PanelState, elements: DebugPan
|
|
|
739
834
|
declare function createPanelElement(config: PanelConfig, classes: CSSClasses): {
|
|
740
835
|
element: HTMLDivElement;
|
|
741
836
|
dragHandle: HTMLDivElement;
|
|
837
|
+
pinButton: HTMLButtonElement | null;
|
|
742
838
|
collapseButton: HTMLButtonElement | null;
|
|
743
839
|
contentWrapper: HTMLDivElement;
|
|
744
840
|
detachGrip: HTMLDivElement | null;
|
|
@@ -754,6 +850,10 @@ declare function createPanelState(config: PanelConfig, classes: CSSClasses, glob
|
|
|
754
850
|
* Toggle panel collapse state
|
|
755
851
|
*/
|
|
756
852
|
declare function toggleCollapse(state: PanelState, classes: CSSClasses, collapsed?: boolean): boolean;
|
|
853
|
+
/**
|
|
854
|
+
* Toggle panel pin state
|
|
855
|
+
*/
|
|
856
|
+
declare function togglePin(state: PanelState, pinned?: boolean): boolean;
|
|
757
857
|
/**
|
|
758
858
|
* Show a hidden panel
|
|
759
859
|
*/
|
|
@@ -838,9 +938,21 @@ declare function areInSameChain(panel1: PanelState, panel2: PanelState, panels:
|
|
|
838
938
|
* Establish a snap relationship between two panels
|
|
839
939
|
*/
|
|
840
940
|
declare function snapPanels(leftPanel: PanelState, rightPanel: PanelState): void;
|
|
941
|
+
/**
|
|
942
|
+
* Get the subset of connected panels that should move when a panel is grabbed,
|
|
943
|
+
* stopping at any pinned panel in the chain.
|
|
944
|
+
*
|
|
945
|
+
* Pinned panels act as immoveable barriers — the chain splits at each one,
|
|
946
|
+
* and only the panels on the same side as the grabbed panel are returned.
|
|
947
|
+
* The snap bonds at each pin boundary are severed as a side effect.
|
|
948
|
+
*
|
|
949
|
+
* Example: chain [A, B, P(pinned), C, D], grab B → returns [A, B], unseats B↔P
|
|
950
|
+
* Example: chain [A, P(pinned), B, C], grab C → returns [B, C], unseats P↔B
|
|
951
|
+
*/
|
|
952
|
+
declare function getMovingGroupRespectingPins(grabbedPanel: PanelState, panels: Map<string, PanelState>): PanelState[];
|
|
841
953
|
/**
|
|
842
954
|
* Break the snap relationship between two specific panels
|
|
843
955
|
*/
|
|
844
956
|
declare function unsnap(leftPanel: PanelState, rightPanel: PanelState): void;
|
|
845
957
|
|
|
846
|
-
export { type AnchorConfig, AnchorManager, type AnchorPreset, type AnchorSnapEvent, type AnchorSnapResult, type AnchorState, type AutoHideCallbacks, AutoHideManager, type Bounds, type CSSClasses, type DebugLogLevel, type DebugPanel, type DebugPanelConfig, type DragEndEvent, DragManager, type DragMode, type DragMoveEvent, type DragStartEvent, type DragState, type EventListener, type PanelAddedEvent, type PanelCollapseEvent, type PanelConfig, type PanelDetachedEvent, type PanelHideEvent, type PanelRemovedEvent, type PanelShowEvent, type PanelSnapEvent, type PanelState, type Position, type ResolvedTabManagerConfig, SnapPreview, type SnapSide, type SnapTarget, TabManager, type TabManagerConfig, type TabManagerEvents, areInSameChain, createDebugPanelContent, createDebugPanelInterface, createPanelElement, createPanelState, createPresetAnchor, detachFromGroup, findSnapTarget, getConnectedGroup, getDefaultAnchorConfigs, getDefaultZIndex, getDragZIndex, getLeftmostPanel, getPanelDimensions, getPanelPosition, getRightmostPanel, hidePanel, setPanelPosition, setPanelZIndex, showPanel, snapPanels, snapPanelsToTarget, toggleCollapse, unsnap, updateSnappedPositions };
|
|
958
|
+
export { type AnchorConfig, AnchorManager, type AnchorPreset, type AnchorSnapEvent, type AnchorSnapResult, type AnchorState, type AutoHideCallbacks, AutoHideManager, type Bounds, type CSSClasses, type DebugLog, type DebugLogConfig, type DebugLogLevel, type DebugPanel, type DebugPanelConfig, type DragEndEvent, DragManager, type DragMode, type DragMoveEvent, type DragStartEvent, type DragState, type EventListener, type PanelAddedEvent, type PanelCollapseEvent, type PanelConfig, type PanelDetachedEvent, type PanelHideEvent, type PanelPinEvent, type PanelRemovedEvent, type PanelShowEvent, type PanelSnapEvent, type PanelState, type Position, type ResolvedTabManagerConfig, SnapPreview, type SnapSide, type SnapTarget, TabManager, type TabManagerConfig, type TabManagerEvents, areInSameChain, createDebugLog, createDebugPanelContent, createDebugPanelInterface, createPanelElement, createPanelState, createPresetAnchor, detachFromGroup, findSnapTarget, getConnectedGroup, getDefaultAnchorConfigs, getDefaultZIndex, getDragZIndex, getLeftmostPanel, getMovingGroupRespectingPins, getPanelDimensions, getPanelPosition, getRightmostPanel, hidePanel, setPanelPosition, setPanelZIndex, setupHoverEnlarge, showPanel, snapPanels, snapPanelsToTarget, toggleCollapse, togglePin, unsnap, updateSnappedPositions };
|