@taiga-ui/core 4.52.0-canary.aaf153c → 4.52.0-canary.b1ce38b

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 (257) hide show
  1. package/README.md +1 -1
  2. package/classes/accessors.d.ts +1 -1
  3. package/components/calendar/calendar-sheet.options.d.ts +1 -3
  4. package/{pipes/calendar-sheet → components/calendar}/calendar-sheet.pipe.d.ts +1 -1
  5. package/components/calendar/calendar-spin.component.d.ts +1 -0
  6. package/components/calendar/calendar-year.component.d.ts +1 -1
  7. package/components/calendar/index.d.ts +2 -0
  8. package/components/data-list/data-list.component.d.ts +7 -11
  9. package/components/data-list/data-list.d.ts +3 -4
  10. package/components/data-list/data-list.tokens.d.ts +1 -23
  11. package/components/data-list/index.d.ts +3 -4
  12. package/components/data-list/opt-group.directive.d.ts +2 -2
  13. package/components/data-list/option-content.directive.d.ts +14 -0
  14. package/components/data-list/option-with-value.directive.d.ts +9 -0
  15. package/components/data-list/option.directive.d.ts +19 -0
  16. package/components/icon/icon.component.d.ts +2 -2
  17. package/components/index.d.ts +2 -4
  18. package/components/input/index.d.ts +2 -0
  19. package/components/input/input.d.ts +5 -0
  20. package/components/input/input.directive.d.ts +30 -0
  21. package/components/link/link.options.d.ts +1 -3
  22. package/components/loader/loader.options.d.ts +1 -3
  23. package/components/notification/index.d.ts +3 -0
  24. package/components/notification/notification.component.d.ts +14 -0
  25. package/components/notification/notification.d.ts +3 -0
  26. package/components/notification/notification.directive.d.ts +4 -5
  27. package/components/notification/notification.options.d.ts +10 -7
  28. package/components/notification/notification.service.d.ts +17 -0
  29. package/components/root/root.component.d.ts +1 -1
  30. package/components/scrollbar/scroll-into-view.directive.d.ts +3 -2
  31. package/components/scrollbar/scrollbar.component.d.ts +2 -2
  32. package/components/scrollbar/scrollbar.directive.d.ts +2 -2
  33. package/components/textfield/index.d.ts +0 -1
  34. package/components/textfield/textfield-multi/textfield-item.component.d.ts +3 -2
  35. package/components/textfield/textfield-multi/textfield-multi.component.d.ts +9 -13
  36. package/components/textfield/textfield.component.d.ts +23 -35
  37. package/components/textfield/textfield.d.ts +2 -3
  38. package/directives/date-format/date-format.directive.d.ts +3 -7
  39. package/directives/group/group.directive.d.ts +7 -7
  40. package/directives/group/group.options.d.ts +1 -3
  41. package/directives/index.d.ts +0 -5
  42. package/directives/number-format/number-format.directive.d.ts +3 -7
  43. package/fesm2022/taiga-ui-core-classes.mjs +9 -11
  44. package/fesm2022/taiga-ui-core-classes.mjs.map +1 -1
  45. package/fesm2022/taiga-ui-core-components-button.mjs +6 -6
  46. package/fesm2022/taiga-ui-core-components-calendar.mjs +130 -31
  47. package/fesm2022/taiga-ui-core-components-calendar.mjs.map +1 -1
  48. package/fesm2022/taiga-ui-core-components-cell.mjs +7 -7
  49. package/fesm2022/taiga-ui-core-components-cell.mjs.map +1 -1
  50. package/fesm2022/taiga-ui-core-components-data-list.mjs +110 -279
  51. package/fesm2022/taiga-ui-core-components-data-list.mjs.map +1 -1
  52. package/fesm2022/taiga-ui-core-components-error.mjs +11 -10
  53. package/fesm2022/taiga-ui-core-components-error.mjs.map +1 -1
  54. package/fesm2022/taiga-ui-core-components-expand.mjs +3 -3
  55. package/fesm2022/taiga-ui-core-components-icon.mjs +9 -10
  56. package/fesm2022/taiga-ui-core-components-icon.mjs.map +1 -1
  57. package/fesm2022/taiga-ui-core-components-input.mjs +103 -0
  58. package/fesm2022/taiga-ui-core-components-input.mjs.map +1 -0
  59. package/fesm2022/taiga-ui-core-components-label.mjs +6 -6
  60. package/fesm2022/taiga-ui-core-components-link.mjs +11 -15
  61. package/fesm2022/taiga-ui-core-components-link.mjs.map +1 -1
  62. package/fesm2022/taiga-ui-core-components-loader.mjs +6 -11
  63. package/fesm2022/taiga-ui-core-components-loader.mjs.map +1 -1
  64. package/fesm2022/taiga-ui-core-components-notification.mjs +95 -23
  65. package/fesm2022/taiga-ui-core-components-notification.mjs.map +1 -1
  66. package/fesm2022/taiga-ui-core-components-root.mjs +8 -10
  67. package/fesm2022/taiga-ui-core-components-root.mjs.map +1 -1
  68. package/fesm2022/taiga-ui-core-components-scrollbar.mjs +54 -63
  69. package/fesm2022/taiga-ui-core-components-scrollbar.mjs.map +1 -1
  70. package/fesm2022/taiga-ui-core-components-spin-button.mjs +3 -3
  71. package/fesm2022/taiga-ui-core-components-textfield.mjs +101 -263
  72. package/fesm2022/taiga-ui-core-components-textfield.mjs.map +1 -1
  73. package/fesm2022/{taiga-ui-core-directives-title.mjs → taiga-ui-core-components-title.mjs} +7 -7
  74. package/fesm2022/{taiga-ui-core-directives-title.mjs.map → taiga-ui-core-components-title.mjs.map} +1 -1
  75. package/fesm2022/taiga-ui-core-components.mjs +2 -4
  76. package/fesm2022/taiga-ui-core-components.mjs.map +1 -1
  77. package/fesm2022/taiga-ui-core-directives-appearance.mjs +15 -15
  78. package/fesm2022/taiga-ui-core-directives-appearance.mjs.map +1 -1
  79. package/fesm2022/taiga-ui-core-directives-date-format.mjs +26 -20
  80. package/fesm2022/taiga-ui-core-directives-date-format.mjs.map +1 -1
  81. package/fesm2022/taiga-ui-core-directives-group.mjs +22 -34
  82. package/fesm2022/taiga-ui-core-directives-group.mjs.map +1 -1
  83. package/fesm2022/taiga-ui-core-directives-icons.mjs +11 -11
  84. package/fesm2022/taiga-ui-core-directives-icons.mjs.map +1 -1
  85. package/fesm2022/taiga-ui-core-directives-items-handlers.mjs +10 -13
  86. package/fesm2022/taiga-ui-core-directives-items-handlers.mjs.map +1 -1
  87. package/fesm2022/taiga-ui-core-directives-number-format.mjs +32 -20
  88. package/fesm2022/taiga-ui-core-directives-number-format.mjs.map +1 -1
  89. package/fesm2022/taiga-ui-core-directives.mjs +0 -5
  90. package/fesm2022/taiga-ui-core-directives.mjs.map +1 -1
  91. package/fesm2022/taiga-ui-core-pipes-format-number.mjs +21 -15
  92. package/fesm2022/taiga-ui-core-pipes-format-number.mjs.map +1 -1
  93. package/fesm2022/taiga-ui-core-pipes.mjs +0 -7
  94. package/fesm2022/taiga-ui-core-pipes.mjs.map +1 -1
  95. package/fesm2022/taiga-ui-core-portals-alert.mjs +73 -0
  96. package/fesm2022/taiga-ui-core-portals-alert.mjs.map +1 -0
  97. package/fesm2022/taiga-ui-core-portals-dialog.mjs +158 -0
  98. package/fesm2022/taiga-ui-core-portals-dialog.mjs.map +1 -0
  99. package/fesm2022/{taiga-ui-core-directives-dropdown.mjs → taiga-ui-core-portals-dropdown.mjs} +153 -268
  100. package/fesm2022/taiga-ui-core-portals-dropdown.mjs.map +1 -0
  101. package/fesm2022/{taiga-ui-core-directives-hint.mjs → taiga-ui-core-portals-hint.mjs} +48 -50
  102. package/fesm2022/taiga-ui-core-portals-hint.mjs.map +1 -0
  103. package/fesm2022/taiga-ui-core-portals-modal.mjs +89 -0
  104. package/fesm2022/taiga-ui-core-portals-modal.mjs.map +1 -0
  105. package/fesm2022/{taiga-ui-core-directives-popup.mjs → taiga-ui-core-portals-popup.mjs} +11 -11
  106. package/fesm2022/taiga-ui-core-portals-popup.mjs.map +1 -0
  107. package/fesm2022/taiga-ui-core-portals.mjs +11 -0
  108. package/fesm2022/taiga-ui-core-portals.mjs.map +1 -0
  109. package/fesm2022/taiga-ui-core-services.mjs +15 -35
  110. package/fesm2022/taiga-ui-core-services.mjs.map +1 -1
  111. package/fesm2022/taiga-ui-core-tokens.mjs +22 -21
  112. package/fesm2022/taiga-ui-core-tokens.mjs.map +1 -1
  113. package/fesm2022/taiga-ui-core-utils-format.mjs +1 -22
  114. package/fesm2022/taiga-ui-core-utils-format.mjs.map +1 -1
  115. package/fesm2022/taiga-ui-core-utils-miscellaneous.mjs +7 -16
  116. package/fesm2022/taiga-ui-core-utils-miscellaneous.mjs.map +1 -1
  117. package/fesm2022/taiga-ui-core.mjs +1 -0
  118. package/fesm2022/taiga-ui-core.mjs.map +1 -1
  119. package/index.d.ts +1 -0
  120. package/package.json +51 -76
  121. package/pipes/format-number/format-number.pipe.d.ts +6 -4
  122. package/pipes/index.d.ts +0 -7
  123. package/{directives/notification/notification.directive.d.ts → portals/alert/alert.directive.d.ts} +3 -3
  124. package/{directives/notification/notification.service.d.ts → portals/alert/alert.service.d.ts} +3 -3
  125. package/portals/alert/index.d.ts +2 -0
  126. package/{components → portals}/dialog/dialog.component.d.ts +2 -3
  127. package/{components → portals}/dialog/dialog.options.d.ts +2 -3
  128. package/{components → portals}/dialog/dialog.providers.d.ts +1 -2
  129. package/{components → portals}/dialog/dialog.service.d.ts +1 -1
  130. package/{components → portals}/dialog/index.d.ts +0 -1
  131. package/{directives → portals}/dropdown/dropdown-hover.directive.d.ts +5 -10
  132. package/{directives → portals}/dropdown/dropdown-hover.options.d.ts +1 -3
  133. package/{directives → portals}/dropdown/dropdown-manual.directive.d.ts +2 -2
  134. package/portals/dropdown/dropdown-open.directive.d.ts +30 -0
  135. package/{directives → portals}/dropdown/dropdown-position-sided.directive.d.ts +3 -3
  136. package/{directives → portals}/dropdown/dropdown-position.directive.d.ts +5 -5
  137. package/{directives → portals}/dropdown/dropdown-selection.directive.d.ts +4 -5
  138. package/{directives → portals}/dropdown/dropdown.bindings.d.ts +0 -1
  139. package/{directives → portals}/dropdown/dropdown.d.ts +1 -2
  140. package/{directives → portals}/dropdown/dropdown.directive.d.ts +5 -6
  141. package/{directives → portals}/dropdown/index.d.ts +0 -1
  142. package/portals/index.d.ts +6 -0
  143. package/{components → portals}/modal/modal.component.d.ts +3 -3
  144. package/{components → portals}/modal/modal.service.d.ts +3 -3
  145. package/services/index.d.ts +0 -1
  146. package/styles/components/link.less +1 -0
  147. package/styles/components/textfield.less +10 -7
  148. package/styles/mixins/appearance.less +1 -1
  149. package/styles/mixins/mixins.less +0 -5
  150. package/styles/mixins/mixins.scss +0 -5
  151. package/styles/mixins/slider.scss +1 -2
  152. package/styles/theme/variables.less +2 -4
  153. package/tokens/common-icons.d.ts +1 -3
  154. package/tokens/date-format.d.ts +2 -3
  155. package/tokens/icons.d.ts +0 -4
  156. package/tokens/number-format.d.ts +2 -3
  157. package/types/index.d.ts +0 -2
  158. package/types/size.d.ts +0 -11
  159. package/utils/format/index.d.ts +0 -1
  160. package/utils/miscellaneous/get-duration.d.ts +2 -0
  161. package/utils/miscellaneous/index.d.ts +1 -1
  162. package/components/alert/alert.component.d.ts +0 -14
  163. package/components/alert/alert.directive.d.ts +0 -8
  164. package/components/alert/alert.interfaces.d.ts +0 -13
  165. package/components/alert/alert.service.d.ts +0 -11
  166. package/components/alert/alert.tokens.d.ts +0 -6
  167. package/components/alert/index.d.ts +0 -5
  168. package/components/data-list/data-list.directive.d.ts +0 -7
  169. package/components/data-list/option/option-content.d.ts +0 -16
  170. package/components/data-list/option/option-legacy.component.d.ts +0 -24
  171. package/components/data-list/option/option.directive.d.ts +0 -27
  172. package/components/dialog/active-zone-adapter.directive.d.ts +0 -11
  173. package/components/dialog/dialogs.component.d.ts +0 -8
  174. package/components/header/header.directive.d.ts +0 -17
  175. package/components/header/index.d.ts +0 -1
  176. package/components/textfield/textfield.directive.d.ts +0 -35
  177. package/directives/dropdown/dropdown-open-legacy.directive.d.ts +0 -12
  178. package/directives/dropdown/dropdown-open.directive.d.ts +0 -33
  179. package/directives/notification/index.d.ts +0 -2
  180. package/fesm2022/taiga-ui-core-components-alert.mjs +0 -110
  181. package/fesm2022/taiga-ui-core-components-alert.mjs.map +0 -1
  182. package/fesm2022/taiga-ui-core-components-dialog.mjs +0 -227
  183. package/fesm2022/taiga-ui-core-components-dialog.mjs.map +0 -1
  184. package/fesm2022/taiga-ui-core-components-header.mjs +0 -42
  185. package/fesm2022/taiga-ui-core-components-header.mjs.map +0 -1
  186. package/fesm2022/taiga-ui-core-components-modal.mjs +0 -89
  187. package/fesm2022/taiga-ui-core-components-modal.mjs.map +0 -1
  188. package/fesm2022/taiga-ui-core-directives-dropdown.mjs.map +0 -1
  189. package/fesm2022/taiga-ui-core-directives-hint.mjs.map +0 -1
  190. package/fesm2022/taiga-ui-core-directives-notification.mjs +0 -73
  191. package/fesm2022/taiga-ui-core-directives-notification.mjs.map +0 -1
  192. package/fesm2022/taiga-ui-core-directives-popup.mjs.map +0 -1
  193. package/fesm2022/taiga-ui-core-pipes-auto-color.mjs +0 -25
  194. package/fesm2022/taiga-ui-core-pipes-auto-color.mjs.map +0 -1
  195. package/fesm2022/taiga-ui-core-pipes-calendar-sheet.mjs +0 -94
  196. package/fesm2022/taiga-ui-core-pipes-calendar-sheet.mjs.map +0 -1
  197. package/fesm2022/taiga-ui-core-pipes-flag.mjs +0 -32
  198. package/fesm2022/taiga-ui-core-pipes-flag.mjs.map +0 -1
  199. package/fesm2022/taiga-ui-core-pipes-format-date.mjs +0 -28
  200. package/fesm2022/taiga-ui-core-pipes-format-date.mjs.map +0 -1
  201. package/fesm2022/taiga-ui-core-pipes-initials.mjs +0 -29
  202. package/fesm2022/taiga-ui-core-pipes-initials.mjs.map +0 -1
  203. package/fesm2022/taiga-ui-core-pipes-month.mjs +0 -30
  204. package/fesm2022/taiga-ui-core-pipes-month.mjs.map +0 -1
  205. package/fesm2022/taiga-ui-core-pipes-order-week-days.mjs +0 -36
  206. package/fesm2022/taiga-ui-core-pipes-order-week-days.mjs.map +0 -1
  207. package/pipes/auto-color/auto-color.pipe.d.ts +0 -7
  208. package/pipes/auto-color/index.d.ts +0 -1
  209. package/pipes/calendar-sheet/index.d.ts +0 -1
  210. package/pipes/calendar-sheet/utils.d.ts +0 -20
  211. package/pipes/flag/flag.pipe.d.ts +0 -14
  212. package/pipes/flag/index.d.ts +0 -1
  213. package/pipes/format-date/format-date.pipe.d.ts +0 -9
  214. package/pipes/format-date/index.d.ts +0 -1
  215. package/pipes/initials/index.d.ts +0 -1
  216. package/pipes/initials/initials.pipe.d.ts +0 -7
  217. package/pipes/month/index.d.ts +0 -1
  218. package/pipes/month/month.pipe.d.ts +0 -10
  219. package/pipes/order-week-days/index.d.ts +0 -1
  220. package/services/format-date.service.d.ts +0 -8
  221. package/types/range-state.d.ts +0 -4
  222. package/types/value-content-context.d.ts +0 -4
  223. package/utils/format/string-hash-to-hsl.d.ts +0 -6
  224. package/utils/miscellaneous/to-animation-options.d.ts +0 -4
  225. /package/{pipes/order-week-days → components/calendar}/order-week-days.pipe.d.ts +0 -0
  226. /package/{directives → components}/title/index.d.ts +0 -0
  227. /package/{directives → components}/title/title.directive.d.ts +0 -0
  228. /package/{components → portals}/dialog/dialog.directive.d.ts +0 -0
  229. /package/{components → portals}/dialog/dialog.factory.d.ts +0 -0
  230. /package/{directives → portals}/dropdown/dropdown-content.directive.d.ts +0 -0
  231. /package/{directives → portals}/dropdown/dropdown-context.directive.d.ts +0 -0
  232. /package/{directives → portals}/dropdown/dropdown-limit-width.d.ts +0 -0
  233. /package/{directives → portals}/dropdown/dropdown-options.directive.d.ts +0 -0
  234. /package/{directives → portals}/dropdown/dropdown.component.d.ts +0 -0
  235. /package/{directives → portals}/dropdown/dropdown.driver.d.ts +0 -0
  236. /package/{directives → portals}/dropdown/dropdown.providers.d.ts +0 -0
  237. /package/{directives → portals}/dropdown/with-dropdown-open.directive.d.ts +0 -0
  238. /package/{directives → portals}/hint/hint-describe.directive.d.ts +0 -0
  239. /package/{directives → portals}/hint/hint-driver.directive.d.ts +0 -0
  240. /package/{directives → portals}/hint/hint-host.directive.d.ts +0 -0
  241. /package/{directives → portals}/hint/hint-hover.directive.d.ts +0 -0
  242. /package/{directives → portals}/hint/hint-manual.directive.d.ts +0 -0
  243. /package/{directives → portals}/hint/hint-options.directive.d.ts +0 -0
  244. /package/{directives → portals}/hint/hint-overflow.directive.d.ts +0 -0
  245. /package/{directives → portals}/hint/hint-pointer.directive.d.ts +0 -0
  246. /package/{directives → portals}/hint/hint-position.directive.d.ts +0 -0
  247. /package/{directives → portals}/hint/hint-unstyled.component.d.ts +0 -0
  248. /package/{directives → portals}/hint/hint.component.d.ts +0 -0
  249. /package/{directives → portals}/hint/hint.d.ts +0 -0
  250. /package/{directives → portals}/hint/hint.directive.d.ts +0 -0
  251. /package/{directives → portals}/hint/hint.providers.d.ts +0 -0
  252. /package/{directives → portals}/hint/index.d.ts +0 -0
  253. /package/{components → portals}/modal/index.d.ts +0 -0
  254. /package/{directives → portals}/popup/index.d.ts +0 -0
  255. /package/{directives → portals}/popup/popup.directive.d.ts +0 -0
  256. /package/{directives → portals}/popup/popup.service.d.ts +0 -0
  257. /package/{directives → portals}/popup/popups.component.d.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Directive, InjectionToken, Optional, Self, SkipSelf, inject, Input, EventEmitter, Output, ChangeDetectorRef, INJECTOR, signal, TemplateRef, computed, ChangeDetectionStrategy, Component, PLATFORM_ID, ElementRef, ContentChild, ViewContainerRef } from '@angular/core';
