@naniteninja/dashboard-components-lib 2.1.8 → 2.1.9

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.
@@ -5159,6 +5159,8 @@ class LibDashboardSwipeableTabsComponent {
5159
5159
  this.settingsTriggerResizeObserver = null;
5160
5160
  this.settingsTriggerScrollListener = null;
5161
5161
  this.settingsTriggerResizeListener = null;
5162
+ this.settingsTriggerScrollTarget = null;
5163
+ this.settingsTriggerRafId = null;
5162
5164
  this.contextMenuViewRef = null;
5163
5165
  this.contextMenuClickListener = null;
5164
5166
  this.confirmViewRef = null;
@@ -6381,12 +6383,17 @@ class LibDashboardSwipeableTabsComponent {
6381
6383
  this.settingsTriggerPortalEl =
6382
6384
  this.settingsTriggerPortalViewRef.rootNodes.find((n) => n?.classList?.contains?.('settings-trigger-wrapper-portal')) ??
6383
6385
  document.body.querySelector('.settings-trigger-wrapper-portal');
6386
+ this.startSettingsTriggerTracking();
6384
6387
  if (!this.settingsTriggerResizeObserver) {
6385
6388
  this.settingsTriggerResizeObserver = new ResizeObserver(() => this.updateSettingsTriggerPortalPosition());
6386
6389
  this.settingsTriggerResizeObserver.observe(this.settingsTriggerWrapperEl.nativeElement);
6387
6390
  }
6388
6391
  if (!this.settingsTriggerScrollListener) {
6389
- this.settingsTriggerScrollListener = this.renderer.listen('window', 'scroll', () => this.updateSettingsTriggerPortalPosition());
6392
+ this.settingsTriggerScrollTarget = this.getScrollParent(this.settingsTriggerWrapperEl.nativeElement);
6393
+ this.settingsTriggerScrollListener =
6394
+ this.settingsTriggerScrollTarget === window
6395
+ ? this.renderer.listen('window', 'scroll', () => this.updateSettingsTriggerPortalPosition())
6396
+ : this.renderer.listen(this.settingsTriggerScrollTarget, 'scroll', () => this.updateSettingsTriggerPortalPosition());
6390
6397
  }
6391
6398
  if (!this.settingsTriggerResizeListener) {
6392
6399
  this.settingsTriggerResizeListener = this.renderer.listen('window', 'resize', () => this.updateSettingsTriggerPortalPosition());
@@ -6395,6 +6402,8 @@ class LibDashboardSwipeableTabsComponent {
6395
6402
  closeSettingsTriggerPortal() {
6396
6403
  this.settingsTriggerPortaled = false;
6397
6404
  this.settingsTriggerPortalEl = null;
6405
+ this.settingsTriggerScrollTarget = null;
6406
+ this.stopSettingsTriggerTracking();
6398
6407
  if (this.settingsTriggerResizeObserver) {
6399
6408
  this.settingsTriggerResizeObserver.disconnect();
6400
6409
  this.settingsTriggerResizeObserver = null;
@@ -6423,6 +6432,74 @@ class LibDashboardSwipeableTabsComponent {
6423
6432
  this.settingsTriggerPortalEl.style.left = r.left + 'px';
6424
6433
  this.settingsTriggerPortalEl.style.top = r.top + 'px';
6425
6434
  }
6435
+ this.applySettingsTriggerPortalVisibility(r);
6436
+ }
6437
+ applySettingsTriggerPortalVisibility(sourceRect) {
6438
+ const portalEl = this.settingsTriggerPortalEl ?? document.body.querySelector('.settings-trigger-wrapper-portal');
6439
+ if (!portalEl)
6440
+ return;
6441
+ const containerRect = this.settingsTriggerScrollTarget && this.settingsTriggerScrollTarget !== window
6442
+ ? this.settingsTriggerScrollTarget.getBoundingClientRect()
6443
+ : { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
6444
+ const vw = Math.min(sourceRect.right, containerRect.right) - Math.max(sourceRect.left, containerRect.left);
6445
+ const vh = Math.min(sourceRect.bottom, containerRect.bottom) - Math.max(sourceRect.top, containerRect.top);
6446
+ let hide = false;
6447
+ const eps = 0.5;
6448
+ if (sourceRect.width > 0 && vw < sourceRect.width - eps)
6449
+ hide = true;
6450
+ if (sourceRect.height > 0 && vh < sourceRect.height - eps)
6451
+ hide = true;
6452
+ if (!hide) {
6453
+ const x = sourceRect.left + sourceRect.width / 2;
6454
+ const y = sourceRect.top + sourceRect.height / 2;
6455
+ if (x >= 0 && x <= window.innerWidth && y >= 0 && y <= window.innerHeight) {
6456
+ const topEl = document.elementFromPoint(x, y);
6457
+ const sourceEl = this.settingsTriggerWrapperEl?.nativeElement;
6458
+ if (topEl && sourceEl && !sourceEl.contains(topEl) && !portalEl.contains(topEl))
6459
+ hide = true;
6460
+ }
6461
+ }
6462
+ portalEl.style.visibility = hide ? 'hidden' : 'visible';
6463
+ portalEl.style.pointerEvents = hide ? 'none' : 'auto';
6464
+ if (hide && this.showGlobalMenu) {
6465
+ this.ngZone.run(() => {
6466
+ this.showGlobalMenu = false;
6467
+ this.cdr.markForCheck();
6468
+ });
6469
+ }
6470
+ }
6471
+ startSettingsTriggerTracking() {
6472
+ this.stopSettingsTriggerTracking();
6473
+ if (!this.settingsTriggerWrapperEl?.nativeElement)
6474
+ return;
6475
+ this.ngZone.runOutsideAngular(() => {
6476
+ const loop = () => {
6477
+ if (!this.settingsTriggerPortaled || !this.settingsTriggerWrapperEl?.nativeElement) {
6478
+ this.settingsTriggerRafId = null;
6479
+ return;
6480
+ }
6481
+ this.updateSettingsTriggerPortalPosition();
6482
+ this.settingsTriggerRafId = requestAnimationFrame(loop);
6483
+ };
6484
+ this.settingsTriggerRafId = requestAnimationFrame(loop);
6485
+ });
6486
+ }
6487
+ stopSettingsTriggerTracking() {
6488
+ if (this.settingsTriggerRafId !== null) {
6489
+ cancelAnimationFrame(this.settingsTriggerRafId);
6490
+ this.settingsTriggerRafId = null;
6491
+ }
6492
+ }
6493
+ getScrollParent(el) {
6494
+ let current = el.parentElement;
6495
+ while (current) {
6496
+ const style = getComputedStyle(current);
6497
+ const overflow = `${style.overflow}${style.overflowX}${style.overflowY}`;
6498
+ if (/(auto|scroll|overlay)/.test(overflow))
6499
+ return current;
6500
+ current = current.parentElement;
6501
+ }
6502
+ return window;
6426
6503
  }
6427
6504
  isSourceVisible(src, container) {
6428
6505
  const vw = Math.min(src.right, container.right) - Math.max(src.left, container.left);