@taiga-ui/cdk 4.52.0-canary.65c65f9 → 4.52.0-canary.669a014

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 (47) hide show
  1. package/constants/version.d.ts +1 -1
  2. package/constants/version.js +1 -1
  3. package/date-time/day.d.ts +1 -1
  4. package/directives/active-zone/active-zone.directive.d.ts +1 -1
  5. package/directives/animated/animated.directive.d.ts +0 -1
  6. package/directives/index.d.ts +1 -0
  7. package/directives/with-styles/index.d.ts +1 -0
  8. package/directives/with-styles/with-styles.directive.d.ts +10 -0
  9. package/fesm2022/taiga-ui-cdk-constants.mjs +1 -1
  10. package/fesm2022/taiga-ui-cdk-constants.mjs.map +1 -1
  11. package/fesm2022/taiga-ui-cdk-date-time.mjs +1 -1
  12. package/fesm2022/taiga-ui-cdk-date-time.mjs.map +1 -1
  13. package/fesm2022/taiga-ui-cdk-directives-active-zone.mjs +4 -5
  14. package/fesm2022/taiga-ui-cdk-directives-active-zone.mjs.map +1 -1
  15. package/fesm2022/taiga-ui-cdk-directives-animated.mjs +41 -38
  16. package/fesm2022/taiga-ui-cdk-directives-animated.mjs.map +1 -1
  17. package/fesm2022/taiga-ui-cdk-directives-focus-trap.mjs +7 -15
  18. package/fesm2022/taiga-ui-cdk-directives-focus-trap.mjs.map +1 -1
  19. package/fesm2022/taiga-ui-cdk-directives-obscured.mjs +3 -1
  20. package/fesm2022/taiga-ui-cdk-directives-obscured.mjs.map +1 -1
  21. package/fesm2022/taiga-ui-cdk-directives-with-styles.mjs +29 -0
  22. package/fesm2022/taiga-ui-cdk-directives-with-styles.mjs.map +1 -0
  23. package/fesm2022/taiga-ui-cdk-directives.mjs +1 -0
  24. package/fesm2022/taiga-ui-cdk-directives.mjs.map +1 -1
  25. package/fesm2022/taiga-ui-cdk-tokens.mjs +7 -6
  26. package/fesm2022/taiga-ui-cdk-tokens.mjs.map +1 -1
  27. package/fesm2022/taiga-ui-cdk-utils-focus.mjs +8 -8
  28. package/fesm2022/taiga-ui-cdk-utils-focus.mjs.map +1 -1
  29. package/fesm2022/taiga-ui-cdk-utils-miscellaneous.mjs +4 -1
  30. package/fesm2022/taiga-ui-cdk-utils-miscellaneous.mjs.map +1 -1
  31. package/package.json +28 -24
  32. package/schematics/ng-add/constants/versions.d.ts +1 -1
  33. package/schematics/ng-update/{v4/steps → utils}/replace-functions.d.ts +1 -1
  34. package/schematics/ng-update/{v4/steps → utils}/replace-functions.js +1 -1
  35. package/schematics/ng-update/utils/replace-functions.js.map +1 -0
  36. package/schematics/ng-update/v4/index.js +1 -1
  37. package/schematics/ng-update/v4/index.js.map +1 -1
  38. package/schematics/ng-update/v5/index.js +7 -0
  39. package/schematics/ng-update/v5/index.js.map +1 -1
  40. package/schematics/ng-update/v5/steps/constants/functions.d.ts +2 -0
  41. package/schematics/ng-update/v5/steps/constants/functions.js +21 -0
  42. package/schematics/ng-update/v5/steps/constants/functions.js.map +1 -0
  43. package/tokens/environment.d.ts +5 -0
  44. package/utils/focus/get-native-focused.d.ts +1 -1
  45. package/utils/focus/is-native-focused-in.d.ts +1 -1
  46. package/utils/focus/is-native-focused.d.ts +1 -1
  47. package/schematics/ng-update/v4/steps/replace-functions.js.map +0 -1
@@ -1,5 +1,6 @@
1
+ import { isPlatformServer } from '@angular/common';
1
2
  import * as i0 from '@angular/core';
2
- import { inject, ViewContainerRef, ApplicationRef, afterNextRender, Directive, Renderer2 } from '@angular/core';
3
+ import { inject, ViewContainerRef, afterNextRender, PLATFORM_ID, Directive, ApplicationRef, Renderer2 } from '@angular/core';
3
4
  import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
4
5
  import * as i2 from '@ng-web-apis/mutation-observer';
5
6
  import { provideMutationObserverInit, WaMutationObserver } from '@ng-web-apis/mutation-observer';
@@ -11,53 +12,24 @@ class TuiAnimated {
11
12
  // @ts-ignore https://github.com/angular/angular/blob/main/packages/core/src/render3/interfaces/view.ts#L56
12
13
  this.renderer = inject(ViewContainerRef)._hostLView?.[11];
13
14
  this.el = tuiInjectElement();
14
- this.app = inject(ApplicationRef);
15
15
  afterNextRender(() => this.remove());
16
- if (!this.renderer) {
16
+ if (!this.renderer || isPlatformServer(inject(PLATFORM_ID))) {
17
17
  return;
18
18
  }
19
19
  // delegate is used in Angular Animations renderer
20
20
  const renderer = this.renderer.delegate || this.renderer;
21
- const { removeChild, data } = renderer;
22
- if (data[TUI_LEAVE]) {
23
- data[TUI_LEAVE].push(this.el);
24
- return;
21
+ if (renderer.data[TUI_LEAVE]) {
22
+ renderer.data[TUI_LEAVE].push(this.el);
23
+ }
24
+ else {
25
+ renderer.data[TUI_LEAVE] = [this.el];
26
+ renderer.removeChild = wrap(renderer);
25
27
  }
26
- data[TUI_LEAVE] = [this.el];
27
- afterNextRender(() => {
28
- renderer.removeChild = (parent, el, host) => {
29
- const remove = () => removeChild.call(renderer, parent, el, host);
30
- const elements = data[TUI_LEAVE];
31
- const element = elements.find((leave) => el.contains(leave));
32
- if (!element) {
33
- remove();
34
- return;
35
- }
36
- element.classList.remove(TUI_ENTER);
37
- const { length } = element.getAnimations?.() || [];
38
- element.classList.add(TUI_LEAVE);
39
- const animations = element.getAnimations?.() ?? [];
40
- const last = animations[animations.length - 1];
41
- const finish = () => {
42
- if (!parent || parent.contains(el)) {
43
- remove();
44
- this.app.tick();
45
- }
46
- };
47
- if (animations.length > length && last) {
48
- last.onfinish = finish;
49
- last.oncancel = finish;
50
- }
51
- else {
52
- remove();
53
- }
54
- };
55
- });
56
28
  }
57
29
  ngOnDestroy() {
58
30
  const data = this.renderer?.data || { [TUI_LEAVE]: [] };
59
31
  setTimeout(() => {
60
- data[TUI_LEAVE] = data[TUI_LEAVE].filter((e) => e !== this.el);
32
+ data[TUI_LEAVE] = data[TUI_LEAVE]?.filter((e) => e !== this.el);
61
33
  });
62
34
  }
63
35
  remove() {
@@ -80,6 +52,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
80
52
  },
81
53
  }]
82
54
  }], ctorParameters: () => [] });
55
+ function wrap(renderer) {
56
+ const { removeChild } = renderer;
57
+ const app = inject(ApplicationRef);
58
+ return (parent, el, host) => {
59
+ const remove = () => removeChild.call(renderer, parent, el, host);
60
+ const elements = renderer.data[TUI_LEAVE];
61
+ const element = elements.find((leave) => el.contains(leave));
62
+ if (!element) {
63
+ remove();
64
+ return;
65
+ }
66
+ element.classList.remove(TUI_ENTER);
67
+ const { length } = element.getAnimations?.() || [];
68
+ element.classList.add(TUI_LEAVE);
69
+ const animations = element.getAnimations?.() ?? [];
70
+ const last = animations[animations.length - 1];
71
+ const finish = () => {
72
+ if (!parent || parent.contains(el)) {
73
+ remove();
74
+ app.tick();
75
+ }
76
+ };
77
+ if (animations.length > length && last) {
78
+ last.onfinish = finish;
79
+ last.oncancel = finish;
80
+ }
81
+ else {
82
+ remove();
83
+ }
84
+ };
85
+ }
83
86
 
