@koobiq/components 20.4.1 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (771) hide show
  1. package/accordion/accordion-trigger.scss +3 -10
  2. package/accordion/accordion.scss +4 -6
  3. package/actions-panel/actions-panel-container.scss +45 -1
  4. package/alert/alert.component.scss +3 -2
  5. package/app-switcher/_app-switcher-theme.scss +0 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +3 -2
  7. package/app-switcher/app-switcher-dropdown-site.scss +2 -1
  8. package/app-switcher/{kbq-app-switcher-list-item.scss → app-switcher-list-item.scss} +18 -4
  9. package/app-switcher/app-switcher-tokens.scss +15 -0
  10. package/app-switcher/app-switcher.scss +14 -4
  11. package/autocomplete/autocomplete.scss +7 -6
  12. package/badge/badge.component.scss +5 -8
  13. package/breadcrumbs/breadcrumbs.scss +25 -10
  14. package/button/_button-base.scss +30 -7
  15. package/button/_button-theme.scss +16 -0
  16. package/button/button-group.scss +7 -0
  17. package/button/button-tokens.scss +0 -2
  18. package/button/button.scss +34 -2
  19. package/button-toggle/_button-toggle-theme.scss +7 -2
  20. package/button-toggle/button-toggle.scss +65 -15
  21. package/checkbox/_checkbox-theme.scss +4 -3
  22. package/checkbox/checkbox.scss +3 -6
  23. package/clamped-text/clamped-text.scss +6 -2
  24. package/code-block/code-block-tokens.scss +0 -224
  25. package/code-block/code-block.scss +20 -9
  26. package/content-panel/content-panel-aside.scss +3 -2
  27. package/content-panel/content-panel-container.scss +37 -0
  28. package/content-panel/content-panel.scss +4 -3
  29. package/core/highlight/_highlight-theme.scss +3 -1
  30. package/core/option/action-container.scss +2 -2
  31. package/core/option/action.scss +2 -1
  32. package/core/option/option.scss +2 -1
  33. package/core/pop-up/_pop-up.scss +0 -37
  34. package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +5 -10
  35. package/core/styles/_core.scss +3 -0
  36. package/core/styles/_koobiq-theme.scss +5 -6
  37. package/core/styles/common/_animation.scss +44 -16
  38. package/core/styles/common/_groups-mixins.scss +21 -19
  39. package/core/styles/common/_groups.scss +4 -32
  40. package/core/styles/common/_index.scss +0 -2
  41. package/core/styles/common/_link.scss +117 -0
  42. package/core/styles/common/_list.scss +0 -26
  43. package/core/styles/common/_overlay.scss +8 -10
  44. package/core/styles/common/_rtl.scss +0 -14
  45. package/core/styles/common/_select.scss +33 -15
  46. package/core/styles/common/_squircle.scss +63 -0
  47. package/core/styles/common/_tokens.scss +0 -11
  48. package/core/styles/common/_vendor-prefixes.scss +0 -20
  49. package/core/styles/functions/_timing.scss +0 -22
  50. package/core/styles/theming/_scrollbar-theme.scss +6 -1
  51. package/core/styles/theming/_theming.scss +13 -65
  52. package/core/styles/typography/_index.scss +0 -1
  53. package/core/styles/typography/_typography.scss +0 -143
  54. package/core/styles/visual/_body.scss +1 -6
  55. package/core/styles/visual/_layout.scss +0 -12
  56. package/datepicker/calendar-body.scss +3 -1
  57. package/datepicker/calendar-header.scss +0 -1
  58. package/datepicker/datepicker-content.scss +33 -1
  59. package/datepicker/datepicker-toggle.scss +0 -38
  60. package/dl/dl-tokens.scss +10 -0
  61. package/dl/dl.scss +113 -13
  62. package/dropdown/_dropdown-theme.scss +4 -16
  63. package/dropdown/dropdown-item.scss +4 -10
  64. package/dropdown/dropdown.scss +2 -1
  65. package/empty-state/_empty-state-theme.scss +10 -4
  66. package/empty-state/empty-state-tokens.scss +4 -4
  67. package/empty-state/empty-state.scss +4 -0
  68. package/fesm2022/koobiq-components-accordion.mjs +347 -229
  69. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-actions-panel.mjs +302 -187
  71. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-alert.mjs +39 -39
  73. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-app-switcher.mjs +677 -367
  75. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-autocomplete.mjs +620 -253
  77. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-badge.mjs +46 -48
  79. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-breadcrumbs.mjs +221 -169
  81. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-button-toggle.mjs +565 -196
  83. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-button.mjs +332 -116
  85. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-checkbox.mjs +172 -132
  87. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-clamped-text.mjs +165 -158
  89. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-code-block.mjs +755 -601
  91. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-content-panel.mjs +260 -143
  93. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-core.mjs +4342 -1595
  95. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-datepicker.mjs +1713 -1606
  97. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-divider.mjs +73 -36
  99. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-dl.mjs +447 -89
  101. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-dropdown.mjs +703 -599
  103. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-dynamic-translation.mjs +20 -20
  105. package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-ellipsis-center.mjs +46 -31
  107. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-empty-state.mjs +116 -60
  109. package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-file-upload.mjs +550 -290
  111. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-filter-bar.mjs +2810 -2538
  113. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-flag.mjs +79 -24
  115. package/fesm2022/koobiq-components-flag.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-form-field.mjs +389 -525
  117. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-icon.mjs +366 -136
  119. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  120. package/fesm2022/koobiq-components-inline-edit.mjs +429 -212
  121. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  122. package/fesm2022/koobiq-components-input.mjs +601 -459
  123. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  124. package/fesm2022/koobiq-components-link-deprecated.mjs +196 -0
  125. package/fesm2022/koobiq-components-link-deprecated.mjs.map +1 -0
  126. package/fesm2022/koobiq-components-link.mjs +328 -125
  127. package/fesm2022/koobiq-components-link.mjs.map +1 -1
  128. package/fesm2022/koobiq-components-list.mjs +583 -433
  129. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  130. package/fesm2022/koobiq-components-loader-overlay.mjs +167 -68
  131. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  132. package/fesm2022/koobiq-components-markdown.mjs +55 -78
  133. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  134. package/fesm2022/koobiq-components-modal.mjs +853 -475
  135. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  136. package/fesm2022/koobiq-components-navbar.mjs +895 -556
  137. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  138. package/fesm2022/koobiq-components-notification-center.mjs +680 -310
  139. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  140. package/fesm2022/koobiq-components-overflow-items.mjs +46 -64
  141. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  142. package/fesm2022/koobiq-components-popover.mjs +684 -285
  143. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  144. package/fesm2022/koobiq-components-progress-bar.mjs +87 -33
  145. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  146. package/fesm2022/koobiq-components-progress-spinner.mjs +52 -43
  147. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  148. package/fesm2022/koobiq-components-radio.mjs +450 -231
  149. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  150. package/fesm2022/koobiq-components-resizer.mjs +127 -21
  151. package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
  152. package/fesm2022/koobiq-components-scrollbar-deprecated.mjs +299 -0
  153. package/fesm2022/koobiq-components-scrollbar-deprecated.mjs.map +1 -0
  154. package/fesm2022/koobiq-components-scrollbar.mjs +745 -222
  155. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  156. package/fesm2022/koobiq-components-search-expandable.mjs +288 -126
  157. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  158. package/fesm2022/koobiq-components-select.mjs +883 -693
  159. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  160. package/fesm2022/koobiq-components-sidebar.mjs +207 -88
  161. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  162. package/fesm2022/koobiq-components-sidepanel.mjs +689 -296
  163. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  164. package/fesm2022/koobiq-components-skeleton.mjs +815 -41
  165. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  166. package/fesm2022/koobiq-components-split-button.mjs +109 -88
  167. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  168. package/fesm2022/koobiq-components-splitter-deprecated.mjs +591 -0
  169. package/fesm2022/koobiq-components-splitter-deprecated.mjs.map +1 -0
  170. package/fesm2022/koobiq-components-splitter.mjs +890 -501
  171. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  172. package/fesm2022/koobiq-components-table.mjs +63 -49
  173. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  174. package/fesm2022/koobiq-components-tabs.mjs +1062 -603
  175. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  176. package/fesm2022/koobiq-components-tags.mjs +886 -733
  177. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  178. package/fesm2022/koobiq-components-textarea.mjs +213 -185
  179. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  180. package/fesm2022/koobiq-components-time-range.mjs +299 -147
  181. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  182. package/fesm2022/koobiq-components-timepicker.mjs +233 -245
  183. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  184. package/fesm2022/koobiq-components-timezone.mjs +344 -142
  185. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  186. package/fesm2022/koobiq-components-title.mjs +229 -145
  187. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  188. package/fesm2022/koobiq-components-toast.mjs +486 -165
  189. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  190. package/fesm2022/koobiq-components-toggle.mjs +177 -130
  191. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  192. package/fesm2022/koobiq-components-tooltip.mjs +657 -214
  193. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  194. package/fesm2022/koobiq-components-top-bar.mjs +61 -32
  195. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  196. package/fesm2022/koobiq-components-tree-select.mjs +719 -488
  197. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  198. package/fesm2022/koobiq-components-tree.mjs +1506 -558
  199. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  200. package/fesm2022/koobiq-components-username.mjs +290 -135
  201. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  202. package/file-upload/dropzone.scss +31 -3
  203. package/file-upload/file-upload-tokens.scss +2 -22
  204. package/file-upload/file-upload.scss +6 -0
  205. package/file-upload/multiple-file-upload.component.scss +14 -12
  206. package/file-upload/single-file-upload.component.scss +3 -2
  207. package/filter-bar/filters.scss +7 -0
  208. package/filter-bar/pipes/base-pipe.scss +3 -3
  209. package/filter-bar/pipes/pipe-date.scss +8 -1
  210. package/flag/flag-tokens.scss +22 -0
  211. package/flag/flag.scss +34 -21
  212. package/form-field/{_fiedset-theme.scss → _fieldset-theme.scss} +1 -5
  213. package/form-field/_form-field-theme.scss +4 -9
  214. package/form-field/cleaner.scss +3 -1
  215. package/form-field/fieldset.scss +3 -4
  216. package/form-field/form-field.scss +26 -21
  217. package/form-field/password-toggle.scss +3 -1
  218. package/icon/_icon-button-theme.scss +7 -0
  219. package/icon/_icon-theme.scss +10 -7
  220. package/icon/icon-button.scss +0 -2
  221. package/icon/icon-tokens.scss +12 -9
  222. package/inline-edit/inline-edit.scss +40 -54
  223. package/input/input.scss +4 -0
  224. package/link/{_link-theme.scss → deprecated/_link-theme.scss} +11 -6
  225. package/link/deprecated/link-tokens.scss +27 -0
  226. package/link/link-tokens.scss +6 -25
  227. package/link/link.scss +137 -0
  228. package/list/list.scss +3 -2
  229. package/loader-overlay/_loader-overlay-theme.scss +19 -10
  230. package/loader-overlay/loader-overlay-tokens.scss +0 -2
  231. package/loader-overlay/loader-overlay.scss +7 -1
  232. package/markdown/_markdown-theme.scss +16 -0
  233. package/markdown/markdown-tokens.scss +5 -0
  234. package/markdown/markdown.scss +2 -1
  235. package/modal/_modal-animation.scss +23 -14
  236. package/modal/modal-tokens.scss +2 -1
  237. package/modal/modal.scss +35 -31
  238. package/navbar/_navbar-item_horizontal.scss +8 -6
  239. package/navbar/_navbar-item_vertical.scss +18 -6
  240. package/navbar/_navbar-theme.scss +9 -1
  241. package/navbar/navbar-brand.scss +8 -6
  242. package/navbar/navbar-divider.scss +1 -1
  243. package/navbar/navbar-item.scss +8 -9
  244. package/navbar/navbar-toggle.scss +3 -3
  245. package/navbar/navbar-tokens.scss +14 -0
  246. package/navbar/navbar.scss +1 -2
  247. package/navbar/vertical-navbar.scss +2 -2
  248. package/notification-center/_notification-center-theme.scss +11 -6
  249. package/notification-center/notification-center-tokens.scss +33 -0
  250. package/notification-center/notification-center.scss +58 -20
  251. package/notification-center/notification-item.scss +15 -6
  252. package/package.json +112 -81
  253. package/popover/popover-tokens.scss +0 -2
  254. package/popover/popover.scss +41 -19
  255. package/prebuilt-themes/theme.css +1 -1
  256. package/progress-bar/_progress-bar-theme.scss +20 -3
  257. package/progress-bar/progress-bar-tokens.scss +3 -0
  258. package/progress-bar/progress-bar.scss +36 -8
  259. package/progress-spinner/progress-spinner.scss +4 -3
  260. package/radio/_radio-theme.scss +21 -4
  261. package/radio/radio-tokens.scss +7 -3
  262. package/radio/radio.scss +55 -8
  263. package/schematics/collection.json +399 -7
  264. package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
  265. package/schematics/migrations/accordion-state-saving-default/data.js +75 -0
  266. package/schematics/migrations/accordion-state-saving-default/index.js +60 -0
  267. package/schematics/migrations/accordion-state-saving-default/schema.json +15 -0
  268. package/schematics/migrations/actions-panel-overlay-container/README.md +35 -0
  269. package/schematics/migrations/actions-panel-overlay-container/data.js +47 -0
  270. package/schematics/migrations/actions-panel-overlay-container/index.js +54 -0
  271. package/schematics/migrations/actions-panel-overlay-container/schema.json +15 -0
  272. package/schematics/migrations/alert-signals/README.md +13 -7
  273. package/schematics/migrations/alert-signals/data.js +3 -0
  274. package/schematics/migrations/alert-signals/index.js +70 -203
  275. package/schematics/migrations/angular-animations-removal/README.md +46 -0
  276. package/schematics/migrations/angular-animations-removal/data.js +150 -0
  277. package/schematics/migrations/angular-animations-removal/index.js +20 -0
  278. package/schematics/migrations/angular-animations-removal/schema.json +15 -0
  279. package/schematics/migrations/app-switcher-signals/README.md +88 -0
  280. package/schematics/migrations/app-switcher-signals/data.js +136 -0
  281. package/schematics/migrations/app-switcher-signals/index.js +365 -0
  282. package/schematics/migrations/app-switcher-signals/schema.json +20 -0
  283. package/schematics/migrations/autocomplete-panel-width-auto/README.md +2 -2
  284. package/schematics/migrations/autocomplete-panel-width-auto/index.js +1 -1
  285. package/schematics/migrations/autocomplete-signals/README.md +92 -0
  286. package/schematics/migrations/autocomplete-signals/data.js +149 -0
  287. package/schematics/migrations/autocomplete-signals/index.js +706 -0
  288. package/schematics/migrations/autocomplete-signals/schema.json +20 -0
  289. package/schematics/migrations/badge-signals/README.md +77 -0
  290. package/schematics/migrations/badge-signals/data.js +109 -0
  291. package/schematics/migrations/badge-signals/index.js +693 -0
  292. package/schematics/migrations/badge-signals/schema.json +20 -0
  293. package/schematics/migrations/button-state-and-styles/README.md +129 -0
  294. package/schematics/migrations/button-state-and-styles/data.js +136 -0
  295. package/schematics/migrations/button-state-and-styles/index.js +220 -0
  296. package/schematics/migrations/button-state-and-styles/schema.json +20 -0
  297. package/schematics/migrations/button-supported-colors/README.md +73 -0
  298. package/schematics/migrations/button-supported-colors/data.js +106 -0
  299. package/schematics/migrations/button-supported-colors/index.js +260 -0
  300. package/schematics/migrations/button-supported-colors/schema.json +20 -0
  301. package/schematics/migrations/button-toggle-signals-and-aria/README.md +137 -0
  302. package/schematics/migrations/button-toggle-signals-and-aria/data.js +200 -0
  303. package/schematics/migrations/button-toggle-signals-and-aria/index.js +496 -0
  304. package/schematics/migrations/button-toggle-signals-and-aria/schema.json +20 -0
  305. package/schematics/migrations/button-truncation/README.md +110 -0
  306. package/schematics/migrations/button-truncation/data.js +88 -0
  307. package/schematics/migrations/button-truncation/index.js +269 -0
  308. package/schematics/migrations/button-truncation/schema.json +20 -0
  309. package/schematics/migrations/checkbox-signals/README.md +76 -0
  310. package/schematics/migrations/checkbox-signals/data.js +114 -0
  311. package/schematics/migrations/checkbox-signals/index.js +634 -0
  312. package/schematics/migrations/checkbox-signals/schema.json +20 -0
  313. package/schematics/migrations/clamped-text-disclosure/README.md +62 -0
  314. package/schematics/migrations/clamped-text-disclosure/data.js +101 -0
  315. package/schematics/migrations/clamped-text-disclosure/index.js +59 -0
  316. package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
  317. package/schematics/migrations/code-block-signals/README.md +84 -0
  318. package/schematics/migrations/code-block-signals/data.js +121 -0
  319. package/schematics/migrations/code-block-signals/index.js +700 -0
  320. package/schematics/migrations/code-block-signals/schema.json +20 -0
  321. package/schematics/migrations/color-signals/README.md +46 -0
  322. package/schematics/migrations/color-signals/data.js +131 -0
  323. package/schematics/migrations/color-signals/index.js +19 -0
  324. package/schematics/migrations/color-signals/schema.json +20 -0
  325. package/schematics/migrations/core-mixins-removal/README.md +20 -0
  326. package/schematics/migrations/core-mixins-removal/data.js +27 -0
  327. package/schematics/migrations/core-mixins-removal/index.js +17 -0
  328. package/schematics/migrations/core-mixins-removal/schema.json +15 -0
  329. package/schematics/migrations/css-selectors/README.md +2 -2
  330. package/schematics/migrations/css-selectors/index.js +1 -1
  331. package/schematics/migrations/datepicker-signals/README.md +24 -0
  332. package/schematics/migrations/datepicker-signals/data.js +49 -0
  333. package/schematics/migrations/datepicker-signals/index.js +17 -0
  334. package/schematics/migrations/datepicker-signals/schema.json +15 -0
  335. package/schematics/migrations/deprecated-icons/README.md +2 -2
  336. package/schematics/migrations/deprecated-icons/index.js +1 -1
  337. package/schematics/migrations/design-tokens-v4/README.md +75 -0
  338. package/schematics/migrations/design-tokens-v4/index.js +59 -0
  339. package/schematics/migrations/design-tokens-v4/schema.json +15 -0
  340. package/schematics/migrations/divider-signals-and-aria/README.md +47 -0
  341. package/schematics/migrations/divider-signals-and-aria/data.js +62 -0
  342. package/schematics/migrations/divider-signals-and-aria/index.js +211 -0
  343. package/schematics/migrations/divider-signals-and-aria/schema.json +15 -0
  344. package/schematics/migrations/dl-attribute-coercion/README.md +59 -0
  345. package/schematics/migrations/dl-attribute-coercion/data.js +85 -0
  346. package/schematics/migrations/dl-attribute-coercion/index.js +161 -0
  347. package/schematics/migrations/dl-attribute-coercion/schema.json +15 -0
  348. package/schematics/migrations/dl-standalone-names/README.md +49 -0
  349. package/schematics/migrations/dl-standalone-names/data.js +44 -0
  350. package/schematics/migrations/dl-standalone-names/index.js +321 -0
  351. package/schematics/migrations/dl-standalone-names/schema.json +20 -0
  352. package/schematics/migrations/dropdown-demote-overlay/README.md +137 -0
  353. package/schematics/migrations/dropdown-demote-overlay/data.js +84 -0
  354. package/schematics/migrations/dropdown-demote-overlay/index.js +288 -0
  355. package/schematics/migrations/dropdown-demote-overlay/schema.json +20 -0
  356. package/schematics/migrations/dropdown-signals/README.md +83 -0
  357. package/schematics/migrations/dropdown-signals/data.js +152 -0
  358. package/schematics/migrations/dropdown-signals/index.js +19 -0
  359. package/schematics/migrations/dropdown-signals/schema.json +20 -0
  360. package/schematics/migrations/empty-state-error-color/README.md +84 -0
  361. package/schematics/migrations/empty-state-error-color/data.js +85 -0
  362. package/schematics/migrations/empty-state-error-color/index.js +71 -0
  363. package/schematics/migrations/empty-state-error-color/schema.json +15 -0
  364. package/schematics/migrations/empty-state-size-attr/README.md +2 -2
  365. package/schematics/migrations/empty-state-size-attr/index.js +1 -1
  366. package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
  367. package/schematics/migrations/file-upload-cva-and-primitives/data.js +97 -0
  368. package/schematics/migrations/file-upload-cva-and-primitives/index.js +60 -0
  369. package/schematics/migrations/file-upload-cva-and-primitives/schema.json +15 -0
  370. package/schematics/migrations/file-upload-deprecated-outputs/README.md +90 -0
  371. package/schematics/migrations/file-upload-deprecated-outputs/data.js +20 -0
  372. package/schematics/migrations/file-upload-deprecated-outputs/index.js +70 -0
  373. package/schematics/migrations/file-upload-deprecated-outputs/schema.json +20 -0
  374. package/schematics/migrations/filter-bar-rename-action/README.md +183 -0
  375. package/schematics/migrations/filter-bar-rename-action/data.js +151 -0
  376. package/schematics/migrations/filter-bar-rename-action/index.js +177 -0
  377. package/schematics/migrations/filter-bar-rename-action/schema.json +20 -0
  378. package/schematics/migrations/filter-bar-signals/README.md +27 -16
  379. package/schematics/migrations/filter-bar-signals/data.js +1 -2
  380. package/schematics/migrations/filter-bar-signals/index.js +100 -195
  381. package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
  382. package/schematics/migrations/filter-bar-state-saving-default/data.js +87 -0
  383. package/schematics/migrations/filter-bar-state-saving-default/index.js +61 -0
  384. package/schematics/migrations/filter-bar-state-saving-default/schema.json +15 -0
  385. package/schematics/migrations/flag-inner-html/README.md +67 -0
  386. package/schematics/migrations/flag-inner-html/data.js +58 -0
  387. package/schematics/migrations/flag-inner-html/index.js +61 -0
  388. package/schematics/migrations/flag-inner-html/schema.json +15 -0
  389. package/schematics/migrations/form-field-signals/README.md +125 -0
  390. package/schematics/migrations/form-field-signals/data.js +288 -0
  391. package/schematics/migrations/form-field-signals/index.js +382 -0
  392. package/schematics/migrations/form-field-signals/schema.json +20 -0
  393. package/schematics/migrations/icon-semantics-and-api/README.md +65 -0
  394. package/schematics/migrations/icon-semantics-and-api/data.js +97 -0
  395. package/schematics/migrations/icon-semantics-and-api/index.js +64 -0
  396. package/schematics/migrations/icon-semantics-and-api/schema.json +15 -0
  397. package/schematics/migrations/icons-replacement/README.md +5 -5
  398. package/schematics/migrations/icons-replacement/index.js +1 -1
  399. package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
  400. package/schematics/migrations/inline-edit-a11y-and-types/data.js +117 -0
  401. package/schematics/migrations/inline-edit-a11y-and-types/index.js +97 -0
  402. package/schematics/migrations/inline-edit-a11y-and-types/schema.json +20 -0
  403. package/schematics/migrations/input-number-surface/README.md +140 -0
  404. package/schematics/migrations/input-number-surface/data.js +135 -0
  405. package/schematics/migrations/input-number-surface/index.js +292 -0
  406. package/schematics/migrations/input-number-surface/schema.json +20 -0
  407. package/schematics/migrations/input-signals/README.md +20 -0
  408. package/schematics/migrations/input-signals/data.js +30 -0
  409. package/schematics/migrations/input-signals/index.js +17 -0
  410. package/schematics/migrations/input-signals/schema.json +15 -0
  411. package/schematics/migrations/link-deprecated-path/README.md +144 -0
  412. package/schematics/migrations/link-deprecated-path/index.js +19 -0
  413. package/schematics/migrations/link-deprecated-path/schema.json +20 -0
  414. package/schematics/migrations/link-signals/README.md +71 -0
  415. package/schematics/migrations/link-signals/data.js +116 -0
  416. package/schematics/migrations/link-signals/index.js +415 -0
  417. package/schematics/migrations/link-signals/schema.json +20 -0
  418. package/schematics/migrations/list-signals/README.md +22 -0
  419. package/schematics/migrations/list-signals/data.js +35 -0
  420. package/schematics/migrations/list-signals/index.js +17 -0
  421. package/schematics/migrations/list-signals/schema.json +15 -0
  422. package/schematics/migrations/list-tree-multiple-input/README.md +105 -0
  423. package/schematics/migrations/list-tree-multiple-input/data.js +74 -0
  424. package/schematics/migrations/list-tree-multiple-input/index.js +221 -0
  425. package/schematics/migrations/list-tree-multiple-input/schema.json +20 -0
  426. package/schematics/migrations/loader-overlay-signals/README.md +62 -0
  427. package/schematics/migrations/loader-overlay-signals/data.js +101 -0
  428. package/schematics/migrations/loader-overlay-signals/index.js +697 -0
  429. package/schematics/migrations/loader-overlay-signals/schema.json +20 -0
  430. package/schematics/migrations/loader-overlay-size-attr/README.md +2 -2
  431. package/schematics/migrations/loader-overlay-size-attr/index.js +1 -1
  432. package/schematics/migrations/locale-configuration-providers/README.md +163 -0
  433. package/schematics/migrations/locale-configuration-providers/data.js +257 -0
  434. package/schematics/migrations/locale-configuration-providers/index.js +294 -0
  435. package/schematics/migrations/locale-configuration-providers/schema.json +20 -0
  436. package/schematics/migrations/mandatory-peer-dependencies/README.md +70 -0
  437. package/schematics/migrations/mandatory-peer-dependencies/index.js +42 -0
  438. package/schematics/migrations/mandatory-peer-dependencies/schema.json +15 -0
  439. package/schematics/migrations/markdown-signals/README.md +58 -0
  440. package/schematics/migrations/markdown-signals/data.js +79 -0
  441. package/schematics/migrations/markdown-signals/index.js +639 -0
  442. package/schematics/migrations/markdown-signals/schema.json +20 -0
  443. package/schematics/migrations/modal-dialog-semantics/README.md +106 -0
  444. package/schematics/migrations/modal-dialog-semantics/data.js +110 -0
  445. package/schematics/migrations/modal-dialog-semantics/index.js +58 -0
  446. package/schematics/migrations/modal-dialog-semantics/schema.json +15 -0
  447. package/schematics/migrations/modal-signals/README.md +88 -0
  448. package/schematics/migrations/modal-signals/data.js +132 -0
  449. package/schematics/migrations/modal-signals/index.js +19 -0
  450. package/schematics/migrations/modal-signals/schema.json +20 -0
  451. package/schematics/migrations/navbar-signals-and-aria/README.md +111 -0
  452. package/schematics/migrations/navbar-signals-and-aria/data.js +198 -0
  453. package/schematics/migrations/navbar-signals-and-aria/index.js +568 -0
  454. package/schematics/migrations/navbar-signals-and-aria/schema.json +20 -0
  455. package/schematics/migrations/new-icons-pack/README.md +10 -10
  456. package/schematics/migrations/new-icons-pack/index.js +1 -1
  457. package/schematics/migrations/notification-center-signals/README.md +67 -0
  458. package/schematics/migrations/notification-center-signals/data.js +66 -0
  459. package/schematics/migrations/notification-center-signals/index.js +61 -0
  460. package/schematics/migrations/notification-center-signals/schema.json +15 -0
  461. package/schematics/migrations/option-signals/README.md +37 -0
  462. package/schematics/migrations/option-signals/data.js +86 -0
  463. package/schematics/migrations/option-signals/index.js +19 -0
  464. package/schematics/migrations/option-signals/schema.json +20 -0
  465. package/schematics/migrations/popover-leave-delay/README.md +51 -0
  466. package/schematics/migrations/popover-leave-delay/data.js +61 -0
  467. package/schematics/migrations/popover-leave-delay/index.js +54 -0
  468. package/schematics/migrations/popover-leave-delay/schema.json +15 -0
  469. package/schematics/migrations/progress-bar-percentage-and-aria/README.md +54 -0
  470. package/schematics/migrations/progress-bar-percentage-and-aria/data.js +76 -0
  471. package/schematics/migrations/progress-bar-percentage-and-aria/index.js +58 -0
  472. package/schematics/migrations/progress-bar-percentage-and-aria/schema.json +15 -0
  473. package/schematics/migrations/progress-spinner-signals/README.md +72 -0
  474. package/schematics/migrations/progress-spinner-signals/data.js +83 -0
  475. package/schematics/migrations/progress-spinner-signals/index.js +694 -0
  476. package/schematics/migrations/progress-spinner-signals/schema.json +20 -0
  477. package/schematics/migrations/query-list-signals/README.md +32 -0
  478. package/schematics/migrations/query-list-signals/data.js +70 -0
  479. package/schematics/migrations/query-list-signals/index.js +17 -0
  480. package/schematics/migrations/query-list-signals/schema.json +15 -0
  481. package/schematics/migrations/radio-signals-and-aria/README.md +82 -0
  482. package/schematics/migrations/radio-signals-and-aria/data.js +163 -0
  483. package/schematics/migrations/radio-signals-and-aria/index.js +39 -0
  484. package/schematics/migrations/radio-signals-and-aria/schema.json +20 -0
  485. package/schematics/migrations/read-state-dwell-handlers/README.md +125 -0
  486. package/schematics/migrations/read-state-dwell-handlers/data.js +45 -0
  487. package/schematics/migrations/read-state-dwell-handlers/index.js +215 -0
  488. package/schematics/migrations/read-state-dwell-handlers/schema.json +20 -0
  489. package/schematics/migrations/scrollbar-deprecated-path/README.md +128 -0
  490. package/schematics/migrations/scrollbar-deprecated-path/index.js +20 -0
  491. package/schematics/migrations/scrollbar-deprecated-path/schema.json +20 -0
  492. package/schematics/migrations/select-signal-inputs/README.md +61 -0
  493. package/schematics/migrations/select-signal-inputs/data.js +99 -0
  494. package/schematics/migrations/select-signal-inputs/index.js +57 -0
  495. package/schematics/migrations/select-signal-inputs/schema.json +15 -0
  496. package/schematics/migrations/sidepanel-non-modal-behavior/README.md +57 -0
  497. package/schematics/migrations/sidepanel-non-modal-behavior/data.js +111 -0
  498. package/schematics/migrations/sidepanel-non-modal-behavior/index.js +57 -0
  499. package/schematics/migrations/sidepanel-non-modal-behavior/schema.json +15 -0
  500. package/schematics/migrations/signal-inputs-subclasses/README.md +28 -0
  501. package/schematics/migrations/signal-inputs-subclasses/data.js +69 -0
  502. package/schematics/migrations/signal-inputs-subclasses/index.js +17 -0
  503. package/schematics/migrations/signal-inputs-subclasses/schema.json +15 -0
  504. package/schematics/migrations/split-button-optional-disabled/README.md +47 -0
  505. package/schematics/migrations/split-button-optional-disabled/data.js +53 -0
  506. package/schematics/migrations/split-button-optional-disabled/index.js +57 -0
  507. package/schematics/migrations/split-button-optional-disabled/schema.json +15 -0
  508. package/schematics/migrations/splitter-deprecated-path/README.md +136 -0
  509. package/schematics/migrations/splitter-deprecated-path/index.js +20 -0
  510. package/schematics/migrations/splitter-deprecated-path/schema.json +20 -0
  511. package/schematics/migrations/state-saving-default/README.md +67 -0
  512. package/schematics/migrations/state-saving-default/data.js +88 -0
  513. package/schematics/migrations/state-saving-default/index.js +62 -0
  514. package/schematics/migrations/state-saving-default/schema.json +15 -0
  515. package/schematics/migrations/table-cell-content/README.md +55 -0
  516. package/schematics/migrations/table-cell-content/data.js +66 -0
  517. package/schematics/migrations/table-cell-content/index.js +66 -0
  518. package/schematics/migrations/table-cell-content/schema.json +15 -0
  519. package/schematics/migrations/tabs-signals-and-aria/README.md +93 -0
  520. package/schematics/migrations/tabs-signals-and-aria/data.js +139 -0
  521. package/schematics/migrations/tabs-signals-and-aria/index.js +65 -0
  522. package/schematics/migrations/tabs-signals-and-aria/schema.json +15 -0
  523. package/schematics/migrations/tag-list-cleaner/README.md +58 -0
  524. package/schematics/migrations/tag-list-cleaner/data.js +42 -0
  525. package/schematics/migrations/tag-list-cleaner/index.js +196 -0
  526. package/schematics/migrations/tag-list-cleaner/schema.json +20 -0
  527. package/schematics/migrations/tag-slots/README.md +41 -0
  528. package/schematics/migrations/tag-slots/index.js +190 -0
  529. package/schematics/migrations/tag-slots/schema.json +20 -0
  530. package/schematics/migrations/tags-signals/README.md +85 -0
  531. package/schematics/migrations/tags-signals/data.js +103 -0
  532. package/schematics/migrations/tags-signals/index.js +673 -0
  533. package/schematics/migrations/tags-signals/schema.json +20 -0
  534. package/schematics/migrations/textarea-signals/README.md +72 -0
  535. package/schematics/migrations/textarea-signals/data.js +121 -0
  536. package/schematics/migrations/textarea-signals/index.js +379 -0
  537. package/schematics/migrations/textarea-signals/schema.json +20 -0
  538. package/schematics/migrations/time-range-title-for/README.md +164 -0
  539. package/schematics/migrations/time-range-title-for/data.js +139 -0
  540. package/schematics/migrations/time-range-title-for/index.js +163 -0
  541. package/schematics/migrations/time-range-title-for/schema.json +20 -0
  542. package/schematics/migrations/timepicker-signals/README.md +78 -0
  543. package/schematics/migrations/timepicker-signals/data.js +82 -0
  544. package/schematics/migrations/timepicker-signals/index.js +709 -0
  545. package/schematics/migrations/timepicker-signals/schema.json +20 -0
  546. package/schematics/migrations/timezone-grouping-utils/README.md +73 -0
  547. package/schematics/migrations/timezone-grouping-utils/data.js +101 -0
  548. package/schematics/migrations/timezone-grouping-utils/index.js +64 -0
  549. package/schematics/migrations/timezone-grouping-utils/schema.json +15 -0
  550. package/schematics/migrations/title-encapsulation/README.md +49 -0
  551. package/schematics/migrations/title-encapsulation/data.js +69 -0
  552. package/schematics/migrations/title-encapsulation/index.js +57 -0
  553. package/schematics/migrations/title-encapsulation/schema.json +15 -0
  554. package/schematics/migrations/toast-stack-and-defaults/README.md +102 -0
  555. package/schematics/migrations/toast-stack-and-defaults/data.js +79 -0
  556. package/schematics/migrations/toast-stack-and-defaults/index.js +53 -0
  557. package/schematics/migrations/toast-stack-and-defaults/schema.json +15 -0
  558. package/schematics/migrations/tooltip-pointer-events-and-types/README.md +53 -0
  559. package/schematics/migrations/tooltip-pointer-events-and-types/data.js +89 -0
  560. package/schematics/migrations/tooltip-pointer-events-and-types/index.js +60 -0
  561. package/schematics/migrations/tooltip-pointer-events-and-types/schema.json +15 -0
  562. package/schematics/migrations/top-bar-container-selectors/README.md +111 -0
  563. package/schematics/migrations/top-bar-container-selectors/data.js +56 -0
  564. package/schematics/migrations/top-bar-container-selectors/index.js +84 -0
  565. package/schematics/migrations/top-bar-container-selectors/schema.json +20 -0
  566. package/schematics/migrations/tree-select-signals/README.md +61 -0
  567. package/schematics/migrations/tree-select-signals/data.js +106 -0
  568. package/schematics/migrations/tree-select-signals/index.js +58 -0
  569. package/schematics/migrations/tree-select-signals/schema.json +15 -0
  570. package/schematics/migrations/tree-signals/README.md +82 -0
  571. package/schematics/migrations/tree-signals/data.js +123 -0
  572. package/schematics/migrations/tree-signals/index.js +54 -0
  573. package/schematics/migrations/tree-signals/schema.json +15 -0
  574. package/schematics/migrations/tree-state-saving-default/README.md +66 -0
  575. package/schematics/migrations/tree-state-saving-default/data.js +78 -0
  576. package/schematics/migrations/tree-state-saving-default/index.js +60 -0
  577. package/schematics/migrations/tree-state-saving-default/schema.json +15 -0
  578. package/schematics/migrations/username-pipe-injection/README.md +59 -0
  579. package/schematics/migrations/username-pipe-injection/data.js +78 -0
  580. package/schematics/migrations/username-pipe-injection/index.js +58 -0
  581. package/schematics/migrations/username-pipe-injection/schema.json +15 -0
  582. package/schematics/migrations/v20-upgrade/README.md +36 -16
  583. package/schematics/migrations/v20-upgrade/data.js +124 -77
  584. package/schematics/migrations/v20-upgrade/index.js +6 -213
  585. package/schematics/migrations/v21-upgrade/README.md +271 -0
  586. package/schematics/migrations/v21-upgrade/data.js +1371 -0
  587. package/schematics/migrations/v21-upgrade/index.js +94 -0
  588. package/schematics/migrations/v21-upgrade/schema.json +20 -0
  589. package/schematics/migrations/zoneless-change-detection/README.md +30 -0
  590. package/schematics/migrations/zoneless-change-detection/data.js +29 -0
  591. package/schematics/migrations/zoneless-change-detection/index.js +20 -0
  592. package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
  593. package/schematics/migrations.json +392 -2
  594. package/schematics/ng-add/index.js +515 -14
  595. package/schematics/ng-add/schema.json +15 -0
  596. package/schematics/utils/deprecated-path-migration.js +61 -0
  597. package/schematics/utils/package-config.js +9 -105
  598. package/scrollbar/{_scrollbar-component-theme.scss → deprecated/_scrollbar-component-theme.scss} +1 -1
  599. package/scrollbar/{scrollbar.component.scss → deprecated/scrollbar.component.scss} +1 -1
  600. package/scrollbar/native-scrollbar.scss +68 -0
  601. package/scrollbar/scrollbar-tokens.scss +13 -22
  602. package/scrollbar/scrollbar-track.scss +94 -0
  603. package/scrollbar/scrollbar-viewport.scss +33 -0
  604. package/scrollbar/scrollbar.scss +24 -0
  605. package/search-expandable/search-expandable-tokens.scss +4 -0
  606. package/search-expandable/search-expandable.scss +4 -2
  607. package/select/_select-theme.scss +3 -16
  608. package/select/select.scss +0 -6
  609. package/sidebar/sidebar.scss +20 -0
  610. package/sidepanel/_sidepanel-theme.scss +1 -1
  611. package/sidepanel/sidepanel-tokens.scss +7 -1
  612. package/sidepanel/sidepanel.scss +41 -5
  613. package/skeleton/skeleton-presets.scss +350 -0
  614. package/skeleton/skeleton-tokens.scss +127 -0
  615. package/skeleton/skeleton.scss +53 -45
  616. package/split-button/_split-button-theme.scss +4 -4
  617. package/split-button/split-button.scss +2 -6
  618. package/splitter/{_splitter-theme.scss → deprecated/_splitter-theme.scss} +1 -1
  619. package/splitter/deprecated/splitter.scss +51 -0
  620. package/splitter/splitter-tokens.scss +19 -0
  621. package/splitter/splitter.scss +148 -28
  622. package/table/_table-theme.scss +13 -12
  623. package/table/table-tokens.scss +8 -0
  624. package/table/table.scss +47 -22
  625. package/tabs/_tabs-common.scss +14 -14
  626. package/tabs/_tabs-theme.scss +4 -5
  627. package/tabs/tab-body.scss +49 -1
  628. package/tabs/tab-header.scss +2 -1
  629. package/tags/tag-list.scss +4 -0
  630. package/tags/tag.scss +19 -1
  631. package/time-range/time-range.scss +9 -0
  632. package/timezone/timezone-option.component.scss +4 -7
  633. package/timezone/timezone-select.component.scss +3 -0
  634. package/toast/_toast-theme.scss +1 -4
  635. package/toast/toast-container.component.scss +19 -13
  636. package/toast/toast-tokens.scss +12 -6
  637. package/toast/toast.component.scss +42 -19
  638. package/toggle/_toggle-theme.scss +4 -10
  639. package/toggle/toggle.scss +67 -26
  640. package/tooltip/_tooltip-theme.scss +7 -1
  641. package/tooltip/tooltip-tokens.scss +1 -2
  642. package/tooltip/tooltip.scss +55 -9
  643. package/top-bar/top-bar-tokens.scss +13 -2
  644. package/top-bar/top-bar.scss +24 -19
  645. package/tree/_tree-theme.scss +0 -1
  646. package/tree/toggle.scss +5 -9
  647. package/tree/tree-option.scss +2 -4
  648. package/tree/tree-tokens.scss +2 -1
  649. package/tree/tree.scss +3 -5
  650. package/tree-select/_tree-select-theme.scss +4 -15
  651. package/tree-select/tree-select-tokens.scss +16 -0
  652. package/tree-select/tree-select.scss +0 -6
  653. package/{accordion/index.d.ts → types/koobiq-components-accordion.d.ts} +102 -84
  654. package/{actions-panel/index.d.ts → types/koobiq-components-actions-panel.d.ts} +44 -59
  655. package/{alert/index.d.ts → types/koobiq-components-alert.d.ts} +8 -3
  656. package/types/koobiq-components-app-switcher.d.ts +406 -0
  657. package/types/koobiq-components-autocomplete.d.ts +443 -0
  658. package/{badge/index.d.ts → types/koobiq-components-badge.d.ts} +25 -20
  659. package/{breadcrumbs/index.d.ts → types/koobiq-components-breadcrumbs.d.ts} +97 -46
  660. package/types/koobiq-components-button-toggle.d.ts +340 -0
  661. package/types/koobiq-components-button.d.ts +296 -0
  662. package/types/koobiq-components-checkbox.d.ts +172 -0
  663. package/types/koobiq-components-clamped-text.d.ts +184 -0
  664. package/{code-block/index.d.ts → types/koobiq-components-code-block.d.ts} +114 -79
  665. package/{content-panel/index.d.ts → types/koobiq-components-content-panel.d.ts} +81 -25
  666. package/{core/index.d.ts → types/koobiq-components-core.d.ts} +2827 -865
  667. package/{datepicker/index.d.ts → types/koobiq-components-datepicker.d.ts} +161 -116
  668. package/types/koobiq-components-divider.d.ts +43 -0
  669. package/types/koobiq-components-dl.d.ts +235 -0
  670. package/{dropdown/index.d.ts → types/koobiq-components-dropdown.d.ts} +245 -239
  671. package/types/koobiq-components-ellipsis-center.d.ts +85 -0
  672. package/types/koobiq-components-empty-state.d.ts +106 -0
  673. package/{file-upload/index.d.ts → types/koobiq-components-file-upload.d.ts} +214 -107
  674. package/{filter-bar/index.d.ts → types/koobiq-components-filter-bar.d.ts} +410 -495
  675. package/types/koobiq-components-flag.d.ts +68 -0
  676. package/{form-field/index.d.ts → types/koobiq-components-form-field.d.ts} +167 -191
  677. package/types/koobiq-components-icon.d.ts +333 -0
  678. package/{inline-edit/index.d.ts → types/koobiq-components-inline-edit.d.ts} +109 -46
  679. package/types/koobiq-components-input.d.ts +477 -0
  680. package/types/koobiq-components-link-deprecated.d.ts +101 -0
  681. package/types/koobiq-components-link.d.ts +176 -0
  682. package/{list/index.d.ts → types/koobiq-components-list.d.ts} +162 -99
  683. package/types/koobiq-components-loader-overlay.d.ts +101 -0
  684. package/{markdown/index.d.ts → types/koobiq-components-markdown.d.ts} +16 -24
  685. package/types/koobiq-components-modal.d.ts +666 -0
  686. package/types/koobiq-components-navbar.d.ts +569 -0
  687. package/types/koobiq-components-notification-center.d.ts +500 -0
  688. package/{overflow-items/index.d.ts → types/koobiq-components-overflow-items.d.ts} +8 -22
  689. package/types/koobiq-components-popover.d.ts +468 -0
  690. package/types/koobiq-components-progress-bar.d.ts +67 -0
  691. package/{progress-spinner/index.d.ts → types/koobiq-components-progress-spinner.d.ts} +33 -10
  692. package/types/koobiq-components-radio.d.ts +294 -0
  693. package/{resizer/index.d.ts → types/koobiq-components-resizer.d.ts} +37 -2
  694. package/{scrollbar/index.d.ts → types/koobiq-components-scrollbar-deprecated.d.ts} +18 -1
  695. package/types/koobiq-components-scrollbar.d.ts +154 -0
  696. package/types/koobiq-components-search-expandable.d.ts +164 -0
  697. package/{select/index.d.ts → types/koobiq-components-select.d.ts} +360 -167
  698. package/types/koobiq-components-sidebar.d.ts +152 -0
  699. package/types/koobiq-components-sidepanel.d.ts +436 -0
  700. package/types/koobiq-components-skeleton.d.ts +234 -0
  701. package/types/koobiq-components-split-button.d.ts +65 -0
  702. package/{splitter/index.d.ts → types/koobiq-components-splitter-deprecated.d.ts} +44 -1
  703. package/types/koobiq-components-splitter.d.ts +406 -0
  704. package/types/koobiq-components-table.d.ts +44 -0
  705. package/types/koobiq-components-tabs.d.ts +888 -0
  706. package/{tags/index.d.ts → types/koobiq-components-tags.d.ts} +249 -133
  707. package/types/koobiq-components-textarea.d.ts +178 -0
  708. package/{time-range/index.d.ts → types/koobiq-components-time-range.d.ts} +135 -62
  709. package/types/koobiq-components-timepicker.d.ts +223 -0
  710. package/types/koobiq-components-timezone.d.ts +266 -0
  711. package/types/koobiq-components-title.d.ts +184 -0
  712. package/types/koobiq-components-toast.d.ts +289 -0
  713. package/types/koobiq-components-toggle.d.ts +121 -0
  714. package/types/koobiq-components-tooltip.d.ts +610 -0
  715. package/types/koobiq-components-top-bar.d.ts +61 -0
  716. package/types/koobiq-components-tree-select.d.ts +667 -0
  717. package/types/koobiq-components-tree.d.ts +1290 -0
  718. package/types/koobiq-components-username.d.ts +340 -0
  719. package/username/_username-theme.scss +35 -0
  720. package/username/username.scss +10 -34
  721. package/app-switcher/index.d.ts +0 -276
  722. package/autocomplete/index.d.ts +0 -286
  723. package/button/index.d.ts +0 -153
  724. package/button-toggle/index.d.ts +0 -162
  725. package/checkbox/index.d.ts +0 -163
  726. package/clamped-text/index.d.ts +0 -146
  727. package/core/styles/_tokens.scss +0 -7
  728. package/core/styles/common/_clearfix.scss +0 -13
  729. package/core/styles/common/_popup.scss +0 -6
  730. package/core/styles/functions/_index.scss +0 -3
  731. package/core/styles/functions/_number.scss +0 -60
  732. package/core/styles/functions/_string.scss +0 -18
  733. package/core/styles/theming/scrollbar-tokens.scss +0 -25
  734. package/core/styles/typography/_typography-utils.scss +0 -84
  735. package/divider/index.d.ts +0 -20
  736. package/dl/index.d.ts +0 -45
  737. package/ellipsis-center/index.d.ts +0 -71
  738. package/empty-state/index.d.ts +0 -45
  739. package/flag/index.d.ts +0 -44
  740. package/icon/index.d.ts +0 -200
  741. package/input/index.d.ts +0 -354
  742. package/link/index.d.ts +0 -56
  743. package/loader-overlay/index.d.ts +0 -57
  744. package/modal/index.d.ts +0 -339
  745. package/navbar/index.d.ts +0 -372
  746. package/notification-center/index.d.ts +0 -323
  747. package/popover/index.d.ts +0 -182
  748. package/prebuilt-themes/dark-theme.css +0 -1
  749. package/prebuilt-themes/light-theme.css +0 -1
  750. package/progress-bar/index.d.ts +0 -31
  751. package/radio/index.d.ts +0 -203
  752. package/search-expandable/index.d.ts +0 -101
  753. package/sidebar/index.d.ts +0 -94
  754. package/sidepanel/index.d.ts +0 -272
  755. package/skeleton/index.d.ts +0 -26
  756. package/split-button/index.d.ts +0 -46
  757. package/table/index.d.ts +0 -25
  758. package/tabs/index.d.ts +0 -677
  759. package/textarea/index.d.ts +0 -138
  760. package/timepicker/index.d.ts +0 -197
  761. package/timezone/index.d.ts +0 -125
  762. package/title/index.d.ts +0 -139
  763. package/toast/index.d.ts +0 -187
  764. package/toggle/index.d.ts +0 -104
  765. package/tooltip/index.d.ts +0 -335
  766. package/top-bar/index.d.ts +0 -33
  767. package/tree/index.d.ts +0 -802
  768. package/tree-select/index.d.ts +0 -475
  769. package/username/index.d.ts +0 -194
  770. /package/{dynamic-translation/index.d.ts → types/koobiq-components-dynamic-translation.d.ts} +0 -0
  771. /package/{index.d.ts → types/koobiq-components.d.ts} +0 -0