3
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
2
+ import { Injectable, Directive, InjectionToken, Optional, Self, SkipSelf, inject, Input, ChangeDetectorRef, effect, signal, INJECTOR, input, computed, TemplateRef, forwardRef, ChangeDetectionStrategy, Component, PLATFORM_ID, contentChild, ElementRef, model, ViewContainerRef } from '@angular/core';
3
+ import { outputFromObservable, 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';
6
6
  import { TuiActiveZone } from '@taiga-ui/cdk/directives/active-zone';
@@ -8,24 +8,25 @@ import * as i2 from '@taiga-ui/cdk/directives/animated';
8
8
  import { TuiAnimated } from '@taiga-ui/cdk/directives/animated';
9
9
  import { tuiInjectElement, tuiGetActualTarget, tuiPointToClientRect, tuiIsElement, tuiIsHTMLElement, tuiIsElementEditable, tuiIsTextNode, tuiIsTextfield } from '@taiga-ui/cdk/utils/dom';
10
10
  import { tuiClamp } from '@taiga-ui/cdk/utils/math';
11
- import { tuiProvide, tuiPure, tuiPx, tuiProvideOptions, tuiIsString, tuiDirectiveBinding } from '@taiga-ui/cdk/utils/miscellaneous';
12
- import { TuiDriverDirective, TuiPositionAccessor, tuiFallbackAccessor, TuiRectAccessor, tuiAsRectAccessor, tuiAsVehicle, tuiPositionAccessorFor, tuiRectAccessorFor, tuiAsDriver, TuiDriver, tuiAsPositionAccessor } from '@taiga-ui/core/classes';
11
+ import { tuiPx, tuiSetSignal, tuiIsString } from '@taiga-ui/cdk/utils/miscellaneous';
12
+ import { TuiDriverDirective, TuiPositionAccessor, tuiFallbackAccessor, TuiRectAccessor, tuiAsVehicle, tuiPositionAccessorFor, tuiRectAccessorFor, tuiAsDriver, tuiAsRectAccessor, TuiDriver, tuiAsPositionAccessor } from '@taiga-ui/core/classes';
13
13
  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, tap, share, combineLatest } from 'rxjs';
