@taiga-ui/core 4.93.0 → 4.95.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.
Files changed (43) hide show
  1. package/components/button/button.directive.d.ts +1 -1
  2. package/directives/dropdown/dropdown-context.directive.d.ts +1 -0
  3. package/directives/dropdown/dropdown-hover.directive.d.ts +1 -0
  4. package/directives/hint/hint-hover.directive.d.ts +1 -0
  5. package/directives/hint/hint.component.d.ts +1 -1
  6. package/esm2022/components/button/button.directive.mjs +2 -2
  7. package/esm2022/components/data-list/data-list.component.mjs +3 -3
  8. package/esm2022/components/icon/icon.component.mjs +2 -2
  9. package/esm2022/components/label/label.directive.mjs +3 -3
  10. package/esm2022/components/link/link.directive.mjs +3 -3
  11. package/esm2022/components/notification/notification.directive.mjs +3 -3
  12. package/esm2022/components/root/root.component.mjs +3 -3
  13. package/esm2022/components/textfield/textfield-multi/textfield-multi.component.mjs +3 -3
  14. package/esm2022/components/textfield/textfield.component.mjs +3 -3
  15. package/esm2022/directives/appearance/appearance.directive.mjs +3 -3
  16. package/esm2022/directives/dropdown/dropdown-context.directive.mjs +7 -4
  17. package/esm2022/directives/dropdown/dropdown-hover.directive.mjs +22 -9
  18. package/esm2022/directives/dropdown/dropdown.component.mjs +2 -2
  19. package/esm2022/directives/group/group.directive.mjs +3 -3
  20. package/esm2022/directives/hint/hint-hover.directive.mjs +10 -3
  21. package/esm2022/directives/hint/hint.component.mjs +4 -4
  22. package/esm2022/directives/icons/icons.directive.mjs +3 -3
  23. package/esm2022/directives/title/title.directive.mjs +3 -3
  24. package/fesm2022/taiga-ui-core-components-button.mjs +2 -2
  25. package/fesm2022/taiga-ui-core-components-data-list.mjs +3 -3
  26. package/fesm2022/taiga-ui-core-components-icon.mjs +2 -2
  27. package/fesm2022/taiga-ui-core-components-label.mjs +3 -3
  28. package/fesm2022/taiga-ui-core-components-link.mjs +3 -3
  29. package/fesm2022/taiga-ui-core-components-notification.mjs +3 -3
  30. package/fesm2022/taiga-ui-core-components-root.mjs +2 -2
  31. package/fesm2022/taiga-ui-core-components-root.mjs.map +1 -1
  32. package/fesm2022/taiga-ui-core-components-textfield.mjs +6 -6
  33. package/fesm2022/taiga-ui-core-directives-appearance.mjs +3 -3
  34. package/fesm2022/taiga-ui-core-directives-dropdown.mjs +28 -12
  35. package/fesm2022/taiga-ui-core-directives-dropdown.mjs.map +1 -1
  36. package/fesm2022/taiga-ui-core-directives-group.mjs +3 -3
  37. package/fesm2022/taiga-ui-core-directives-hint.mjs +12 -5
  38. package/fesm2022/taiga-ui-core-directives-hint.mjs.map +1 -1
  39. package/fesm2022/taiga-ui-core-directives-icons.mjs +3 -3
  40. package/fesm2022/taiga-ui-core-directives-title.mjs +3 -3
  41. package/package.json +15 -15
  42. package/styles/components/textfield.less +1 -1
  43. package/styles/variables/version.less +1 -1