@@ -1,23 +1,24 @@
1
- import { CdkMonitorFocus, A11yModule } from '@angular/cdk/a11y';
2
- import { Directionality } from '@angular/cdk/bidi';
3
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
1
+ import { CdkMonitorFocus } from '@angular/cdk/a11y';
4
2
  import { SelectionModel } from '@angular/cdk/collections';
5
- import { CdkOverlayOrigin, CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
3
+ import { CdkConnectedOverlay, CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';
6
4
  import { Platform, _getEventTarget } from '@angular/cdk/platform';
7
5
  import { NgTemplateOutlet } from '@angular/common';
8
6
  import * as i0 from '@angular/core';
9
- import { InjectionToken, inject, ElementRef, ChangeDetectorRef, NgZone, Renderer2, viewChild, contentChild, TemplateRef, EventEmitter, output, input, booleanAttribute, numberAttribute, computed, DestroyRef, effect, afterNextRender, Input, Output, ViewChildren, ViewChild, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
10
- import { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { InjectionToken, inject, ElementRef, ChangeDetectorRef, Injector, Renderer2, signal, viewChild, viewChildren, contentChild, TemplateRef, input, EventEmitter, output, computed, booleanAttribute, linkedSignal, numberAttribute, DestroyRef, effect, afterNextRender, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
8
+ import { outputFromObservable, outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
9
  import { NgForm, FormGroupDirective, NgControl } from '@angular/forms';
12
- import { KbqAbstractSelect, getKbqSelectDynamicMultipleError, isInput, shouldSelectSearchText, KbqComponentColors, ErrorStateMatcher, KBQ_SELECT_SCROLL_STRATEGY, KBQ_LOCALE_SERVICE, defaultOffsetY, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KBQ_PANEL_DEFAULT_MIN_WIDTH, kbqResolvePanelMaxHeightToken, KbqSelectAllEvent, MultipleMode, DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, ESCAPE, TAB, HOME, END, PAGE_UP, PAGE_DOWN, isSelectAll, hasModifierKey, isUndefined, getKbqSelectNonArrayValueError, kbqSelectAnimations, KBQ_PARENT_POPUP, kbqSiblingPopupProvider, KbqSelectFooter, KbqSelectSearchEmptyResult, KbqPseudoCheckboxModule } from '@koobiq/components/core';
10
+ import * as i1 from '@koobiq/components/core';
11
+ import { KbqAbstractSelect, isInput, shouldSelectSearchText, runClearPredicate, ErrorStateMatcher, KBQ_SELECT_SCROLL_STRATEGY, KBQ_OVERLAY_LAYERS, KbqErrorStateTracker, defaultOffsetY, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, kbqQueryListFrom, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqLocaleOverridesDirective, KBQ_SELECT_LOCALE_CONFIGURATION, kbqSelectAllHandlerTransform, KBQ_PANEL_DEFAULT_MIN_WIDTH, kbqResolvePanelMaxHeightToken, KbqComponentColors, getKbqSelectDynamicMultipleError, KbqSelectAllEvent, MultipleMode, DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, ESCAPE, TAB, HOME, END, PAGE_UP, PAGE_DOWN, isSelectAll, hasModifierKey, isUndefined, getKbqSelectNonArrayValueError, KBQ_PARENT_POPUP, kbqSiblingPopupProvider, KbqSelectFooter, KbqSelectSearchEmptyResult } from '@koobiq/components/core';
13
12
  import { KBQ_FORM_FIELD, KbqCleaner, KbqFormFieldControl, kbqCleanerFactoryProvider, KbqFormFieldModule } from '@koobiq/components/form-field';
14
- import * as i1 from '@koobiq/components/icon';
13
+ import * as i2 from '@koobiq/components/icon';
15
14
  import { KbqIconModule } from '@koobiq/components/icon';
16
- import { KbqTagRemove, KbqTag, KbqTagsModule } from '@koobiq/components/tags';
17
- import { KbqTreeSelection, KbqTree, KbqTreeModule } from '@koobiq/components/tree';
15
+ import { KbqScrollbarViewport } from '@koobiq/components/scrollbar';
16
+ import { KbqSelectNoOptions } from '@koobiq/components/select';
17
+ import { KbqTag, KbqTagRemove, KbqTagsModule } from '@koobiq/components/tags';
18
+ import { KbqTreeSelection, KbqTreeModule } from '@koobiq/components/tree';
18
19
  import { SizeXxs } from '@koobiq/design-tokens';
19
- import { Subject, defer, merge, Subscription, fromEvent, audit } from 'rxjs';
20
- import { filter, map, startWith, switchMap, take, delay, debounceTime, distinctUntilChanged } from 'rxjs/operators';
20
+ import { Subject, defer, merge, Subscription, fromEvent, audit, timer } from 'rxjs';
21
+ import { filter, map, startWith, switchMap, delay, debounceTime, distinctUntilChanged, take } from 'rxjs/operators';
21
22
 
22
23
  let nextUniqueId = 0;
23
24
  /** Injection token that can be used to provide the default options for the `kbq-tree-select`. */
@@ -31,7 +32,19 @@ const kbqTreeSelectOptionsProvider = (options) => {
31
32
  };
32
33
  /** Change event object that is emitted when the select value has changed. */
33
34
  class KbqTreeSelectChange {
34
- constructor(source, value, isUserInput = false, values) {
35
+ constructor(
36
+ /** Select the change comes from. */
37
+ source,
38
+ /**
39
+ * Option the change is about — a `KbqTreeOption` whenever the changed node is rendered, and the
40
+ * raw value of the node when it is not. `null` when the change is not about a single option,
41
+ * which today means the cleaner was activated; `values` then carries the nodes it removed.
42
+ */
43
+ value,
44
+ /** Whether the change was made by the user rather than written to the model. */
45
+ isUserInput = false,
46
+ /** Every option the change is about, when it covers more than one. */
47
+ values) {
35
48
  this.source = source;
36
49
  this.value = value;
37
50
  this.isUserInput = isUserInput;
@@ -39,114 +52,33 @@ class KbqTreeSelectChange {
39
52
  }
40
53
  }
41
54
  class KbqTreeSelect extends KbqAbstractSelect {
42
- // TODO: Skipped for migration because:
43
- // Accessor inputs cannot be migrated as they are too complex.
44
- get placeholder() {
45
- return this._placeholder;
46
- }
47
- set placeholder(value) {
48
- this._placeholder = value;
49
- this.stateChanges.next();
50
- }
51
- // TODO: Skipped for migration because:
52
- // Accessor inputs cannot be migrated as they are too complex.
53
- get required() {
54
- return this._required;
55
- }
56
- set required(value) {
57
- this._required = coerceBooleanProperty(value);
58
- this.stateChanges.next();
59
- }
60
- // TODO: Skipped for migration because:
61
- // Accessor inputs cannot be migrated as they are too complex.
62
- get multiple() {
63
- return this._multiple;
64
- }
65
- set multiple(value) {
66
- if (this.selectionModel) {
67
- throw getKbqSelectDynamicMultipleError();
68
- }
69
- this._multiple = coerceBooleanProperty(value);
70
- }
71
- // TODO: Skipped for migration because:
72
- // Accessor inputs cannot be migrated as they are too complex.
73
- get autoSelect() {
74
- if (this.multiSelection) {
75
- return false;
76
- }
77
- return this._autoSelect;
78
- }
79
- set autoSelect(value) {
80
- this._autoSelect = coerceBooleanProperty(value);
81
- }
82
- get value() {
83
- return this.tree().getSelectedValues();
55
+ /** Reference to the CDK connected overlay directive. */
56
+ get overlayDir() {
57
+ return this.overlayDirQuery();
84
58
  }
85
- // TODO: Skipped for migration because:
86
- // Accessor inputs cannot be migrated as they are too complex.
87
- get id() {
88
- return this._id;
59
+ get tags() {
60
+ return this.tagsList();
89
61
  }
90
- set id(value) {
91
- this._id = value || this.uid;
92
- this.stateChanges.next();
93
- }
94
- // TODO: Skipped for migration because:
95
- // Accessor inputs cannot be migrated as they are too complex.
96
- get hasBackdrop() {
97
- return this._hasBackdrop;
62
+ /** Whether multiple nodes can be selected. Cannot be changed once the selection model exists. */
63
+ get multiple() {
64
+ return this.multipleValue ?? this.multipleInput();
98
65
  }
99
- set hasBackdrop(value) {
100
- this._hasBackdrop = coerceBooleanProperty(value);
66
+ /** Whether moving the active node selects it. Always off in multiple selection. */
67
+ get autoSelect() {
68
+ return !this.multiSelection && this.autoSelectInput();
101
69
  }
102
- // TODO: Skipped for migration because:
103
- // Accessor inputs cannot be migrated as they are too complex.
70
+ /** Tab index of the select, `-1` while it is disabled. A value that is not an integer keeps the last valid one. */
104
71
  get tabIndex() {
105
- return this.disabled ? -1 : this._tabIndex;
106
- }
107
- set tabIndex(value) {
108
- if (Number.isInteger(value) || value === null) {
109
- this._tabIndex = value;
110
- }
111
- }
112
- // TODO: Skipped for migration because:
113
- // Accessor inputs cannot be migrated as they are too complex.
114
- get disabled() {
115
- return this._disabled;
116
- }
117
- set disabled(value) {
118
- if (value !== this.disabled) {
119
- this._disabled = value;
120
- if (this.parentFormField) {
121
- Promise.resolve().then(() => {
122
- if (this._disabled) {
123
- this.parentFormField.stopFocusMonitor();
124
- }
125
- else {
126
- this.parentFormField.runFocusMonitor();
127
- }
128
- });
129
- }
130
- // Let the parent form field know to run change detection when the disabled state changes.
131
- this.stateChanges.next();
132
- }
72
+ return this.resolvedTabIndex();
133
73
  }
134
74
  /**
135
75
  * Function for handling the combination Ctrl + A (select all). By default, the internal handler is used.
136
76
  */
137
- // TODO: Skipped for migration because:
138
- // Accessor inputs cannot be migrated as they are too complex.
139
77
  get selectAllHandler() {
140
- return this._selectAllHandler;
141
- }
142
- set selectAllHandler(fn) {
143
- if (typeof fn !== 'function') {
144
- throw Error('`selectAllHandler` must be a function.');
145
- }
146
- this._selectAllHandler = fn;
78
+ return this.selectAllHandlerInput() ?? this.defaultSelectAllHandler;
147
79
  }
148
80
  /** Function for handling the combination Ctrl + A (select all). By default, the internal handler is used. */
149
- _selectAllHandler(event, select) {
81
+ defaultSelectAllHandler(event, select) {
150
82
  const searchInput = isInput(event) ? event.target : null;
151
83
  if (shouldSelectSearchText(searchInput)) {
152
84
  searchInput.select();
@@ -159,97 +91,93 @@ class KbqTreeSelect extends KbqAbstractSelect {
159
91
  // `onSelectAll` is emitted by the tree subscription set up in `ngAfterContentInit`.
160
92
  select.tree().selectAllOptions(select.selectAll() || select.selectAllToggle());
161
93
  }
162
- /** Whether the select is focused. */
163
- get focused() {
164
- return this._focused || this._panelOpen;
165
- }
166
- set focused(value) {
167
- this._focused = value;
168
- }
169
94
  /** Whether multiple choice is enabled or not. True if multiple or multiline */
170
95
  get multiSelection() {
171
96
  return this.multiple || this.multiline();
172
97
  }
173
- /**
174
- * Controls when the search functionality is displayed based on the number of available options.
175
- *
176
- * Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
177
- * @default undefined
178
- */
179
- // TODO: Skipped for migration because:
180
- // Accessor inputs cannot be migrated as they are too complex.
181
- set searchMinOptionsThreshold(value) {
182
- this._searchMinOptionsThreshold =
183
- this.resolveSearchMinOptionsThreshold(value) ??
184
- this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold);
185
- }
186
- get searchMinOptionsThreshold() {
187
- return this._searchMinOptionsThreshold;
188
- }
189
98
  get panelOpen() {
190
- return this._panelOpen;
99
+ return this.panelOpenValue();
191
100
  }
192
101
  /** Whether the overlay panel is currently on screen. Part of the `KbqSiblingPopup` contract. */
193
102
  get isAttached() {
194
- return this._panelOpen;
103
+ return this.panelOpenValue();
195
104
  }
196
105
  /**
197
106
  * Whether the cleaner (clear button) should be shown.
107
+ *
198
108
  * @docs-private
199
109
  */
200
110
  get canShowCleaner() {
201
111
  return !!this.cleaner()?.canShow;
202
112
  }
203
- /** @docs-private */
204
- get colorForState() {
205
- const hasLegacyValidateDirective = this.elementRef.nativeElement.classList.contains('kbq-control_has-validate-directive');
206
- return (hasLegacyValidateDirective && this.ngControl?.invalid) || this.errorState
207
- ? KbqComponentColors.Error
208
- : KbqComponentColors.ContrastFade;
113
+ /**
114
+ * Whether the cleaner still has a node to remove.
115
+ *
116
+ * @docs-private
117
+ */
118
+ get canClear() {
119
+ return !!this.selectionModel?.selected.some((node) => runClearPredicate(this.clearPredicate(), node));
120
+ }
121
+ /** Selected nodes the cleaner removes, in selection order. */
122
+ get clearTargets() {
123
+ return this.selectionModel?.selected.filter((node) => runClearPredicate(this.clearPredicate(), node)) ?? [];
124
+ }
125
+ /**
126
+ * The tree answers for any node; the option is asked only for its own `[disabled]` input, and a
127
+ * node inside a collapsed branch has no option to ask.
128
+ */
129
+ isNodeDisabled(node) {
130
+ const tree = this.tree();
131
+ if (!tree)
132
+ return false;
133
+ if (tree.disabled || tree.treeControl.isDisabled(node))
134
+ return true;
135
+ return tree.renderedOptions.find((option) => option.data === node)?.disabled ?? false;
136
+ }
137
+ /**
138
+ * Accessible name of the combobox.
139
+ *
140
+ * A combobox takes its name from the author only, so the placeholder rendered inside the trigger does
141
+ * not name it. Falling back to the placeholder text keeps a control that was given neither an
142
+ * `aria-label` nor an `aria-labelledby` from being announced blank — the shape every consumer in the
143
+ * repository is in. Left off while `aria-labelledby` is set, which outranks `aria-label` anyway.
144
+ */
145
+ get ariaLabelText() {
146
+ return this.resolvedAriaLabel();
209
147
  }
210
148
  constructor() {
211
149
  super();
212
150
  this.elementRef = inject(ElementRef);
213
151
  this.changeDetectorRef = inject(ChangeDetectorRef);
214
- this.ngZone = inject(NgZone);
152
+ this.injector = inject(Injector);
215
153
  this.renderer = inject(Renderer2);
216
154
  this.defaultErrorStateMatcher = inject(ErrorStateMatcher);
217
155
  this.scrollStrategyFactory = inject(KBQ_SELECT_SCROLL_STRATEGY);
218
- this.dir = inject(Directionality, { optional: true });
156
+ this.overlayLayers = inject(KBQ_OVERLAY_LAYERS);
219
157
  this.parentForm = inject(NgForm, { optional: true });
220
158
  this.parentFormGroup = inject(FormGroupDirective, { optional: true });
221
159
  this.parentFormField = inject(KBQ_FORM_FIELD, { host: true, optional: true });
222
160
  this.ngControl = inject(NgControl, { optional: true, self: true });
223
- this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
224
161
  this.isBrowser = inject(Platform).isBrowser;
225
162
  this.defaultOptions = inject(KBQ_TREE_SELECT_OPTIONS, { optional: true });
163
+ this.errorStateTracker = new KbqErrorStateTracker(this.defaultErrorStateMatcher, this.ngControl, this.parentFormGroup, this.parentForm);
226
164
  /** Whether the component is in an error state. */
227
- this.errorState = false;
228
- /**
229
- * Emits whenever the component state changes and should cause the parent
230
- * form-field to update. Implemented as part of `KbqFormFieldControl`.
231
- * @docs-private
232
- */
233
- this.stateChanges = new Subject();
165
+ this.errorState = this.errorStateTracker.errorState;
234
166
  /** A name for this control that can be used by `kbq-form-field`. */
235
167
  this.controlType = 'select';
236
- this.hiddenItems = 0;
168
+ /**
169
+ * A `kbq-tree-select` is not a native labelable element, so the form-field's `<label for>` cannot
170
+ * associate with it. The control is named through `aria-labelledby` instead.
171
+ */
172
+ this.isNativeLabelSupported = false;
173
+ /** Number of the selected items that do not fit into the trigger. */
174
+ this.hiddenItems = signal(0, ...(ngDevMode ? [{ debugName: "hiddenItems" }] : /* istanbul ignore next */ []));
237
175
  /** The cached font-size of the trigger element. */
238
176
  this.triggerFontSize = 0;
239
- /** The value of the select panel's transform-origin property. */
240
- this.transformOrigin = 'top';
241
- /** Emits when the panel element is finished transforming in. */
177
+ /** Emits once the panel has rendered (`'showing'`) or has been removed (`'void'`). */
242
178
  this.panelDoneAnimatingStream = new Subject();
243
179
  /** Strategy that will be used to handle scrolling while the select panel is open. */
244
180
  this.scrollStrategy = this.scrollStrategyFactory();
245
- /**
246
- * The y-offset of the overlay panel in relation to the trigger.
247
- *
248
- * @deprecated noop. The trigger↔panel gap is now controlled by the `--kbq-connected-overlay-gap` CSS
249
- * variable (transparent padding inside the pane via the `kbq-connected-overlay_below/_above` panel
250
- * classes), not by a physical overlay offset — so setting this has no effect. Will be removed in 21.0.0.
251
- */
252
- this.offsetY = 0;
253
181
  /**
254
182
  * Minimum space to keep between the overlay and the viewport edge.
255
183
  * At least `defaultOffsetY` so CDK's fit check — which runs before the `kbq-connected-overlay_below/_above`
@@ -284,23 +212,39 @@ class KbqTreeSelect extends KbqAbstractSelect {
284
212
  */
285
213
  this.trigger = viewChild.required('trigger');
286
214
  /** Reference to the overlay panel element. */
287
- this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : []));
215
+ this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
288
216
  /** Scrollable option list inside the panel. */
289
- this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : []));
217
+ this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : /* istanbul ignore next */ []));
218
+ /** The options container's custom scrollbar viewport, flashed when the panel opens. */
219
+ this.scrollbarViewport = viewChild(KbqScrollbarViewport, ...(ngDevMode ? [{ debugName: "scrollbarViewport" }] : /* istanbul ignore next */ []));
220
+ this.overlayDirQuery = viewChild(CdkConnectedOverlay, ...(ngDevMode ? [{ debugName: "overlayDirQuery" }] : /* istanbul ignore next */ []));
221
+ this.tagsQuery = viewChildren(KbqTag, ...(ngDevMode ? [{ debugName: "tagsQuery" }] : /* istanbul ignore next */ []));
222
+ this.tagsList = kbqQueryListFrom(this.tagsQuery);
290
223
  /**
291
224
  * Reference to the optional cleaner element for clearing selection.
225
+ *
292
226
  * @docs-private
293
227
  */
294
- this.cleaner = contentChild(KbqCleaner, ...(ngDevMode ? [{ debugName: "cleaner", descendants: false }] : [{ descendants: false }]));
228
+ this.cleaner = contentChild(KbqCleaner, { ...(ngDevMode ? { debugName: "cleaner" } : /* istanbul ignore next */ {}), descendants: false });
295
229
  /** User-supplied override of the trigger element. */
296
- this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : []));
297
- this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : []));
298
- this.customTagTemplateRef = contentChild('kbqSelectTagContent', ...(ngDevMode ? [{ debugName: "customTagTemplateRef", read: TemplateRef }] : [{ read: TemplateRef }]));
299
- this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : []));
300
- this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : []));
301
- // TODO: Skipped for migration because:
302
- // Your application code writes to the input. This prevents migration.
303
- this.hiddenItemsText = '+{{ number }}';
230
+ this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : /* istanbul ignore next */ []));
231
+ this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : /* istanbul ignore next */ []));
232
+ this.customTagTemplateRef = contentChild('kbqSelectTagContent', { ...(ngDevMode ? { debugName: "customTagTemplateRef" } : /* istanbul ignore next */ {}), read: TemplateRef });
233
+ this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []));
234
+ this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
235
+ /** Message projected for an empty tree — the only thing the panel opens onto without options. */
236
+ this.noOptionsMessage = contentChild(KbqSelectNoOptions, ...(ngDevMode ? [{ debugName: "noOptionsMessage" }] : /* istanbul ignore next */ []));
237
+ /**
238
+ * Text of the counter of the selected items that do not fit into the trigger. `{{ number }}` is
239
+ * replaced with their number.
240
+ *
241
+ * Left unset, the text follows the active locale (`select.hiddenItemsText`); set, it wins over the
242
+ * locale and survives a locale change.
243
+ */
244
+ this.hiddenItemsText = input(undefined, ...(ngDevMode ? [{ debugName: "hiddenItemsText" }] : /* istanbul ignore next */ []));
245
+ /** Formats the counter of the items that do not fit into the trigger. */
246
+ this.hiddenItemsTextFormatter = input((hiddenItemsText, hiddenItems) => hiddenItemsText.replace('{{ number }}', hiddenItems.toString()), ...(ngDevMode ? [{ debugName: "hiddenItemsTextFormatter" }] : /* istanbul ignore next */ []));
247
+ this.localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('select', KBQ_SELECT_LOCALE_CONFIGURATION);
304
248
  /**
305
249
  * Event emitted when the select panel has been toggled.
306
250
  * Also serves as the `openedChange` member of the `KbqSiblingPopup` contract — a tooltip sharing
@@ -308,10 +252,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
308
252
  * `ngOnInit`) matters beyond this output's original consumers.
309
253
  */