17
+ import { BehaviorSubject, Subject, distinctUntilChanged, throttleTime, takeWhile, map, merge, filter, fromEvent, switchMap, delay, startWith, takeUntil, of, tap, share, combineLatest } from 'rxjs';
18
18
  import { coerceArray } from '@angular/cdk/coercion';
19
19
  import { tuiZonefreeScheduler, tuiTypedFromEvent, tuiZonefree, tuiIfMap, tuiCloseWatcher, tuiZonefull, tuiWatch, tuiZoneOptimized } from '@taiga-ui/cdk/observables';
20
- import { TuiPopupService } from '@taiga-ui/core/directives/popup';
20
+ import { TuiPopupService } from '@taiga-ui/core/portals/popup';
21
21
  import { tuiOverrideOptions, tuiCheckFixedPosition, tuiGetWordRange } from '@taiga-ui/core/utils';
22
- import { __decorate } from 'tslib';
22
+ import { tuiProvide, tuiCreateOptions, tuiDirectiveBinding } from '@taiga-ui/cdk/utils/di';
23
23
  import { isPlatformBrowser, DOCUMENT } from '@angular/common';
24
- import { TUI_IS_TOUCH, TUI_RANGE } from '@taiga-ui/cdk/tokens';
24
+ import { __decorate } from 'tslib';
25
+ import { TUI_IS_TOUCH } from '@taiga-ui/cdk/tokens';
25
26
  import { shouldCall } from '@taiga-ui/event-plugins';
26
27
  import * as i1$1 from '@taiga-ui/cdk/directives/obscured';
27
28
  import { TuiObscured } from '@taiga-ui/cdk/directives/obscured';
28
- import { tuiIsKeyboardFocusable, tuiGetClosestFocusable, tuiIsFocusedIn, tuiGetFocused } from '@taiga-ui/cdk/utils/focus';
29
+ import { tuiIsFocusable, tuiGetClosestFocusable, tuiIsFocusedIn, tuiGetFocused } from '@taiga-ui/cdk/utils/focus';
29
30
  import { tuiIsEditingKey, tuiOverrideOptions as tuiOverrideOptions$1 } from '@taiga-ui/core/utils/miscellaneous';
30
31
 
31
32
  class TuiDropdownDriver extends BehaviorSubject {
@@ -33,10 +34,10 @@ class TuiDropdownDriver extends BehaviorSubject {
33
34
  super(false);
34
35
  this.type = 'dropdown';
35
36
  }
36
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
37
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDriver }); }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
38
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDriver }); }
38
39
  }
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDriver, decorators: [{
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDriver, decorators: [{
40
41
  type: Injectable
41
42
  }], ctorParameters: () => [] });
42
43
  class TuiDropdownDriverDirective extends TuiDriverDirective {
@@ -44,14 +45,11 @@ class TuiDropdownDriverDirective extends TuiDriverDirective {
44
45
  super(...arguments);
45
46
  this.type = 'dropdown';
46
47
  }
47
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDriverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
48
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownDriverDirective, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDriverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
49
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownDriverDirective, isStandalone: true, usesInheritance: true, ngImport: i0 }); }
49
50
  }
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDriverDirective, decorators: [{
51
- type: Directive,
52
- args: [{
53
- standalone: true,
54
- }]
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDriverDirective, decorators: [{
52
+ type: Directive
55
53
  }] });
56
54
 