84
87
  class TuiAnimatedParent {
85
88
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-directives-animated.mjs","sources":["../../../projects/cdk/directives/animated/animated.directive.ts","../../../projects/cdk/directives/animated/animated-parent.directive.ts","../../../projects/cdk/directives/animated/taiga-ui-cdk-directives-animated.ts"],"sourcesContent":["import {\n afterNextRender,\n ApplicationRef,\n Directive,\n inject,\n type OnDestroy,\n ViewContainerRef,\n} from '@angular/core';\nimport {tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\n\nexport const TUI_ENTER = 'tui-enter';\nexport const TUI_LEAVE = 'tui-leave';\n\n@Directive({\n standalone: true,\n selector: '[tuiAnimated]',\n host: {\n class: TUI_ENTER,\n '(animationend.self)': 'remove()',\n '(animationcancel.self)': 'remove()',\n },\n})\nexport class TuiAnimated implements OnDestroy {\n // @ts-ignore https://github.com/angular/angular/blob/main/packages/core/src/render3/interfaces/view.ts#L56\n private readonly renderer = inject(ViewContainerRef)._hostLView?.[11];\n private readonly el = tuiInjectElement();\n private readonly app = inject(ApplicationRef);\n\n constructor() {\n afterNextRender(() => this.remove());\n\n if (!this.renderer) {\n return;\n }\n\n // delegate is used in Angular Animations renderer\n const renderer = this.renderer.delegate || this.renderer;\n const {removeChild, data} = renderer;\n\n if (data[TUI_LEAVE]) {\n data[TUI_LEAVE].push(this.el);\n\n return;\n }\n\n data[TUI_LEAVE] = [this.el];\n\n afterNextRender(() => {\n renderer.removeChild = (parent: Node, el: Node, host?: boolean) => {\n const remove = (): void => removeChild.call(renderer, parent, el, host);\n const elements: Element[] = data[TUI_LEAVE];\n const element = elements.find((leave) => el.contains(leave));\n\n if (!element) {\n remove();\n\n return;\n }\n\n element.classList.remove(TUI_ENTER);\n\n const {length} = element.getAnimations?.() || [];\n\n element.classList.add(TUI_LEAVE);\n\n const animations = element.getAnimations?.() ?? [];\n const last = animations[animations.length - 1];\n const finish = (): void => {\n if (!parent || parent.contains(el)) {\n remove();\n this.app.tick();\n }\n };\n\n if (animations.length > length && last) {\n last.onfinish = finish;\n last.oncancel = finish;\n } else {\n remove();\n }\n };\n });\n }\n\n public ngOnDestroy(): void {\n const data = this.renderer?.data || {[TUI_LEAVE]: []};\n\n setTimeout(() => {\n data[TUI_LEAVE] = data[TUI_LEAVE].filter((e: Element) => e !== this.el);\n });\n }\n\n protected remove(): void {\n if (this.el.isConnected && !this.el.getAnimations?.().length) {\n this.el.classList.remove(TUI_ENTER);\n }\n }\n}\n","import {Directive, inject, Renderer2} from '@angular/core';\nimport {\n provideMutationObserverInit,\n WaMutationObserver,\n} from '@ng-web-apis/mutation-observer';\nimport {tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {TUI_ENTER, TUI_LEAVE, TuiAnimated} from './animated.directive';\n\n@Directive({\n standalone: true,\n selector: '[tuiAnimatedParent]',\n providers: [provideMutationObserverInit({childList: true})],\n hostDirectives: [\n TuiAnimated,\n {\n directive: WaMutationObserver,\n outputs: ['waMutationObserver'],\n },\n ],\n host: {\n '(waMutationObserver)': 'handle()',\n },\n})\nexport class TuiAnimatedParent {\n private readonly el = tuiInjectElement();\n private readonly renderer = inject(Renderer2);\n\n protected handle(): void {\n this.el.classList.remove(TUI_ENTER);\n this.renderer.data[TUI_LEAVE] = Array.from(this.el.children);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TuiAnimated"],"mappings":"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"}
1
+ {"version":3,"file":"taiga-ui-cdk-directives-animated.mjs","sources":["../../../projects/cdk/directives/animated/animated.directive.ts","../../../projects/cdk/directives/animated/animated-parent.directive.ts","../../../projects/cdk/directives/animated/taiga-ui-cdk-directives-animated.ts"],"sourcesContent":["import {isPlatformServer} from '@angular/common';\nimport {\n afterNextRender,\n ApplicationRef,\n Directive,\n inject,\n type OnDestroy,\n PLATFORM_ID,\n type Renderer2,\n ViewContainerRef,\n} from '@angular/core';\nimport {tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\n\nexport const TUI_ENTER = 'tui-enter';\nexport const TUI_LEAVE = 'tui-leave';\n\n@Directive({\n standalone: true,\n selector: '[tuiAnimated]',\n host: {\n class: TUI_ENTER,\n '(animationend.self)': 'remove()',\n '(animationcancel.self)': 'remove()',\n },\n})\nexport class TuiAnimated implements OnDestroy {\n // @ts-ignore https://github.com/angular/angular/blob/main/packages/core/src/render3/interfaces/view.ts#L56\n private readonly renderer = inject(ViewContainerRef)._hostLView?.[11];\n private readonly el = tuiInjectElement();\n\n constructor() {\n afterNextRender(() => this.remove());\n\n if (!this.renderer || isPlatformServer(inject(PLATFORM_ID))) {\n return;\n }\n\n // delegate is used in Angular Animations renderer\n const renderer = this.renderer.delegate || this.renderer;\n\n if (renderer.data[TUI_LEAVE]) {\n renderer.data[TUI_LEAVE].push(this.el);\n } else {\n renderer.data[TUI_LEAVE] = [this.el];\n renderer.removeChild = wrap(renderer);\n }\n }\n\n public ngOnDestroy(): void {\n const data = this.renderer?.data || {[TUI_LEAVE]: []};\n\n setTimeout(() => {\n data[TUI_LEAVE] = data[TUI_LEAVE]?.filter((e: Element) => e !== this.el);\n });\n }\n\n protected remove(): void {\n if (this.el.isConnected && !this.el.getAnimations?.().length) {\n this.el.classList.remove(TUI_ENTER);\n }\n }\n}\n\nfunction wrap(renderer: Renderer2): Renderer2['removeChild'] {\n const {removeChild} = renderer;\n const app = inject(ApplicationRef);\n\n return (parent: Node, el: Node, host?: boolean): void => {\n const remove = (): void => removeChild.call(renderer, parent, el, host);\n const elements: Element[] = renderer.data[TUI_LEAVE];\n const element = elements.find((leave) => el.contains(leave));\n\n if (!element) {\n remove();\n\n return;\n }\n\n element.classList.remove(TUI_ENTER);\n\n const {length} = element.getAnimations?.() || [];\n\n element.classList.add(TUI_LEAVE);\n\n const animations = element.getAnimations?.() ?? [];\n const last = animations[animations.length - 1];\n const finish = (): void => {\n if (!parent || parent.contains(el)) {\n remove();\n app.tick();\n }\n };\n\n if (animations.length > length && last) {\n last.onfinish = finish;\n last.oncancel = finish;\n } else {\n remove();\n }\n };\n}\n","import {Directive, inject, Renderer2} from '@angular/core';\nimport {\n provideMutationObserverInit,\n WaMutationObserver,\n} from '@ng-web-apis/mutation-observer';\nimport {tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {TUI_ENTER, TUI_LEAVE, TuiAnimated} from './animated.directive';\n\n@Directive({\n standalone: true,\n selector: '[tuiAnimatedParent]',\n providers: [provideMutationObserverInit({childList: true})],\n hostDirectives: [\n TuiAnimated,\n {\n directive: WaMutationObserver,\n outputs: ['waMutationObserver'],\n },\n ],\n host: {\n '(waMutationObserver)': 'handle()',\n },\n})\nexport class TuiAnimatedParent {\n private readonly el = tuiInjectElement();\n private readonly renderer = inject(Renderer2);\n\n protected handle(): void {\n this.el.classList.remove(TUI_ENTER);\n this.renderer.data[TUI_LEAVE] = Array.from(this.el.children);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TuiAnimated"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Directive } from '@angular/core';
4
4
  import { tuiInjectElement, tuiIsHTMLElement, tuiContainsOrAfter } from '@taiga-ui/cdk/utils/dom';
5
- import { tuiGetNativeFocused, tuiBlurNativeFocused, tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus';
5
+ import { tuiGetFocused, tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus';
6
6
 
7
7
  class TuiFocusTrap {
8
8
  constructor() {
@@ -20,26 +20,18 @@ class TuiFocusTrap {
20
20
  * The same event can synchronously close already opened focus trap and open another one.
21
21
  * All focus traps have microtask inside its `ngOnDestroy` –
22
22
  * they should be resolved before enabling of new focus trap.
23
- * Don't enable any new event listeners before `initialized` equals to `true`!
23
+ * Don't enable any new event listeners before `initialized` is equal to `true`!
24
24
  */
25
25
  this.initialized = true;
26
- this.activeElement = tuiGetNativeFocused(this.doc);
26
+ this.activeElement = tuiGetFocused(this.doc);
27
27
  this.el.focus();
28
28
  });
29
29
  }
30
30
  ngOnDestroy() {
31
- tuiBlurNativeFocused(this.doc);
32
- /**
33
- * HostListeners are triggered even after ngOnDestroy
34
- * {@link https://github.com/angular/angular/issues/38100}
35
- * so we need to delay it but stay in the same sync cycle,
36
- * therefore using Promise instead of setTimeout
37
- */
38
- Promise.resolve().then(() => {
39
- if (tuiIsHTMLElement(this.activeElement)) {
40
- this.activeElement.focus();
41
- }
42
- });
31
+ this.initialized = false;
32
+ if (tuiIsHTMLElement(this.activeElement)) {
33
+ this.activeElement.focus();
34
+ }
43
35
  }
44
36
  onFocusIn(node) {
45
37
  const { firstElementChild } = this.el;
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-directives-focus-trap.mjs","sources":["../../../projects/cdk/directives/focus-trap/focus-trap.directive.ts","../../../projects/cdk/directives/focus-trap/taiga-ui-cdk-directives-focus-trap.ts"],"sourcesContent":["import {DOCUMENT} from '@angular/common';\nimport {Directive, inject, type OnDestroy} from '@angular/core';\nimport {\n tuiContainsOrAfter,\n tuiInjectElement,\n tuiIsHTMLElement,\n} from '@taiga-ui/cdk/utils/dom';\nimport {\n tuiBlurNativeFocused,\n tuiGetClosestFocusable,\n tuiGetNativeFocused,\n} from '@taiga-ui/cdk/utils/focus';\n\n@Directive({\n standalone: true,\n selector: '[tuiFocusTrap]',\n host: {\n tabIndex: '0',\n '(window:focusin.zoneless)': 'initialized && onFocusIn($event.target)',\n },\n})\nexport class TuiFocusTrap implements OnDestroy {\n private readonly doc = inject(DOCUMENT);\n private readonly el = tuiInjectElement();\n private activeElement: Element | null = null;\n protected initialized = false;\n\n constructor() {\n /**\n * This would cause currently focused element to lose focus,\n * but it might cause ExpressionChanged error due to potential HostBinding.\n * Microtask keeps it in the same frame but allows change detection to run\n */\n Promise.resolve().then(() => {\n /**\n * The same event can synchronously close already opened focus trap and open another one.\n * All focus traps have microtask inside its `ngOnDestroy` –\n * they should be resolved before enabling of new focus trap.\n * Don't enable any new event listeners before `initialized` equals to `true`!\n */\n this.initialized = true;\n this.activeElement = tuiGetNativeFocused(this.doc);\n this.el.focus();\n });\n }\n\n public ngOnDestroy(): void {\n tuiBlurNativeFocused(this.doc);\n\n /**\n * HostListeners are triggered even after ngOnDestroy\n * {@link https://github.com/angular/angular/issues/38100}\n * so we need to delay it but stay in the same sync cycle,\n * therefore using Promise instead of setTimeout\n */\n Promise.resolve().then(() => {\n if (tuiIsHTMLElement(this.activeElement)) {\n this.activeElement.focus();\n }\n });\n }\n\n protected onFocusIn(node: Node): void {\n const {firstElementChild} = this.el;\n\n if (!tuiContainsOrAfter(this.el, node) && firstElementChild) {\n tuiGetClosestFocusable({\n initial: firstElementChild,\n root: this.el,\n })?.focus();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAqBa,YAAY,CAAA;AAMrB,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtB,IAAE,CAAA,EAAA,GAAG,gBAAgB,EAAE;QAChC,IAAa,CAAA,aAAA,GAAmB,IAAI;QAClC,IAAW,CAAA,WAAA,GAAG,KAAK;AAGzB;;;;AAIG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB;;;;;AAKG;AACH,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;AAClD,YAAA,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;AACnB,SAAC,CAAC;;IAGC,WAAW,GAAA;AACd,QAAA,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;AAE9B;;;;;AAKG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACtC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;AAElC,SAAC,CAAC;;AAGI,IAAA,SAAS,CAAC,IAAU,EAAA;AAC1B,QAAA,MAAM,EAAC,iBAAiB,EAAC,GAAG,IAAI,CAAC,EAAE;AAEnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE;AACzD,YAAA,sBAAsB,CAAC;AACnB,gBAAA,OAAO,EAAE,iBAAiB;gBAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;aAChB,CAAC,EAAE,KAAK,EAAE;;;+GAhDV,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACF,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,2BAA2B,EAAE,yCAAyC;AACzE,qBAAA;AACJ,iBAAA;;;ACpBD;;AAEG;;;;"}
1
+ {"version":3,"file":"taiga-ui-cdk-directives-focus-trap.mjs","sources":["../../../projects/cdk/directives/focus-trap/focus-trap.directive.ts","../../../projects/cdk/directives/focus-trap/taiga-ui-cdk-directives-focus-trap.ts"],"sourcesContent":["import {DOCUMENT} from '@angular/common';\nimport {Directive, inject, type OnDestroy} from '@angular/core';\nimport {\n tuiContainsOrAfter,\n tuiInjectElement,\n tuiIsHTMLElement,\n} from '@taiga-ui/cdk/utils/dom';\nimport {tuiGetClosestFocusable, tuiGetFocused} from '@taiga-ui/cdk/utils/focus';\n\n@Directive({\n standalone: true,\n selector: '[tuiFocusTrap]',\n host: {\n tabIndex: '0',\n '(window:focusin.zoneless)': 'initialized && onFocusIn($event.target)',\n },\n})\nexport class TuiFocusTrap implements OnDestroy {\n private readonly doc = inject(DOCUMENT);\n private readonly el = tuiInjectElement();\n private activeElement: Element | null = null;\n protected initialized = false;\n\n constructor() {\n /**\n * This would cause currently focused element to lose focus,\n * but it might cause ExpressionChanged error due to potential HostBinding.\n * Microtask keeps it in the same frame but allows change detection to run\n */\n Promise.resolve().then(() => {\n /**\n * The same event can synchronously close already opened focus trap and open another one.\n * All focus traps have microtask inside its `ngOnDestroy` –\n * they should be resolved before enabling of new focus trap.\n * Don't enable any new event listeners before `initialized` is equal to `true`!\n */\n this.initialized = true;\n this.activeElement = tuiGetFocused(this.doc);\n this.el.focus();\n });\n }\n\n public ngOnDestroy(): void {\n this.initialized = false;\n\n if (tuiIsHTMLElement(this.activeElement)) {\n this.activeElement.focus();\n }\n }\n\n protected onFocusIn(node: Node): void {\n const {firstElementChild} = this.el;\n\n if (!tuiContainsOrAfter(this.el, node) && firstElementChild) {\n tuiGetClosestFocusable({\n initial: firstElementChild,\n root: this.el,\n })?.focus();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAiBa,YAAY,CAAA;AAMrB,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtB,IAAE,CAAA,EAAA,GAAG,gBAAgB,EAAE;QAChC,IAAa,CAAA,aAAA,GAAmB,IAAI;QAClC,IAAW,CAAA,WAAA,GAAG,KAAK;AAGzB;;;;AAIG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB;;;;;AAKG;AACH,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5C,YAAA,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;AACnB,SAAC,CAAC;;IAGC,WAAW,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AAExB,QAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;;;AAIxB,IAAA,SAAS,CAAC,IAAU,EAAA;AAC1B,QAAA,MAAM,EAAC,iBAAiB,EAAC,GAAG,IAAI,CAAC,EAAE;AAEnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE;AACzD,YAAA,sBAAsB,CAAC;AACnB,gBAAA,OAAO,EAAE,iBAAiB;gBAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;aAChB,CAAC,EAAE,KAAK,EAAE;;;+GAxCV,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACF,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,2BAA2B,EAAE,yCAAyC;AACzE,qBAAA;AACJ,iBAAA;;;AChBD;;AAEG;;;;"}
@@ -30,7 +30,9 @@ class TuiObscured {
30
30
  constructor() {
31
31
  this.activeZone = inject(TuiActiveZone, { optional: true });
32
32
  this.enabled$ = new BehaviorSubject(false);
33
- this.obscured$ = inject(TuiObscuredService, { self: true }).pipe(map((by) => !!by?.every((el) => !this.activeZone?.contains(el))));
33
+ this.obscured$ = inject(TuiObscuredService, { self: true }).pipe(
34
+ // TODO: Refactor so that dropdowns and dialogs work properly without hacks
35
+ map((by) => !!by?.every((el) => el.closest('tui-dialogs') || !this.activeZone?.contains(el))));
34
36
  this.tuiObscured = this.enabled$.pipe(tuiIfMap(() => this.obscured$));
35
37
  }
36
38
  set tuiObscuredEnabled(enabled) {
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-directives-obscured.mjs","sources":["../../../projects/cdk/directives/obscured/obscured.service.ts","../../../projects/cdk/directives/obscured/obscured.directive.ts","../../../projects/cdk/directives/obscured/taiga-ui-cdk-directives-obscured.ts"],"sourcesContent":["import {inject, Injectable} from '@angular/core';\nimport {WA_ANIMATION_FRAME} from '@ng-web-apis/common';\nimport {tuiZonefreeScheduler, tuiZoneOptimized} from '@taiga-ui/cdk/observables';\nimport {tuiGetElementObscures, tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\nimport {distinctUntilChanged, map, Observable, startWith, throttleTime} from 'rxjs';\n\n/**\n * Service that monitors element visibility by polling and returning\n * either null or an array of elements that overlap given element edges\n */\n@Injectable()\nexport class TuiObscuredService extends Observable<readonly Element[] | null> {\n private readonly el = tuiInjectElement();\n private readonly obscured$ = inject(WA_ANIMATION_FRAME).pipe(\n throttleTime(100, tuiZonefreeScheduler()),\n map(() => tuiGetElementObscures(this.el)),\n startWith(null),\n distinctUntilChanged(),\n tuiZoneOptimized(),\n );\n\n constructor() {\n super((subscriber) => this.obscured$.subscribe(subscriber));\n }\n}\n","import {Directive, inject, Input, Output} from '@angular/core';\nimport {TuiActiveZone} from '@taiga-ui/cdk/directives/active-zone';\nimport {tuiIfMap} from '@taiga-ui/cdk/observables';\nimport {BehaviorSubject, map} from 'rxjs';\n\nimport {TuiObscuredService} from './obscured.service';\n\n/**\n * Directive that monitors element visibility\n */\n@Directive({\n standalone: true,\n selector: '[tuiObscured]',\n providers: [TuiObscuredService],\n})\nexport class TuiObscured {\n private readonly activeZone = inject(TuiActiveZone, {optional: true});\n private readonly enabled$ = new BehaviorSubject(false);\n private readonly obscured$ = inject(TuiObscuredService, {self: true}).pipe(\n map((by) => !!by?.every((el) => !this.activeZone?.contains(el))),\n );\n\n @Output()\n public readonly tuiObscured = this.enabled$.pipe(tuiIfMap(() => this.obscured$));\n\n @Input()\n public set tuiObscuredEnabled(enabled: boolean) {\n this.enabled$.next(enabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAMA;;;AAGG;AAEG,MAAO,kBAAmB,SAAQ,UAAqC,CAAA;AAUzE,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAV9C,IAAE,CAAA,EAAA,GAAG,gBAAgB,EAAE;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CACxD,YAAY,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC,EACzC,GAAG,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EACzC,SAAS,CAAC,IAAI,CAAC,EACf,oBAAoB,EAAE,EACtB,gBAAgB,EAAE,CACrB;;+GARQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAlB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACHD;;AAEG;MAMU,WAAW,CAAA;AALxB,IAAA,WAAA,GAAA;QAMqB,IAAU,CAAA,UAAA,GAAG,MAAM,CAAC,aAAa,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACpD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;QACrC,IAAS,CAAA,SAAA,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,IAAI,CACtE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CACnE;AAGe,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;AAMnF;IAJG,IACW,kBAAkB,CAAC,OAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;;+GAZtB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFT,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEtB,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,eAAe;oBACzB,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAClC,iBAAA;8BASmB,WAAW,EAAA,CAAA;sBAD1B;gBAIU,kBAAkB,EAAA,CAAA;sBAD5B;;;ACzBL;;AAEG;;;;"}
1
+ {"version":3,"file":"taiga-ui-cdk-directives-obscured.mjs","sources":["../../../projects/cdk/directives/obscured/obscured.service.ts","../../../projects/cdk/directives/obscured/obscured.directive.ts","../../../projects/cdk/directives/obscured/taiga-ui-cdk-directives-obscured.ts"],"sourcesContent":["import {inject, Injectable} from '@angular/core';\nimport {WA_ANIMATION_FRAME} from '@ng-web-apis/common';\nimport {tuiZonefreeScheduler, tuiZoneOptimized} from '@taiga-ui/cdk/observables';\nimport {tuiGetElementObscures, tuiInjectElement} from '@taiga-ui/cdk/utils/dom';\nimport {distinctUntilChanged, map, Observable, startWith, throttleTime} from 'rxjs';\n\n/**\n * Service that monitors element visibility by polling and returning\n * either null or an array of elements that overlap given element edges\n */\n@Injectable()\nexport class TuiObscuredService extends Observable<readonly Element[] | null> {\n private readonly el = tuiInjectElement();\n private readonly obscured$ = inject(WA_ANIMATION_FRAME).pipe(\n throttleTime(100, tuiZonefreeScheduler()),\n map(() => tuiGetElementObscures(this.el)),\n startWith(null),\n distinctUntilChanged(),\n tuiZoneOptimized(),\n );\n\n constructor() {\n super((subscriber) => this.obscured$.subscribe(subscriber));\n }\n}\n","import {Directive, inject, Input, Output} from '@angular/core';\nimport {TuiActiveZone} from '@taiga-ui/cdk/directives/active-zone';\nimport {tuiIfMap} from '@taiga-ui/cdk/observables';\nimport {BehaviorSubject, map} from 'rxjs';\n\nimport {TuiObscuredService} from './obscured.service';\n\n/**\n * Directive that monitors element visibility\n */\n@Directive({\n standalone: true,\n selector: '[tuiObscured]',\n providers: [TuiObscuredService],\n})\nexport class TuiObscured {\n private readonly activeZone = inject(TuiActiveZone, {optional: true});\n private readonly enabled$ = new BehaviorSubject(false);\n private readonly obscured$ = inject(TuiObscuredService, {self: true}).pipe(\n // TODO: Refactor so that dropdowns and dialogs work properly without hacks\n map(\n (by) =>\n !!by?.every(\n (el) => el.closest('tui-dialogs') || !this.activeZone?.contains(el),\n ),\n ),\n );\n\n @Output()\n public readonly tuiObscured = this.enabled$.pipe(tuiIfMap(() => this.obscured$));\n\n @Input()\n public set tuiObscuredEnabled(enabled: boolean) {\n this.enabled$.next(enabled);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAMA;;;AAGG;AAEG,MAAO,kBAAmB,SAAQ,UAAqC,CAAA;AAUzE,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAV9C,IAAE,CAAA,EAAA,GAAG,gBAAgB,EAAE;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CACxD,YAAY,CAAC,GAAG,EAAE,oBAAoB,EAAE,CAAC,EACzC,GAAG,CAAC,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EACzC,SAAS,CAAC,IAAI,CAAC,EACf,oBAAoB,EAAE,EACtB,gBAAgB,EAAE,CACrB;;+GARQ,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAlB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACHD;;AAEG;MAMU,WAAW,CAAA;AALxB,IAAA,WAAA,GAAA;QAMqB,IAAU,CAAA,UAAA,GAAG,MAAM,CAAC,aAAa,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACpD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,IAAI;;AAEtE,QAAA,GAAG,CACC,CAAC,EAAE,KACC,CAAC,CAAC,EAAE,EAAE,KAAK,CACP,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CACtE,CACR,CACJ;AAGe,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;AAMnF;IAJG,IACW,kBAAkB,CAAC,OAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;;+GAlBtB,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAX,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFT,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEtB,WAAW,EAAA,UAAA,EAAA,CAAA;kBALvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,eAAe;oBACzB,SAAS,EAAE,CAAC,kBAAkB,CAAC;AAClC,iBAAA;8BAemB,WAAW,EAAA,CAAA;sBAD1B;gBAIU,kBAAkB,EAAA,CAAA;sBAD5B;;;AC/BL;;AAEG;;;;"}
@@ -0,0 +1,29 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, EnvironmentInjector, createComponent, Directive } from '@angular/core';
3
+
4
+ const TUI_STYLES = new InjectionToken(ngDevMode ? 'TUI_STYLES' : '');
5
+ function provideStyles(useValue) {
6
+ return { provide: TUI_STYLES, multi: true, useValue };
7
+ }
8
+ // Use it after this is fixed: https://github.com/angular/angular/issues/57846
9
+ class TuiWithStyles {
10
+ constructor() {
11
+ this.injector = inject(EnvironmentInjector);
12
+ this.refs = inject(TUI_STYLES, { self: true }).map((component) => createComponent(component, { environmentInjector: this.injector }));
13
+ }
14
+ ngOnDestroy() {
15
+ this.refs.forEach((ref) => ref.destroy());
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiWithStyles, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiWithStyles, isStandalone: true, ngImport: i0 }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiWithStyles, decorators: [{
21
+ type: Directive
22
+ }] });
23
+
24
+ /**
25
+ * Generated bundle index. Do not edit.
26
+ */
27
+
28
+ export { TuiWithStyles, provideStyles };
29
+ //# sourceMappingURL=taiga-ui-cdk-directives-with-styles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taiga-ui-cdk-directives-with-styles.mjs","sources":["../../../projects/cdk/directives/with-styles/with-styles.directive.ts","../../../projects/cdk/directives/with-styles/taiga-ui-cdk-directives-with-styles.ts"],"sourcesContent":["import {\n createComponent,\n Directive,\n EnvironmentInjector,\n inject,\n InjectionToken,\n type OnDestroy,\n type Type,\n type ValueProvider,\n} from '@angular/core';\n\nconst TUI_STYLES = new InjectionToken<ReadonlyArray<Type<unknown>>>(\n ngDevMode ? 'TUI_STYLES' : '',\n);\n\nexport function provideStyles(useValue: Type<unknown>): ValueProvider {\n return {provide: TUI_STYLES, multi: true, useValue};\n}\n\n// Use it after this is fixed: https://github.com/angular/angular/issues/57846\n@Directive()\nexport class TuiWithStyles implements OnDestroy {\n private readonly injector = inject(EnvironmentInjector);\n private readonly refs = inject(TUI_STYLES, {self: true}).map((component) =>\n createComponent(component, {environmentInjector: this.injector}),\n );\n\n public ngOnDestroy(): void {\n this.refs.forEach((ref) => ref.destroy());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAWA,MAAM,UAAU,GAAG,IAAI,cAAc,CACjC,SAAS,GAAG,YAAY,GAAG,EAAE,CAChC;AAEK,SAAU,aAAa,CAAC,QAAuB,EAAA;IACjD,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC;AACvD;AAEA;MAEa,aAAa,CAAA;AAD1B,IAAA,WAAA,GAAA;AAEqB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,KACnE,eAAe,CAAC,SAAS,EAAE,EAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAC,CAAC,CACnE;AAKJ;IAHU,WAAW,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;;+GAPpC,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACpBD;;AAEG;;;;"}
@@ -25,6 +25,7 @@ export * from '@taiga-ui/cdk/directives/transitioned';
25
25
  export * from '@taiga-ui/cdk/directives/validator';
26
26
  export * from '@taiga-ui/cdk/directives/value-changes';
27
27
  export * from '@taiga-ui/cdk/directives/visual-viewport';
28
+ export * from '@taiga-ui/cdk/directives/with-styles';
28
29
  export * from '@taiga-ui/cdk/directives/zoom';
29
30
 
30
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-directives.mjs","sources":["../../../projects/cdk/directives/taiga-ui-cdk-directives.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"taiga-ui-cdk-directives.mjs","sources":["../../../projects/cdk/directives/taiga-ui-cdk-directives.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG"}
@@ -79,12 +79,13 @@ const TUI_BASE_HREF = new InjectionToken(ngDevMode ? 'TUI_BASE_HREF' : '', {
79
79
  factory: () => inject(DOCUMENT).querySelector('base')?.href ?? '',
80
80
  });
81
81
 
82
- // https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/
83
- const firstRegex = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/;
84
- const secondRegex = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/;
82
+ /**
83
+ * Unified mobile detection regex.
84
+ * https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/
85
+ */
86
+ const TUI_MOBILE_REGEXP = /(?:android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|^(?:1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-)/i;
85
87
  const TUI_IS_MOBILE = new InjectionToken(ngDevMode ? 'TUI_IS_MOBILE' : '', {
86
- factory: () => firstRegex.test(inject(WA_USER_AGENT).toLowerCase()) ||
87
- secondRegex.test(inject(WA_USER_AGENT).slice(0, 4).toLowerCase()),
88
+ factory: () => TUI_MOBILE_REGEXP.test(inject(WA_USER_AGENT)),
88
89
  });
89
90
  const TUI_IS_IOS = new InjectionToken(ngDevMode ? 'TUI_IS_IOS' : '', {
90
91
  factory: () => isIos(inject(WA_NAVIGATOR)),
@@ -182,5 +183,5 @@ const TUI_WINDOW_SIZE = new InjectionToken(ngDevMode ? 'TUI_WINDOW_SIZE' : '', {
182
183
  * Generated bundle index. Do not edit.
183
184
  */
184
185
 
185
- export { TUI_ACTIVE_ELEMENT, TUI_BASE_HREF, TUI_FALLBACK_VALUE, TUI_IS_ANDROID, TUI_IS_CYPRESS, TUI_IS_E2E, TUI_IS_IOS, TUI_IS_MOBILE, TUI_IS_PLAYWRIGHT, TUI_IS_TOUCH, TUI_IS_WEBKIT, TUI_PLATFORM, TUI_RANGE, TUI_REMOVED_ELEMENT, TUI_WINDOW_SIZE, tuiFallbackValueProvider };
186
+ export { TUI_ACTIVE_ELEMENT, TUI_BASE_HREF, TUI_FALLBACK_VALUE, TUI_IS_ANDROID, TUI_IS_CYPRESS, TUI_IS_E2E, TUI_IS_IOS, TUI_IS_MOBILE, TUI_IS_PLAYWRIGHT, TUI_IS_TOUCH, TUI_IS_WEBKIT, TUI_MOBILE_REGEXP, TUI_PLATFORM, TUI_RANGE, TUI_REMOVED_ELEMENT, TUI_WINDOW_SIZE, tuiFallbackValueProvider };
186
187
  //# sourceMappingURL=taiga-ui-cdk-tokens.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-tokens.mjs","sources":["../../../projects/cdk/tokens/removed-element.ts","../../../projects/cdk/tokens/active-element.ts","../../../projects/cdk/tokens/base-href.ts","../../../projects/cdk/tokens/environment.ts","../../../projects/cdk/tokens/fallback-value.ts","../../../projects/cdk/tokens/range.ts","../../../projects/cdk/tokens/window-size.ts","../../../projects/cdk/tokens/taiga-ui-cdk-tokens.ts"],"sourcesContent":["import {ɵAnimationEngine as AnimationEngine} from '@angular/animations/browser';\nimport {inject, InjectionToken} from '@angular/core';\nimport {map, share, startWith, Subject, switchMap, timer} from 'rxjs';\n\n/**\n * Element currently being removed by AnimationEngine\n */\nexport const TUI_REMOVED_ELEMENT = new InjectionToken(\n ngDevMode ? 'TUI_REMOVED_ELEMENT' : '',\n {\n factory: () => {\n const stub = {onRemovalComplete: () => {}};\n const element$ = new Subject<Element | null>();\n const engine = inject(AnimationEngine, {optional: true}) || stub;\n const {onRemovalComplete = stub.onRemovalComplete} = engine;\n\n engine.onRemovalComplete = (element, context) => {\n element$.next(element);\n onRemovalComplete.call(engine, element, context);\n };\n\n return element$.pipe(\n startWith(null),\n switchMap((element) =>\n timer(0).pipe(\n map(() => null),\n startWith(element),\n ),\n ),\n share(),\n );\n },\n },\n);\n","import {DOCUMENT} from '@angular/common';\nimport {inject, InjectionToken, NgZone} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {tuiTypedFromEvent, tuiZonefreeScheduler} from '@taiga-ui/cdk/observables';\nimport {\n tuiGetActualTarget,\n tuiGetDocumentOrShadowRoot,\n tuiIsNativeMouseFocusable,\n} from '@taiga-ui/cdk/utils';\nimport {\n distinctUntilChanged,\n filter,\n map,\n merge,\n type Observable,\n of,\n repeat,\n share,\n startWith,\n switchMap,\n take,\n takeUntil,\n timer,\n withLatestFrom,\n} from 'rxjs';\n\nimport {TUI_REMOVED_ELEMENT} from './removed-element';\n\n// Checks if focusout event should be considered leaving active zone\nfunction isValidFocusout(target: any, removedElement: Element | null = null): boolean {\n return (\n // Not due to switching tabs/going to DevTools\n tuiGetDocumentOrShadowRoot(target).activeElement !== target &&\n // Not due to button/input becoming disabled or under disabled fieldset\n !target.matches(':disabled') &&\n // Not due to element being removed from DOM\n !removedElement?.contains(target) &&\n // Not due to scrollable element became non-scrollable\n tuiIsNativeMouseFocusable(target)\n );\n}\n\nfunction shadowRootActiveElement(root: Document): Observable<EventTarget | null> {\n return merge(\n tuiTypedFromEvent(root, 'focusin').pipe(map(({target}) => target)),\n tuiTypedFromEvent(root, 'focusout').pipe(\n filter(\n ({target, relatedTarget}) => !!relatedTarget && isValidFocusout(target),\n ),\n map(({relatedTarget}) => relatedTarget),\n ),\n );\n}\n\n/**\n * Active element on the document for ActiveZone\n */\nexport const TUI_ACTIVE_ELEMENT = new InjectionToken<Observable<EventTarget | null>>(\n ngDevMode ? 'TUI_ACTIVE_ELEMENT' : '',\n {\n factory: () => {\n const removedElement$ = inject(TUI_REMOVED_ELEMENT);\n const win = inject(WA_WINDOW);\n const doc = inject(DOCUMENT);\n const zone = inject(NgZone);\n const focusout$ = tuiTypedFromEvent(win, 'focusout', {capture: true});\n const focusin$ = tuiTypedFromEvent(win, 'focusin', {capture: true});\n const blur$ = tuiTypedFromEvent(win, 'blur');\n const mousedown$ = tuiTypedFromEvent(win, 'mousedown');\n const mouseup$ = tuiTypedFromEvent(win, 'mouseup');\n\n return merge(\n focusout$.pipe(\n takeUntil(mousedown$),\n repeat({delay: () => mouseup$}),\n withLatestFrom(removedElement$),\n filter(([event, removedElement]) =>\n isValidFocusout(tuiGetActualTarget(event), removedElement),\n ),\n map(([{relatedTarget}]) => relatedTarget),\n ),\n blur$.pipe(\n map(() => doc.activeElement),\n filter((element) => !!element?.matches('iframe')),\n ),\n focusin$.pipe(\n switchMap((event) => {\n const target = tuiGetActualTarget(event);\n const root = tuiGetDocumentOrShadowRoot(target) || doc;\n\n return root === doc\n ? of(target)\n : shadowRootActiveElement(root as Document).pipe(\n startWith(target),\n );\n }),\n ),\n mousedown$.pipe(\n switchMap((event) => {\n const actualTargetInCurrentTime = tuiGetActualTarget(event);\n\n return !doc.activeElement || doc.activeElement === doc.body\n ? of(actualTargetInCurrentTime)\n : focusout$.pipe(\n take(1),\n map(\n /**\n * Do not use `map(() => tuiGetActualTarget(event))`\n * because we have different result in runtime\n */\n () => actualTargetInCurrentTime,\n ),\n takeUntil(timer(0, tuiZonefreeScheduler(zone))),\n );\n }),\n ),\n ).pipe(distinctUntilChanged(), share());\n },\n },\n);\n","import {DOCUMENT} from '@angular/common';\nimport {inject, InjectionToken} from '@angular/core';\n\nexport const TUI_BASE_HREF = new InjectionToken(ngDevMode ? 'TUI_BASE_HREF' : '', {\n factory: () => inject(DOCUMENT).querySelector('base')?.href ?? '',\n});\n","import {inject, InjectionToken} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {WA_NAVIGATOR, WA_USER_AGENT, WA_WINDOW} from '@ng-web-apis/common';\nimport {isIos} from '@ng-web-apis/platform';\nimport {TUI_FALSE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {fromEvent, map} from 'rxjs';\n\n// https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/\nconst firstRegex =\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series([46])0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/;\nconst secondRegex =\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \\-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/;\n\nexport const TUI_IS_MOBILE = new InjectionToken(ngDevMode ? 'TUI_IS_MOBILE' : '', {\n factory: () =>\n firstRegex.test(inject(WA_USER_AGENT).toLowerCase()) ||\n secondRegex.test(inject(WA_USER_AGENT).slice(0, 4).toLowerCase()),\n});\n\nexport const TUI_IS_IOS = new InjectionToken(ngDevMode ? 'TUI_IS_IOS' : '', {\n factory: () => isIos(inject(WA_NAVIGATOR)),\n});\n\nexport const TUI_IS_ANDROID = new InjectionToken(ngDevMode ? 'TUI_IS_ANDROID' : '', {\n factory: () => inject(TUI_IS_MOBILE) && !inject(TUI_IS_IOS),\n});\n\nexport const TUI_IS_WEBKIT = new InjectionToken(ngDevMode ? 'TUI_IS_WEBKIT' : '', {\n factory: () => !!inject<any>(WA_WINDOW)?.webkitConvertPointFromNodeToPage,\n});\n\nexport const TUI_PLATFORM = new InjectionToken<'android' | 'ios' | 'web'>(\n ngDevMode ? 'TUI_PLATFORM' : '',\n {\n factory: () => {\n if (inject(TUI_IS_IOS)) {\n return 'ios';\n }\n\n return inject(TUI_IS_ANDROID) ? 'android' : 'web';\n },\n },\n);\n\nexport const TUI_IS_TOUCH = new InjectionToken(ngDevMode ? 'TUI_IS_TOUCH' : '', {\n factory: () => {\n const media = inject(WA_WINDOW).matchMedia('(pointer: coarse)');\n\n return toSignal(fromEvent(media, 'change').pipe(map(() => media.matches)), {\n initialValue: media.matches,\n });\n },\n});\n\n/**\n * @deprecated: use only {@link TUI_IS_E2E}\n * Detect if app is running under Cypress\n * {@link https://docs.cypress.io/faq/questions/using-cypress-faq#Is-there-any-way-to-detect-if-my-app-is-running-under-Cypress Cypress docs}\n * TODO: remove in v5\n */\nexport const TUI_IS_CYPRESS = new InjectionToken(ngDevMode ? 'TUI_IS_CYPRESS' : '', {\n factory: () => !!inject<any>(WA_WINDOW).Cypress,\n});\n\n/**\n * @deprecated: use only {@link TUI_IS_E2E}\n * Manually provide `true` when running tests in Playwright\n * TODO: remove in v5\n */\nexport const TUI_IS_PLAYWRIGHT = new InjectionToken<boolean>(\n ngDevMode ? 'TUI_IS_PLAYWRIGHT' : '',\n {\n factory: TUI_FALSE_HANDLER,\n },\n);\n\n/**\n * Detect if app is running under any of test frameworks\n */\nexport const TUI_IS_E2E = new InjectionToken(ngDevMode ? 'TUI_IS_E2E' : '', {\n factory: () =>\n inject(TUI_IS_CYPRESS) ||\n inject(TUI_IS_PLAYWRIGHT) ||\n inject(WA_NAVIGATOR).webdriver,\n});\n","import {InjectionToken, type ValueProvider} from '@angular/core';\n\nexport const TUI_FALLBACK_VALUE = new InjectionToken<any>(\n ngDevMode ? 'TUI_FALLBACK_VALUE' : '',\n {\n factory: () => null,\n },\n);\n\nexport function tuiFallbackValueProvider<T>(useValue: T): ValueProvider {\n return {\n provide: TUI_FALLBACK_VALUE,\n useValue,\n };\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {inject, InjectionToken, PLATFORM_ID} from '@angular/core';\n\n/**\n * SSR safe default empty Range\n */\nexport const TUI_RANGE = new InjectionToken(ngDevMode ? 'TUI_RANGE' : '', {\n factory: () =>\n isPlatformBrowser(inject(PLATFORM_ID)) ? new Range() : ({} as unknown as Range),\n});\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {tuiTypedFromEvent} from '@taiga-ui/cdk/observables';\nimport {map, type Observable, shareReplay, startWith} from 'rxjs';\n\nexport const TUI_WINDOW_SIZE = new InjectionToken<Observable<DOMRect>>(\n ngDevMode ? 'TUI_WINDOW_SIZE' : '',\n {\n factory: () => {\n const w = inject(WA_WINDOW);\n\n return tuiTypedFromEvent(w, 'resize').pipe(\n startWith(null),\n map(() => {\n const width = Math.max(\n w.document.documentElement.clientWidth || 0,\n w.innerWidth || 0,\n w.visualViewport?.width || 0,\n );\n const height = Math.max(\n w.document.documentElement.clientHeight || 0,\n w.innerHeight || 0,\n w.visualViewport?.height || 0,\n );\n const rect = {\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n x: 0,\n y: 0,\n };\n\n return {\n ...rect,\n toJSON: () => JSON.stringify(rect),\n };\n }),\n shareReplay({bufferSize: 1, refCount: true}),\n );\n },\n },\n);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AnimationEngine"],"mappings":"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"}
1
+ {"version":3,"file":"taiga-ui-cdk-tokens.mjs","sources":["../../../projects/cdk/tokens/removed-element.ts","../../../projects/cdk/tokens/active-element.ts","../../../projects/cdk/tokens/base-href.ts","../../../projects/cdk/tokens/environment.ts","../../../projects/cdk/tokens/fallback-value.ts","../../../projects/cdk/tokens/range.ts","../../../projects/cdk/tokens/window-size.ts","../../../projects/cdk/tokens/taiga-ui-cdk-tokens.ts"],"sourcesContent":["import {ɵAnimationEngine as AnimationEngine} from '@angular/animations/browser';\nimport {inject, InjectionToken} from '@angular/core';\nimport {map, share, startWith, Subject, switchMap, timer} from 'rxjs';\n\n/**\n * Element currently being removed by AnimationEngine\n */\nexport const TUI_REMOVED_ELEMENT = new InjectionToken(\n ngDevMode ? 'TUI_REMOVED_ELEMENT' : '',\n {\n factory: () => {\n const stub = {onRemovalComplete: () => {}};\n const element$ = new Subject<Element | null>();\n const engine = inject(AnimationEngine, {optional: true}) || stub;\n const {onRemovalComplete = stub.onRemovalComplete} = engine;\n\n engine.onRemovalComplete = (element, context) => {\n element$.next(element);\n onRemovalComplete.call(engine, element, context);\n };\n\n return element$.pipe(\n startWith(null),\n switchMap((element) =>\n timer(0).pipe(\n map(() => null),\n startWith(element),\n ),\n ),\n share(),\n );\n },\n },\n);\n","import {DOCUMENT} from '@angular/common';\nimport {inject, InjectionToken, NgZone} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {tuiTypedFromEvent, tuiZonefreeScheduler} from '@taiga-ui/cdk/observables';\nimport {\n tuiGetActualTarget,\n tuiGetDocumentOrShadowRoot,\n tuiIsNativeMouseFocusable,\n} from '@taiga-ui/cdk/utils';\nimport {\n distinctUntilChanged,\n filter,\n map,\n merge,\n type Observable,\n of,\n repeat,\n share,\n startWith,\n switchMap,\n take,\n takeUntil,\n timer,\n withLatestFrom,\n} from 'rxjs';\n\nimport {TUI_REMOVED_ELEMENT} from './removed-element';\n\n// Checks if focusout event should be considered leaving active zone\nfunction isValidFocusout(target: any, removedElement: Element | null = null): boolean {\n return (\n // Not due to switching tabs/going to DevTools\n tuiGetDocumentOrShadowRoot(target).activeElement !== target &&\n // Not due to button/input becoming disabled or under disabled fieldset\n !target.matches(':disabled') &&\n // Not due to element being removed from DOM\n !removedElement?.contains(target) &&\n // Not due to scrollable element became non-scrollable\n tuiIsNativeMouseFocusable(target)\n );\n}\n\nfunction shadowRootActiveElement(root: Document): Observable<EventTarget | null> {\n return merge(\n tuiTypedFromEvent(root, 'focusin').pipe(map(({target}) => target)),\n tuiTypedFromEvent(root, 'focusout').pipe(\n filter(\n ({target, relatedTarget}) => !!relatedTarget && isValidFocusout(target),\n ),\n map(({relatedTarget}) => relatedTarget),\n ),\n );\n}\n\n/**\n * Active element on the document for ActiveZone\n */\nexport const TUI_ACTIVE_ELEMENT = new InjectionToken<Observable<EventTarget | null>>(\n ngDevMode ? 'TUI_ACTIVE_ELEMENT' : '',\n {\n factory: () => {\n const removedElement$ = inject(TUI_REMOVED_ELEMENT);\n const win = inject(WA_WINDOW);\n const doc = inject(DOCUMENT);\n const zone = inject(NgZone);\n const focusout$ = tuiTypedFromEvent(win, 'focusout', {capture: true});\n const focusin$ = tuiTypedFromEvent(win, 'focusin', {capture: true});\n const blur$ = tuiTypedFromEvent(win, 'blur');\n const mousedown$ = tuiTypedFromEvent(win, 'mousedown');\n const mouseup$ = tuiTypedFromEvent(win, 'mouseup');\n\n return merge(\n focusout$.pipe(\n takeUntil(mousedown$),\n repeat({delay: () => mouseup$}),\n withLatestFrom(removedElement$),\n filter(([event, removedElement]) =>\n isValidFocusout(tuiGetActualTarget(event), removedElement),\n ),\n map(([{relatedTarget}]) => relatedTarget),\n ),\n blur$.pipe(\n map(() => doc.activeElement),\n filter((element) => !!element?.matches('iframe')),\n ),\n focusin$.pipe(\n switchMap((event) => {\n const target = tuiGetActualTarget(event);\n const root = tuiGetDocumentOrShadowRoot(target) || doc;\n\n return root === doc\n ? of(target)\n : shadowRootActiveElement(root as Document).pipe(\n startWith(target),\n );\n }),\n ),\n mousedown$.pipe(\n switchMap((event) => {\n const actualTargetInCurrentTime = tuiGetActualTarget(event);\n\n return !doc.activeElement || doc.activeElement === doc.body\n ? of(actualTargetInCurrentTime)\n : focusout$.pipe(\n take(1),\n map(\n /**\n * Do not use `map(() => tuiGetActualTarget(event))`\n * because we have different result in runtime\n */\n () => actualTargetInCurrentTime,\n ),\n takeUntil(timer(0, tuiZonefreeScheduler(zone))),\n );\n }),\n ),\n ).pipe(distinctUntilChanged(), share());\n },\n },\n);\n","import {DOCUMENT} from '@angular/common';\nimport {inject, InjectionToken} from '@angular/core';\n\nexport const TUI_BASE_HREF = new InjectionToken(ngDevMode ? 'TUI_BASE_HREF' : '', {\n factory: () => inject(DOCUMENT).querySelector('base')?.href ?? '',\n});\n","import {inject, InjectionToken} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {WA_NAVIGATOR, WA_USER_AGENT, WA_WINDOW} from '@ng-web-apis/common';\nimport {isIos} from '@ng-web-apis/platform';\nimport {TUI_FALSE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {fromEvent, map} from 'rxjs';\n\n/**\n * Unified mobile detection regex.\n * https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/\n */\nexport const TUI_MOBILE_REGEXP =\n /(?:android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series([46])0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|^(?:1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \\-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-)/i;\n\nexport const TUI_IS_MOBILE = new InjectionToken(ngDevMode ? 'TUI_IS_MOBILE' : '', {\n factory: () => TUI_MOBILE_REGEXP.test(inject(WA_USER_AGENT)),\n});\n\nexport const TUI_IS_IOS = new InjectionToken(ngDevMode ? 'TUI_IS_IOS' : '', {\n factory: () => isIos(inject(WA_NAVIGATOR)),\n});\n\nexport const TUI_IS_ANDROID = new InjectionToken(ngDevMode ? 'TUI_IS_ANDROID' : '', {\n factory: () => inject(TUI_IS_MOBILE) && !inject(TUI_IS_IOS),\n});\n\nexport const TUI_IS_WEBKIT = new InjectionToken(ngDevMode ? 'TUI_IS_WEBKIT' : '', {\n factory: () => !!inject<any>(WA_WINDOW)?.webkitConvertPointFromNodeToPage,\n});\n\nexport const TUI_PLATFORM = new InjectionToken<'android' | 'ios' | 'web'>(\n ngDevMode ? 'TUI_PLATFORM' : '',\n {\n factory: () => {\n if (inject(TUI_IS_IOS)) {\n return 'ios';\n }\n\n return inject(TUI_IS_ANDROID) ? 'android' : 'web';\n },\n },\n);\n\nexport const TUI_IS_TOUCH = new InjectionToken(ngDevMode ? 'TUI_IS_TOUCH' : '', {\n factory: () => {\n const media = inject(WA_WINDOW).matchMedia('(pointer: coarse)');\n\n return toSignal(fromEvent(media, 'change').pipe(map(() => media.matches)), {\n initialValue: media.matches,\n });\n },\n});\n\n/**\n * @deprecated: use only {@link TUI_IS_E2E}\n * Detect if app is running under Cypress\n * {@link https://docs.cypress.io/faq/questions/using-cypress-faq#Is-there-any-way-to-detect-if-my-app-is-running-under-Cypress Cypress docs}\n * TODO: remove in v5\n */\nexport const TUI_IS_CYPRESS = new InjectionToken(ngDevMode ? 'TUI_IS_CYPRESS' : '', {\n factory: () => !!inject<any>(WA_WINDOW).Cypress,\n});\n\n/**\n * @deprecated: use only {@link TUI_IS_E2E}\n * Manually provide `true` when running tests in Playwright\n * TODO: remove in v5\n */\nexport const TUI_IS_PLAYWRIGHT = new InjectionToken<boolean>(\n ngDevMode ? 'TUI_IS_PLAYWRIGHT' : '',\n {\n factory: TUI_FALSE_HANDLER,\n },\n);\n\n/**\n * Detect if app is running under any of test frameworks\n */\nexport const TUI_IS_E2E = new InjectionToken(ngDevMode ? 'TUI_IS_E2E' : '', {\n factory: () =>\n inject(TUI_IS_CYPRESS) ||\n inject(TUI_IS_PLAYWRIGHT) ||\n inject(WA_NAVIGATOR).webdriver,\n});\n","import {InjectionToken, type ValueProvider} from '@angular/core';\n\nexport const TUI_FALLBACK_VALUE = new InjectionToken<any>(\n ngDevMode ? 'TUI_FALLBACK_VALUE' : '',\n {\n factory: () => null,\n },\n);\n\nexport function tuiFallbackValueProvider<T>(useValue: T): ValueProvider {\n return {\n provide: TUI_FALLBACK_VALUE,\n useValue,\n };\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {inject, InjectionToken, PLATFORM_ID} from '@angular/core';\n\n/**\n * SSR safe default empty Range\n */\nexport const TUI_RANGE = new InjectionToken(ngDevMode ? 'TUI_RANGE' : '', {\n factory: () =>\n isPlatformBrowser(inject(PLATFORM_ID)) ? new Range() : ({} as unknown as Range),\n});\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_WINDOW} from '@ng-web-apis/common';\nimport {tuiTypedFromEvent} from '@taiga-ui/cdk/observables';\nimport {map, type Observable, shareReplay, startWith} from 'rxjs';\n\nexport const TUI_WINDOW_SIZE = new InjectionToken<Observable<DOMRect>>(\n ngDevMode ? 'TUI_WINDOW_SIZE' : '',\n {\n factory: () => {\n const w = inject(WA_WINDOW);\n\n return tuiTypedFromEvent(w, 'resize').pipe(\n startWith(null),\n map(() => {\n const width = Math.max(\n w.document.documentElement.clientWidth || 0,\n w.innerWidth || 0,\n w.visualViewport?.width || 0,\n );\n const height = Math.max(\n w.document.documentElement.clientHeight || 0,\n w.innerHeight || 0,\n w.visualViewport?.height || 0,\n );\n const rect = {\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n x: 0,\n y: 0,\n };\n\n return {\n ...rect,\n toJSON: () => JSON.stringify(rect),\n };\n }),\n shareReplay({bufferSize: 1, refCount: true}),\n );\n },\n },\n);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AnimationEngine"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { merge, fromEvent, map, observeOn } from 'rxjs';
9
9
  *
10
10
  * @return element or null
11
11
  */
12
- function tuiGetNativeFocused({ activeElement }) {
12
+ function tuiGetFocused({ activeElement }) {
13
13
  if (!activeElement?.shadowRoot) {
14
14
  return activeElement;
15
15
  }
@@ -24,7 +24,7 @@ function tuiGetNativeFocused({ activeElement }) {
24
24
  * Finds and blurs current active element, including shadow DOM
25
25
  */
26
26
  function tuiBlurNativeFocused(doc) {
27
- const activeElement = tuiGetNativeFocused(doc);
27
+ const activeElement = tuiGetFocused(doc);
28
28
  if (tuiIsHTMLElement(activeElement)) {
29
29
  activeElement.blur();
30
30
  }
@@ -102,9 +102,9 @@ function tuiGetClosestFocusable({ initial, root, previous = false, keyboard = tr
102
102
  * @param node or null (as a common return value of DOM nodes walking)
103
103
  * @return true if focused
104
104
  */
105
- function tuiIsNativeFocused(node) {
105
+ function tuiIsFocused(node) {
106
106
  return (!!node?.ownerDocument &&
107
- tuiGetNativeFocused(node.ownerDocument) === node &&
107
+ tuiGetFocused(node.ownerDocument) === node &&
108
108
  node.ownerDocument.hasFocus());
109
109
  }
110
110
 
@@ -114,8 +114,8 @@ function tuiIsNativeFocused(node) {
114
114
  * @param node
115
115
  * @return true if focused node is contained within element
116
116
  */
117
- function tuiIsNativeFocusedIn(node) {
118
- const focused = node?.ownerDocument && tuiGetNativeFocused(node.ownerDocument);
117
+ function tuiIsFocusedIn(node) {
118
+ const focused = node?.ownerDocument && tuiGetFocused(node.ownerDocument);
119
119
  return !!focused && node.contains(focused) && node.ownerDocument?.hasFocus();
120
120
  }
121
121
 
@@ -130,7 +130,7 @@ function tuiMoveFocus(currentIndex, elements, step) {
130
130
  currentIndex += step;
131
131
  while (currentIndex >= 0 && currentIndex < elements.length) {
132
132
  elements[currentIndex]?.focus();
133
- if (tuiIsNativeFocused(elements[currentIndex])) {
133
+ if (tuiIsFocused(elements[currentIndex])) {
134
134
  return;
135
135
  }
136
136
  currentIndex += step;
@@ -141,5 +141,5 @@ function tuiMoveFocus(currentIndex, elements, step) {
141
141
  * Generated bundle index. Do not edit.
142
142
  */
143
143
 
144
- export { tuiBlurNativeFocused, tuiFocusedIn, tuiGetClosestFocusable, tuiGetNativeFocused, tuiIsNativeFocused, tuiIsNativeFocusedIn, tuiIsNativeKeyboardFocusable, tuiIsNativeMouseFocusable, tuiMoveFocus };
144
+ export { tuiBlurNativeFocused, tuiFocusedIn, tuiGetClosestFocusable, tuiGetFocused, tuiIsFocused, tuiIsFocusedIn, tuiIsNativeKeyboardFocusable, tuiIsNativeMouseFocusable, tuiMoveFocus };
145
145
  //# sourceMappingURL=taiga-ui-cdk-utils-focus.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taiga-ui-cdk-utils-focus.mjs","sources":["../../../projects/cdk/utils/focus/get-native-focused.ts","../../../projects/cdk/utils/focus/blur-native-focused.ts","../../../projects/cdk/utils/focus/focused-in.ts","../../../projects/cdk/utils/focus/is-native-keyboard-focusable.ts","../../../projects/cdk/utils/focus/is-native-mouse-focusable.ts","../../../projects/cdk/utils/focus/get-closest-focusable.ts","../../../projects/cdk/utils/focus/is-native-focused.ts","../../../projects/cdk/utils/focus/is-native-focused-in.ts","../../../projects/cdk/utils/focus/move-focus.ts","../../../projects/cdk/utils/focus/taiga-ui-cdk-utils-focus.ts"],"sourcesContent":["/**\n * Returns current active element, including shadow dom\n *\n * @return element or null\n */\nexport function tuiGetNativeFocused({activeElement}: Document): Element | null {\n if (!activeElement?.shadowRoot) {\n return activeElement;\n }\n\n let element = activeElement.shadowRoot.activeElement;\n\n while (element?.shadowRoot) {\n element = element.shadowRoot.activeElement;\n }\n\n return element;\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Finds and blurs current active element, including shadow DOM\n */\nexport function tuiBlurNativeFocused(doc: Document): void {\n const activeElement = tuiGetNativeFocused(doc);\n\n if (tuiIsHTMLElement(activeElement)) {\n activeElement.blur();\n }\n}\n","import {type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {TUI_FALSE_HANDLER, TUI_TRUE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {tuiUntrackedScheduler} from '@taiga-ui/cdk/observables';\nimport {fromEvent, map, merge, observeOn} from 'rxjs';\n\nexport function tuiFocusedIn(node: Node): Signal<boolean> {\n return toSignal(\n merge(\n fromEvent(node, 'focus', {capture: true}).pipe(map(TUI_TRUE_HANDLER)),\n fromEvent(node, 'blur', {capture: true}).pipe(map(TUI_FALSE_HANDLER)),\n ).pipe(observeOn(tuiUntrackedScheduler)),\n {initialValue: false},\n );\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\n/**\n * Checks for signs that element can be focused with keyboard. tabIndex above 0 is ignored to\n * only target natural focus order. Not checking the possibility of an element to\n * be focused, for example element can have display: none applied to it or any other\n * circumstances could prevent actual focus.\n */\nexport function tuiIsNativeKeyboardFocusable(element: Element): boolean {\n if (element.hasAttribute('disabled') || element.getAttribute('tabIndex') === '-1') {\n return false;\n }\n\n if (\n (tuiIsHTMLElement(element) && element.isContentEditable) ||\n element.getAttribute('tabIndex') === '0'\n ) {\n return true;\n }\n\n switch (element.tagName) {\n case 'A':\n case 'LINK':\n return element.hasAttribute('href');\n case 'AUDIO':\n case 'VIDEO':\n return element.hasAttribute('controls');\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n case 'INPUT':\n return element.getAttribute('type') !== 'hidden';\n default:\n return false;\n }\n}\n","import {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\n\nexport function tuiIsNativeMouseFocusable(element: Element): boolean {\n return (\n !element.hasAttribute('disabled') &&\n (element.getAttribute('tabIndex') === '-1' ||\n tuiIsNativeKeyboardFocusable(element))\n );\n}\n","import {svgNodeFilter} from '@taiga-ui/cdk/constants';\nimport {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\nimport {tuiIsNativeMouseFocusable} from './is-native-mouse-focusable';\n\nexport interface TuiGetClosestFocusableOptions {\n /**\n * @description:\n * current HTML element\n */\n initial: Element;\n\n /**\n * @description:\n * determine if only keyboard focus is of interest\n */\n keyboard?: boolean;\n\n /**\n * @description:\n * should it look backwards instead (find item that will be focused with Shift + Tab)\n */\n previous?: boolean;\n\n /**\n * @description:\n * top Node limiting the search area\n */\n root: Node;\n}\n\n/**\n * @description:\n * Finds the closest element that can be focused with a keyboard or mouse in theory\n */\nexport function tuiGetClosestFocusable({\n initial,\n root,\n previous = false,\n keyboard = true,\n}: TuiGetClosestFocusableOptions): HTMLElement | null {\n if (!root.ownerDocument) {\n return null;\n }\n\n const check = keyboard ? tuiIsNativeKeyboardFocusable : tuiIsNativeMouseFocusable;\n const treeWalker = root.ownerDocument.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT,\n svgNodeFilter,\n );\n\n treeWalker.currentNode = initial;\n\n do {\n if (tuiIsHTMLElement(treeWalker.currentNode)) {\n initial = treeWalker.currentNode;\n }\n\n if (tuiIsHTMLElement(initial) && check(initial)) {\n return initial;\n }\n } while (previous ? treeWalker.previousNode() : treeWalker.nextNode());\n\n return null;\n}\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if element is focused.\n *\n * Could return true even after blur since element remains focused if you switch away from a browser tab.\n *\n * @param node or null (as a common return value of DOM nodes walking)\n * @return true if focused\n */\nexport function tuiIsNativeFocused(node?: Node | null): boolean {\n return (\n !!node?.ownerDocument &&\n tuiGetNativeFocused(node.ownerDocument) === node &&\n node.ownerDocument.hasFocus()\n );\n}\n","import {tuiGetNativeFocused} from './get-native-focused';\n\n/**\n * Checks if focused element is within given element.\n *\n * @param node\n * @return true if focused node is contained within element\n */\nexport function tuiIsNativeFocusedIn(node?: Node | null): boolean {\n const focused = node?.ownerDocument && tuiGetNativeFocused(node.ownerDocument);\n\n return !!focused && node.contains(focused) && node.ownerDocument?.hasFocus();\n}\n","import {tuiIsNativeFocused} from './is-native-focused';\n\n/**\n * Utility method for moving focus in a list of elements\n *\n * @param currentIndex currently focused index\n * @param elements array of focusable elements\n * @param step a step to move focus by, typically -1 or 1\n */\nexport function tuiMoveFocus(\n currentIndex: number,\n elements: readonly HTMLElement[],\n step: number,\n): void {\n currentIndex += step;\n\n while (currentIndex >= 0 && currentIndex < elements.length) {\n elements[currentIndex]?.focus();\n\n if (tuiIsNativeFocused(elements[currentIndex])) {\n return;\n }\n\n currentIndex += step;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"taiga-ui-cdk-utils-focus.mjs","sources":["../../../projects/cdk/utils/focus/get-native-focused.ts","../../../projects/cdk/utils/focus/blur-native-focused.ts","../../../projects/cdk/utils/focus/focused-in.ts","../../../projects/cdk/utils/focus/is-native-keyboard-focusable.ts","../../../projects/cdk/utils/focus/is-native-mouse-focusable.ts","../../../projects/cdk/utils/focus/get-closest-focusable.ts","../../../projects/cdk/utils/focus/is-native-focused.ts","../../../projects/cdk/utils/focus/is-native-focused-in.ts","../../../projects/cdk/utils/focus/move-focus.ts","../../../projects/cdk/utils/focus/taiga-ui-cdk-utils-focus.ts"],"sourcesContent":["/**\n * Returns current active element, including shadow dom\n *\n * @return element or null\n */\nexport function tuiGetFocused({activeElement}: Document): Element | null {\n if (!activeElement?.shadowRoot) {\n return activeElement;\n }\n\n let element = activeElement.shadowRoot.activeElement;\n\n while (element?.shadowRoot) {\n element = element.shadowRoot.activeElement;\n }\n\n return element;\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiGetFocused} from './get-native-focused';\n\n/**\n * Finds and blurs current active element, including shadow DOM\n */\nexport function tuiBlurNativeFocused(doc: Document): void {\n const activeElement = tuiGetFocused(doc);\n\n if (tuiIsHTMLElement(activeElement)) {\n activeElement.blur();\n }\n}\n","import {type Signal} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {TUI_FALSE_HANDLER, TUI_TRUE_HANDLER} from '@taiga-ui/cdk/constants';\nimport {tuiUntrackedScheduler} from '@taiga-ui/cdk/observables';\nimport {fromEvent, map, merge, observeOn} from 'rxjs';\n\nexport function tuiFocusedIn(node: Node): Signal<boolean> {\n return toSignal(\n merge(\n fromEvent(node, 'focus', {capture: true}).pipe(map(TUI_TRUE_HANDLER)),\n fromEvent(node, 'blur', {capture: true}).pipe(map(TUI_FALSE_HANDLER)),\n ).pipe(observeOn(tuiUntrackedScheduler)),\n {initialValue: false},\n );\n}\n","import {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\n/**\n * Checks for signs that element can be focused with keyboard. tabIndex above 0 is ignored to\n * only target natural focus order. Not checking the possibility of an element to\n * be focused, for example element can have display: none applied to it or any other\n * circumstances could prevent actual focus.\n */\nexport function tuiIsNativeKeyboardFocusable(element: Element): boolean {\n if (element.hasAttribute('disabled') || element.getAttribute('tabIndex') === '-1') {\n return false;\n }\n\n if (\n (tuiIsHTMLElement(element) && element.isContentEditable) ||\n element.getAttribute('tabIndex') === '0'\n ) {\n return true;\n }\n\n switch (element.tagName) {\n case 'A':\n case 'LINK':\n return element.hasAttribute('href');\n case 'AUDIO':\n case 'VIDEO':\n return element.hasAttribute('controls');\n case 'BUTTON':\n case 'SELECT':\n case 'TEXTAREA':\n return true;\n case 'INPUT':\n return element.getAttribute('type') !== 'hidden';\n default:\n return false;\n }\n}\n","import {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\n\nexport function tuiIsNativeMouseFocusable(element: Element): boolean {\n return (\n !element.hasAttribute('disabled') &&\n (element.getAttribute('tabIndex') === '-1' ||\n tuiIsNativeKeyboardFocusable(element))\n );\n}\n","import {svgNodeFilter} from '@taiga-ui/cdk/constants';\nimport {tuiIsHTMLElement} from '@taiga-ui/cdk/utils/dom';\n\nimport {tuiIsNativeKeyboardFocusable} from './is-native-keyboard-focusable';\nimport {tuiIsNativeMouseFocusable} from './is-native-mouse-focusable';\n\nexport interface TuiGetClosestFocusableOptions {\n /**\n * @description:\n * current HTML element\n */\n initial: Element;\n\n /**\n * @description:\n * determine if only keyboard focus is of interest\n */\n keyboard?: boolean;\n\n /**\n * @description:\n * should it look backwards instead (find item that will be focused with Shift + Tab)\n */\n previous?: boolean;\n\n /**\n * @description:\n * top Node limiting the search area\n */\n root: Node;\n}\n\n/**\n * @description:\n * Finds the closest element that can be focused with a keyboard or mouse in theory\n */\nexport function tuiGetClosestFocusable({\n initial,\n root,\n previous = false,\n keyboard = true,\n}: TuiGetClosestFocusableOptions): HTMLElement | null {\n if (!root.ownerDocument) {\n return null;\n }\n\n const check = keyboard ? tuiIsNativeKeyboardFocusable : tuiIsNativeMouseFocusable;\n const treeWalker = root.ownerDocument.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT,\n svgNodeFilter,\n );\n\n treeWalker.currentNode = initial;\n\n do {\n if (tuiIsHTMLElement(treeWalker.currentNode)) {\n initial = treeWalker.currentNode;\n }\n\n if (tuiIsHTMLElement(initial) && check(initial)) {\n return initial;\n }\n } while (previous ? treeWalker.previousNode() : treeWalker.nextNode());\n\n return null;\n}\n","import {tuiGetFocused} from './get-native-focused';\n\n/**\n * Checks if element is focused.\n *\n * Could return true even after blur since element remains focused if you switch away from a browser tab.\n *\n * @param node or null (as a common return value of DOM nodes walking)\n * @return true if focused\n */\nexport function tuiIsFocused(node?: Node | null): boolean {\n return (\n !!node?.ownerDocument &&\n tuiGetFocused(node.ownerDocument) === node &&\n node.ownerDocument.hasFocus()\n );\n}\n","import {tuiGetFocused} from './get-native-focused';\n\n/**\n * Checks if focused element is within given element.\n *\n * @param node\n * @return true if focused node is contained within element\n */\nexport function tuiIsFocusedIn(node?: Node | null): boolean {\n const focused = node?.ownerDocument && tuiGetFocused(node.ownerDocument);\n\n return !!focused && node.contains(focused) && node.ownerDocument?.hasFocus();\n}\n","import {tuiIsFocused} from './is-native-focused';\n\n/**\n * Utility method for moving focus in a list of elements\n *\n * @param currentIndex currently focused index\n * @param elements array of focusable elements\n * @param step a step to move focus by, typically -1 or 1\n */\nexport function tuiMoveFocus(\n currentIndex: number,\n elements: readonly HTMLElement[],\n step: number,\n): void {\n currentIndex += step;\n\n while (currentIndex >= 0 && currentIndex < elements.length) {\n elements[currentIndex]?.focus();\n\n if (tuiIsFocused(elements[currentIndex])) {\n return;\n }\n\n currentIndex += step;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -81,7 +81,10 @@ function tuiSetSignal(signal, value) {
81
81
  function tuiDirectiveBinding(token, key, initial, options = { self: true }) {
82
82
  const result = isSignal(initial) ? initial : signal(initial);
83
83
  const directive = inject(token, options);
84
- const output = directive[`${key.toString()}Change`];
84
+ const output = directive?.[`${key.toString()}Change`];
85
+ if (!directive) {
86
+ return result;
87
+ }
85
88
  // TODO: Figure out why effects are executed all the time and not just when result changes (check with Angular 18)
86
89
  let previous;
87
90
  effect(() => {