310
254
  this.openedChange = new EventEmitter();
255
+ /** @docs-private */
256
+ this.openedChangeOutput = outputFromObservable(this.openedChange, { alias: 'openedChange' });
311
257
  /** Event emitted when the select has been opened. */
312
258
  this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
259
+ /** @docs-private */
260
+ this.openedOutput = outputFromObservable(this.openedStream, { alias: 'opened' });
313
261
  /** Event emitted when the select has been closed. */
314
262
  this.closedStream = this.openedChange.pipe(filter((o) => !o), map(() => { }));
263
+ /** @docs-private */
264
+ this.closedOutput = outputFromObservable(this.closedStream, { alias: 'closed' });
315
265
  /** Event emitted when the selected value has been changed by the user. */
316
266
  this.selectionChange = output();
317
267
  /**
@@ -319,43 +269,87 @@ class KbqTreeSelect extends KbqAbstractSelect {
319
269
  * checkbox, the Ctrl/Cmd + A shortcut, or a custom `selectAllHandler` that delegates to it.
320
270
  */
321
271
  this.onSelectAll = output();
272
+ /** Classes to be passed to the select panel. Supports the same syntax as the `[class]` binding. */
273
+ this.panelClass = input(undefined, ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
274
+ this.backdropClass = input('cdk-overlay-transparent-backdrop', ...(ngDevMode ? [{ debugName: "backdropClass" }] : /* istanbul ignore next */ []));
322
275
  /**
323
- * Event that emits whenever the raw value of the select changes. This is here primarily
324
- * to facilitate the two-way binding for the `value` input.
325
- * @docs-private
276
+ * Name of the control, for when no element on the page carries it. Defaults to the placeholder.
277
+ *
278
+ * Prefer `aria-labelledby` and point it at visible text: a name that duplicates a visible label is one
279
+ * more string to keep in sync, and a name with no visible counterpart cannot be spoken back by voice
280
+ * control (WCAG 2.5.3).
326
281
  */
327
- this.valueChange = output();
328
- /** Classes to be passed to the select panel. Supports the same syntax as the `[class]` binding. */
329
- this.panelClass = input(undefined, ...(ngDevMode ? [{ debugName: "panelClass" }] : []));
330
- this.backdropClass = input('cdk-overlay-transparent-backdrop', ...(ngDevMode ? [{ debugName: "backdropClass" }] : []));
282
+ this.ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
283
+ /**
284
+ * Id of the element that names the control. Defaults to the `kbq-label` of a wrapping `kbq-form-field`.
285
+ *
286
+ * A `role="combobox"` element takes its name from the author only, so neither the placeholder nor the
287
+ * selected values name it, and the `<label for>` of the form field names labelable elements only, which
288
+ * a custom control is not. Without a form-field label, point this at whatever visible text names the
289
+ * control.
290
+ */
291
+ this.ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
292
+ /**
293
+ * Id of the element that names the control: its own `aria-labelledby`, or else the form-field label.
294
+ *
295
+ * @internal
296
+ */
297
+ this.resolvedAriaLabelledby = computed(() => this.ariaLabelledby() ?? this.parentFormField?.labelId() ?? null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabelledby" }] : /* istanbul ignore next */ []));
298
+ /** Object used to control when error messages are shown. */
299
+ this.errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
300
+ /**
301
+ * Function used to sort the values in a select in multiple mode, by default their order in the panel.
302
+ * Follows the same logic as `Array.prototype.sort`. Receives two selected data nodes and every data node of the
303
+ * tree in panel order, collapsed branches included — a node in a collapsed branch has no option.
304
+ */
305
+ this.sortComparator = input(undefined, ...(ngDevMode ? [{ debugName: "sortComparator" }] : /* istanbul ignore next */ []));
331
306
  /**
332
- * Function used to sort the values in a select in multiple mode.
333
- * Follows the same logic as `Array.prototype.sort`.
307
+ * Decides which selected nodes the projected `KbqCleaner` removes: return `true` to clear the node,
308
+ * `false` to keep it. Receives the data node, not the option — a node in a collapsed branch has no
309
+ * option. Disabled nodes are kept by default. Bind a stable reference — a new function on every
310
+ * change detection re-runs the predicate over the whole selection.
311
+ *
312
+ * Not consulted by `writeValue` / `reset()`, which always clear everything. The parameter type becomes the select's
313
+ * `T` in a template: type it with the tree's node, not with an option.
334
314
  */
335
- this.sortComparator = input(undefined, ...(ngDevMode ? [{ debugName: "sortComparator" }] : []));
315
+ this.clearPredicate = input(this.defaultOptions?.clearPredicate ?? ((node) => !this.isNodeDisabled(node)), { ...(ngDevMode ? { debugName: "clearPredicate" } : /* istanbul ignore next */ {}), transform: (fn) => {
316
+ if (typeof fn !== 'function') {
317
+ throw Error('`clearPredicate` must be a function.');
318
+ }
319
+ return fn;
320
+ } });
336
321
  /**
337
322
  * Whether to use a multiline matcher or not. Default is false
338
323
  */
339
- this.multiline = input(false, ...(ngDevMode ? [{ debugName: "multiline", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
324
+ this.multiline = input(false, { ...(ngDevMode ? { debugName: "multiline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
340
325
  /** Combined stream of all of the child options' change events. */
341
326
  this.optionSelectionChanges = defer(() => {
342
327
  if (this.options) {
343
- return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.onSelectionChange)))));
328
+ return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.selectionChange)))));
344
329
  }
345
- return this.ngZone.onStable.asObservable().pipe(take(1), switchMap(() => this.optionSelectionChanges));
330
+ return this.optionsInitialized.pipe(switchMap(() => this.optionSelectionChanges));
346
331
  });