57
55
  /**
@@ -97,13 +95,12 @@ class TuiDropdownOptionsDirective {
97
95
  this.maxHeight = this.options.maxHeight;
98
96
  this.offset = this.options.offset;
99
97
  }
100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOptionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
101
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownOptionsDirective, isStandalone: true, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: { align: ["tuiDropdownAlign", "align"], appearance: ["tuiDropdownAppearance", "appearance"], direction: ["tuiDropdownDirection", "direction"], limitWidth: ["tuiDropdownLimitWidth", "limitWidth"], minHeight: ["tuiDropdownMinHeight", "minHeight"], maxHeight: ["tuiDropdownMaxHeight", "maxHeight"], offset: ["tuiDropdownOffset", "offset"] }, providers: [tuiProvide(TUI_DROPDOWN_OPTIONS, TuiDropdownOptionsDirective)], ngImport: i0 }); }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownOptionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
99
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownOptionsDirective, isStandalone: true, selector: "[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]", inputs: { align: ["tuiDropdownAlign", "align"], appearance: ["tuiDropdownAppearance", "appearance"], direction: ["tuiDropdownDirection", "direction"], limitWidth: ["tuiDropdownLimitWidth", "limitWidth"], minHeight: ["tuiDropdownMinHeight", "minHeight"], maxHeight: ["tuiDropdownMaxHeight", "maxHeight"], offset: ["tuiDropdownOffset", "offset"] }, providers: [tuiProvide(TUI_DROPDOWN_OPTIONS, TuiDropdownOptionsDirective)], ngImport: i0 }); }
102
100
  }
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOptionsDirective, decorators: [{
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownOptionsDirective, decorators: [{
104
102
  type: Directive,
105
103
  args: [{
106
- standalone: true,
107
104
  selector: '[tuiDropdownAlign], [tuiDropdownAppearance], [tuiDropdownDirection], [tuiDropdownLimitWidth], [tuiDropdownMinHeight], [tuiDropdownMaxHeight], [tuiDropdownOffset]',
108
105
  providers: [tuiProvide(TUI_DROPDOWN_OPTIONS, TuiDropdownOptionsDirective)],
109
106
  }]
@@ -136,18 +133,16 @@ class TuiDropdownPosition extends TuiPositionAccessor {
136
133
  this.el = tuiInjectElement();
137
134
  this.options = inject(TUI_DROPDOWN_OPTIONS);
138
135
  this.viewport = inject(TUI_VIEWPORT);
139
- this.directionChange = new EventEmitter();
136
+ this.direction = new Subject();
140
137
  this.type = 'dropdown';
141
- this.accessor = tuiFallbackAccessor('dropdown')(inject(TuiRectAccessor), inject(TuiDropdownDirective, { optional: true }));
142
- }
143
- emitDirection(direction) {
144
- this.directionChange.emit(direction);
138
+ this.accessor = tuiFallbackAccessor('dropdown')(inject(TuiRectAccessor, { optional: true }), { getClientRect: () => this.el.getBoundingClientRect() });
139
+ this.tuiDropdownDirectionChange = outputFromObservable(this.direction.pipe(distinctUntilChanged()));
145
140
  }
146
141
  getPosition({ width, height }) {
147
142
  if (!width && !height) {
148
143
  this.previous = undefined;
149
144
  }
150
- const hostRect = this.accessor?.getClientRect() ?? EMPTY_CLIENT_RECT;
145
+ const hostRect = this.accessor.getClientRect();
151
146
  const viewportRect = this.viewport.getClientRect();
152
147
  const { minHeight, direction, offset, limitWidth } = this.options;
153
148
  const align = this.getAlign(this.options.align);
@@ -177,11 +172,11 @@ class TuiDropdownPosition extends TuiPositionAccessor {
177
172
  const better = available.top > available.bottom ? 'top' : 'bottom';
178
173
  if ((available[previous] > minHeight && direction) ||
179
174
  available[previous] > height) {
180
- this.emitDirection(previous);
175
+ this.direction.next(previous);
181
176
  return [position[previous], position[align]];
182
177
  }
183
178
  this.previous = better;
184
- this.emitDirection(better);
179
+ this.direction.next(better);
185
180
  return [position[better], position[align]];
186
181
  }
187
182
  getAlign(align) {
@@ -191,28 +186,18 @@ class TuiDropdownPosition extends TuiPositionAccessor {
191
186
  }
192
187
  return rtl && align === 'right' ? 'left' : align;
193
188
  }
194
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownPosition, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
195
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownPosition, isStandalone: true, outputs: { directionChange: "tuiDropdownDirectionChange" }, usesInheritance: true, ngImport: i0 }); }
189
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownPosition, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
190
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownPosition, isStandalone: true, outputs: { tuiDropdownDirectionChange: "tuiDropdownDirectionChange" }, usesInheritance: true, ngImport: i0 }); }
196
191
  }
197
- __decorate([
198
- tuiPure
199
- ], TuiDropdownPosition.prototype, "emitDirection", null);
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownPosition, decorators: [{
201
- type: Directive,
202
- args: [{
203
- standalone: true,
204
- }]
205
- }], propDecorators: { directionChange: [{
206
- type: Output,
207
- args: ['tuiDropdownDirectionChange']
208
- }], emitDirection: [] } });
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownPosition, decorators: [{
193
+ type: Directive
194
+ }] });
209
195
 
210
196
  class TuiDropdownDirective {
211
197
  constructor() {
212
198
  this.refresh$ = new Subject();
213
199
  this.service = inject(TuiPopupService);
214
200
  this.cdr = inject(ChangeDetectorRef);
215
- // TODO: think of a better solution later
216
201
  this.drivers = coerceArray(inject(TuiDropdownDriver, { self: true, optional: true }));
217
202
  this.sub = this.refresh$
218
203
  .pipe(throttleTime(0, tuiZonefreeScheduler()), takeUntilDestroyed())
@@ -220,33 +205,25 @@ class TuiDropdownDirective {
220
205
  this.ref()?.changeDetectorRef.detectChanges();
221
206
  this.ref()?.changeDetectorRef.markForCheck();
222
207
  });
208
+ this.autoClose = effect(() => {
209
+ if (!this.content()) {
210
+ this.toggle(false);
211
+ }
212
+ });
213
+ this.ref = signal(null);
223
214
  this.el = tuiInjectElement();
224
215
  this.type = 'dropdown';
225
216
  this.component = new PolymorpheusComponent(inject(TUI_DROPDOWN_COMPONENT), inject(INJECTOR));
226
- this.ref = signal(null);
227
- // TODO(v5): rename to `content`
228
- // eslint-disable-next-line @typescript-eslint/naming-convention
229
- this._content = signal(null);
230
- }
231
- set tuiDropdown(content) {
232
- this._content.set(content instanceof TemplateRef
233
- ? new PolymorpheusTemplate(content, this.cdr)
234
- : content);
235
- if (!this._content()) {
236
- this.toggle(false);
237
- }
217
+ this.tuiDropdown = input();
218
+ this.content = computed((content = this.tuiDropdown()) => {
219
+ return content instanceof TemplateRef
220
+ ? new PolymorpheusTemplate(content, this.cdr)
221
+ : content;
222
+ });
238
223
  }
239
224
  get position() {
240
225
  return tuiCheckFixedPosition(this.el) ? 'fixed' : 'absolute';
241
226
  }
242
- // TODO(v5): delete
243
- get content() {
244
- return this._content();
245
- }
246
- // TODO(v5): delete
247
- set content(x) {
248
- this._content.set(x);
249
- }
250
227
  ngAfterViewChecked() {
251
228
  this.refresh$.next();
252
229
  }
@@ -258,32 +235,25 @@ class TuiDropdownDirective {
258
235
  }
259
236
  toggle(show) {
260
237
  const ref = this.ref();
261
- if (show && this._content() && !ref) {
238
+ if (show && this.content() && !ref) {
262
239
  this.ref.set(this.service.add(this.component));
263
240
  }
264
241
  else if (!show && ref) {
265
242
  this.ref.set(null);
266
243
  ref.destroy();
267
244
  }
268
- this.drivers.forEach((driver) => driver?.next(show));
269
245
  // TODO: Remove in v5, only needed in Angular 16
270
246
  this.cdr.markForCheck();
247
+ this.drivers.forEach((driver) => driver?.next(show));
271
248
  }
272
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
273
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownDirective, isStandalone: true, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: { tuiDropdown: "tuiDropdown" }, host: { properties: { "class.tui-dropdown-open": "ref()" } }, providers: [
274
- tuiAsRectAccessor(TuiDropdownDirective),
275
- tuiAsVehicle(TuiDropdownDirective),
276
- ], exportAs: ["tuiDropdown"], hostDirectives: [{ directive: TuiDropdownDriverDirective }, { directive: TuiDropdownPosition, outputs: ["tuiDropdownDirectionChange", "tuiDropdownDirectionChange"] }], ngImport: i0 }); }
249
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
250
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.16", type: TuiDropdownDirective, isStandalone: true, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: { tuiDropdown: { classPropertyName: "tuiDropdown", publicName: "tuiDropdown", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.tui-dropdown-open": "ref()" } }, providers: [tuiAsVehicle(TuiDropdownDirective)], exportAs: ["tuiDropdown"], hostDirectives: [{ directive: TuiDropdownDriverDirective }, { directive: TuiDropdownPosition, outputs: ["tuiDropdownDirectionChange", "tuiDropdownDirectionChange"] }], ngImport: i0 }); }
277
251
  }
278
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownDirective, decorators: [{
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownDirective, decorators: [{
279
253
  type: Directive,
280
254
  args: [{
281
- standalone: true,
282
255
  selector: '[tuiDropdown]:not(ng-container):not(ng-template)',
283
- providers: [
284
- tuiAsRectAccessor(TuiDropdownDirective),
285
- tuiAsVehicle(TuiDropdownDirective),
286
- ],
256
+ providers: [tuiAsVehicle(TuiDropdownDirective)],
287
257
  exportAs: 'tuiDropdown',
288
258
  hostDirectives: [
289
259
  TuiDropdownDriverDirective,
@@ -296,9 +266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
296
266
  '[class.tui-dropdown-open]': 'ref()',
297
267
  },
298
268
  }]
299
- }], propDecorators: { tuiDropdown: [{
300
- type: Input
301
- }] } });
269
+ }] });
302
270
 
303
271
  /**
304
272
  * @description:
@@ -351,44 +319,43 @@ class TuiDropdownComponent {
351
319
  maxWidth: tuiPx(Math.round(viewport.width) - 16), // 8px min gap from each side
352
320
  };
353
321
  }
354
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
355
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownComponent, isStandalone: true, selector: "tui-dropdown", host: { properties: { "attr.data-appearance": "options.appearance", "attr.tuiTheme": "theme()" } }, providers: [
322
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
323
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownComponent, isStandalone: true, selector: "tui-dropdown", host: { properties: { "attr.data-appearance": "options.appearance", "attr.tuiTheme": "theme()" } }, providers: [
356
324
  TuiPositionService,
357
325
  tuiPositionAccessorFor('dropdown', TuiDropdownPosition),
358
- tuiRectAccessorFor('dropdown', TuiDropdownDirective),
359
- ], 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: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 }); }
326
+ tuiRectAccessorFor('dropdown', forwardRef(() => TuiDropdownDirective)),
327
+ ], 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: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 }); }
360
328
  }
361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownComponent, decorators: [{
329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownComponent, decorators: [{
362
330
  type: Component,
363
331
  args: [{ selector: 'tui-dropdown', imports: [PolymorpheusOutlet, TuiScrollbar], changeDetection: ChangeDetectionStrategy.Default, providers: [
364
332
  TuiPositionService,
365
333
  tuiPositionAccessorFor('dropdown', TuiDropdownPosition),
366
- tuiRectAccessorFor('dropdown', TuiDropdownDirective),
334
+ tuiRectAccessorFor('dropdown', forwardRef(() => TuiDropdownDirective)),
367
335
  ], hostDirectives: [TuiActiveZone, TuiAnimated], host: {
368
336
  '[attr.data-appearance]': 'options.appearance',
369
337
  '[attr.tuiTheme]': 'theme()',
370
- }, 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:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"] }]
338
+ }, 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:max-content;overscroll-behavior:none}.t-primitive{padding:1rem}\n"] }]
371
339
  }] });
372
340
 
373
341
  class TuiDropdownContent {
374
342
  constructor() {
375
343
  this.directive = inject(TuiDropdownDirective);
376
- this.directive.tuiDropdown = inject(TemplateRef);
344
+ tuiSetSignal(this.directive.tuiDropdown, inject(TemplateRef));
377
345
  if (isPlatformBrowser(inject(PLATFORM_ID)) &&
378
346
  this.directive.el.matches(':focus-within')) {
379
347
  this.directive.toggle(true);
380
348
  }
381
349
  }
382
350
  ngOnDestroy() {
383
- this.directive.tuiDropdown = null;
351
+ tuiSetSignal(this.directive.tuiDropdown, null);
384
352
  }
385
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
386
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownContent, isStandalone: true, selector: "ng-template[tuiDropdown]", ngImport: i0 }); }
353
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
354
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownContent, isStandalone: true, selector: "ng-template[tuiDropdown]", ngImport: i0 }); }
387
355
  }
388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownContent, decorators: [{
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownContent, decorators: [{
389
357
  type: Directive,
390
358
  args: [{
391
- standalone: true,
392
359
  selector: 'ng-template[tuiDropdown]',
393
360
  }]
394
361
  }], ctorParameters: () => [] });
@@ -422,8 +389,8 @@ class TuiDropdownContext extends TuiRectAccessor {
422
389
  this.currentRect = tuiPointToClientRect(x, y);
423
390
  this.driver.next(true);
424
391
  }
425
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownContext, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
426
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownContext, isStandalone: true, selector: "[tuiDropdownContext]", host: { listeners: { "document:keydown.esc": "closeDropdown()", "longtap": "onContextMenu($event.detail.clientX, $event.detail.clientY)" }, properties: { "style.user-select": "userSelect()", "style.-webkit-user-select": "userSelect()", "style.-webkit-touch-callout": "userSelect()" } }, providers: [
392
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownContext, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
393
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownContext, isStandalone: true, selector: "[tuiDropdownContext]", host: { listeners: { "document:keydown.esc": "closeDropdown()", "longtap": "onContextMenu($event.detail.clientX, $event.detail.clientY)" }, properties: { "style.user-select": "userSelect()", "style.-webkit-user-select": "userSelect()", "style.-webkit-touch-callout": "userSelect()" } }, providers: [
427
394
  TuiActiveZone,
428
395
  TuiDropdownDriver,
429
396
  tuiAsDriver(TuiDropdownDriver),
@@ -433,10 +400,9 @@ class TuiDropdownContext extends TuiRectAccessor {
433
400
  __decorate([
434
401
  shouldCall(activeZoneFilter)
435
402
  ], TuiDropdownContext.prototype, "closeDropdown", null);
436
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownContext, decorators: [{
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownContext, decorators: [{
437
404
  type: Directive,
438
405
  args: [{
439
- standalone: true,
440
406
  selector: '[tuiDropdownContext]',
441
407
  providers: [
442
408
  TuiActiveZone,
@@ -462,48 +428,40 @@ const TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS = {
462
428
  /**
463
429
  * Default parameters for dropdown hover directive
464
430
  */
