codexly-ui 0.5.0 → 0.5.2

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.
@@ -2321,6 +2321,12 @@ class ClxTooltipDirective {
2321
2321
  host.addEventListener('mouseleave', () => this._scheduleHide(), { signal });
2322
2322
  host.addEventListener('focus', () => this._scheduleShow(), { signal });
2323
2323
  host.addEventListener('blur', () => this._scheduleHide(), { signal });
2324
+ // Touch devices fire 'mouseenter'/'focus' on tap but never a real
2325
+ // 'mouseleave' — dismiss immediately (no fade) once the tap completes so
2326
+ // the bubble can't outlive the tap and float over whatever the tap
2327
+ // triggered (e.g. a modal opening on the same gesture).
2328
+ host.addEventListener('touchend', () => this._hideImmediate(), { signal });
2329
+ host.addEventListener('touchcancel', () => this._hideImmediate(), { signal });
2324
2330
  this._destroyRef.onDestroy(() => {
2325
2331
  this._destroyed = true;
2326
2332
  this._abort.abort();
@@ -2402,6 +2408,18 @@ class ClxTooltipDirective {
2402
2408
  ref.destroy();
2403
2409
  });
2404
2410
  }
2411
+ /** Synchronous teardown, no fade — used on touchend so the bubble can't linger over UI the tap opens. */
2412
+ _hideImmediate() {
2413
+ this._clearTimers();
2414
+ this._destroyBubble();
2415
+ if (this._pendingRef) {
2416
+ const el = this._pendingRef.location.nativeElement;
2417
+ this._animate.stop(el);
2418
+ this._appRef.detachView(this._pendingRef.hostView);
2419
+ this._pendingRef.destroy();
2420
+ this._pendingRef = null;
2421
+ }
2422
+ }
2405
2423
  // ── Positioning ──────────────────────────────────────────────────────────
2406
2424
  _resolvePosition(el) {
2407
2425
  const requested = this.clxTooltipPosition();