@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/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
- private scheduleHide;
734
+ scheduleHide(panel: PanelState): void;
684
735
  /**
685
736
  * Clear hide timer for a panel
686
737
  */
687
- private clearTimer;
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
- private scheduleHide;
734
+ scheduleHide(panel: PanelState): void;
684
735
  /**
685
736
  * Clear hide timer for a panel
686
737
  */
687
- private clearTimer;
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 };