465
- const TUI_DROPDOWN_HOVER_OPTIONS = new InjectionToken(ngDevMode ? 'TUI_DROPDOWN_HOVER_OPTIONS' : '', {
466
- factory: () => TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS,
467
- });
468
- function tuiDropdownHoverOptionsProvider(options) {
469
- return tuiProvideOptions(TUI_DROPDOWN_HOVER_OPTIONS, options, TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS);
470
- }
431
+ const [TUI_DROPDOWN_HOVER_OPTIONS, tuiDropdownHoverOptionsProvider] = tuiCreateOptions(TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS);
471
432
 
472
433
  function shouldClose(event) {
473
434
  return (
474
435
  // @ts-ignore
475
436
  typeof CloseWatcher === 'undefined' &&
476
- // ?. for auto fill events
437
+ // ?. for autofill events
477
438
  event.key?.toLowerCase() === 'escape' &&
478
- this.tuiDropdownEnabled &&
479
- !!this.tuiDropdownOpen &&
439
+ this.enabled() &&
440
+ this.open() &&
480
441
  !this['dropdown']()?.nextElementSibling);
481
442
  }
482
443
  class TuiDropdownOpen {
483
444
  constructor() {
445
+ this.dropdownHost = contentChild('tuiDropdownHost', {
446
+ descendants: true,
447
+ read: ElementRef,
448
+ });
484
449
  this.directive = inject(TuiDropdownDirective);
485
450
  this.el = tuiInjectElement();
486
451
  this.obscured = inject(TuiObscured);
487
452
  this.activeZone = inject(TuiActiveZone);
488
- this.dropdown = computed(() => this.directive.ref()?.location.nativeElement);
489
- this.tuiDropdownEnabled = true;
490
- this.tuiDropdownOpen = false;
491
- this.tuiDropdownOpenChange = new EventEmitter();
492
- // TODO: make it private when all legacy controls will be deleted from @taiga-ui/legacy (5.0)
493
453
  this.driver = inject(TuiDropdownDriver);
494
- this.sub = this.driver
495
- .pipe(tuiIfMap(() => merge(tuiCloseWatcher(), this.obscured.tuiObscured.pipe(filter(Boolean)), this.activeZone.tuiActiveZoneChange.pipe(filter((a) => !a)), fromEvent(this.el, 'focusin').pipe(filter((event) => !this.host.contains(tuiGetActualTarget(event)) ||
454
+ this.dropdown = computed(() => this.directive.ref()?.location.nativeElement);
455
+ this.enabled = input(true, { alias: 'tuiDropdownEnabled' });
456
+ this.open = model(false, { alias: 'tuiDropdownOpen' });
457
+ this.driveEffect = effect(() => this.drive(this.open()));
458
+ this.syncSub = this.driver
459
+ .pipe(filter((open) => open !== this.open()), takeUntilDestroyed())
460
+ .subscribe((open) => this.update(open));
461
+ this.closeSub = this.driver
462
+ .pipe(tuiIfMap(() => merge(tuiCloseWatcher(), this.obscured.tuiObscured$.pipe(filter(Boolean)), this.activeZone.tuiActiveZoneChange.pipe(filter((a) => !a)), fromEvent(this.el, 'focusin').pipe(filter((event) => !this.host.contains(tuiGetActualTarget(event)) ||
496
463
  !this.directive.ref())))), tuiZonefull(), tuiWatch(), takeUntilDestroyed())
497
464
  .subscribe(() => this.toggle(false));
498
- this.sync = this.driver.pipe(takeUntilDestroyed()).subscribe((open) => {
499
- if (open !== this.tuiDropdownOpen) {
500
- this.update(open);
501
- }
502
- });
503
- }
504
- ngOnChanges() {
505
- this.drive(!!this.tuiDropdownOpen);
506
- this.tuiDropdownOpenChange.emit(!!this.tuiDropdownOpen);
507
465
  }
508
466
  toggle(open) {
509
467
  if (this.focused && !open) {
@@ -517,14 +475,14 @@ class TuiDropdownOpen {
517
475
  }
518
476
  onClick(target) {
519
477
  if (!this.editable && this.host.contains(target)) {
520
- this.update(!this.tuiDropdownOpen);
478
+ this.update(!this.open());
521
479
  }
522
480
  }
523
481
  onArrow(event, up) {
524
482
  if (!tuiIsElement(event.target) ||
525
483
  !this.host.contains(event.target) ||
526
- !this.tuiDropdownEnabled ||
527
- !this.directive._content()) {
484
+ !this.enabled() ||
485
+ !this.directive.content()) {
528
486
  return;
529
487
  }
530
488
  event.preventDefault();
@@ -542,11 +500,11 @@ class TuiDropdownOpen {
542
500
  }
543
501
  }
544
502
  get host() {
545
- const initial = this.dropdownHost?.nativeElement || this.el;
546
- const focusable = tuiIsKeyboardFocusable(initial)
503
+ const initial = this.dropdownHost()?.nativeElement || this.el;
504
+ const focusable = tuiIsFocusable(initial)
547
505
  ? initial
548
506
  : tuiGetClosestFocusable({ initial, root: this.el });
549
- return this.dropdownHost?.nativeElement || focusable || this.el;
507
+ return this.dropdownHost()?.nativeElement || focusable || this.el;
550
508
  }
551
509
  get editable() {
552
510
  return tuiIsElementEditable(this.host);
@@ -555,15 +513,14 @@ class TuiDropdownOpen {
555
513
  return tuiIsFocusedIn(this.host) || tuiIsFocusedIn(this.dropdown());
556
514
  }
557
515
  update(open) {
558
- if (open && !this.tuiDropdownEnabled) {
516
+ if (open && !this.enabled()) {
559
517
  return this.drive();
560
518
  }
561
- this.tuiDropdownOpen = open;
562
- this.tuiDropdownOpenChange.emit(open);
519
+ this.open.set(open);
563
520
  this.drive();
564
521
  }
565
- drive(open = !!this.tuiDropdownOpen && this.tuiDropdownEnabled) {
566
- this.obscured.tuiObscuredEnabled = open;
522
+ drive(open = this.open() && this.enabled()) {
523
+ tuiSetSignal(this.obscured.tuiObscuredEnabled, open);
567
524
  this.driver.next(open);
568
525
  }
569
526
  focusDropdown(previous) {
@@ -579,17 +536,16 @@ class TuiDropdownOpen {
579
536
  child.remove();
580
537
  focusable?.focus();
581
538
  }
582
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
583
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownOpen, isStandalone: true, selector: "[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: { tuiDropdownEnabled: "tuiDropdownEnabled", tuiDropdownOpen: "tuiDropdownOpen" }, outputs: { tuiDropdownOpenChange: "tuiDropdownOpenChange" }, host: { listeners: { "click": "onClick($event.target)", "keydown.arrowDown": "onArrow($event, false)", "keydown.arrowUp": "onArrow($event, true)", "document:keydown.zoneless.capture": "onEsc($event)", "document:keydown.zoneless": "onKeydown($event)", "tuiActiveZoneChange": "0" } }, providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)], queries: [{ propertyName: "dropdownHost", first: true, predicate: ["tuiDropdownHost"], descendants: true, read: ElementRef }], usesOnChanges: true, hostDirectives: [{ directive: i1$1.TuiObscured }, { directive: i1.TuiActiveZone, inputs: ["tuiActiveZoneParent", "tuiActiveZoneParent"], outputs: ["tuiActiveZoneChange", "tuiActiveZoneChange"] }], ngImport: i0 }); }
539
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
540
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "19.2.16", type: TuiDropdownOpen, isStandalone: true, selector: "[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: { enabled: { classPropertyName: "enabled", publicName: "tuiDropdownEnabled", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "tuiDropdownOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "tuiDropdownOpenChange" }, host: { listeners: { "click": "onClick($event.target)", "keydown.arrowDown": "onArrow($event, false)", "keydown.arrowUp": "onArrow($event, true)", "document:keydown.zoneless.capture": "onEsc($event)", "document:keydown.zoneless": "onKeydown($event)", "tuiActiveZoneChange": "0" } }, providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)], queries: [{ propertyName: "dropdownHost", first: true, predicate: ["tuiDropdownHost"], descendants: true, read: ElementRef, isSignal: true }], hostDirectives: [{ directive: i1$1.TuiObscured }, { directive: i1.TuiActiveZone, inputs: ["tuiActiveZoneParent", "tuiActiveZoneParent"], outputs: ["tuiActiveZoneChange", "tuiActiveZoneChange"] }], ngImport: i0 }); }
584
541
  }
585
542
  __decorate([
586
543
  shouldCall(shouldClose)
587
544
  ], TuiDropdownOpen.prototype, "onEsc", null);
588
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOpen, decorators: [{
545
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownOpen, decorators: [{
589
546
  type: Directive,
590
547
  args: [{
591
- standalone: true,
592
- selector: '[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]',
548
+ selector: '[tuiDropdown][tuiDropdownAuto],[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]',
593
549
  providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)],
594
550
  hostDirectives: [
595
551
  TuiObscured,
@@ -609,37 +565,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
609
565
  '(tuiActiveZoneChange)': '0',
610
566
  },
611
567
  }]
612
- }], propDecorators: { dropdownHost: [{
613
- type: ContentChild,
614
- args: ['tuiDropdownHost', { descendants: true, read: ElementRef }]
615
- }], tuiDropdownEnabled: [{
616
- type: Input
617
- }], tuiDropdownOpen: [{
618
- type: Input
619
- }], tuiDropdownOpenChange: [{
620
- type: Output
621
- }], onEsc: [] } });
568
+ }], propDecorators: { onEsc: [] } });
622
569
 