347
332
  /** Combined stream of all of the child options userInteraction events. */
348
333
  this.userInteractionChanges = defer(() => {
349
334
  if (this.options) {
350
335
  return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => option.userInteraction))));
351
336
  }
352
- return this.ngZone.onStable.asObservable().pipe(take(1), switchMap(() => this.userInteractionChanges));
337
+ return this.optionsInitialized.pipe(switchMap(() => this.userInteractionChanges));
353
338
  });
354
- this._required = false;
355
- this._multiple = false;
356
- this._autoSelect = true;
339
+ /** Emits once `options` is assigned, for subscribers that arrive before the content is resolved. */
340
+ this.optionsInitialized = new Subject();
341
+ /** Placeholder shown in the trigger while nothing is selected. */
342
+ this.placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
343
+ /** Whether the select is required. */
344
+ this.required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
345
+ /** @docs-private */
346
+ this.multipleInput = input(false, { ...(ngDevMode ? { debugName: "multipleInput" } : /* istanbul ignore next */ {}), alias: 'multiple',
347
+ transform: booleanAttribute });
348
+ /** @docs-private */
349
+ this.autoSelectInput = input(true, { ...(ngDevMode ? { debugName: "autoSelectInput" } : /* istanbul ignore next */ {}), alias: 'autoSelect',
350
+ transform: booleanAttribute });
357
351
  /** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
358
- this.selectAllToggle = input(false, ...(ngDevMode ? [{ debugName: "selectAllToggle", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
352
+ this.selectAllToggle = input(false, { ...(ngDevMode ? { debugName: "selectAllToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
359
353
  /**
360
354
  * Whether to render the "select all" master checkbox above the tree. Multiple selection only.
361
355
  *
@@ -364,30 +358,61 @@ class KbqTreeSelect extends KbqAbstractSelect {
364
358
  * covers only the matches. Enabling it also makes Ctrl/Cmd + A a two-way toggle, so the shortcut and
365
359
  * the checkbox never disagree (`selectAllToggle` is implied).
366
360
  */