@@ -18,11 +18,11 @@ function tuiAppearanceOptionsProvider(token) {
18
18
 
19
19
  class TuiAppearanceStyles {
20
20
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiAppearanceStyles, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiAppearanceStyles, isStandalone: true, selector: "ng-component", exportAs: ["tui-appearance-4.93.0"], ngImport: i0, template: '', isInline: true, styles: ["[tuiAppearanceV=\"4.93.0\"]{transition-property:all;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;-webkit-appearance:none;appearance:none;outline:.125rem solid transparent;outline-offset:-.125rem;transition-property:color,background-color,opacity,box-shadow,border-color,border-radius,filter}[tuiAppearanceV=\"4.93.0\"]:before,[tuiAppearanceV=\"4.93.0\"]:after{transition-duration:inherit;transition-timing-function:ease-in-out}[tuiAppearanceV=\"4.93.0\"]:focus-visible:not([data-focus=false]){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][data-focus=true]{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]:not(._focused):has(:focus-visible){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]._focused._focused{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"]:disabled:not([data-state]),[tuiAppearanceV=\"4.93.0\"][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]:disabled:not([data-state]),[tuiAppearanceV=\"4.93.0\"][tuiWrapper][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiAppearanceStyles, isStandalone: true, selector: "ng-component", exportAs: ["tui-appearance-4.95.0"], ngImport: i0, template: '', isInline: true, styles: ["[tuiAppearanceV=\"4.95.0\"]{transition-property:all;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;-webkit-appearance:none;appearance:none;outline:.125rem solid transparent;outline-offset:-.125rem;transition-property:color,background-color,opacity,box-shadow,border-color,border-radius,filter}[tuiAppearanceV=\"4.95.0\"]:before,[tuiAppearanceV=\"4.95.0\"]:after{transition-duration:inherit;transition-timing-function:ease-in-out}[tuiAppearanceV=\"4.95.0\"]:focus-visible:not([data-focus=false]){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][data-focus=true]{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]:not(._focused):has(:focus-visible){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]._focused._focused{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"]:disabled:not([data-state]),[tuiAppearanceV=\"4.95.0\"][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]:disabled:not([data-state]),[tuiAppearanceV=\"4.95.0\"][tuiWrapper][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
22
22
  }
23
23
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiAppearanceStyles, decorators: [{
24
24
  type: Component,
25
- args: [{ standalone: true, template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: `tui-appearance-${TUI_VERSION}`, styles: ["[tuiAppearanceV=\"4.93.0\"]{transition-property:all;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;-webkit-appearance:none;appearance:none;outline:.125rem solid transparent;outline-offset:-.125rem;transition-property:color,background-color,opacity,box-shadow,border-color,border-radius,filter}[tuiAppearanceV=\"4.93.0\"]:before,[tuiAppearanceV=\"4.93.0\"]:after{transition-duration:inherit;transition-timing-function:ease-in-out}[tuiAppearanceV=\"4.93.0\"]:focus-visible:not([data-focus=false]){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][data-focus=true]{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]:not(._focused):has(:focus-visible){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]._focused._focused{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.93.0\"]:disabled:not([data-state]),[tuiAppearanceV=\"4.93.0\"][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}[tuiAppearanceV=\"4.93.0\"][tuiWrapper]:disabled:not([data-state]),[tuiAppearanceV=\"4.93.0\"][tuiWrapper][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}\n"] }]
25
+ args: [{ standalone: true, template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: `tui-appearance-${TUI_VERSION}`, styles: ["[tuiAppearanceV=\"4.95.0\"]{transition-property:all;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;-webkit-appearance:none;appearance:none;outline:.125rem solid transparent;outline-offset:-.125rem;transition-property:color,background-color,opacity,box-shadow,border-color,border-radius,filter}[tuiAppearanceV=\"4.95.0\"]:before,[tuiAppearanceV=\"4.95.0\"]:after{transition-duration:inherit;transition-timing-function:ease-in-out}[tuiAppearanceV=\"4.95.0\"]:focus-visible:not([data-focus=false]){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][data-focus=true]{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]:not(._focused):has(:focus-visible){outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]._focused._focused{outline-color:var(--tui-border-focus)}[tuiAppearanceV=\"4.95.0\"]:disabled:not([data-state]),[tuiAppearanceV=\"4.95.0\"][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}[tuiAppearanceV=\"4.95.0\"][tuiWrapper]:disabled:not([data-state]),[tuiAppearanceV=\"4.95.0\"][tuiWrapper][data-state=disabled]{cursor:initial;opacity:var(--tui-disabled-opacity)}\n"] }]
26
26
  }] });
27
27
  class TuiAppearance {
28
28
  constructor() {
@@ -58,7 +58,7 @@ class TuiAppearance {
58
58
  this.mode.set(mode);
59
59
  }
60
60
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiAppearance, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
61
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiAppearance, isStandalone: true, selector: "[tuiAppearance]", inputs: { tuiAppearance: "tuiAppearance", tuiAppearanceState: "tuiAppearanceState", tuiAppearanceFocus: "tuiAppearanceFocus", tuiAppearanceMode: "tuiAppearanceMode" }, host: { attributes: { "tuiAppearance": "", "tuiAppearanceV": "4.93.0" }, properties: { "attr.data-appearance": "appearance()", "attr.data-state": "state()", "attr.data-focus": "focus()", "attr.data-mode": "modes()" } }, hostDirectives: [{ directive: i1.TuiTransitioned }], ngImport: i0 }); }
61
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiAppearance, isStandalone: true, selector: "[tuiAppearance]", inputs: { tuiAppearance: "tuiAppearance", tuiAppearanceState: "tuiAppearanceState", tuiAppearanceFocus: "tuiAppearanceFocus", tuiAppearanceMode: "tuiAppearanceMode" }, host: { attributes: { "tuiAppearance": "", "tuiAppearanceV": "4.95.0" }, properties: { "attr.data-appearance": "appearance()", "attr.data-state": "state()", "attr.data-focus": "focus()", "attr.data-mode": "modes()" } }, hostDirectives: [{ directive: i1.TuiTransitioned }], ngImport: i0 }); }
62
62
  }