623
570
  class TuiDropdownHover extends TuiDriver {
624
571
  constructor() {
625
572
  super((subscriber) => this.stream$.subscribe(subscriber));
573
+ this.dropdownHost = contentChild('tuiDropdownHost', {
574
+ descendants: true,
575
+ read: ElementRef,
576
+ });
577
+ this.hovered = false;
626
578
  this.el = tuiInjectElement();
627
579
  this.doc = inject(DOCUMENT);
628
580
  this.options = inject(TUI_DROPDOWN_HOVER_OPTIONS);
629
581
  this.activeZone = inject(TuiActiveZone);
630
582
  this.open = inject(TuiDropdownOpen, { optional: true });
583
+ this.stream$ = merge(
631
584
  /**
632
585
  * Dropdown can be removed not only via click/touch –
633
586
  * swipe on mobile devices removes dropdown sheet without triggering new mouseover / mouseout events.
634
587
  */
635
- this.dropdownExternalRemoval$ = toObservable(inject(TuiDropdownDirective).ref).pipe(filter((x) => !x && this.hovered));
636
- 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((v) => of(v).pipe(delay(v ? this.showDelay : this.hideDelay))), tuiZoneOptimized(), tap((hovered) => {
588
+ toObservable(inject(TuiDropdownDirective).ref).pipe(filter((x) => !x && this.hovered), switchMap(() => tuiTypedFromEvent(this.doc, 'pointerdown').pipe(map(tuiGetActualTarget), delay(this.tuiDropdownHideDelay()), 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((v) => of(v).pipe(delay(v ? this.tuiDropdownShowDelay() : this.tuiDropdownHideDelay()))), tuiZoneOptimized(), tap((hovered) => {
637
589
  this.hovered = hovered;
638
590
  this.open?.toggle(hovered);
639
591
  }), share());
640
- this.showDelay = this.options.showDelay;
641
- this.hideDelay = this.options.hideDelay;
642
- this.hovered = false;
592
+ this.tuiDropdownShowDelay = input(this.options.showDelay);
593
+ this.tuiDropdownHideDelay = input(this.options.hideDelay);
643
594
  this.type = 'dropdown';
644
595
  }
645
596
  onClick(event) {
@@ -648,85 +599,43 @@ class TuiDropdownHover extends TuiDriver {
648
599
  }
649
600
  }
650
601
  isHovered(element) {
651
- const host = this.dropdownHost?.nativeElement || this.el;
602
+ const host = this.dropdownHost()?.nativeElement || this.el;
652
603
  const hovered = host.contains(element);
653
604
  const child = !this.el.contains(element) && this.activeZone.contains(element);
654
605
  return hovered || child;
655
606
  }
656
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownHover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
657
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", 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 }); }
607
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownHover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
608
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "19.2.16", type: TuiDropdownHover, isStandalone: true, selector: "[tuiDropdownHover]", inputs: { tuiDropdownShowDelay: { classPropertyName: "tuiDropdownShowDelay", publicName: "tuiDropdownShowDelay", isSignal: true, isRequired: false, transformFunction: null }, tuiDropdownHideDelay: { classPropertyName: "tuiDropdownHideDelay", publicName: "tuiDropdownHideDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click.capture": "onClick($event)" } }, providers: [TuiActiveZone, tuiAsDriver(TuiDropdownHover)], queries: [{ propertyName: "dropdownHost", first: true, predicate: ["tuiDropdownHost"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0 }); }
658
609
  }
659
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownHover, decorators: [{
610
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownHover, decorators: [{
660
611
  type: Directive,
661
612
  args: [{
662
- standalone: true,
663
613
  selector: '[tuiDropdownHover]',
664
614
  providers: [TuiActiveZone, tuiAsDriver(TuiDropdownHover)],
665
615
  host: {
666
616
  '(click.capture)': 'onClick($event)',
667
617
  },
668
618
  }]
669
- }], ctorParameters: () => [], propDecorators: { dropdownHost: [{
670
- type: ContentChild,
671
- args: ['tuiDropdownHost', { descendants: true, read: ElementRef }]
672
- }], showDelay: [{
673
- type: Input,
674
- args: ['tuiDropdownShowDelay']
675
- }], hideDelay: [{
676
- type: Input,
677
- args: ['tuiDropdownHideDelay']
678
- }] } });
619
+ }], ctorParameters: () => [] });
679
620
 
680
621
  class TuiDropdownManual {
681
622
  constructor() {
682
623
  this.driver = inject(TuiDropdownDriver);
683
- this.tuiDropdownManual = false;
624
+ this.tuiDropdownManual = input(false);
684
625
  }
685
626
  ngOnChanges() {
686
- this.driver.next(!!this.tuiDropdownManual);
627
+ this.driver.next(!!this.tuiDropdownManual());
687
628
  }
688
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownManual, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
689
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownManual, isStandalone: true, selector: "[tuiDropdownManual]", inputs: { tuiDropdownManual: "tuiDropdownManual" }, providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)], usesOnChanges: true, ngImport: i0 }); }
629
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownManual, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
630
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.16", type: TuiDropdownManual, isStandalone: true, selector: "[tuiDropdownManual]", inputs: { tuiDropdownManual: { classPropertyName: "tuiDropdownManual", publicName: "tuiDropdownManual", isSignal: true, isRequired: false, transformFunction: null } }, providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)], usesOnChanges: true, ngImport: i0 }); }
690
631
  }