367
- this.selectAll = input(false, ...(ngDevMode ? [{ debugName: "selectAll", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
368
- this._hasBackdrop = false;
369
- this._tabIndex = 0;
370
- this._disabled = false;
371
- this._focused = false;
361
+ this.selectAll = input(false, { ...(ngDevMode ? { debugName: "selectAll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
362
+ this.valueState = signal(undefined, ...(ngDevMode ? [{ debugName: "valueState" }] : /* istanbul ignore next */ []));
363
+ /** Values of the selected nodes: an array in multiple mode. */
364
+ this.value = this.valueState.asReadonly();
365
+ /** @docs-private */
366
+ this.idInput = input(undefined, { ...(ngDevMode ? { debugName: "idInput" } : /* istanbul ignore next */ {}), alias: 'id' });
367
+ /** Unique identifier of the select, generated when not provided. */
368
+ this.id = computed(() => this.idInput() || this.uid, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
369
+ /** Whether the overlay panel is rendered on top of a backdrop. */
370
+ this.hasBackdrop = input(false, { ...(ngDevMode ? { debugName: "hasBackdrop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
371
+ /** @docs-private */
372
+ this.tabIndexInput = input(0, { ...(ngDevMode ? { debugName: "tabIndexInput" } : /* istanbul ignore next */ {}), alias: 'tabIndex' });
373
+ this.validTabIndex = linkedSignal({ ...(ngDevMode ? { debugName: "validTabIndex" } : /* istanbul ignore next */ {}), source: () => this.tabIndexInput(),
374
+ computation: (value, previous) => (Number.isInteger(value) || value === null ? value : (previous?.value ?? 0)) });
375
+ /** @docs-private */
376
+ this.disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
377
+ transform: booleanAttribute });
378
+ /** Whether the select is disabled. Also set by the bound form control. */
379
+ this.disabled = linkedSignal(() => this.disabledInput(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
380
+ // One signal per host value. The host bindings of every tree-select in a view run in that view's reactive
381
+ // consumer, where a signal read again by another binding costs a scan of everything the view has read.
382
+ this.resolvedTabIndex = computed(() => (this.disabled() ? -1 : this.validTabIndex()), ...(ngDevMode ? [{ debugName: "resolvedTabIndex" }] : /* istanbul ignore next */ []));
383
+ this.resolvedAriaLabel = computed(() => this.resolvedAriaLabelledby() ? null : this.ariaLabel() || this.placeholder() || null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabel" }] : /* istanbul ignore next */ []));
384
+ /** @internal */
385
+ this.disabledAttribute = computed(() => this.disabled() || null, ...(ngDevMode ? [{ debugName: "disabledAttribute" }] : /* istanbul ignore next */ []));
386
+ /** @internal */
387
+ this.disabledClass = computed(() => this.disabled(), ...(ngDevMode ? [{ debugName: "disabledClass" }] : /* istanbul ignore next */ []));
388
+ /** @internal */
389
+ this.invalidClass = computed(() => this.errorState(), ...(ngDevMode ? [{ debugName: "invalidClass" }] : /* istanbul ignore next */ []));
390
+ /** @docs-private */
391
+ this.selectAllHandlerInput = input(undefined, { ...(ngDevMode ? { debugName: "selectAllHandlerInput" } : /* istanbul ignore next */ {}), alias: 'selectAllHandler',
392
+ transform: kbqSelectAllHandlerTransform });
393
+ this.focusedValue = signal(false, ...(ngDevMode ? [{ debugName: "focusedValue" }] : /* istanbul ignore next */ []));
394
+ this.panelOpenValue = signal(false, ...(ngDevMode ? [{ debugName: "panelOpenValue" }] : /* istanbul ignore next */ []));
395
+ /** Whether the select is focused. */
396
+ this.focused = computed(() => this.focusedValue() || this.panelOpenValue(), ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
372
397
  /**
373
398
  * Minimum width of the panel.
374
399
  * If minWidth is larger than window width, it will be ignored.
375
400
  */
376
401
  this.panelMinWidth = input(this.defaultOptions?.panelMinWidth === undefined
377
402
  ? KBQ_PANEL_DEFAULT_MIN_WIDTH
378
- : this.defaultOptions.panelMinWidth, ...(ngDevMode ? [{ debugName: "panelMinWidth", transform: numberAttribute }] : [{ transform: numberAttribute }]));
403
+ : this.defaultOptions.panelMinWidth, { ...(ngDevMode ? { debugName: "panelMinWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
379
404
  /**
380
405
  * Width of the panel. If set to `auto`, the panel will match the trigger width, but will never be
381
406
  * narrower than `panelMinWidth`. If set to null or an empty string, the panel will grow to match the
382
407
  * longest option's text. Any other value is used as an exact width, and `panelMinWidth` is not applied.
383
408
  */
384
- this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : []));
409
+ this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []));
385
410
  /**
386
411
  * Maximum width of the panel in pixels. Caps how far the panel grows with its content — it never makes
387
412
  * the panel narrower than the trigger, and never clamps an explicit `panelWidth`.
388
413
  * When null, the `--kbq-panel-size-width-max` token applies.
389
414
  */
390
- this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, ...(ngDevMode ? [{ debugName: "panelMaxWidth", transform: numberAttribute }] : [{ transform: numberAttribute }]));
415
+ this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, { ...(ngDevMode ? { debugName: "panelMaxWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
391
416
  /**
392
417
  * Maximum height of the panel's scrollable option list, in pixels. Applied as the
393
418
  * `--kbq-select-panel-size-max-height` custom property on the panel.
@@ -395,66 +420,140 @@ class KbqTreeSelect extends KbqAbstractSelect {
395
420
  * The search field and the footer sit outside the scrollable area and add to the panel's total height.
396
421
  * When null, the token default (256px) applies.
397
422
  */
398
- this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, ...(ngDevMode ? [{ debugName: "panelMaxHeight", transform: numberAttribute }] : [{ transform: numberAttribute }]));
423
+ this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, { ...(ngDevMode ? { debugName: "panelMaxHeight" } : /* istanbul ignore next */ {}), transform: numberAttribute });
399
424
  /**
400
425
  * `panelMaxHeight` rendered as a CSS length for the `--kbq-select-panel-size-max-height` token.
401
426
  * A non-finite value (e.g. `null`) leaves the stylesheet default in place.
427
+ *
402
428
  * @docs-private
403
429
  */
404
- this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : []));
405
- this._searchMinOptionsThreshold = this.resolveSearchMinOptionsThreshold();
430
+ this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : /* istanbul ignore next */ []));
431
+ /**
432
+ * Controls when the search functionality is displayed based on the number of available options.
433
+ *
434
+ * Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
435
+ * Defaults to `undefined`.
436
+ */
437
+ this.searchMinOptionsThreshold = computed(() => this.resolveSearchMinOptionsThreshold(this.searchMinOptionsThresholdInput()) ??
438
+ this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold), ...(ngDevMode ? [{ debugName: "searchMinOptionsThreshold" }] : /* istanbul ignore next */ []));
439
+ /** @docs-private */
440
+ this.searchMinOptionsThresholdInput = input(undefined, { ...(ngDevMode ? { debugName: "searchMinOptionsThresholdInput" } : /* istanbul ignore next */ {}), alias: 'searchMinOptionsThreshold' });
441
+ /**
442
+ * Colour of the trigger's tags and arrow.
443
+ *
444
+ * @docs-private
445
+ */
446
+ this.colorForState = computed(() => this.errorState() ? KbqComponentColors.Error : KbqComponentColors.ContrastFade, ...(ngDevMode ? [{ debugName: "colorForState" }] : /* istanbul ignore next */ []));
447
+ /** Full set of classes for the panel: base class, form-field theme and custom `panelClass`. */
448
+ this.panelClasses = computed(() => {
449
+ const panelClass = this.panelClass();
450
+ const formFieldColor = this.parentFormField?.color();
451
+ const classes = ['kbq-tree-select__panel', formFieldColor ? `kbq-${formFieldColor}` : ''];
452
+ if (typeof panelClass === 'string') {
453
+ classes.push(panelClass);
454
+ }
455
+ else if (Array.isArray(panelClass) || panelClass instanceof Set) {
456
+ classes.push(...panelClass);
457
+ }
458
+ else if (panelClass) {
459
+ classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
460
+ }
461
+ return classes.filter(Boolean).join(' ');
462
+ }, ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
463
+ /** Text of the counter of the items that do not fit into the trigger. */
464
+ this.hiddenItemsLabel = computed(() => this.hiddenItemsTextFormatter()(this.hiddenItemsText() ?? this.localeConfiguration().hiddenItemsText, this.hiddenItems()), ...(ngDevMode ? [{ debugName: "hiddenItemsLabel" }] : /* istanbul ignore next */ []));
406
465
  this.triggerValues = [];
407
466
  this.closeSubscription = Subscription.EMPTY;
408
- this._panelOpen = false;
409
467
  /** The scroll offset the panel is restored to when it attaches — the list always opens at the top. */
410
468
  this.scrollTop = 0;
411
469
  /** Unique id for this input. */
412
470
  this.uid = `kbq-tree-select-${nextUniqueId++}`;
471
+ /** Id of the overlay panel, referenced by the host's `aria-controls`. */
472
+ this.panelId = `${this.uid}-panel`;
473
+ /**
474
+ * Whether projected content has been resolved. The search field reaches its form control through
475
+ * its own form field, and that is only guaranteed to have been wired by `ngAfterContentInit`.
476
+ */
477
+ this.contentInitialized = signal(false, ...(ngDevMode ? [{ debugName: "contentInitialized" }] : /* istanbul ignore next */ []));
478
+ /**
479
+ * The last value the form wrote while the tree could not resolve all of it yet — before the content was
480
+ * initialized, or before the data held every node it names. Applied again as the data changes, until every node
481
+ * is found or the selection is reported to the form.
482
+ */
483
+ this.pendingValue = null;
484
+ /** The data nodes {@link pendingValue} was last resolved against. */
485
+ this.pendingValueDataNodes = null;
486
+ /** Whether the selection is being set to a value the form wrote, which is no change to report back. */
487
+ this.writingValue = false;
488
+ /** Handles of the timers that outlive the call that scheduled them. */
489
+ this.pendingTimers = new Set();
413
490
  this.destroyRef = inject(DestroyRef);
414
- /** `View -> model callback called when value changes` */
491
+ /**
492
+ * Called when the value changes. Needed to properly implement `ControlValueAccessor`.
493
+ *
494
+ * @docs-private
495
+ */
415
496
  this.onChange = () => { };
416
- /** `View -> model callback called when select has been touched` */
497
+ /**
498
+ * Called when the control is blurred. Needed to properly implement `ControlValueAccessor`.
499
+ *
500
+ * @docs-private
501
+ */
417
502
  this.onTouched = () => { };
503
+ this.emptyValue = signal(true, ...(ngDevMode ? [{ debugName: "emptyValue" }] : /* istanbul ignore next */ []));
504
+ /** Whether no node is selected. */
505
+ this.empty = this.emptyValue.asReadonly();
506
+ /**
507
+ * Recounts the tags of the trigger that do not fit on its first line and refreshes the "+N"
508
+ * counter. Runs on window resize and whenever the rendered tags change.
509
+ *
510
+ * @docs-private
511
+ */
418
512
  this.calculateHiddenItems = () => {
419
513
  if (!this.isBrowser ||
420
514
  this.customTrigger() ||
421
515
  this.customMatcher() ||
422
- this.empty ||
516
+ this.empty() ||
423
517
  !this.multiple ||
424
518
  this.multiline())
425
519
  return;
426
- const totalItemsWidth = this.getTotalItemsWidthInMatcher();
427
- const [totalVisibleItemsWidth, visibleItems] = this.getTotalVisibleItems();
428
- this.hiddenItems = this.selectionModel.selected.length - visibleItems;
520
+ const { totalItemsWidth, visibleItems } = this.measureMatcherItems();
521
+ this.hiddenItems.set(this.selectionModel.selected.length - visibleItems);
429
522
  this.changeDetectorRef.detectChanges();
430
- if (this.hiddenItems) {
523
+ if (this.hiddenItems()) {
431
524
  const itemsCounter = this.trigger().nativeElement.querySelector('.kbq-select__match-hidden-text');
432
525
  const matcherList = this.trigger().nativeElement.querySelector('.kbq-select__match-list');
433
- if (!itemsCounter || !matcherList) {
434
- this.changeDetectorRef.markForCheck();
526
+ if (!itemsCounter || !matcherList)
435
527
  return;
436
- }
437
528
  const itemsCounterShowed = itemsCounter.offsetTop < itemsCounter.offsetHeight;
438
529
  const itemsCounterWidth = Math.floor(itemsCounter.getBoundingClientRect().width);
439
530
  const matcherListWidth = Math.floor(matcherList.getBoundingClientRect().width);
440
531
  const matcherWidth = matcherListWidth + (itemsCounterShowed ? itemsCounterWidth : 0);
441
532
  if (itemsCounterShowed && totalItemsWidth < matcherWidth) {
442
- this.hiddenItems = 0;
533
+ this.hiddenItems.set(0);
443
534
  this.changeDetectorRef.detectChanges();
444
535
  }
445
- if (totalVisibleItemsWidth === matcherListWidth ||
446
- totalVisibleItemsWidth + itemsCounterWidth < matcherListWidth) {
447
- this.changeDetectorRef.markForCheck();
448
- return;
449
- }
450
536
  }
451
- this.changeDetectorRef.markForCheck();
452
- };
453
- this.updateLocaleParams = () => {
454
- this.hiddenItemsText = this.localeService?.getParams('select').hiddenItemsText;
455
- this.changeDetectorRef.markForCheck();
456
537
  };
457
- this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe(this.updateLocaleParams);
538
+ // The selection model is created with the multiplicity of the first binding and cannot follow a change.
539
+ effect(() => {
540
+ const multiple = this.multipleInput();
541
+ if (this.multipleValue !== undefined && multiple !== this.multipleValue) {
542
+ throw getKbqSelectDynamicMultipleError();
543
+ }
544
+ });
545
+ // A disabled select reports no focus to its form field.
546
+ let wasDisabled = false;
547
+ effect(() => {
548
+ const disabled = this.disabled();
549
+ if (disabled === wasDisabled)
550
+ return;
551
+ wasDisabled = disabled;
552
+ const formField = this.parentFormField;
553
+ if (formField) {
554
+ Promise.resolve().then(() => this.disabled() ? formField.stopFocusMonitor() : formField.runFocusMonitor());
555
+ }
556
+ });
458
557
  // The tree owns the "select all" row — it is the only place that can put it in front of the nodes
459
558
  // and into the key manager's list. Mirrored through an effect rather than assigned once in
460
559
  // `ngAfterContentInit` so a `[selectAll]` bound to a changing expression keeps working.
@@ -464,13 +563,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
464
563
  tree.selectAll = this.selectAll();
465
564
  }
466
565
  });
566
+ // `search` is projected content and can come and go with an `@if`, so both the wiring that
567
+ // follows it and the flag the tree reads on blur have to be re-applied, not read once.
568
+ // Gated on content init because the search reaches its control through its own form field,
569
+ // which is only guaranteed to have resolved by then.
570
+ effect((onCleanup) => {
571
+ const tree = this.tree();
572
+ const search = this.search();
573
+ if (!tree || !this.contentInitialized())
574
+ return;
575
+ tree.optionShouldHoldFocusOnBlur = !!search;
576
+ if (!search)
577
+ return;
578
+ const subscription = this.subscribeOnSearchChanges(tree, search);
579
+ onCleanup(() => subscription?.unsubscribe());
580
+ });
581
+ this.destroyRef.onDestroy(() => {
582
+ this.pendingTimers.forEach(clearTimeout);
583
+ this.pendingTimers.clear();
584
+ });
467
585
  if (this.ngControl) {
468
586
  // Note: we provide the value accessor through here, instead of
469
587
  // the `providers` to avoid running into a circular import.
470
588
  this.ngControl.valueAccessor = this;
471
589
  }
472
- // Force setter to be called in case id was not specified.
473
- this.id = this.id;
474
590
  afterNextRender(() => {
475
591
  if (this.multiple && !this.multiline()) {
476
592
  merge(fromEvent(this.window, 'resize'), this.tags.changes)
@@ -480,22 +596,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
480
596
  });
481
597
  }
482
598
  ngOnInit() {
483
- this.stateChanges.next();
484
- // We need `distinctUntilChanged` here, because some browsers will
485
- // fire the animation end event twice for the same animation. See:
486
- // https://github.com/angular/angular/issues/24084
599
+ // Only the latest report of a frame is delivered, so a close and a reopen within one frame repeat the
600
+ // state delivered before; `distinctUntilChanged` keeps `openedChange` from emitting it twice.
487
601
  this.panelDoneAnimatingStream
488
602
  .pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
489
603
  .subscribe(() => {
490
604
  if (this.panelOpen) {
491
- this.scrollTop = 0;
492
- setTimeout(() => {
605
+ this.scheduleTimeout(() => {
493
606
  this.highlightCorrectOption();
494
607
  const search = this.search();
495
608
  if (search) {
496
609
  search.focus();
497
610
  }
498
611
  });
612
+ this.scrollbarViewport()?.flashScrollIndicators();
499
613
  this.openedChange.emit(true);
500
614
  }
501
615
  else {
@@ -515,13 +629,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
515
629
  if (!tree)
516
630
  return;
517
631
  tree.resetFocusedItemOnBlur = false;
518
- tree.optionShouldHoldFocusOnBlur = !!this.search();
519
- this.selectionModel = tree.selectionModel = new SelectionModel(this.multiSelection);
632
+ this.multipleValue = this.multipleInput();
633
+ this.selectionModel = new SelectionModel(this.multiSelection);
634
+ this.syncSelectionState();
520
635
  this.selectionModel.changed.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
521
- this.onChange(this.selectedValues);
636
+ this.syncSelectionState();
637
+ // Neither a written value nor the tree re-pointing the selection at reloaded data is the user's change.
638
+ if (!this.writingValue && !tree.syncingSelection) {
639
+ this.reportValue();
640
+ }
522
641
  if (this.multiSelection) {
523
642
  this.refreshTriggerValues();
524
643
  }
644
+ // The trigger renders the selection, whichever way it changed (a click, `writeValue`, select all).
645
+ this.changeDetectorRef.markForCheck();
525
646
  });
526
647
  this.selectionModel.changed.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
527
648
  // A multiline trigger grows with every selected option, and this is the one signal guaranteed
@@ -529,30 +650,43 @@ class KbqTreeSelect extends KbqAbstractSelect {
529
650
  this.updatePanelAnchor();
530
651
  this.setOverlayPosition();
531
652
  });
532
- // eslint-disable-next-line @angular-eslint/no-lifecycle-call
533
- tree.ngAfterContentInit();
653
+ // Hands the tree the model this component owns. Re-running `tree.ngAfterContentInit()` was the
654
+ // old way of doing it and left the tree with a second set of subscribers on query lists that are
655
+ // never re-created — every options change handled twice, for the lifetime of the component.
656
+ tree.initializeForEmbedding(this.selectionModel);
657
+ tree.renderedOptions.changes.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
658
+ // A value written ahead of its data, such as one loaded over HTTP, is applied once the nodes arrive.
659
+ if (this.pendingValue && tree.treeControl.dataNodes !== this.pendingValueDataNodes) {
660
+ this.applyPendingValue();
661
+ }
662
+ // Options render after the first value reaches the control, so the trigger is built before any
663
+ // of them exists and its `disabled` flags can be stale.
664
+ if (this.multiSelection && this.hasStaleTriggerValues()) {
665
+ this.refreshTriggerValues();
666
+ }
667
+ });
534
668
  this.initKeyManager();
535
669
  this.options = tree.renderedOptions;
536
670
  tree.autoSelect = this.autoSelect;
537
671
  // Single place the event is raised, so a click on the master checkbox and Ctrl/Cmd + A — which
538
672
  // both go through `selectAllOptions` — emit exactly once and with the same payload.
539
- outputToObservable(tree.onSelectAll)
673
+ outputToObservable(tree.selectAllChange)
540
674
  .pipe(takeUntilDestroyed(this.destroyRef))
541
675
  .subscribe(({ options }) => this.onSelectAll.emit(new KbqSelectAllEvent(this, options, tree.allOptionsSelected)));
542
676
  // Tree lives inside the select panel: enable hover-to-focus on options even without a
543
677
  // wrapping form-field (e.g. filter-bar pipes render the tree-select bare).
544
678
  tree.inSelect = true;
545
- if (tree.multipleMode === null) {
546
- // setTimeout need for prevent an error "NG0100: ExpressionChangedAfterItHasBeenCheckedError"
547
- setTimeout(() => (this.tree().multipleMode = this.multiSelection ? MultipleMode.CHECKBOX : null));
679
+ if (tree.multipleMode === null && this.multiSelection) {
680
+ tree.multipleMode = MultipleMode.CHECKBOX;
548
681
  }
549
682
  if (this.multiSelection) {
550
683
  tree.noUnselectLast = false;
551
684
  }
552
- if (this.tempValues) {
553
- this.setSelectionByValue(this.tempValues);
554
- this.tempValues = null;
685
+ // A missing value written ahead of the content leaves the selection as empty as it starts.
686
+ if (this.pendingValue?.value === null || this.pendingValue?.value === undefined) {
687
+ this.pendingValue = null;
555
688
  }
689
+ this.applyPendingValue();
556
690
  this.userInteractionChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
557
691
  if (!this.multiSelection && this.panelOpen) {
558
692
  this.close();
@@ -562,7 +696,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
562
696
  tree.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
563
697
  this.selectionChange.emit(new KbqTreeSelectChange(this, event.option, false, event.options));
564
698
  const search = this.search();
565
- if (search) {
699
+ // Guarded the same way every other refocus in the component is: with the field hidden by
700
+ // `searchMinOptionsThreshold` there is nothing to give the caret back to.
701
+ if (search && this.shouldShowSearch()) {
566
702
  search.focus();
567
703
  }
568
704
  });
@@ -574,7 +710,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
574
710
  this.tree().keyManager.setActiveItem(this.options.find(({ data }) => data === added[0]));
575
711
  });
576
712
  }
577
- this.subscribeOnSearchChanges();
713
+ this.contentInitialized.set(true);
714
+ this.optionsInitialized.next();
715
+ this.optionsInitialized.complete();
578
716
  }
579
717
  ngAfterViewInit() {
580
718
  const tree = this.tree();
@@ -584,53 +722,44 @@ class KbqTreeSelect extends KbqAbstractSelect {
584
722
  .pipe(takeUntilDestroyed(this.destroyRef))
585
723
  .subscribe(() => this.setOverlayPosition());
586
724
  }
725
+ ngAfterViewChecked() {
726
+ // Syncs the list here so `changes` emits once this view is checked.
727
+ this.tagsList();
728
+ }
587
729
  ngOnDestroy() {
588
- this.stateChanges.complete();
730
+ this.panelDoneAnimatingStream.complete();
731
+ this.openedChange.complete();
589
732
  this.closeSubscription.unsubscribe();
590
733
  this.unsubscribeFromPanelResize();
591
734
  }
592
735
  updateErrorState() {
593
- const oldState = this.errorState;
594
- const parent = this.parentFormGroup || this.parentForm;
595
- const matcher = this.errorStateMatcher || this.defaultErrorStateMatcher;
596
- const control = this.ngControl ? this.ngControl.control : null;
597
- const newState = matcher.isErrorState(control, parent);
598
- if (newState !== oldState) {
599
- this.errorState = newState;
600
- this.stateChanges.next();
601
- }
602
- }
603
- hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
604
- return hiddenItemsText.replace('{{ number }}', hiddenItems.toString());
736
+ this.errorStateTracker.errorStateMatcher = this.errorStateMatcher();
737
+ this.errorStateTracker.updateErrorState();
605
738
  }
606
739
  /**
607
- * Clears the current selection.
740
+ * Clears the nodes `clearPredicate` accepts; disabled ones are kept by default.
741
+ *
742
+ * Deselects on the model directly: `tree.setOptionsFromValues([])` starts by clearing the whole
743
+ * model and would take the kept nodes with it.
744
+ *
608
745
  * @docs-private
609
746
  */
610
747
  clear() {
611
- this.selectionModel.clear();
612
- this.tree().keyManager.setActiveItem(-1);
613
- this.setSelectionByValue([]);
614
- this.onChange(this.selectedValues);
615
- this.selectionChange.emit(new KbqTreeSelectChange(this, this.selectedValues));
748
+ untracked(() => {
749
+ const targets = this.clearTargets;
750
+ this.selectionModel.deselect(...targets);
751
+ this.tree().keyManager.setActiveItem(-1);
752
+ this.changeDetectorRef.detectChanges();
753
+ this.reportValue();
754
+ this.selectionChange.emit(new KbqTreeSelectChange(this, null, false, targets));
755
+ });
616
756
  }
617
- /**
618
- * Clears the current selection.
619
- * @deprecated Activate the projected `KbqCleaner` instead.
620
- * @docs-private
621
- */
622
- clearValue(event) {
623
- const cleaner = this.cleaner();
624
- if (cleaner) {
625
- cleaner.clear(event);
626
- }
627
- else {
628
- event.stopPropagation();
629
- event.preventDefault();
630
- this.clear();
631
- this.focus();
632
- }
757
+ /** Reports the selection to the form, which then holds it instead of a value still waiting for its nodes. */
758
+ reportValue() {
759
+ this.pendingValue = null;
760
+ this.onChange(this.selectedValues);
633
761
  }
762
+ /** Host click handler. A custom matcher that opts out of the default handlers takes it over. */
634
763
  handleClick() {
635
764
  const customMatcher = this.customMatcher();
636
765
  if (customMatcher && !customMatcher.useDefaultHandlers())
@@ -638,15 +767,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
638
767
  this.toggle();
639
768
  }
640
769
  toggle() {
641
- if (this.panelOpen) {
642
- this.close();
643
- }
644
- else {
645
- this.open();
646
- }
770
+ // Untracked, like the other imperative methods: called from a consumer's `effect()`, the state read on the
771
+ // way — `panelOpen`, `disabled`, the options, the inputs — would make the effect run again on every open
772
+ // and close.
773
+ untracked(() => {
774
+ if (this.panelOpen) {
775
+ this.close();
776
+ }
777
+ else {
778
+ this.open();
779
+ }
780
+ });
647
781
  }
648
782
  open() {
649
- if (this.disabled || !this.options || !this.options.length || this._panelOpen)
783
+ untracked(() => this.attachPanel());
784
+ }
785
+ attachPanel() {
786
+ if (this.disabled() || !this.options || this.panelOpenValue())
787
+ return;
788
+ if (!this.options.length && !this.noOptionsMessage())
650
789
  return;
651
790
  // add check for form-field bounding rectangles, since it adds extra padding around the trigger
652
791
  this.triggerRect = (this.parentFormField?.getConnectedOverlayOrigin().nativeElement || this.trigger().nativeElement).getBoundingClientRect();
@@ -660,37 +799,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
660
799
  this.overlayOrigin = this.parentFormField.getConnectedOverlayOrigin();
661
800
  }
662
801
  this.updateOverlayWidth(this.panelWidth(), this.panelMinWidth(), this.overlayOrigin ?? this.elementRef);
663
- this._panelOpen = true;
802
+ this.panelOpenValue.set(true);
664
803
  this.changeDetectorRef.markForCheck();
665
804
  // Set the font size on the panel element once it exists.
666
- this.ngZone.onStable
667
- .asObservable()
668
- .pipe(take(1))
669
- .subscribe(() => {
805
+ afterNextRender(() => {
670
806
  if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
671
807
  this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
672
808
  }
673
809
  if (this.search()) {
674
810
  this.lockOverlayWidthForSearch(this.panel());
675
811
  }
676
- });
812
+ }, { injector: this.injector });
813
+ this.reportPanelRendered('showing');
677
814
  }
678
815
  /** Closes the overlay panel and focuses the host element. */
679
816
  close() {
680
- if (!this._panelOpen) {
817
+ untracked(() => {
818
+ if (!this.panelOpenValue()) {
819
+ return;
820
+ }
821
+ this.panelOpenValue.set(false);
822
+ this.unsubscribeFromPanelResize();
823
+ // Back to the two default sides, so the next open is not resolved against a first row that has since
824
+ // changed height.
825
+ this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
826
+ this.changeDetectorRef.markForCheck();
827
+ this.onTouched();
828
+ const search = this.search();
829
+ if (search) {
830
+ search.reset();
831
+ }
832
+ this.reportPanelRendered('void');
833
+ });
834
+ }
835
+ /**
836
+ * Reports the panel rendered or removed once the next render has applied `panelOpen`; only the latest
837
+ * report of a frame is delivered.
838
+ */
839
+ reportPanelRendered(state) {
840
+ this.panelRender?.destroy();
841
+ // The overlay detaching while the select is destroyed closes it too.
842
+ if (this.destroyRef.destroyed)
681
843
  return;
682
- }
683
- this._panelOpen = false;
684
- this.unsubscribeFromPanelResize();
685
- // Back to the two default sides, so the next open is not resolved against a first row that has since
686
- // changed height.
687
- this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
688
- this.changeDetectorRef.markForCheck();
689
- this.onTouched();
690
- const search = this.search();
691
- if (search) {
692
- search.reset();
693
- }
844
+ this.panelRender = afterNextRender(() => this.panelDoneAnimatingStream.next(state), {
845
+ injector: this.injector
846
+ });
694
847
  }
695
848
  /**
696
849
  * Sets the select's value. Part of the ControlValueAccessor interface
@@ -699,11 +852,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
699
852
  * @param value New value to be written to the model.
700
853
  */
701
854
  writeValue(value) {
702
- if (this.tree()?.treeControl) {
703
- this.setSelectionByValue(value);
704
- }
705
- else {
706
- this.tempValues = value;
855
+ // Untracked: a form control set from an `effect()` writes here synchronously.
856
+ untracked(() => {
857
+ this.pendingValue = { value };
858
+ // Until then the select has no selection model shared with the tree, and `ngAfterContentInit` applies it.
859
+ if (this.contentInitialized()) {
860
+ this.applyPendingValue();
861
+ }
862
+ });
863
+ }
864
+ /** Applies the value the form wrote last, and lets it go once the data holds every node it names. */
865
+ applyPendingValue() {
866
+ const pending = this.pendingValue;
867
+ const treeControl = this.tree()?.treeControl;
868
+ if (!pending || !treeControl)
869
+ return;
870
+ // Dropped first, so a value that throws is not applied again with every change of the data.
871
+ this.pendingValue = null;
872
+ this.pendingValueDataNodes = treeControl.dataNodes;
873
+ this.setSelectionByValue(pending.value);
874
+ const { value } = pending;
875
+ const values = value === null || value === undefined ? [] : this.multiSelection && Array.isArray(value) ? value : [value];
876
+ // Unless another value was written meanwhile.
877
+ if (this.pendingValue === null && !values.every((item) => treeControl.hasValue(item))) {
878
+ this.pendingValue = pending;
707
879
  }
708
880
  }
709
881
  /**
@@ -723,7 +895,6 @@ class KbqTreeSelect extends KbqAbstractSelect {
723
895
  *
724
896
  * @param fn Callback to be triggered when the component has been touched.
725
897
  */
726
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
727
898
  registerOnTouched(fn) {
728
899
  this.onTouched = fn;
729
900
  }
@@ -734,9 +905,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
734
905
  * @param isDisabled Sets whether the component is disabled.
735
906
  */
736
907
  setDisabledState(isDisabled) {
737
- this.disabled = isDisabled;
738
- this.changeDetectorRef.markForCheck();
739
- this.stateChanges.next();
908
+ this.disabled.set(isDisabled);
740
909
  }
741
910
  get selected() {
742
911
  return this.multiSelection ? this.selectionModel?.selected : this.selectionModel?.selected[0];
@@ -746,25 +915,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
746
915
  return this.multiSelection ? selectedValues : selectedValues[0];
747
916
  }
748
917
  get triggerValue() {
749
- if (this.empty) {
918
+ if (this.empty()) {
750
919
  return '';
751
920
  }
921
+ // Shown in single selection, where `selected` is the node.
752
922
  return this.tree().treeControl.getViewValue(this.selected);
753
923
  }
754
- get empty() {
755
- return !this.selectionModel || this.selectionModel.isEmpty();
756
- }
757
- isRtl() {
758
- return this.dir ? this.dir.value === 'rtl' : false;
759
- }
924
+ /** First selected node that is not disabled — the one the panel highlights when it opens. */
760
925
  get firstSelected() {
761
926
  return this.selectionModel.selected.filter((node) => !this.tree().treeControl.isDisabled(node))[0];
762
927
  }
928
+ /**
929
+ * Host keydown handler, routing the event to the trigger or the panel handler. A custom matcher
930
+ * that opts out of the default handlers reaches those two directly instead.
931
+ */
763
932
  handleKeydown(event) {
764
933
  const customMatcher = this.customMatcher();
765
934
  if (customMatcher && !customMatcher.useDefaultHandlers())
766
935
  return;
767
- if (!this.disabled) {
936
+ if (!this.disabled()) {
768
937
  if (this.panelOpen) {
769
938
  this.panelKeydownHandler(event);
770
939
  }
@@ -777,9 +946,8 @@ class KbqTreeSelect extends KbqAbstractSelect {
777
946
  const customMatcher = this.customMatcher();
778
947
  if (customMatcher && !customMatcher.useDefaultHandlers())
779
948
  return;
780
- if (!this.disabled) {
781
- this._focused = true;
782
- this.stateChanges.next();
949
+ if (!this.disabled()) {
950
+ this.focusedValue.set(true);
783
951
  }
784
952
  }
785
953
  /**
@@ -790,25 +958,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
790
958
  const customMatcher = this.customMatcher();
791
959
  if (customMatcher && !customMatcher.useDefaultHandlers())
792
960
  return;
793
- this._focused = false;
794
- if (!this.disabled && !this.panelOpen) {
961
+ this.focusedValue.set(false);
962
+ if (!this.disabled() && !this.panelOpen) {
795
963
  this.onTouched();
796
964
  this.changeDetectorRef.markForCheck();
797
- this.stateChanges.next();
798
965
  }
799
966
  }
800
967
  /** Callback that is invoked when the overlay panel has been attached. */
801
968
  onAttached() {
969
+ // `cdkConnectedOverlay` creates and attaches the overlay in one go, so this is the first point it exists.
970
+ this.overlayLayers.adopt(this.overlayDir.overlayRef, this.elementRef.nativeElement);
802
971
  this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {
803
972
  this.changeDetectorRef.detectChanges();
804
973
  this.setOverlayPosition();
805
974
  // The panel itself is an `overflow: hidden` box; the option list is what scrolls.
806
- this.optionsContainer().nativeElement.scrollTop = this.scrollTop;
975
+ this.scrollbarViewport()?.scrollTo({ top: this.scrollTop });
807
976
  this.tree().updateScrollSize();
808
977
  // Deliberately out of this frame — see `reanchorPanel`. A microtask still lands before paint.
809
978
  queueMicrotask(() => this.reanchorPanel());
810
979
  });
811
980
  this.subscribeToPanelResize();
981
+ // This runs on every open, so without dropping the previous subscription every open would add
982
+ // another one and a single outside click would call `close()` once per open so far.
983
+ this.closeSubscription.unsubscribe();
812
984
  this.closeSubscription = this.closingActions().subscribe(() => this.close());
813
985
  }
814
986
  /** Element the overlay is positioned and sized against. */
@@ -816,43 +988,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
816
988
  return this.parentFormField?.getConnectedOverlayOrigin().nativeElement ?? this.trigger()?.nativeElement;
817
989
  }
818
990
  isPanelOpen() {
819
- return this._panelOpen;
820
- }
821
- /** Returns the theme to be used on the panel. */
822
- getPanelTheme() {
823
- return this.parentFormField ? `kbq-${this.parentFormField.color}` : '';
824
- }
825
- /** Returns the full set of classes for the panel: base class, theme and custom `panelClass`. */
826
- getPanelClasses() {
827
- const panelClass = this.panelClass();
828
- const classes = ['kbq-tree-select__panel', this.getPanelTheme()];
829
- if (typeof panelClass === 'string') {
830
- classes.push(panelClass);
831
- }
832
- else if (Array.isArray(panelClass) || panelClass instanceof Set) {
833
- classes.push(...panelClass);
834
- }
835
- else if (panelClass) {
836
- classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
837
- }
838
- return classes.filter(Boolean).join(' ');
991
+ return this.panelOpenValue();
839
992
  }
840
993
  focus() {
841
994
  this.elementRef.nativeElement.focus();
842
995
  }
843
996
  /**
844
997
  * Implemented as part of KbqFormFieldControl.
998
+ *
845
999
  * @docs-private
846
1000
  */
847
1001
  onContainerClick() {
848
1002
  this.focus();
849
1003
  }
850
- /** Invoked when an option is clicked. */
1004
+ /** Removes an option from the selection through the trailing icon of its tag in the trigger. */
851
1005
  onRemoveSelectedOption(selectedOption, $event) {
852
1006
  $event.stopPropagation();
853
- this.selectionModel.deselect(this.selected.find((value) => this.tree().treeControl.getValue(value) === selectedOption.value));
1007
+ // Only removable tags render the icon, so this is also the index of the icon among them.
1008
+ const removedIndex = this.triggerValues
1009
+ .filter(({ disabled }) => !disabled)
1010
+ .findIndex(({ value }) => value === selectedOption.value);
1011
+ const removed = this.selectionModel.selected.find((node) => this.tree().treeControl.getValue(node) === selectedOption.value);
1012
+ if (removed !== undefined) {
1013
+ this.selectionModel.deselect(removed);
1014
+ }
854
1015
  this.selectionChange.emit(new KbqTreeSelectChange(this, this.options.find((option) => option.value === selectedOption.value) || selectedOption.value));
855
- this.onChange(this.selectedValues);
1016
+ this.reportValue();
1017
+ this.restoreFocusAfterRemoval(removedIndex);
1018
+ }
1019
+ /**
1020
+ * Takes the focus off the remove icon that has just been destroyed along with its tag.
1021
+ *
1022
+ * The trigger is rebuilt synchronously — `selectionModel.changed` runs `refreshTriggerValues()`,
1023
+ * which calls `detectChanges()` — so by the time the click handler returns the icon the keyboard was
1024
+ * on is gone and the focus has fallen back to the document body. Hands it to the icon that took the
1025
+ * removed tag's place, or to the control itself once no removable tag is left.
1026
+ */
1027
+ restoreFocusAfterRemoval(removedIndex) {
1028
+ const removeIcons = this.trigger().nativeElement.querySelectorAll('[kbqTagRemove]');
1029
+ const next = removeIcons[Math.min(removedIndex, removeIcons.length - 1)];
1030
+ if (next) {
1031
+ next.focus();
1032
+ }
1033
+ else {
1034
+ this.focus();
1035
+ }
856
1036
  }
857
1037
  triggerKeydownHandler(event) {
858
1038
  const keyCode = event.keyCode;
@@ -873,7 +1053,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
873
1053
  const keyCode = event.keyCode;
874
1054
  const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
875
1055
  const tree = this.tree();
876
- if ((isArrowKey && event.altKey) || keyCode === ESCAPE || keyCode === TAB) {
1056
+ if ((isArrowKey && event.altKey) || keyCode === ESCAPE) {
877
1057
  // Close the select on ALT + arrow key to match the native <select>
878
1058
  event.preventDefault();
879
1059
  // Prevent ESCAPE from bubbling to ancestor (when inside overlay)
@@ -883,8 +1063,15 @@ class KbqTreeSelect extends KbqAbstractSelect {
883
1063
  this.close();
884
1064
  this.focus();
885
1065
  }
1066
+ else if (keyCode === TAB) {
1067
+ // Deliberately not `preventDefault`-ed. Closing the panel and pulling the focus back to the
1068
+ // host is all this control has to do; the browser then moves on to the next control the way
1069
+ // Tab always does. Swallowing the key trapped the focus inside an open select.
1070
+ this.close();
1071
+ this.focus();
1072
+ }
886
1073
  else if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW) {
887
- this.originalOnKeyDown.call(tree, event);
1074
+ tree.handleKeydown(event);
888
1075
  // LEFT_ARROW moves focus to the parent option when the active one is already collapsed,
889
1076
  // so the search field has to be given the caret back, the same way the other keys do below.
890
1077
  const search = this.search();
@@ -912,7 +1099,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
912
1099
  else if ((keyCode === ENTER || keyCode === SPACE) && tree.keyManager.activeItem) {
913
1100
  event.preventDefault();
914
1101
  if (!this.autoSelect) {
915
- this.originalOnKeyDown.call(tree, event);
1102
+ tree.handleKeydown(event);
916
1103
  }
917
1104
  else {
918
1105
  this.close();
@@ -957,9 +1144,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
957
1144
  // reading the tree's own authoritative node count instead of subtracting from `options.length`
958
1145
  // sidesteps that race entirely, rather than risking the two going momentarily out of step.
959
1146
  const optionsCount = this.tree()?.nodesCount ?? this.options.length;
960
- return (isUndefined(this.searchMinOptionsThreshold) ||
1147
+ return (isUndefined(this.searchMinOptionsThreshold()) ||
961
1148
  !!this.search()?.value() ||
962
- optionsCount >= this.searchMinOptionsThreshold);
1149
+ optionsCount >= this.searchMinOptionsThreshold());
1150
+ }
1151
+ /**
1152
+ * Runs `callback` after the current task, keeping the handle so that destroying the component
1153
+ * cancels it. A timer left to fire after teardown runs against a component that is already gone.
1154
+ */
1155
+ scheduleTimeout(callback) {
1156
+ const handle = setTimeout(() => {
1157
+ this.pendingTimers.delete(handle);
1158
+ callback();
1159
+ });
1160
+ this.pendingTimers.add(handle);
963
1161
  }
964
1162
  closingActions() {
965
1163
  const backdrop = this.overlayDir.overlayRef.backdropClick();
@@ -969,33 +1167,34 @@ class KbqTreeSelect extends KbqAbstractSelect {
969
1167
  const detachments = this.overlayDir.overlayRef.detachments();
970
1168
  return merge(backdrop, outsidePointerEvents, detachments);
971
1169
  }
972
- getTotalItemsWidthInMatcher() {
973
- const triggerClone = this.buildTriggerClone();
974
- triggerClone.querySelector('.kbq-select__match-hidden-text')?.remove();
975
- this.renderer.appendChild(this.trigger().nativeElement, triggerClone);
976
- let totalItemsWidth = 0;
977
- const selectedItemsViewValueContainers = triggerClone.querySelectorAll('kbq-tag');
978
- selectedItemsViewValueContainers.forEach((item) => (totalItemsWidth += this.getItemWidth(item)));
979
- triggerClone.remove();
980
- return totalItemsWidth;
981
- }
982
- getTotalVisibleItems() {
1170
+ /**
1171
+ * Measures the tags of the matcher on an off-screen copy of the trigger.
1172
+ *
1173
+ * Two answers are needed — how many tags fit on the first line next to the "+N" counter, and how
1174
+ * wide all of them are together — and they used to cost a clone each. One clone is enough: it is
1175
+ * built, appended and removed once, and the only thing separating the two passes is the counter,
1176
+ * which the second pass drops from the copy.
1177
+ */
1178
+ measureMatcherItems() {
983
1179
  const triggerClone = this.buildTriggerClone();
984
1180
  const hiddenText = triggerClone.querySelector('.kbq-select__match-hidden-text');
985
1181
  if (hiddenText) {
986
1182
  this.renderer.setStyle(hiddenText, 'display', 'block');
987
1183
  }
988
1184
  this.renderer.appendChild(this.trigger().nativeElement, triggerClone);
989
- let visibleItemsCount = 0;
990
- let totalVisibleItemsWidth = 0;
1185
+ let visibleItems = 0;
991
1186
  triggerClone.querySelectorAll('kbq-tag').forEach((item) => {
992
1187
  if (item.offsetTop < item.offsetHeight) {
993
- totalVisibleItemsWidth += this.getItemWidth(item);
994
- visibleItemsCount++;
1188
+ visibleItems++;
995
1189
  }
996
1190
  });
1191
+ hiddenText?.remove();
1192
+ let totalItemsWidth = 0;
1193
+ triggerClone
1194
+ .querySelectorAll('kbq-tag')
1195
+ .forEach((item) => (totalItemsWidth += this.getItemWidth(item)));
997
1196
  triggerClone.remove();
998
- return [totalVisibleItemsWidth, visibleItemsCount];
1197
+ return { totalItemsWidth, visibleItems };
999
1198
  }
1000
1199
  buildTriggerClone() {
1001
1200
  const triggerClone = this.trigger().nativeElement.cloneNode(true);
@@ -1018,11 +1217,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
1018
1217
  const marginRight = parseFloat(computedStyle.marginRight) || 0;
1019
1218
  return width + marginLeft + marginRight + parseInt(SizeXxs);
1020
1219
  }
1220
+ /** Whether the trigger's tags still agree with the selection about which nodes are disabled. */
1221
+ hasStaleTriggerValues() {
1222
+ const selected = this.selectionModel.selected;
1223
+ return (this.triggerValues.length === selected.length &&
1224
+ selected.some((node, index) => this.triggerValues[index].disabled !== this.isNodeDisabled(node)));
1225
+ }
1021
1226
  refreshTriggerValues() {
1227
+ const treeControl = this.tree().treeControl;
1022
1228
  this.triggerValues = this.selectionModel.selected.map((node) => ({
1023
- value: this.tree().treeControl.getValue(node),
1024
- viewValue: this.tree().treeControl.getViewValue(node),
1025
- disabled: this.tree().treeControl.isDisabled(node)
1229
+ value: treeControl.getValue(node),
1230
+ viewValue: treeControl.getViewValue(node),
1231
+ // `treeControl` alone would miss a node disabled through the option's own input and give it
1232
+ // a remove icon — one-by-one removal of exactly what the cleaner keeps.
1233
+ disabled: this.isNodeDisabled(node)
1026
1234
  }));
1027
1235
  this.changeDetectorRef.detectChanges();
1028
1236
  }
@@ -1031,42 +1239,76 @@ class KbqTreeSelect extends KbqAbstractSelect {
1031
1239
  * found with the designated value, the select trigger is cleared.
1032
1240
  */
1033
1241
  setSelectionByValue(value) {
1034
- if (this.multiSelection && value) {
1035
- if (!Array.isArray(value)) {
1036
- throw getKbqSelectNonArrayValueError();
1242
+ // Restored rather than cleared: a value written while this one is applied must not end the outer write.
1243
+ const wasWritingValue = this.writingValue;
1244
+ this.writingValue = true;
1245
+ try {
1246
+ if (this.multiSelection && value) {
1247
+ if (!Array.isArray(value)) {
1248
+ throw getKbqSelectNonArrayValueError();
1249
+ }
1250
+ this.tree().setOptionsFromValues(value);
1251
+ this.sortValues();
1252
+ }
1253
+ else {
1254
+ this.tree().setOptionsFromValues([value]);
1037
1255
  }
1038
- this.tree().setOptionsFromValues(value);
1039
- this.sortValues();
1040
1256
  }
1041
- else {
1042
- this.tree().setOptionsFromValues([value]);
1257
+ finally {
1258
+ this.writingValue = wasWritingValue;
1043
1259
  }
1044
1260
  this.changeDetectorRef.detectChanges();
1045
1261
  }
1046
1262
  initKeyManager() {
1047
1263
  const tree = this.tree();
1048
- this.originalOnKeyDown = tree.onKeyDown;
1049
- tree.onKeyDown = () => { };
1264
+ // The select routes every key itself and calls back into `tree.handleKeydown` for the parts it
1265
+ // delegates, so the tree must not also act on the same event from its own host listener.
1266
+ tree.ownsKeyboard = false;
1267
+ // `panelKeydownHandler` forwards every unhandled key to the tree's key manager, and the search
1268
+ // field sits inside the panel — so its query would otherwise drive the tree's type-ahead.
1269
+ tree.typeAhead = !this.search();
1050
1270
  tree.keyManager.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
1051
1271
  const treeValue = this.tree();
1052
- if (this._panelOpen && this.panel()) {
1272
+ if (this.panelOpenValue() && this.panel()) {
1053
1273
  this.scrollActiveOptionIntoView();
1054
1274
  }
1055
- else if (!this._panelOpen && !this.multiSelection && treeValue.keyManager.activeItem) {
1275
+ else if (!this.panelOpenValue() &&
1276
+ !this.multiSelection &&
1277
+ treeValue.keyManager.activeItem &&
1278
+ // The active option follows a written value, or the selection the tree re-pointed at reloaded data;
1279
+ // selecting it again would report it as the user's.
1280
+ !this.writingValue &&
1281
+ !treeValue.syncingSelection) {
1056
1282
  treeValue.keyManager.activeItem.selectViaInteraction();
1057
1283
  }
1058
1284
  });
1059
1285
  }
1060
- /** Sorts the selected values in the selected based on their order in the panel. */
1286
+ /**
1287
+ * Sorts the selected nodes by their order in the panel, collapsed branches included, or with `sortComparator`.
1288
+ * A node missing from the data sorts after every node in it.
1289
+ */
1061
1290
  sortValues() {
1062
- if (this.multiSelection) {
1063
- const options = this.options.toArray();
1064
- this.selectionModel.sort((a, b) => {
1065
- const sortComparator = this.sortComparator();
1066
- return sortComparator ? sortComparator(a, b, options) : options.indexOf(a) - options.indexOf(b);
1067
- });
1068
- this.stateChanges.next();
1291
+ if (!this.multiSelection)
1292
+ return;
1293
+ const nodes = this.tree().treeControl.dataNodes ?? [];
1294
+ const sortComparator = this.sortComparator();
1295
+ if (sortComparator) {
1296
+ this.selectionModel.sort((a, b) => sortComparator(a, b, nodes));
1069
1297
  }
1298
+ else {
1299
+ // Indexed once: `indexOf` in the comparator would scan the whole data set on every comparison.
1300
+ const order = new Map(nodes.map((node, index) => [node, index]));
1301
+ const indexOf = (node) => order.get(node) ?? nodes.length;
1302
+ this.selectionModel.sort((a, b) => indexOf(a) - indexOf(b));
1303
+ }
1304
+ this.syncSelectionState();
1305
+ // The tags were built while the model emitted, ahead of the sort.
1306
+ this.refreshTriggerValues();
1307
+ }
1308
+ /** Mirrors the selection into the `value` and `empty` signals. */
1309
+ syncSelectionState() {
1310
+ this.emptyValue.set(this.selectionModel.isEmpty());
1311
+ this.valueState.set(this.selectedValues);
1070
1312
  }
1071
1313
  /**
1072
1314
  * Highlights the selected item. If no option is selected, it will highlight
@@ -1092,19 +1334,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
1092
1334
  scrollActiveOptionIntoView() {
1093
1335
  this.tree().keyManager.activeItem?.focus();
1094
1336
  }
1095
- subscribeOnSearchChanges() {
1096
- const search = this.search();
1097
- if (!search?.ngControl.valueChanges)
1337
+ /**
1338
+ * Keeps `isEmptySearchResult` in step with the search field.
1339
+ *
1340
+ * The flag is read back once the tree has had the chance to re-render for the new query. Waiting on
1341
+ * the rendered set alone is not enough: a query that filters nothing out leaves the option list —
1342
+ * and therefore its `changes` — silent, and the flag kept answering for the query before it. The
1343
+ * timer is the floor that covers that case.
1344
+ */
1345
+ subscribeOnSearchChanges(tree, search) {
1346
+ const ngControl = search.ngControl;
1347
+ const valueChanges = ngControl?.valueChanges;
1348
+ if (!ngControl || !valueChanges)
1098
1349
  return;
1099
- search.ngControl.valueChanges
1100
- .pipe(audit(() => this.tree().unorderedOptions.changes), takeUntilDestroyed(this.destroyRef))
1101
- .subscribe((value) => {
1102
- this.isEmptySearchResult = !!value && this.tree().isEmpty;
1350
+ // Seeded rather than piped through `startWith`, which would open the gate below — and with it a
1351
+ // timer — before the user has typed anything.
1352
+ this.isEmptySearchResult = !!ngControl.value && tree.isEmpty;
1353
+ return valueChanges.pipe(audit(() => merge(tree.unorderedOptions.changes, timer(0)))).subscribe((value) => {
1354
+ this.isEmptySearchResult = !!value && tree.isEmpty;
1103
1355
  this.changeDetectorRef.markForCheck();
1104
1356
  });
1105
1357
  }
1106
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1107
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.30", type: KbqTreeSelect, isStandalone: true, selector: "kbq-tree-select", inputs: { hiddenItemsText: { classPropertyName: "hiddenItemsText", publicName: "hiddenItemsText", isSignal: false, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: false, isRequired: false, transformFunction: null }, sortComparator: { classPropertyName: "sortComparator", publicName: "sortComparator", isSignal: true, isRequired: false, transformFunction: null }, multiline: { classPropertyName: "multiline", publicName: "multiline", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, autoSelect: { classPropertyName: "autoSelect", publicName: "autoSelect", isSignal: false, isRequired: false, transformFunction: null }, selectAllToggle: { classPropertyName: "selectAllToggle", publicName: "selectAllToggle", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: false, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: false, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, selectAllHandler: { classPropertyName: "selectAllHandler", publicName: "selectAllHandler", isSignal: false, isRequired: false, transformFunction: null }, panelMinWidth: { classPropertyName: "panelMinWidth", publicName: "panelMinWidth", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxWidth: { classPropertyName: "panelMaxWidth", publicName: "panelMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxHeight: { classPropertyName: "panelMaxHeight", publicName: "panelMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, searchMinOptionsThreshold: { classPropertyName: "searchMinOptionsThreshold", publicName: "searchMinOptionsThreshold", isSignal: false, isRequired: false, transformFunction: null }, hiddenItemsTextFormatter: { classPropertyName: "hiddenItemsTextFormatter", publicName: "hiddenItemsTextFormatter", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { openedChange: "openedChange", openedStream: "opened", closedStream: "closed", selectionChange: "selectionChange", onSelectAll: "onSelectAll", valueChange: "valueChange" }, host: { listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline()", "class.kbq-disabled": "disabled", "class.kbq-invalid": "errorState", "attr.tabindex": "tabIndex", "attr.disabled": "disabled || null" }, classAttribute: "kbq-tree-select" }, providers: [
1358
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1359
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqTreeSelect, isStandalone: true, selector: "kbq-tree-select", inputs: { hiddenItemsText: { classPropertyName: "hiddenItemsText", publicName: "hiddenItemsText", isSignal: true, isRequired: false, transformFunction: null }, hiddenItemsTextFormatter: { classPropertyName: "hiddenItemsTextFormatter", publicName: "hiddenItemsTextFormatter", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, sortComparator: { classPropertyName: "sortComparator", publicName: "sortComparator", isSignal: true, isRequired: false, transformFunction: null }, clearPredicate: { classPropertyName: "clearPredicate", publicName: "clearPredicate", isSignal: true, isRequired: false, transformFunction: null }, multiline: { classPropertyName: "multiline", publicName: "multiline", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multipleInput: { classPropertyName: "multipleInput", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, autoSelectInput: { classPropertyName: "autoSelectInput", publicName: "autoSelect", isSignal: true, isRequired: false, transformFunction: null }, selectAllToggle: { classPropertyName: "selectAllToggle", publicName: "selectAllToggle", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null }, idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, tabIndexInput: { classPropertyName: "tabIndexInput", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selectAllHandlerInput: { classPropertyName: "selectAllHandlerInput", publicName: "selectAllHandler", isSignal: true, isRequired: false, transformFunction: null }, panelMinWidth: { classPropertyName: "panelMinWidth", publicName: "panelMinWidth", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxWidth: { classPropertyName: "panelMaxWidth", publicName: "panelMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxHeight: { classPropertyName: "panelMaxHeight", publicName: "panelMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, searchMinOptionsThresholdInput: { classPropertyName: "searchMinOptionsThresholdInput", publicName: "searchMinOptionsThreshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedChangeOutput: "openedChange", openedOutput: "opened", closedOutput: "closed", selectionChange: "selectionChange", onSelectAll: "onSelectAll" }, host: { attributes: { "role": "combobox" }, listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline()", "class.kbq-disabled": "disabledClass()", "class.kbq-invalid": "invalidClass()", "attr.id": "id()", "attr.aria-expanded": "panelOpen", "attr.aria-controls": "panelOpen ? panelId : null", "attr.aria-label": "ariaLabelText", "attr.aria-labelledby": "resolvedAriaLabelledby()", "attr.aria-invalid": "errorState()", "attr.aria-required": "required()", "attr.aria-disabled": "disabled() || null", "attr.tabindex": "tabIndex", "attr.disabled": "disabledAttribute()" }, classAttribute: "kbq-tree-select" }, providers: [
1108
1360
  { provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
1109
1361
  kbqCleanerFactoryProvider((() => {
1110
1362
  const treeSelect = inject(KbqTreeSelect);
@@ -1112,22 +1364,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
1112
1364
  get control() {
1113
1365
  return treeSelect;
1114
1366
  },
1115
- get keydownTarget() {
1116
- return treeSelect.elementRef.nativeElement;
1117
- },
1118
1367
  clearByEscape: false,
1119
- clear: (() => treeSelect.clear())
1368
+ clear: (() => treeSelect.clear()),
1369
+ canClear: (() => treeSelect.canClear)
1120
1370
  };
1121
1371
  })),
1122
- { provide: KbqTree, useExisting: KbqTreeSelect },
1123
1372
  { provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
1124
1373
  kbqSiblingPopupProvider(KbqTreeSelect)
1125
- ], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: KbqTag, descendants: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]" }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "value", "selectable", "removable", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
1126
- kbqSelectAnimations.transformPanel,
1127
- kbqSelectAnimations.fadeInContent
1128
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1374
+ ], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }, { propertyName: "noOptionsMessage", first: true, predicate: KbqSelectNoOptions, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "scrollbarViewport", first: true, predicate: KbqScrollbarViewport, descendants: true, isSignal: true }, { propertyName: "overlayDirQuery", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "tagsQuery", predicate: KbqTag, descendants: true, isSignal: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i2.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]", inputs: ["aria-label", "tabIndex"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "selectable", "removable", "value", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: KbqScrollbarViewport, selector: "[kbqScrollbarViewport]", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1129
1375
  }
1130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelect, decorators: [{
1376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, decorators: [{
1131
1377
  type: Component,
1132
1378
  args: [{ selector: 'kbq-tree-select', imports: [
1133
1379
  CdkOverlayOrigin,
@@ -1136,6 +1382,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
1136
1382
  CdkConnectedOverlay,
1137
1383
  CdkMonitorFocus,
1138
1384
  KbqTag,
1385
+ KbqScrollbarViewport,
1139
1386
  NgTemplateOutlet
1140
1387
  ], providers: [
1141
1388
  { provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
@@ -1145,130 +1392,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
1145
1392
  get control() {
1146
1393
  return treeSelect;
1147
1394
  },
1148
- get keydownTarget() {
1149
- return treeSelect.elementRef.nativeElement;
1150
- },
1151
1395
  clearByEscape: false,
1152
- clear: (() => treeSelect.clear())
1396
+ clear: (() => treeSelect.clear()),
1397
+ canClear: (() => treeSelect.canClear)
1153
1398
  };
1154
1399
  })),
1155
- { provide: KbqTree, useExisting: KbqTreeSelect },
1156
1400
  { provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
1157
1401
  kbqSiblingPopupProvider(KbqTreeSelect)
1158
1402
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
1159
1403
  class: 'kbq-tree-select',
1160
1404
  '[class.kbq-select_multiple]': 'multiple',
1161
1405
  '[class.kbq-select_multiline]': 'multiline()',
1162
- '[class.kbq-disabled]': 'disabled',
1163
- '[class.kbq-invalid]': 'errorState',
1406
+ '[class.kbq-disabled]': 'disabledClass()',
1407
+ '[class.kbq-invalid]': 'invalidClass()',
1408
+ // The tree-select is not a native control, so its combobox semantics, its accessible name and
1409
+ // its invalid/required/disabled states all have to be exposed explicitly.
1410
+ //
1411
+ // No `aria-haspopup` here: the panel carries no `role="tree"` yet, and announcing a popup that
1412
+ // the assistive technology then cannot find is worse than announcing none — the same call
1413
+ // `KbqDropdownTrigger` made. Add it together with the tree roles.
1414
+ //
1415
+ // No `aria-activedescendant` either: it is only read off the element that HAS the focus, and this
1416
+ // control moves the focus into the panel — onto the option, or into the projected search field —
1417
+ // for as long as the panel is open. It can only start telling the truth once the option highlight
1418
+ // stops being driven by real DOM focus (`KbqTreeOption` paints `kbq-focused` from `hasFocus`),
1419
+ // which is `@koobiq/components/tree`'s call to make.
1420
+ role: 'combobox',
1421
+ '[attr.id]': 'id()',
1422
+ '[attr.aria-expanded]': 'panelOpen',
1423
+ '[attr.aria-controls]': 'panelOpen ? panelId : null',
1424
+ '[attr.aria-label]': 'ariaLabelText',
1425
+ '[attr.aria-labelledby]': 'resolvedAriaLabelledby()',
1426
+ '[attr.aria-invalid]': 'errorState()',
1427
+ '[attr.aria-required]': 'required()',
1428
+ '[attr.aria-disabled]': 'disabled() || null',
1164
1429
  '[attr.tabindex]': 'tabIndex',
1165
- '[attr.disabled]': 'disabled || null',
1430
+ '[attr.disabled]': 'disabledAttribute()',
1166
1431
  '(click)': 'handleClick()',
1167
1432
  '(keydown)': 'handleKeydown($event)',
1168
1433
  '(focus)': 'onFocus()',
1169
1434
  '(blur)': 'onBlur()'
1170
- }, animations: [
1171
- kbqSelectAnimations.transformPanel,
1172
- kbqSelectAnimations.fadeInContent
1173
- ], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"] }]
1174
- }], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], overlayDir: [{
1175
- type: ViewChild,
1176
- args: [CdkConnectedOverlay, { static: false }]
1177
- }], tags: [{
1178
- type: ViewChildren,
1179
- args: [KbqTag]
1180
- }], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], hiddenItemsText: [{
1181
- type: Input
1182
- }], openedChange: [{
1183
- type: Output
1184
- }], openedStream: [{
1185
- type: Output,
1186
- args: ['opened']
1187
- }], closedStream: [{
1188
- type: Output,
1189
- args: ['closed']
1190
- }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], errorStateMatcher: [{
1191
- type: Input
1192
- }], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{
1193
- type: Input
1194
- }], required: [{
1195
- type: Input
1196
- }], multiple: [{
1197
- type: Input,
1198
- args: [{ transform: booleanAttribute }]
1199
- }], autoSelect: [{
1200
- type: Input
1201
- }], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], id: [{
1202
- type: Input
1203
- }], hasBackdrop: [{
1204
- type: Input
1205
- }], tabIndex: [{
1206
- type: Input
1207
- }], disabled: [{
1208
- type: Input,
1209
- args: [{ transform: booleanAttribute }]
1210
- }], selectAllHandler: [{
1211
- type: Input
1212
- }], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThreshold: [{
1213
- type: Input
1214
- }], hiddenItemsTextFormatter: [{
1215
- type: Input
1216
- }] } });
1435
+ }, hostDirectives: [
1436
+ { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
1437
+ ], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"] }]
1438
+ }], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], scrollbarViewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqScrollbarViewport), { isSignal: true }] }], overlayDirQuery: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], tagsQuery: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => KbqTag), { isSignal: true }] }], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], noOptionsMessage: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectNoOptions), { isSignal: true }] }], hiddenItemsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsText", required: false }] }], hiddenItemsTextFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsTextFormatter", required: false }] }], openedChangeOutput: [{ type: i0.Output, args: ["openedChange"] }], openedOutput: [{ type: i0.Output, args: ["opened"] }], closedOutput: [{ type: i0.Output, args: ["closed"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], clearPredicate: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearPredicate", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multipleInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], autoSelectInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSelect", required: false }] }], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], idInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], tabIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectAllHandlerInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllHandler", required: false }] }], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThresholdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchMinOptionsThreshold", required: false }] }] } });
1217
1439
 