63
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiAppearance, decorators: [{
64
64
  type: Directive,
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Directive, InjectionToken, Optional, Self, SkipSelf, inject, Input, EventEmitter, Output, effect, signal, ChangeDetectorRef, INJECTOR, TemplateRef, ElementRef, computed, Component, ChangeDetectionStrategy, NgZone, ContentChild, ViewContainerRef } from '@angular/core';
2
+ import { Injectable, Directive, InjectionToken, Optional, Self, SkipSelf, inject, Input, EventEmitter, Output, effect, signal, ChangeDetectorRef, INJECTOR, TemplateRef, ElementRef, computed, Component, ChangeDetectionStrategy, NgZone, ContentChild, PLATFORM_ID, ViewContainerRef } from '@angular/core';
3
3
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
4
  import { EMPTY_CLIENT_RECT, TUI_TRUE_HANDLER, CHAR_ZERO_WIDTH_SPACE, CHAR_NO_BREAK_SPACE } from '@taiga-ui/cdk/constants';
5
5
  import * as i1 from '@taiga-ui/cdk/directives/active-zone';
@@ -14,14 +14,14 @@ import { TuiScrollbar } from '@taiga-ui/core/components/scrollbar';
14
14
  import { TuiVisualViewportService, TuiPositionService } from '@taiga-ui/core/services';
15
15
  import { TUI_VIEWPORT, TUI_DARK_MODE, TUI_SELECTION_STREAM } from '@taiga-ui/core/tokens';
16
16
  import { PolymorpheusComponent, PolymorpheusTemplate, PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
17
- import { BehaviorSubject, Subject, throttleTime, takeWhile, map, merge, filter, fromEvent, switchMap, delay, startWith, takeUntil, distinctUntilChanged, of, EMPTY, tap, share, combineLatest } from 'rxjs';
17
+ import { BehaviorSubject, Subject, throttleTime, takeWhile, map, merge, filter, fromEvent, NEVER, switchMap, delay, startWith, takeUntil, distinctUntilChanged, of, EMPTY, tap, share, combineLatest } from 'rxjs';
18
18
  import { coerceArray } from '@angular/cdk/coercion';
19
- import { tuiZonefreeScheduler, tuiTypedFromEvent, tuiZonefree, tuiIfMap, tuiCloseWatcher, tuiZonefull, tuiWatch, tuiZoneOptimized } from '@taiga-ui/cdk/observables';
19
+ import { tuiZonefreeScheduler, tuiTypedFromEvent, tuiZonefree, tuiIfMap, tuiCloseWatcher, tuiZonefull, tuiWatch } from '@taiga-ui/cdk/observables';
20
20
  import { tuiOverrideOptions, tuiCheckFixedPosition, tuiGetWordRange } from '@taiga-ui/core/utils';
21
21
  import { TuiPortalService, TuiPortals, tuiAsPortal } from '@taiga-ui/cdk/classes';
22
22
  import { __decorate } from 'tslib';
23
23
  import { TuiIdService } from '@taiga-ui/cdk/services';
24
- import { DOCUMENT } from '@angular/common';
24
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
25
25
  import { TUI_IS_TOUCH, TUI_RANGE } from '@taiga-ui/cdk/tokens';
26
26
  import * as i1$1 from '@taiga-ui/cdk/directives/obscured';
27
27
  import { TuiObscured } from '@taiga-ui/cdk/directives/obscured';
@@ -421,7 +421,7 @@ class TuiDropdownComponent {
421
421
  TuiPositionService,
422
422
  tuiPositionAccessorFor('dropdown', TuiDropdownPosition),
423
423
  tuiRectAccessorFor('dropdown', TuiDropdownDirective),
424
- ], hostDirectives: [{ directive: i1.TuiActiveZone }, { directive: i2.TuiAnimated }], ngImport: i0, template: "<tui-scrollbar class=\"t-scroll\">\n <div\n *polymorpheusOutlet=\"directive._content() as text; context: {$implicit: close}\"\n class=\"t-primitive\"\n >\n {{ text }}\n </div>\n</tui-scrollbar>\n", styles: [":host{position:absolute;display:flex;box-shadow:var(--tui-shadow-medium);color:var(--tui-text-primary);background:var(--tui-background-elevation-3);border-radius:var(--tui-radius-m);overflow:hidden;border:1px solid var(--tui-border-normal);box-sizing:border-box;isolation:isolate;pointer-events:auto;--tui-from: translateY(-1rem)}:host.tui-enter,:host.tui-leave{animation-name:tuiFade,tuiSlide}:host:not([style*=top]){visibility:hidden}.t-scroll{flex-grow:1;max-inline-size:100%;inline-size:-webkit-max-content;inline-size:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"], dependencies: [{ kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
424
+ ], hostDirectives: [{ directive: i1.TuiActiveZone }, { directive: i2.TuiAnimated }], ngImport: i0, template: "<tui-scrollbar class=\"t-scroll\">\n <div\n *polymorpheusOutlet=\"directive._content() as text; context: {$implicit: close}\"\n class=\"t-primitive\"\n >\n {{ text }}\n </div>\n</tui-scrollbar>\n", styles: [":host{position:absolute;display:flex;box-shadow:var(--tui-shadow-medium);color:var(--tui-text-primary);background:var(--tui-background-elevation-1);border-radius:var(--tui-radius-m);overflow:hidden;border:1px solid var(--tui-border-normal);box-sizing:border-box;isolation:isolate;pointer-events:auto;--tui-from: translateY(-1rem)}:host.tui-enter,:host.tui-leave{animation-name:tuiFade,tuiSlide}:host:not([style*=top]){visibility:hidden}.t-scroll{flex-grow:1;max-inline-size:100%;inline-size:-webkit-max-content;inline-size:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"], dependencies: [{ kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.Default }); }
425
425
  }
426
426
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDropdownComponent, decorators: [{
427
427
  type: Component,
@@ -432,7 +432,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
432
432
  ], hostDirectives: [TuiActiveZone, TuiAnimated], host: {
433
433
  '[attr.data-appearance]': 'options.appearance',
434
434
  '[attr.tuiTheme]': 'theme()',
435
- }, template: "<tui-scrollbar class=\"t-scroll\">\n <div\n *polymorpheusOutlet=\"directive._content() as text; context: {$implicit: close}\"\n class=\"t-primitive\"\n >\n {{ text }}\n </div>\n</tui-scrollbar>\n", styles: [":host{position:absolute;display:flex;box-shadow:var(--tui-shadow-medium);color:var(--tui-text-primary);background:var(--tui-background-elevation-3);border-radius:var(--tui-radius-m);overflow:hidden;border:1px solid var(--tui-border-normal);box-sizing:border-box;isolation:isolate;pointer-events:auto;--tui-from: translateY(-1rem)}:host.tui-enter,:host.tui-leave{animation-name:tuiFade,tuiSlide}:host:not([style*=top]){visibility:hidden}.t-scroll{flex-grow:1;max-inline-size:100%;inline-size:-webkit-max-content;inline-size:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"] }]
435
+ }, template: "<tui-scrollbar class=\"t-scroll\">\n <div\n *polymorpheusOutlet=\"directive._content() as text; context: {$implicit: close}\"\n class=\"t-primitive\"\n >\n {{ text }}\n </div>\n</tui-scrollbar>\n", styles: [":host{position:absolute;display:flex;box-shadow:var(--tui-shadow-medium);color:var(--tui-text-primary);background:var(--tui-background-elevation-1);border-radius:var(--tui-radius-m);overflow:hidden;border:1px solid var(--tui-border-normal);box-sizing:border-box;isolation:isolate;pointer-events:auto;--tui-from: translateY(-1rem)}:host.tui-enter,:host.tui-leave{animation-name:tuiFade,tuiSlide}:host:not([style*=top]){visibility:hidden}.t-scroll{flex-grow:1;max-inline-size:100%;inline-size:-webkit-max-content;inline-size:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"] }]
436
436
  }] });