691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownManual, decorators: [{
632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownManual, decorators: [{
692
633
  type: Directive,
693
634
  args: [{
694
- standalone: true,
695
635
  selector: '[tuiDropdownManual]',
696
636
  providers: [TuiDropdownDriver, tuiAsDriver(TuiDropdownDriver)],
697
637
  }]
698
- }], propDecorators: { tuiDropdownManual: [{
699
- type: Input
700
- }] } });
701
-
702
- /**
703
- * @deprecated TODO: remove in v.5 when legacy controls are dropped
704
- */
705
- class TuiDropdownOpenLegacy {
706
- constructor() {
707
- this.openStateSub = new Subject();
708
- this.tuiDropdownOpenChange = this.openStateSub.pipe(distinctUntilChanged());
709
- }
710
- set tuiDropdownOpen(open) {
711
- this.emitOpenChange(open);
712
- }
713
- emitOpenChange(open) {
714
- this.openStateSub.next(open);
715
- }
716
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOpenLegacy, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
717
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownOpenLegacy, isStandalone: true, selector: "[tuiDropdownOpen]:not([tuiDropdown]),[tuiDropdownOpenChange]:not([tuiDropdown])", inputs: { tuiDropdownOpen: "tuiDropdownOpen" }, outputs: { tuiDropdownOpenChange: "tuiDropdownOpenChange" }, ngImport: i0 }); }
718
- }
719
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownOpenLegacy, decorators: [{
720
- type: Directive,
721
- args: [{
722
- standalone: true,
723
- selector: '[tuiDropdownOpen]:not([tuiDropdown]),[tuiDropdownOpenChange]:not([tuiDropdown])',
724
- }]
725
- }], propDecorators: { tuiDropdownOpenChange: [{
726
- type: Output
727
- }], tuiDropdownOpen: [{
728
- type: Input
729
- }] } });
638
+ }] });
730
639
 
731
640
  class TuiDropdownPositionSided extends TuiPositionAccessor {
732
641
  constructor() {
@@ -735,12 +644,12 @@ class TuiDropdownPositionSided extends TuiPositionAccessor {
735
644
  this.viewport = inject(TUI_VIEWPORT);
736
645
  this.vertical = inject(TuiDropdownPosition);
737
646
  this.previous = this.options.direction || 'bottom';
738
- this.tuiDropdownSided = '';
739
- this.tuiDropdownSidedOffset = 4;
647
+ this.tuiDropdownSided = input('');
648
+ this.tuiDropdownSidedOffset = input(4);
740
649
  this.type = 'dropdown';
741
650
  }
742
651
  getPosition(rect) {
743
- if (this.tuiDropdownSided === false) {
652
+ if (this.tuiDropdownSided() === false) {
744
653
  return this.vertical.getPosition(rect);
745
654
  }
746
655
  const { height, width } = rect;
@@ -756,38 +665,33 @@ class TuiDropdownPositionSided extends TuiPositionAccessor {
756
665
  bottom: viewport.bottom - hostRect.top,
757
666
  };
758
667
  const position = {
759
- top: hostRect.bottom - height + this.tuiDropdownSidedOffset + 1, // 1 for border
668
+ top: hostRect.bottom - height + this.tuiDropdownSidedOffset() + 1, // 1 for border
760
669
  left: hostRect.left - width - offset,
761
670
  right: hostRect.right + offset,
762
- bottom: hostRect.top - this.tuiDropdownSidedOffset - 1, // 1 for border
671
+ bottom: hostRect.top - this.tuiDropdownSidedOffset() - 1, // 1 for border
763
672
  };
764
673
  const better = available.top > available.bottom ? 'top' : 'bottom';
765
674
  const maxLeft = available.left > available.right ? position.left : position.right;
766
675
  const left = available[align] > width ? position[align] : maxLeft;
767
676
  if ((available[this.previous] > height && direction) ||
768
677
  this.previous === better) {
769
- this.vertical.emitDirection(this.previous);
678
+ this.vertical.direction.next(this.previous);
770
679
  return [position[this.previous], left];
771
680
  }
772
681
  this.previous = better;
773
- this.vertical.emitDirection(better);
682
+ this.vertical.direction.next(better);
774
683
  return [position[better], left];
775
684
  }
776
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownPositionSided, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
777
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownPositionSided, isStandalone: true, selector: "[tuiDropdownSided]", inputs: { tuiDropdownSided: "tuiDropdownSided", tuiDropdownSidedOffset: "tuiDropdownSidedOffset" }, providers: [TuiDropdownPosition, tuiAsPositionAccessor(TuiDropdownPositionSided)], usesInheritance: true, ngImport: i0 }); }
685
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownPositionSided, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
686
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.16", type: TuiDropdownPositionSided, isStandalone: true, selector: "[tuiDropdownSided]", inputs: { tuiDropdownSided: { classPropertyName: "tuiDropdownSided", publicName: "tuiDropdownSided", isSignal: true, isRequired: false, transformFunction: null }, tuiDropdownSidedOffset: { classPropertyName: "tuiDropdownSidedOffset", publicName: "tuiDropdownSidedOffset", isSignal: true, isRequired: false, transformFunction: null } }, providers: [TuiDropdownPosition, tuiAsPositionAccessor(TuiDropdownPositionSided)], usesInheritance: true, ngImport: i0 }); }
778
687
  }
779
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownPositionSided, decorators: [{
688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownPositionSided, decorators: [{
780
689
  type: Directive,
781
690
  args: [{
782
- standalone: true,
783
691
  selector: '[tuiDropdownSided]',
784
692
  providers: [TuiDropdownPosition, tuiAsPositionAccessor(TuiDropdownPositionSided)],
785
693
  }]
786
- }], propDecorators: { tuiDropdownSided: [{
787
- type: Input
788
- }], tuiDropdownSidedOffset: [{
789
- type: Input
790
- }] } });
694
+ }] });
791
695
 
