@mintplayer/ng-bootstrap 21.24.0 → 21.26.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mintplayer/ng-bootstrap",
3
3
  "private": false,
4
- "version": "21.24.0",
4
+ "version": "21.26.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
@@ -84,6 +84,9 @@ declare class MintDockManagerElement extends LitElement {
84
84
  static configureDocument(documentRef: Document | null | undefined): void;
85
85
  static get observedAttributes(): string[];
86
86
  private static instanceCounter;
87
+ private static readonly TOUCH_LONG_PRESS_MS;
88
+ private static readonly TOUCH_LONG_PRESS_SLOP_PX;
89
+ private static readonly TOUCH_PRESS_FEEDBACK_DELAY_MS;
87
90
  private documentRef;
88
91
  private windowRef;
89
92
  private rootEl;
@@ -111,6 +114,7 @@ declare class MintDockManagerElement extends LitElement {
111
114
  private cornerSnapXTargets;
112
115
  private cornerSnapYTargets;
113
116
  private showSnapMarkers;
117
+ debugLayoutIntegrity: boolean;
114
118
  private renderSnapMarkersForCorner;
115
119
  private clearSnapMarkers;
116
120
  private pendingDragEndTimeout;
@@ -199,13 +203,36 @@ declare class MintDockManagerElement extends LitElement {
199
203
  private captureTabDragMetrics;
200
204
  private clearPendingTabDragMetrics;
201
205
  /**
202
- * Pointerdown handler arms a "may become a drag" gesture. Once the pointer
203
- * moves past `threshold` pixels we promote it to an actual pane drag via
204
- * {@link beginPaneDrag}; if the user releases first we just clear the
205
- * pending tab metrics. All listeners self-clean on resolve so the gesture
206
- * stays scoped to a single pointerdown.
206
+ * Pointerdown handler arms a "may become a drag" gesture. Mouse / pen use a
207
+ * 5 px distance threshold and arm immediately; touch dispatches to
208
+ * {@link armPaneDragGestureTouch} which requires a 600 ms stationary hold
209
+ * (so the user can scroll the tabstrip natively without undocking).
210
+ * Once armed, both paths converge on {@link beginPaneDrag}. All listeners
211
+ * self-clean on resolve so the gesture stays scoped to a single pointerdown.
207
212
  */
208
213
  private armPaneDragGesture;
214
+ /**
215
+ * Touch-specific gesture arming. With `.dock-tab` set to `touch-action:
216
+ * none`, the browser never arbitrates the gesture itself, so JS owns it
217
+ * from frame 1. Three outcomes from the pending state:
218
+ *
219
+ * - User holds within {@link TOUCH_LONG_PRESS_SLOP_PX} for
220
+ * {@link TOUCH_LONG_PRESS_MS} → timer fires → drag arms via
221
+ * {@link beginPaneDrag}.
222
+ * - User moves past slop and the move is mostly horizontal, and the
223
+ * strip's `<ul>` is scrollable → enter `scrolling` mode and drive
224
+ * `ul.scrollLeft` from JS for the rest of the gesture (no drag, no
225
+ * momentum — direct 1:1 finger follow).
226
+ * - User moves past slop in any other direction, releases, or
227
+ * pointercancel fires → abandoned, no drag, no scroll. Releases
228
+ * under slop fire the synthesized click that drives `tab-activate`.
229
+ *
230
+ * `touch-action: pan-x` was the original PRD design but doesn't work:
231
+ * the policy is frozen at touchstart and `setPointerCapture` doesn't
232
+ * promote it, so first move after a long-press fires pointercancel and
233
+ * strands the panel. JS-driven scroll is the only model that holds.
234
+ */
235
+ private armPaneDragGestureTouch;
209
236
  private beginPaneDrag;
210
237
  private preparePaneDragSource;
211
238
  private endPaneDrag;
@@ -249,8 +276,6 @@ declare class MintDockManagerElement extends LitElement {
249
276
  private getNodeAtPath;
250
277
  private resolveSplitNode;
251
278
  private replaceNodeInTree;
252
- private cleanupEmptyStackInTree;
253
- private cleanupSplitIfNecessary;
254
279
  private dockNodeBeside;
255
280
  private forEachStack;
256
281
  private findStackContainingPane;
@@ -268,12 +293,42 @@ declare class MintDockManagerElement extends LitElement {
268
293
  private removePaneFromLocation;
269
294
  private addPaneToLocation;
270
295
  private setActivePaneForLocation;
271
- private cleanupLocation;
272
296
  private reorderPaneInLocation;
273
297
  private removeFloatingAt;
274
298
  private removePaneFromFloating;
275
299
  private normalizeSizesArray;
276
300
  private normalizeSplitNode;
301
+ /**
302
+ * Bottom-up layout sanitizer. Returns a normalized version of `node` where:
303
+ * - Empty stacks (panes.length === 0) are dropped (returned as null).
304
+ * - A stack's `activePane` is repaired if it no longer references one of `panes`.
305
+ * - Splits whose direction matches a child split are flattened, with sizes
306
+ * combined multiplicatively so the resulting on-screen pixel layout is
307
+ * identical to the pre-merge one.
308
+ * - Splits with 0 children become null. Splits with 1 child are unwrapped.
309
+ *
310
+ * Idempotent: passing the result back through this method yields the same
311
+ * structure. Mutates the input tree in place but only returns nodes that
312
+ * remain part of the layout.
313
+ */
314
+ private normalizeLayoutNode;
315
+ /**
316
+ * Apply `normalizeLayoutNode` to `rootLayout` and every floating window's
317
+ * root, drop floating windows whose root collapses to null, and repair
318
+ * stale `activePane` references on each floating window. Run this at the
319
+ * end of every public mutation entry point (drop handlers, layout setter,
320
+ * pane removal) so the tree the renderer sees is always in canonical form.
321
+ */
322
+ private normalizeAllLayouts;
323
+ /**
324
+ * Dev-mode integrity guard: walks every pane referenced by the current
325
+ * layout and asserts that the rendered shadow DOM contains a matching
326
+ * `<slot name="${pane}">`. A missing slot means the layout tree got into
327
+ * a state the renderer can't display — typically a missed normalize() call
328
+ * or a render bug. Opt in via the `debug-layout-integrity` attribute or
329
+ * the `debugLayoutIntegrity` property; off by default.
330
+ */
331
+ private verifyProjectionSlots;
277
332
  private dispatchLayoutChanged;
278
333
  private cloneLayoutNode;
279
334
  private cloneFloatingArray;
@@ -281,6 +336,14 @@ declare class MintDockManagerElement extends LitElement {
281
336
 
282
337
  declare class BsDockManagerComponent implements AfterViewInit {
283
338
  readonly layout: _angular_core.InputSignal<DockLayoutNode | DockLayout | null>;
339
+ /**
340
+ * Dev-mode integrity guard. When `true`, the inner web component throws
341
+ * after each render if any registered pane has no projection slot in the
342
+ * shadow DOM — a signal that the layout tree got corrupted. Off by default;
343
+ * enable in development to catch layout-logic bugs loudly.
344
+ */
345
+ readonly debugLayoutIntegrity: _angular_core.InputSignal<boolean>;
346
+ protected readonly debugLayoutIntegrityAttr: _angular_core.Signal<"" | null>;
284
347
  get layoutSnapshot(): DockLayoutSnapshot | null;
285
348
  readonly layoutChange: _angular_core.OutputEmitterRef<DockLayoutSnapshot | null>;
286
349
  readonly layoutSnapshotChange: _angular_core.OutputEmitterRef<DockLayoutSnapshot>;
@@ -298,7 +361,7 @@ declare class BsDockManagerComponent implements AfterViewInit {
298
361
  private stringifyLayout;
299
362
  private cloneLayout;
300
363
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsDockManagerComponent, never>;
301
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsDockManagerComponent, "bs-dock-manager", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, { "layoutChange": "layoutChange"; "layoutSnapshotChange": "layoutSnapshotChange"; }, ["panes"], never, true, never>;
364
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BsDockManagerComponent, "bs-dock-manager", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "debugLayoutIntegrity": { "alias": "debugLayoutIntegrity"; "required": false; "isSignal": true; }; }, { "layoutChange": "layoutChange"; "layoutSnapshotChange": "layoutSnapshotChange"; }, ["panes"], never, true, never>;
302
365
  }
303
366
 
304
367
  export { BsDockManagerComponent, BsDockPaneComponent, MintDockManagerElement };