1440
+ /**
1441
+ * The module declares nothing — `KbqTreeSelect` is standalone and brings its own imports — so the
1442
+ * entries below are here either to be re-exported or for the providers they carry (`OverlayModule`,
1443
+ * `KbqTagsModule`, `KbqTreeModule`).
1444
+ */
1218
1445
  class KbqTreeSelectModule {
1219
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1220
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
1446
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1447
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
1221
1448
  KbqTreeModule,
1222
- KbqIconModule,
1223
1449
  KbqTagsModule,
1224
- KbqPseudoCheckboxModule,
1225
1450
  KbqSelectSearch,
1226
1451
  KbqSelectFooter,
1227
1452
  KbqSelectMatcher,
1228
1453
  KbqSelectTrigger,
1229
1454
  KbqSelectSearchEmptyResult,
1230
- NgTemplateOutlet,
1231
- A11yModule,
1455
+ KbqSelectNoOptions,
1232
1456
  KbqTreeSelect], exports: [KbqTreeSelect,
1457
+ // `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
1458
+ // gives a consumer a control they cannot fill.
1459
+ KbqTreeModule,
1233
1460
  KbqSelectSearch,
1234
1461
  KbqSelectFooter,
1235
1462
  KbqSelectMatcher,
1236
1463
  KbqSelectTrigger,
1237
1464
  KbqSelectSearchEmptyResult,
1465
+ KbqSelectNoOptions,
1238
1466
  KbqFormFieldModule] }); }