437
437
 
438
438
  class TuiDropdownContext extends TuiRectAccessor {
@@ -440,6 +440,7 @@ class TuiDropdownContext extends TuiRectAccessor {
440
440
  super(...arguments);
441
441
  this.zone = inject(NgZone);
442
442
  this.isTouch = inject(TUI_IS_TOUCH);
443
+ this.el = tuiInjectElement();
443
444
  this.currentRect = EMPTY_CLIENT_RECT;
444
445
  this.userSelect = computed(() => (this.isTouch() ? 'none' : null));
445
446
  this.activeZone = inject(TuiActiveZone);
@@ -454,8 +455,10 @@ class TuiDropdownContext extends TuiRectAccessor {
454
455
  return this.currentRect;
455
456
  }
456
457
  closeDropdown(event) {
457
- if (!event ||
458
- (this.driver.value && !this.activeZone.contains(tuiGetActualTarget(event)))) {
458
+ const target = event ? tuiGetActualTarget(event) : null;
459
+ if (!target ||
460
+ (this.driver.value &&
461
+ (!this.activeZone.contains(target) || this.el.contains(target)))) {
459
462
  this.zone.run(() => {
460
463
  this.driver.next(false);
461
464
  this.currentRect = EMPTY_CLIENT_RECT;
@@ -682,10 +685,9 @@ class TuiDropdownHover extends TuiDriver {
682
685
  * swipe on mobile devices removes dropdown sheet without triggering new mouseover / mouseout events.
683
686
  */
684
687
  this.dropdownExternalRemoval$ = toObservable(inject(TuiDropdownDirective).ref).pipe(filter((x) => !x && this.hovered));
685
- this.stream$ = merge(this.dropdownExternalRemoval$.pipe(switchMap(() => tuiTypedFromEvent(this.doc, 'pointerdown').pipe(map(tuiGetActualTarget), delay(this.hideDelay), startWith(null), takeUntil(fromEvent(this.doc, 'mouseover'))))), tuiTypedFromEvent(this.doc, 'mouseover').pipe(map(tuiGetActualTarget)), tuiTypedFromEvent(this.doc, 'mouseout').pipe(map((e) => e.relatedTarget))).pipe(map((element) => tuiIsElement(element) && this.isHovered(element)), distinctUntilChanged(), switchMap((visible) => of(visible).pipe(delay(visible ? this.showDelay : this.hideDelay), takeUntil(this.open ? fromEvent(this.el, 'pointerdown') : EMPTY))), tuiZoneOptimized(), tap((hovered) => {
686
- this.hovered = hovered;
687
- this.open?.toggle(hovered);
688
- }), share());
688
+ this.stream$ = isPlatformBrowser(inject(PLATFORM_ID))
689
+ ? this.createStream()
690
+ : NEVER;
689
691
  this.showDelay = this.options.showDelay;
690
692
  this.hideDelay = this.options.hideDelay;
691
693
  this.hovered = false;
@@ -702,6 +704,20 @@ class TuiDropdownHover extends TuiDriver {
702
704
  const child = !this.el.contains(element) && this.activeZone.contains(element);
703
705
  return hovered || child;
704
706
  }
707
+ createStream() {
708
+ const root = this.el.getRootNode();
709
+ const mouseover$ = tuiTypedFromEvent(root, 'mouseover');
710
+ const mouseout$ = tuiTypedFromEvent(root, 'mouseout');
711
+ return merge(
712
+ /**
713
+ * Dropdown can be removed not only via click/touch –
714
+ * swipe on mobile devices removes dropdown sheet without triggering new mouseover / mouseout events.
715
+ */
716
+ this.dropdownExternalRemoval$.pipe(switchMap(() => tuiTypedFromEvent(this.doc, 'pointerdown').pipe(map(tuiGetActualTarget), delay(this.hideDelay), startWith(null), takeUntil(mouseover$)))), mouseover$.pipe(map(tuiGetActualTarget)), mouseout$.pipe(map((event) => event.relatedTarget))).pipe(map((element) => tuiIsElement(element) && this.isHovered(element)), distinctUntilChanged(), switchMap((visible) => of(visible).pipe(delay(visible ? this.showDelay : this.hideDelay), takeUntil(this.open ? fromEvent(this.el, 'pointerdown') : EMPTY))), tap((hovered) => {
717
+ this.hovered = hovered;
718
+ this.open?.toggle(hovered);
719
+ }), share());
720
+ }
705
721
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDropdownHover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
706
722
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDropdownHover, isStandalone: true, selector: "[tuiDropdownHover]", inputs: { showDelay: ["tuiDropdownShowDelay", "showDelay"], hideDelay: ["tuiDropdownHideDelay", "hideDelay"] }, host: { listeners: { "click.capture": "onClick($event)" } }, providers: [TuiActiveZone, tuiAsDriver(TuiDropdownHover)], queries: [{ propertyName: "dropdownHost", first: true, predicate: ["tuiDropdownHost"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0 }); }
707
723
  }