792
696
  class TuiDropdownSelection extends TuiDriver {
793
697
  constructor() {
@@ -796,9 +700,9 @@ class TuiDropdownSelection extends TuiDriver {
796
700
  this.vcr = inject(ViewContainerRef);
797
701
  this.dropdown = inject(TuiDropdownDirective);
798
702
  this.el = tuiInjectElement();
799
- this.handler$ = new BehaviorSubject(TUI_TRUE_HANDLER);
703
+ this.handler = computed((visible = this.tuiDropdownSelection()) => tuiIsString(visible) ? TUI_TRUE_HANDLER : visible);
800
704
  this.stream$ = combineLatest([
801
- this.handler$,
705
+ toObservable(this.handler),
802
706
  inject(TUI_SELECTION_STREAM).pipe(map(() => this.getRange()), filter((range) => this.isValid(range)), distinctUntilChanged((x, y) => x.startOffset === y.startOffset &&
803
707
  x.endOffset === y.endOffset &&
804
708
  x.commonAncestorContainer === y.commonAncestorContainer)),
@@ -810,17 +714,15 @@ class TuiDropdownSelection extends TuiDriver {
810
714
  : this.range;
811
715
  return (contained && handler(this.range)) || this.inDropdown(range);
812
716
  }));
813
- this.range = inject(TUI_RANGE);
814
- this.position = 'selection';
717
+ this.range = isPlatformBrowser(inject(PLATFORM_ID))
718
+ ? new Range()
719
+ : {};
815
720
  this.type = 'dropdown';
816
- }
817
- set tuiDropdownSelection(visible) {
818
- if (!tuiIsString(visible)) {
819
- this.handler$.next(visible);
820
- }
721
+ this.tuiDropdownSelection = input('');
722
+ this.tuiDropdownSelectionPosition = input('selection');
821
723
  }
822
724
  getClientRect() {
823
- switch (this.position) {
725
+ switch (this.tuiDropdownSelectionPosition()) {
824
726
  case 'tag': {
825
727
  const { commonAncestorContainer } = this.range;
826
728
  const element = tuiIsElement(commonAncestorContainer)
@@ -911,28 +813,22 @@ class TuiDropdownSelection extends TuiDriver {
911
813
  this.ghost = ghost;
912
814
  return ghost;
913
815
  }
914
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
915
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownSelection, isStandalone: true, selector: "[tuiDropdownSelection]", inputs: { position: ["tuiDropdownSelectionPosition", "position"], tuiDropdownSelection: "tuiDropdownSelection" }, providers: [
816
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownSelection, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
817
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.16", type: TuiDropdownSelection, isStandalone: true, selector: "[tuiDropdownSelection]", inputs: { tuiDropdownSelection: { classPropertyName: "tuiDropdownSelection", publicName: "tuiDropdownSelection", isSignal: true, isRequired: false, transformFunction: null }, tuiDropdownSelectionPosition: { classPropertyName: "tuiDropdownSelectionPosition", publicName: "tuiDropdownSelectionPosition", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
916
818
  tuiAsDriver(TuiDropdownSelection),
917
819
  tuiAsRectAccessor(TuiDropdownSelection),
918
820
  ], usesInheritance: true, ngImport: i0 }); }
919
821
  }
920
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownSelection, decorators: [{
822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownSelection, decorators: [{
921
823
  type: Directive,
922
824
  args: [{
923
- standalone: true,
924
825
  selector: '[tuiDropdownSelection]',
925
826
  providers: [
926
827
  tuiAsDriver(TuiDropdownSelection),
927
828
  tuiAsRectAccessor(TuiDropdownSelection),
928
829
  ],
929
830
  }]
930
- }], ctorParameters: () => [], propDecorators: { position: [{
931
- type: Input,
932
- args: ['tuiDropdownSelectionPosition']
933
- }], tuiDropdownSelection: [{
934
- type: Input
935
- }] } });
831
+ }], ctorParameters: () => [] });
936
832
 
937
833
  const TuiDropdown = [
938
834
  TuiDropdownOptionsDirective,
@@ -940,7 +836,6 @@ const TuiDropdown = [
940
836
  TuiDropdownDirective,
941
837
  TuiDropdownComponent,
942
838
  TuiDropdownOpen,
943
- TuiDropdownOpenLegacy,
944
839
  TuiDropdownManual,
945
840
  TuiDropdownHover,
946
841
  TuiDropdownContent,
@@ -954,14 +849,7 @@ function tuiDropdown(value) {
954
849
  return tuiDirectiveBinding(TuiDropdownDirective, 'tuiDropdown', value, {});
955
850
  }
956
851
  function tuiDropdownEnabled(value) {
957
- return tuiDirectiveBinding(TuiDropdownOpen, 'tuiDropdownEnabled', value, {});
958
- }
959
- function tuiDropdownOpen() {
960
- const open = tuiDirectiveBinding(TuiDropdownOpen, 'tuiDropdownOpen', false, {});
961
- inject(TuiDropdownOpen)
962
- .tuiDropdownOpenChange.pipe(takeUntilDestroyed())
963
- .subscribe((value) => open.set(value));
964
- return open;
852
+ return tuiDirectiveBinding(TuiDropdownOpen, 'enabled', value, {});
965
853
  }
966
854
 
967
855
  class TuiDropdownFixed {
@@ -969,13 +857,12 @@ class TuiDropdownFixed {
969
857
  const override = tuiOverrideOptions$1({ limitWidth: 'fixed' }, TUI_DROPDOWN_DEFAULT_OPTIONS);
970
858
  override(inject(TUI_DROPDOWN_OPTIONS, { self: true, optional: true }), null);
971
859
  }
972
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownFixed, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
973
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownFixed, isStandalone: true, providers: [tuiDropdownOptionsProvider({})], ngImport: i0 }); }
860
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownFixed, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
861
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownFixed, isStandalone: true, providers: [tuiDropdownOptionsProvider({})], ngImport: i0 }); }
974
862
  }
975
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownFixed, decorators: [{
863
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownFixed, decorators: [{
976
864
  type: Directive,
977
865
  args: [{
978
- standalone: true,
979
866
  providers: [tuiDropdownOptionsProvider({})],
980
867
  }]
981
868
  }], ctorParameters: () => [] });
@@ -987,22 +874,20 @@ class TuiDropdownAuto {
987
874
  */
988
875
  inject(TUI_DROPDOWN_OPTIONS).limitWidth = 'auto';
989
876
  }
990
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownAuto, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
991
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiDropdownAuto, isStandalone: true, ngImport: i0 }); }
877
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownAuto, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
878
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiDropdownAuto, isStandalone: true, ngImport: i0 }); }
992
879
  }
993
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiDropdownAuto, decorators: [{
994
- type: Directive,
995
- args: [{ standalone: true }]
880
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiDropdownAuto, decorators: [{
881
+ type: Directive
996
882
  }], ctorParameters: () => [] });
997
883
 
998
884
  class TuiWithDropdownOpen {
999
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiWithDropdownOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1000
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.15", type: TuiWithDropdownOpen, isStandalone: true, hostDirectives: [{ directive: TuiDropdownOpen, inputs: ["tuiDropdownOpen", "open", "tuiDropdownEnabled", "tuiDropdownEnabled"], outputs: ["tuiDropdownOpenChange", "openChange"] }], ngImport: i0 }); }
885
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiWithDropdownOpen, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
886
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.16", type: TuiWithDropdownOpen, isStandalone: true, hostDirectives: [{ directive: TuiDropdownOpen, inputs: ["tuiDropdownOpen", "open", "tuiDropdownEnabled", "tuiDropdownEnabled"], outputs: ["tuiDropdownOpenChange", "openChange"] }], ngImport: i0 }); }
1001
887
  }
1002
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TuiWithDropdownOpen, decorators: [{
888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.16", ngImport: i0, type: TuiWithDropdownOpen, decorators: [{
1003
889
  type: Directive,
1004
890
  args: [{
1005
- standalone: true,
1006
891
  hostDirectives: [
1007
892
  {
1008
893
  directive: TuiDropdownOpen,
@@ -1017,5 +902,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
1017
902
  * Generated bundle index. Do not edit.
1018
903
  */
1019
904
 
1020
- export { TUI_DROPDOWN_COMPONENT, TUI_DROPDOWN_CONTEXT, TUI_DROPDOWN_DEFAULT_OPTIONS, TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS, TUI_DROPDOWN_HOVER_OPTIONS, TUI_DROPDOWN_OPTIONS, TuiDropdown, TuiDropdownAuto, TuiDropdownComponent, TuiDropdownContent, TuiDropdownContext, TuiDropdownDirective, TuiDropdownDriver, TuiDropdownDriverDirective, TuiDropdownFixed, TuiDropdownHover, TuiDropdownManual, TuiDropdownOpen, TuiDropdownOpenLegacy, TuiDropdownOptionsDirective, TuiDropdownPosition, TuiDropdownPositionSided, TuiDropdownSelection, TuiWithDropdownOpen, tuiDropdown, tuiDropdownEnabled, tuiDropdownHoverOptionsProvider, tuiDropdownOpen, tuiDropdownOptionsProvider };
1021
- //# sourceMappingURL=taiga-ui-core-directives-dropdown.mjs.map
905
+ export { TUI_DROPDOWN_COMPONENT, TUI_DROPDOWN_CONTEXT, TUI_DROPDOWN_DEFAULT_OPTIONS, TUI_DROPDOWN_HOVER_DEFAULT_OPTIONS, TUI_DROPDOWN_HOVER_OPTIONS, TUI_DROPDOWN_OPTIONS, TuiDropdown, TuiDropdownAuto, TuiDropdownComponent, TuiDropdownContent, TuiDropdownContext, TuiDropdownDirective, TuiDropdownDriver, TuiDropdownDriverDirective, TuiDropdownFixed, TuiDropdownHover, TuiDropdownManual, TuiDropdownOpen, TuiDropdownOptionsDirective, TuiDropdownPosition, TuiDropdownPositionSided, TuiDropdownSelection, TuiWithDropdownOpen, tuiDropdown, tuiDropdownEnabled, tuiDropdownHoverOptionsProvider, tuiDropdownOptionsProvider };
906
+ //# sourceMappingURL=taiga-ui-core-portals-dropdown.mjs.map