1239
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
1467
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
1240
1468
  KbqTreeModule,
1241
- KbqIconModule,
1242
1469
  KbqTagsModule,
1243
- KbqPseudoCheckboxModule,
1244
- A11yModule,
1245
- KbqTreeSelect, KbqFormFieldModule] }); }
1470
+ KbqSelectNoOptions,
1471
+ KbqTreeSelect,
1472
+ // `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
1473
+ // gives a consumer a control they cannot fill.
1474
+ KbqTreeModule,
1475
+ KbqFormFieldModule] }); }
1246
1476
  }
1247
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTreeSelectModule, decorators: [{
1477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, decorators: [{
1248
1478
  type: NgModule,
1249
1479
  args: [{
1250
1480
  imports: [
1251
1481
  OverlayModule,
1252
1482
  KbqTreeModule,
1253
- KbqIconModule,
1254
1483
  KbqTagsModule,
1255
- KbqPseudoCheckboxModule,
1256
1484
  KbqSelectSearch,
1257
1485
  KbqSelectFooter,
1258
1486
  KbqSelectMatcher,
1259
1487
  KbqSelectTrigger,
1260
1488
  KbqSelectSearchEmptyResult,
1261
- NgTemplateOutlet,
1262
- A11yModule,
1489
+ KbqSelectNoOptions,
1263
1490
  KbqTreeSelect
1264
1491
  ],
1265
1492
  exports: [
1266
1493
  KbqTreeSelect,
1494
+ // `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
1495
+ // gives a consumer a control they cannot fill.
1496
+ KbqTreeModule,
1267
1497
  KbqSelectSearch,
1268
1498
  KbqSelectFooter,
1269
1499
  KbqSelectMatcher,
1270
1500
  KbqSelectTrigger,
1271
1501
  KbqSelectSearchEmptyResult,
1502
+ KbqSelectNoOptions,
1272
1503
  KbqFormFieldModule
1273
1504
  ]
1274
1505
  }]