@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,15 +1,16 @@
1
1
  import { ContentObserver } from '@angular/cdk/observers';
2
+ import { SharedResizeObserver } from '@angular/cdk/observers/private';
2
3
  import * as i0 from '@angular/core';
3
- import { inject, input, ContentChild, ContentChildren, Directive, NgModule } from '@angular/core';
4
- import { KBQ_TITLE_TEXT_REF, kbqInjectNativeElement, KBQ_WINDOW, PopUpTriggers, PopUpPlacements } from '@koobiq/components/core';
4
+ import { inject, input, contentChildren, ElementRef, contentChild, Directive, NgModule } from '@angular/core';
5
+ import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { PopUpTriggers, KBQ_TITLE_TEXT_REF, kbqInjectNativeElement, KBQ_WINDOW, PopUpPlacements } from '@koobiq/components/core';
5
7
  import { KbqTooltipTrigger, KbqToolTipModule } from '@koobiq/components/tooltip';
6
- import { Subject, Subscription, throttleTime } from 'rxjs';
7
- import { debounceTime } from 'rxjs/operators';
8
+ import { skip, debounceTime, filter, throttleTime } from 'rxjs';
8
9
 
9
10
  /**
10
11
  * Shows a tooltip with the full text of the host element, but only when that text is truncated —
11
12
  * i.e. it overflows horizontally, or vertically when clamped to several lines. The tooltip opens on
12
- * hover and on keyboard focus, and hides on blur, mouse leave, or window resize.
13
+ * hover and on keyboard focus, and hides on blur, mouse leave, or a resize of the measured container.
13
14
  *
14
15
  * By default, the tooltip content is the trimmed `textContent` of the host. Provide explicit content
15
16
  * with `[kbq-title]="stringOrTemplateRef"`. For nested markup, mark the measured container with the
@@ -21,42 +22,19 @@ import { debounceTime } from 'rxjs/operators';
21
22
  * elements automatically, so the directive works without explicit template references.
22
23
  */
23
24
  class KbqTitleDirective extends KbqTooltipTrigger {
24
- constructor() {
25
- super(...arguments);
26
- /** Optional host component that exposes the measured text/parent elements via `KBQ_TITLE_TEXT_REF`. */
27
- this.componentInstance = inject(KBQ_TITLE_TEXT_REF, { host: true, optional: true });
28
- /** Host native element the directive is attached to. */
29
- this.nativeElement = kbqInjectNativeElement();
30
- /** SSR-safe window reference used for `getComputedStyle` reads. */
31
- this.window = inject(KBQ_WINDOW);
32
- /** Observes host content mutations to re-evaluate overflow and refresh the resolved tooltip content. */
33
- this.contentObserver = inject(ContentObserver);
34
- /**
35
- * Optional explicit tooltip content. Accepts a `TemplateRef` (rendered as rich tooltip content) or a string.
36
- * When omitted (a bare `kbq-title` attribute resolves to an empty string), the directive falls back to the
37
- * trimmed `textContent` of the host (`viewValue`), preserving the default behavior.
38
- */
39
- this.titleContent = input('', ...(ngDevMode ? [{ debugName: "titleContent", alias: 'kbq-title' }] : [{ alias: 'kbq-title' }]));
40
- /** Emits `window:resize` events; subscribed to re-evaluate overflow after the viewport changes.
41
- * @docs-private */
42
- this.resizeStream = new Subject();
43
- /** Debounce/throttle interval (ms) applied to the resize and content-observer streams. */
44
- this.debounceInterval = 100;
45
- /** Subscription to `resizeStream`, torn down in `ngOnDestroy`. */
46
- this.resizeSubscription = Subscription.EMPTY;
47
- /** Subscription to the content observer, torn down in `ngOnDestroy`. */
48
- this.contentObserverSubscription = Subscription.EMPTY;
49
- /** Subscription to the focus monitor, torn down in `ngOnDestroy`. */
50
- this.focusMonitorSubscription = Subscription.EMPTY;
51
- }
52
- // todo need rename kbqTrigger in popover, tooltip and title. Here workaround for kbq-title and popover on one button
25
+ /**
26
+ * `kbqTrigger` is a single input alias shared by the tooltip, the popover and this directive, so a host
27
+ * carrying both `kbq-title` and `kbqPopover` feeds one value to both. The title tooltip ignores it and
28
+ * always behaves as hover + keyboard focus; the setter exists only so such a host keeps working.
29
+ *
30
+ * Unifying the alias family is a breaking change owned by the pop-up base, not a title-local fix.
31
+ */
53
32
  set trigger(value) {
54
33
  super.trigger = value;
55
34
  }
56
35
  /**
57
36
  * The pop-up trigger. Always reports `PopUpTriggers.Hover`, so the title tooltip reacts to hover and
58
- * keyboard focus regardless of the assigned value. The setter is kept only as a no-op workaround so a
59
- * host that also uses a popover can assign a trigger without breaking `kbq-title`.
37
+ * keyboard focus regardless of the assigned value.
60
38
  */
61
39
  get trigger() {
62
40
  return PopUpTriggers.Hover;
@@ -68,102 +46,118 @@ class KbqTitleDirective extends KbqTooltipTrigger {
68
46
  * them clips its own content.
69
47
  */
70
48
  get isOverflown() {
71
- const children = this.childElements;
72
- /** Multiple text elements (e.g. filter-bar pipe with a name and a value): overflown if any of them overflows. */
73
- if (children.length > 1) {
74
- return children.some((element) => this.parent?.offsetWidth < element.scrollWidth ||
75
- this.parent?.offsetHeight < element.scrollHeight ||
76
- this.isClippedInOwnBox(element));
77
- }
78
- /** For special cases where the difference is a fraction of a pixel */
79
- if (!this.isVerticalOverflown &&
80
- (this.child.scrollWidth === 0 || this.parent?.offsetWidth === this.child.scrollWidth)) {
81
- if (this.hasOnlyText) {
82
- const wrapper = this.renderer.createElement('span');
83
- wrapper.innerText = this.child.innerText;
84
- this.parent.appendChild(wrapper);
85
- const result = this.isWidthOverflown(this.parent.getBoundingClientRect().width, wrapper.getBoundingClientRect().width);
86
- wrapper.remove();
87
- return result;
88
- }
89
- return this.isWidthOverflown(this.parent.getBoundingClientRect().width, this.child.getBoundingClientRect().width);
90
- }
91
- return this.isHorizontalOverflown || this.isVerticalOverflown;
92
- }
93
- /** Whether the text is clipped horizontally: the parent `offsetWidth` is smaller than the child `scrollWidth`. */
94
- get isHorizontalOverflown() {
95
- return this.parent?.offsetWidth < this.child.scrollWidth;
96
- }
97
- /** Whether the text is clipped vertically: the parent `offsetHeight` is smaller than the child `scrollHeight`. */
98
- get isVerticalOverflown() {
99
- return this.parent?.offsetHeight < this.child.scrollHeight;
100
- }
101
- /**
102
- * Compares measured widths, treating only *visible* clipping as overflow. With `text-overflow: ellipsis`
103
- * any positive difference counts (even a sub-pixel overflow shows `…`). With `text-overflow: clip` the
104
- * widths are rounded to whole CSS pixels first — mirroring the integer `offsetWidth`/`scrollWidth` path —
105
- * so an imperceptible sub-pixel clip is not treated as truncation.
106
- * @docs-private */
107
- isWidthOverflown(parentWidth, childWidth) {
108
- return this.hasEllipsis ? parentWidth < childWidth : Math.round(parentWidth) < Math.round(childWidth);
49
+ const elements = this.childElements;
50
+ return elements.some((element) => this.isElementOverflown(element) || (elements.length > 1 && this.isClippedInOwnBox(element)));
109
51
  }
110
52
  /** Trimmed `textContent` of the measured parent, used as the default tooltip content. */
111
53
  get viewValue() {
112
- return (this.parent?.textContent || '').trim();
54
+ return (this.parent.textContent || '').trim();
113
55
  }
114
56
  /**
115
57
  * Measured container element. Resolved as the projected `#kbqTitleContainer`, otherwise the
116
- * `KBQ_TITLE_TEXT_REF` host's `parentTextElement`, otherwise the host element itself.
117
- * @docs-private */
58
+ * `KBQ_TITLE_TEXT_REF` host's `parentTextElement`, otherwise the host element itself. Never falsy.
59
+ *
60
+ * @docs-private
61
+ */
118
62
  get parent() {
119
- return (this.parentContainer?.nativeElement ||
63
+ return (this.parentContainer()?.nativeElement ||
120
64
  this.componentInstance?.parentTextElement?.nativeElement ||
121
65
  this.elementRef.nativeElement);
122
66
  }
123
- /** First effective text element used for overflow detection (the first entry of `childElements`).
124
- * @docs-private */
125
- get child() {
126
- return this.childElements[0];
127
- }
128
- /** Whether the host element contains exactly one child node and that node is a text node. */
67
+ /**
68
+ * Whether the host element contains exactly one child node and that node is a text node.
69
+ */
129
70
  get hasOnlyText() {
130
71
  return (this.nativeElement.childNodes.length === 1 && this.nativeElement.childNodes[0].nodeType === Node.TEXT_NODE);
131
72
  }
132
- /**
133
- * Whether the measured text truncates with an ellipsis on either the child text element or its
134
- * wrapping container. Only then is a sub-pixel overflow actually visible (the trailing glyph is
135
- * replaced by `…`); with the default `text-overflow: clip` a sub-pixel clip is imperceptible, so
136
- * it must not be reported as truncation. Both elements are checked because `text-overflow` is not
137
- * inherited and consumers place it differently: `KbqOption`/`KbqDropdownItem` style the measured
138
- * `child`, whereas `KbqTreeOption` styles the `parent` container that wraps the child.
139
- * @docs-private */
140
- get hasEllipsis() {
141
- return this.elementHasEllipsis(this.child) || this.elementHasEllipsis(this.parent);
142
- }
143
- /** Whether the element's computed `text-overflow` renders an ellipsis.
144
- * @docs-private */
145
- elementHasEllipsis(element) {
146
- return this.window.getComputedStyle(element).textOverflow.includes('ellipsis');
147
- }
148
73
  /**
149
74
  * Effective text elements used for overflow detection. Resolves to the projected `#kbqTitleText` elements,
150
75
  * otherwise falls back to the `KbqTitleTextRef` host's `textElement`, otherwise to the host element itself.
151
76
  * Always contains at least one element.
152
- * @docs-private */
77
+ */
153
78
  get childElements() {
154
- if (this.childContainer?.length) {
155
- return this.childContainer.map(({ nativeElement }) => nativeElement);
79
+ const projected = this.childContainer();
80
+ if (projected.length) {
81
+ return projected.map(({ nativeElement }) => nativeElement);
156
82
  }
157
83
  return [this.componentInstance?.textElement?.nativeElement ?? this.elementRef.nativeElement];
158
84
  }
159
- /** Resolved tooltip content: the explicit `titleContent` input when provided, otherwise the host text.
160
- * @docs-private */
85
+ /**
86
+ * Resolved tooltip content: the explicit `titleContent` input when provided, otherwise the host text.
87
+ */
161
88
  get resolvedContent() {
162
89
  return this.titleContent() || this.viewValue;
163
90
  }
91
+ /**
92
+ * Whether the pointer or the keyboard focus is on the host: the only time the overflow verdict is read. The two
93
+ * are tracked apart — `hovered` comes from the pop-up base, which binds it to the same `mouseenter`/`mouseleave`
94
+ * — because a click on a hovered host reports a mouse focus origin that hides the tooltip while the pointer stays
95
+ * where it was.
96
+ */
97
+ get entered() {
98
+ return this.hovered() || this.keyboardFocused;
99
+ }
100
+ constructor() {
101
+ super();
102
+ /** Optional host component that exposes the measured text/parent elements via `KBQ_TITLE_TEXT_REF`. */
103
+ this.componentInstance = inject(KBQ_TITLE_TEXT_REF, { host: true, optional: true });
104
+ /** Host native element the directive is attached to. */
105
+ this.nativeElement = kbqInjectNativeElement();
106
+ /** SSR-safe window reference used for `getComputedStyle` reads. */
107
+ this.window = inject(KBQ_WINDOW);
108
+ /** Observes host content mutations to re-evaluate overflow and refresh the resolved tooltip content. */
109
+ this.contentObserver = inject(ContentObserver);
110
+ /**
111
+ * Application-wide `ResizeObserver` shared by every consumer. One directive instance therefore adds no
112
+ * listener of its own — which matters because `kbq-title` sits on every dropdown item, list option and
113
+ * tree option — and, unlike a `window:resize` listener, it also reacts to container-only resizes
114
+ * (splitter drag, sidebar collapse) that leave the window untouched.
115
+ */
116
+ this.resizeObserver = inject(SharedResizeObserver);
117
+ /**
118
+ * Optional explicit tooltip content. Accepts a `TemplateRef` (rendered as rich tooltip content) or a string.
119
+ * When omitted (a bare `kbq-title` attribute resolves to an empty string), the directive falls back to the
120
+ * trimmed `textContent` of the host (`viewValue`), preserving the default behavior.
121
+ */
122
+ this.titleContent = input('', { ...(ngDevMode ? { debugName: "titleContent" } : /* istanbul ignore next */ {}), alias: 'kbq-title' });
123
+ /**
124
+ * Overrides the tooltip's hoverable default, as `KbqOptionTooltip` does. The hint spells out text that
125
+ * the host had to truncate, so it floats over the neighbouring content — and a pointer-capturing pane
126
+ * would swallow the clicks meant for it.
127
+ */
128
+ this.ignoreTooltipPointerEvents = input(true, ...(ngDevMode ? [{ debugName: "ignoreTooltipPointerEvents" }] : /* istanbul ignore next */ []));
129
+ /**
130
+ * The hint repeats text the host had to clip, so `kbqTooltipDisabled="false"` cannot conjure one for a
131
+ * fully visible title.
132
+ *
133
+ * @docs-private
134
+ */
135
+ this.derivedDisabledWins = true;
136
+ /** Debounce/throttle interval (ms) applied to the resize and content-observer streams. */
137
+ this.debounceInterval = 100;
138
+ /** Whether the host holds the keyboard focus, as the focus monitor reports it. */
139
+ this.keyboardFocused = false;
140
+ /** Projected text elements marked with the `#kbqTitleText` template reference. */
141
+ this.childContainer = contentChildren('kbqTitleText', { ...(ngDevMode ? { debugName: "childContainer" } : /* istanbul ignore next */ {}), descendants: true,
142
+ read: ElementRef });
143
+ /** Projected container element marked with the `#kbqTitleContainer` template reference. */
144
+ this.parentContainer = contentChild('kbqTitleContainer', { ...(ngDevMode ? { debugName: "parentContainer" } : /* istanbul ignore next */ {}), read: ElementRef });
145
+ // The input is otherwise read only on hover and on host mutations, neither of which a programmatic
146
+ // rebind triggers: without this, changing `[kbq-title]` while the tooltip is open leaves the overlay
147
+ // showing the previous text, and `disabled` keeps the verdict computed for the old content. Measured
148
+ // here whether or not the host is entered, unlike the observer streams below: a rebind is the
149
+ // consumer's own doing, one host at a time, and `disabled` is public. The initial value is skipped —
150
+ // `ngAfterViewInit` seeds the content once the queries are resolved.
151
+ toObservable(this.titleContent)
152
+ .pipe(skip(1), takeUntilDestroyed())
153
+ .subscribe(() => {
154
+ this.content = this.resolvedContent;
155
+ this.setDerivedDisabled(!this.isOverflown);
156
+ });
157
+ }
164
158
  /**
165
159
  * Sets the initial tooltip content and wires the streams that toggle the tooltip's `disabled` state:
166
- * window resize and content mutations re-evaluate overflow, and keyboard focus opens the tooltip
160
+ * container resizes and content mutations re-evaluate overflow, and keyboard focus opens the tooltip
167
161
  * while other focus origins hide it.
168
162
  */
169
163
  ngAfterViewInit() {
@@ -179,75 +173,165 @@ class KbqTitleDirective extends KbqTooltipTrigger {
179
173
  PopUpPlacements.Left
180
174
  ];
181
175
  }
182
- this.resizeSubscription = this.resizeStream
183
- .pipe(debounceTime(this.debounceInterval))
184
- .subscribe(() => (this.disabled = !this.isOverflown));
185
- this.contentObserverSubscription = this.contentObserver
176
+ // Measured only while the host is entered: nothing reads the verdict before `handleElementEnter` measures
177
+ // afresh, and `hideTooltip` disables the tooltip on leave. The gate is re-checked when the timer fires, since
178
+ // the pointer may have left in between and the verdict would otherwise re-enable a tooltip the leave had just
179
+ // disabled. A measurement appends a probe span to the container and reads it back, so each one forces a layout
180
+ // of the whole page — see `docs/e2e-flakiness.md` for what that costs on a page of hundreds of titled hosts.
181
+ this.resizeObserver
182
+ .observe(this.parent)
183
+ .pipe(debounceTime(this.debounceInterval), filter(() => this.entered), takeUntilDestroyed(this.destroyRef))
184
+ .subscribe(() => this.setDerivedDisabled(!this.isOverflown));
185
+ this.contentObserver
186
186
  .observe(this.parent)
187
- .pipe(throttleTime(this.debounceInterval))
187
+ .pipe(throttleTime(this.debounceInterval), filter(() => this.entered), takeUntilDestroyed(this.destroyRef))
188
188
  .subscribe(() => {
189
- this.disabled = !this.isOverflown;
189
+ this.setDerivedDisabled(!this.isOverflown);
190
190
  this.content = this.resolvedContent;
191
191
  });
192
- this.focusMonitorSubscription = this.focusMonitor
192
+ this.focusMonitor
193
193
  .monitor(this.elementRef)
194
- .subscribe((origin) => (origin === 'keyboard' ? this.handleElementEnter() : this.hideTooltip()));
195
- }
196
- /** Unsubscribes from the resize, content-observer and focus-monitor streams and stops focus monitoring. */
197
- ngOnDestroy() {
198
- super.ngOnDestroy();
199
- this.resizeSubscription.unsubscribe();
200
- this.contentObserverSubscription.unsubscribe();
201
- this.focusMonitorSubscription.unsubscribe();
202
- this.focusMonitor.stopMonitoring(this.elementRef);
194
+ .pipe(takeUntilDestroyed(this.destroyRef))
195
+ .subscribe((origin) => {
196
+ if (origin === 'keyboard') {
197
+ this.keyboardFocused = true;
198
+ this.handleElementEnter();
199
+ // `handleElementEnter()` only re-enables the tooltip. Without an explicit `show()` a
200
+ // keyboard user gets nothing: the trigger is locked to hover, so the base class binds no
201
+ // focus listener that would open it.
202
+ this.show();
203
+ return;
204
+ }
205
+ if (origin === null) {
206
+ // Stands in for the `blur` listener the base class never binds here: it binds one only for
207
+ // a focus trigger, and this directive reports hover unconditionally. `KbqTooltipTrigger`
208
+ // releases a tooltip muted by a pop-up on the same host on `mouseleave` or `blur` alone, so
209
+ // without this a keyboard-only user who once opened that pop-up would never see the title
210
+ // again — `show()` keeps returning early on the still-muted tooltip.
211
+ this.triggerName = 'blur';
212
+ }
213
+ this.keyboardFocused = false;
214
+ // Disabling hides an open tooltip on the way through `setDerivedDisabled`.
215
+ this.hideTooltip();
216
+ });
203
217
  }
204
- /** Enables the tooltip only when the content is overflown. Bound to `mouseenter` and keyboard focus.
205
- * @docs-private */
218
+ /**
219
+ * Enables the tooltip only when the content is overflown. Bound to `mouseenter` and keyboard focus.
220
+ *
221
+ * @docs-private
222
+ */
206
223
  handleElementEnter() {
207
224
  this.content = this.resolvedContent;
208
- this.disabled = !this.isOverflown;
225
+ this.setDerivedDisabled(!this.isOverflown);
209
226
  }
210
- /** Always disables (hides) the tooltip. Bound to `mouseleave` and non-keyboard focus changes.
211
- * @docs-private */
227
+ /**
228
+ * Always disables (hides) the tooltip. Bound to `mouseleave` and non-keyboard focus changes.
229
+ *
230
+ * @docs-private
231
+ */
212
232
  hideTooltip() {
213
- this.disabled = true;
233
+ this.setDerivedDisabled(true);
234
+ }
235
+ /**
236
+ * Whether a single measured text element is clipped by the parent container. Both the single- and the
237
+ * multi-element host go through this method, so a filter-bar pipe or a two-line list option gets the same
238
+ * sub-pixel and ellipsis awareness as a plain text host.
239
+ */
240
+ isElementOverflown(element) {
241
+ if (!element) {
242
+ return false;
243
+ }
244
+ const { offsetWidth, offsetHeight } = this.parent;
245
+ const isVerticalOverflown = offsetHeight < element.scrollHeight;
246
+ /** For special cases where the difference is a fraction of a pixel */
247
+ if (!isVerticalOverflown && (element.scrollWidth === 0 || offsetWidth === element.scrollWidth)) {
248
+ if (this.hasOnlyText) {
249
+ return this.isTextWiderThanContainer(element);
250
+ }
251
+ return this.isWidthOverflown(this.parent.getBoundingClientRect().width, element.getBoundingClientRect().width, element);
252
+ }
253
+ return offsetWidth < element.scrollWidth || isVerticalOverflown;
214
254
  }
215
255
  /**
216
256
  * Whether a text element is narrower than its own text. Text elements that share the parent can take width
217
257
  * from each other, so one is clipped while its full text would still fit the parent — which the parent
218
258
  * comparison above cannot see. An inline element reports a zero `clientWidth` and never clips.
219
- * @docs-private */
259
+ */
220
260
  isClippedInOwnBox(element) {
221
261
  return element.clientWidth > 0 && element.scrollWidth > element.clientWidth;
222
262
  }
223
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
224
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqTitleDirective, isStandalone: true, selector: "[kbq-title]", inputs: { titleContent: { classPropertyName: "titleContent", publicName: "kbq-title", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "handleElementEnter()", "mouseleave": "hideTooltip()", "window:resize": "resizeStream.next($event)" } }, queries: [{ propertyName: "parentContainer", first: true, predicate: ["kbqTitleContainer"], descendants: true }, { propertyName: "childContainer", predicate: ["kbqTitleText"], descendants: true }], exportAs: ["kbqTitle"], usesInheritance: true, ngImport: i0 }); }
263
+ /**
264
+ * Compares the container against the width the text occupies when nothing clips it: a probe span
265
+ * carrying the same text is appended to the container, both are measured, and the probe is removed
266
+ * again. `finally` guarantees the probe never outlives the measurement — a throw between the append and
267
+ * the read (e.g. a layout call on a detached tree) would otherwise strand it in the consumer's DOM.
268
+ *
269
+ * The container is measured while the probe is attached, as it has been since the sub-pixel path was
270
+ * introduced: a shrink-to-fit container stretched by the probe must not be reported as clipping it.
271
+ */
272
+ isTextWiderThanContainer(element) {
273
+ const wrapper = this.renderer.createElement('span');
274
+ wrapper.innerText = element.innerText;
275
+ this.parent.appendChild(wrapper);
276
+ try {
277
+ return this.isWidthOverflown(this.parent.getBoundingClientRect().width, wrapper.getBoundingClientRect().width, element);
278
+ }
279
+ finally {
280
+ wrapper.remove();
281
+ }
282
+ }
283
+ /**
284
+ * Compares measured widths, treating only *visible* clipping as overflow. With `text-overflow: ellipsis`
285
+ * any positive difference counts (even a sub-pixel overflow shows `…`). With `text-overflow: clip` the
286
+ * widths are rounded to whole CSS pixels first — mirroring the integer `offsetWidth`/`scrollWidth` path —
287
+ * so an imperceptible sub-pixel clip is not treated as truncation.
288
+ */
289
+ isWidthOverflown(parentWidth, childWidth, element) {
290
+ return this.hasEllipsis(element) ? parentWidth < childWidth : Math.round(parentWidth) < Math.round(childWidth);
291
+ }
292
+ /**
293
+ * Whether the measured text truncates with an ellipsis on either the text element or its wrapping
294
+ * container. Only then is a sub-pixel overflow actually visible (the trailing glyph is replaced by `…`);
295
+ * with the default `text-overflow: clip` a sub-pixel clip is imperceptible, so it must not be reported as
296
+ * truncation. Both elements are checked because `text-overflow` is not inherited and consumers place it
297
+ * differently: `KbqOption`/`KbqDropdownItem` style the measured text element, whereas `KbqTreeOption`
298
+ * styles the parent container that wraps it.
299
+ */
300
+ hasEllipsis(element) {
301
+ return this.elementHasEllipsis(element) || this.elementHasEllipsis(this.parent);
302
+ }
303
+ /**
304
+ * Whether the element's computed `text-overflow` renders an ellipsis.
305
+ */
306
+ elementHasEllipsis(element) {
307
+ return this.window.getComputedStyle(element).textOverflow.includes('ellipsis');
308
+ }
309
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
310
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.25", type: KbqTitleDirective, isStandalone: true, selector: "[kbq-title]", inputs: { titleContent: { classPropertyName: "titleContent", publicName: "kbq-title", isSignal: true, isRequired: false, transformFunction: null }, ignoreTooltipPointerEvents: { classPropertyName: "ignoreTooltipPointerEvents", publicName: "ignoreTooltipPointerEvents", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "handleElementEnter()", "mouseleave": "hideTooltip()" } }, queries: [{ propertyName: "childContainer", predicate: ["kbqTitleText"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "parentContainer", first: true, predicate: ["kbqTitleContainer"], descendants: true, read: ElementRef, isSignal: true }], exportAs: ["kbqTitle"], usesInheritance: true, ngImport: i0 }); }
225
311
  }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleDirective, decorators: [{
312
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleDirective, decorators: [{
227
313
  type: Directive,
228
314
  args: [{
229
315
  selector: '[kbq-title]',
230
316
  host: {
231
317
  '(mouseenter)': 'handleElementEnter()',
232
- '(mouseleave)': 'hideTooltip()',
233
- '(window:resize)': 'resizeStream.next($event)'
318
+ '(mouseleave)': 'hideTooltip()'
234
319
  },
235
320
  exportAs: 'kbqTitle'
236
321
  }]
237
- }], propDecorators: { titleContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbq-title", required: false }] }], childContainer: [{
238
- type: ContentChildren,
239
- args: ['kbqTitleText', { descendants: true }]
240
- }], parentContainer: [{
241
- type: ContentChild,
242
- args: ['kbqTitleContainer']
243
- }] } });
322
+ }], ctorParameters: () => [], propDecorators: { titleContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbq-title", required: false }] }], ignoreTooltipPointerEvents: [{ type: i0.Input, args: [{ isSignal: true, alias: "ignoreTooltipPointerEvents", required: false }] }], childContainer: [{ type: i0.ContentChildren, args: ['kbqTitleText', { ...{
323
+ descendants: true,
324
+ read: ElementRef
325
+ }, isSignal: true }] }], parentContainer: [{ type: i0.ContentChild, args: ['kbqTitleContainer', { ...{
326
+ read: ElementRef
327
+ }, isSignal: true }] }] } });
244
328
 
245
329
  class KbqTitleModule {
246
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
247
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleModule, imports: [KbqToolTipModule, KbqTitleDirective], exports: [KbqTitleDirective] }); }
248
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleModule, imports: [KbqToolTipModule] }); }
330
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
331
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleModule, imports: [KbqToolTipModule, KbqTitleDirective], exports: [KbqTitleDirective] }); }
332
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleModule, imports: [KbqToolTipModule] }); }
249
333
  }
250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTitleModule, decorators: [{
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTitleModule, decorators: [{
251
335
  type: NgModule,
252
336
  args: [{
253
337
  imports: [KbqToolTipModule, KbqTitleDirective],
@@ -1 +1 @@
1
- {"version":3,"file":"koobiq-components-title.mjs","sources":["../../../packages/components/title/title.directive.ts","../../../packages/components/title/title.module.ts","../../../packages/components/title/koobiq-components-title.ts"],"sourcesContent":["import { ContentObserver } from '@angular/cdk/observers';\nimport {\n AfterViewInit,\n ContentChild,\n ContentChildren,\n Directive,\n ElementRef,\n inject,\n input,\n OnDestroy,\n QueryList,\n TemplateRef\n} from '@angular/core';\nimport {\n KBQ_TITLE_TEXT_REF,\n KBQ_WINDOW,\n kbqInjectNativeElement,\n KbqTitleTextRef,\n PopUpPlacements,\n PopUpTriggers\n} from '@koobiq/components/core';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { Subject, Subscription, throttleTime } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/**\n * Shows a tooltip with the full text of the host element, but only when that text is truncated —\n * i.e. it overflows horizontally, or vertically when clamped to several lines. The tooltip opens on\n * hover and on keyboard focus, and hides on blur, mouse leave, or window resize.\n *\n * By default, the tooltip content is the trimmed `textContent` of the host. Provide explicit content\n * with `[kbq-title]=\"stringOrTemplateRef\"`. For nested markup, mark the measured container with the\n * `#kbqTitleContainer` template reference and the text element(s) with `#kbqTitleText`; several\n * `#kbqTitleText` elements are supported and the tooltip is shown when any of them overflows the container\n * or is clipped by its siblings.\n *\n * Host components that provide `KBQ_TITLE_TEXT_REF` (e.g. `KbqOption`) supply the text and parent\n * elements automatically, so the directive works without explicit template references.\n */\n@Directive({\n selector: '[kbq-title]',\n host: {\n '(mouseenter)': 'handleElementEnter()',\n '(mouseleave)': 'hideTooltip()',\n '(window:resize)': 'resizeStream.next($event)'\n },\n exportAs: 'kbqTitle'\n})\nexport class KbqTitleDirective extends KbqTooltipTrigger implements AfterViewInit, OnDestroy {\n /** Optional host component that exposes the measured text/parent elements via `KBQ_TITLE_TEXT_REF`. */\n private componentInstance = inject<KbqTitleTextRef>(KBQ_TITLE_TEXT_REF, { host: true, optional: true });\n\n /** Host native element the directive is attached to. */\n private readonly nativeElement = kbqInjectNativeElement();\n\n /** SSR-safe window reference used for `getComputedStyle` reads. */\n private readonly window = inject(KBQ_WINDOW);\n\n /** Observes host content mutations to re-evaluate overflow and refresh the resolved tooltip content. */\n private contentObserver = inject(ContentObserver);\n\n /**\n * Optional explicit tooltip content. Accepts a `TemplateRef` (rendered as rich tooltip content) or a string.\n * When omitted (a bare `kbq-title` attribute resolves to an empty string), the directive falls back to the\n * trimmed `textContent` of the host (`viewValue`), preserving the default behavior.\n */\n readonly titleContent = input<TemplateRef<any> | string>('', { alias: 'kbq-title' });\n\n // todo need rename kbqTrigger in popover, tooltip and title. Here workaround for kbq-title and popover on one button\n set trigger(value: string) {\n super.trigger = value;\n }\n\n /**\n * The pop-up trigger. Always reports `PopUpTriggers.Hover`, so the title tooltip reacts to hover and\n * keyboard focus regardless of the assigned value. The setter is kept only as a no-op workaround so a\n * host that also uses a popover can assign a trigger without breaking `kbq-title`.\n */\n get trigger(): string {\n return PopUpTriggers.Hover;\n }\n\n /**\n * Whether the host content is clipped and therefore needs a tooltip. Returns `true` if any measured\n * text element overflows the parent — covering multiple `#kbqTitleText` elements, the sub-pixel\n * special case, and both horizontal and vertical overflow — or, with several text elements, if one of\n * them clips its own content.\n */\n get isOverflown(): boolean {\n const children = this.childElements;\n\n /** Multiple text elements (e.g. filter-bar pipe with a name and a value): overflown if any of them overflows. */\n if (children.length > 1) {\n return children.some(\n (element) =>\n this.parent?.offsetWidth < element.scrollWidth ||\n this.parent?.offsetHeight < element.scrollHeight ||\n this.isClippedInOwnBox(element)\n );\n }\n\n /** For special cases where the difference is a fraction of a pixel */\n if (\n !this.isVerticalOverflown &&\n (this.child.scrollWidth === 0 || this.parent?.offsetWidth === this.child.scrollWidth)\n ) {\n if (this.hasOnlyText) {\n const wrapper = this.renderer.createElement('span');\n\n wrapper.innerText = this.child.innerText;\n this.parent.appendChild(wrapper);\n\n const result = this.isWidthOverflown(\n this.parent.getBoundingClientRect().width,\n wrapper.getBoundingClientRect().width\n );\n\n wrapper.remove();\n\n return result;\n }\n\n return this.isWidthOverflown(\n this.parent.getBoundingClientRect().width,\n this.child.getBoundingClientRect().width\n );\n }\n\n return this.isHorizontalOverflown || this.isVerticalOverflown;\n }\n\n /** Whether the text is clipped horizontally: the parent `offsetWidth` is smaller than the child `scrollWidth`. */\n get isHorizontalOverflown(): boolean {\n return this.parent?.offsetWidth < this.child.scrollWidth;\n }\n\n /** Whether the text is clipped vertically: the parent `offsetHeight` is smaller than the child `scrollHeight`. */\n get isVerticalOverflown(): boolean {\n return this.parent?.offsetHeight < this.child.scrollHeight;\n }\n\n /**\n * Compares measured widths, treating only *visible* clipping as overflow. With `text-overflow: ellipsis`\n * any positive difference counts (even a sub-pixel overflow shows `…`). With `text-overflow: clip` the\n * widths are rounded to whole CSS pixels first — mirroring the integer `offsetWidth`/`scrollWidth` path —\n * so an imperceptible sub-pixel clip is not treated as truncation.\n * @docs-private */\n private isWidthOverflown(parentWidth: number, childWidth: number): boolean {\n return this.hasEllipsis ? parentWidth < childWidth : Math.round(parentWidth) < Math.round(childWidth);\n }\n\n /** Trimmed `textContent` of the measured parent, used as the default tooltip content. */\n get viewValue(): string {\n return (this.parent?.textContent || '').trim();\n }\n\n /**\n * Measured container element. Resolved as the projected `#kbqTitleContainer`, otherwise the\n * `KBQ_TITLE_TEXT_REF` host's `parentTextElement`, otherwise the host element itself.\n * @docs-private */\n get parent(): HTMLElement {\n return (\n this.parentContainer?.nativeElement ||\n this.componentInstance?.parentTextElement?.nativeElement ||\n this.elementRef.nativeElement\n );\n }\n\n /** First effective text element used for overflow detection (the first entry of `childElements`).\n * @docs-private */\n get child(): HTMLElement {\n return this.childElements[0];\n }\n\n /** Whether the host element contains exactly one child node and that node is a text node. */\n get hasOnlyText(): boolean {\n return (\n this.nativeElement.childNodes.length === 1 && this.nativeElement.childNodes[0].nodeType === Node.TEXT_NODE\n );\n }\n\n /**\n * Whether the measured text truncates with an ellipsis on either the child text element or its\n * wrapping container. Only then is a sub-pixel overflow actually visible (the trailing glyph is\n * replaced by `…`); with the default `text-overflow: clip` a sub-pixel clip is imperceptible, so\n * it must not be reported as truncation. Both elements are checked because `text-overflow` is not\n * inherited and consumers place it differently: `KbqOption`/`KbqDropdownItem` style the measured\n * `child`, whereas `KbqTreeOption` styles the `parent` container that wraps the child.\n * @docs-private */\n private get hasEllipsis(): boolean {\n return this.elementHasEllipsis(this.child) || this.elementHasEllipsis(this.parent);\n }\n\n /** Whether the element's computed `text-overflow` renders an ellipsis.\n * @docs-private */\n private elementHasEllipsis(element: HTMLElement): boolean {\n return this.window.getComputedStyle(element).textOverflow.includes('ellipsis');\n }\n\n /**\n * Effective text elements used for overflow detection. Resolves to the projected `#kbqTitleText` elements,\n * otherwise falls back to the `KbqTitleTextRef` host's `textElement`, otherwise to the host element itself.\n * Always contains at least one element.\n * @docs-private */\n private get childElements(): HTMLElement[] {\n if (this.childContainer?.length) {\n return this.childContainer.map(({ nativeElement }) => nativeElement);\n }\n\n return [this.componentInstance?.textElement?.nativeElement ?? this.elementRef.nativeElement];\n }\n\n /** Resolved tooltip content: the explicit `titleContent` input when provided, otherwise the host text.\n * @docs-private */\n private get resolvedContent(): string | TemplateRef<any> {\n return this.titleContent() || this.viewValue;\n }\n\n /** Emits `window:resize` events; subscribed to re-evaluate overflow after the viewport changes.\n * @docs-private */\n readonly resizeStream = new Subject<Event>();\n\n /** Debounce/throttle interval (ms) applied to the resize and content-observer streams. */\n private readonly debounceInterval: number = 100;\n\n /** Subscription to `resizeStream`, torn down in `ngOnDestroy`. */\n private resizeSubscription = Subscription.EMPTY;\n /** Subscription to the content observer, torn down in `ngOnDestroy`. */\n private contentObserverSubscription = Subscription.EMPTY;\n /** Subscription to the focus monitor, torn down in `ngOnDestroy`. */\n private focusMonitorSubscription = Subscription.EMPTY;\n\n /** Projected text elements marked with the `#kbqTitleText` template reference. */\n @ContentChildren('kbqTitleText', { descendants: true })\n private childContainer: QueryList<ElementRef>;\n\n /** Projected container element marked with the `#kbqTitleContainer` template reference. */\n @ContentChild('kbqTitleContainer')\n private parentContainer: ElementRef;\n\n /**\n * Sets the initial tooltip content and wires the streams that toggle the tooltip's `disabled` state:\n * window resize and content mutations re-evaluate overflow, and keyboard focus opens the tooltip\n * while other focus origins hide it.\n */\n ngAfterViewInit() {\n this.content = this.resolvedContent;\n\n // Keep the title tooltip centered on the trigger: fall back only to center-aligned placements\n // (top/bottom center horizontally; left/right center vertically), never to edge-anchored corner\n // positions. Guarded so an explicit consumer `kbqPlacementPriority` or `kbqPlacement` is respected.\n if (!this.placementPriority && this.placement === PopUpPlacements.Top) {\n this.placementPriority = [\n PopUpPlacements.Top,\n PopUpPlacements.Bottom,\n PopUpPlacements.Right,\n PopUpPlacements.Left\n ];\n }\n\n this.resizeSubscription = this.resizeStream\n .pipe(debounceTime(this.debounceInterval))\n .subscribe(() => (this.disabled = !this.isOverflown));\n\n this.contentObserverSubscription = this.contentObserver\n .observe(this.parent)\n .pipe(throttleTime(this.debounceInterval))\n .subscribe(() => {\n this.disabled = !this.isOverflown;\n this.content = this.resolvedContent;\n });\n\n this.focusMonitorSubscription = this.focusMonitor\n .monitor(this.elementRef)\n .subscribe((origin) => (origin === 'keyboard' ? this.handleElementEnter() : this.hideTooltip()));\n }\n\n /** Unsubscribes from the resize, content-observer and focus-monitor streams and stops focus monitoring. */\n ngOnDestroy() {\n super.ngOnDestroy();\n\n this.resizeSubscription.unsubscribe();\n this.contentObserverSubscription.unsubscribe();\n this.focusMonitorSubscription.unsubscribe();\n this.focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Enables the tooltip only when the content is overflown. Bound to `mouseenter` and keyboard focus.\n * @docs-private */\n handleElementEnter() {\n this.content = this.resolvedContent;\n this.disabled = !this.isOverflown;\n }\n\n /** Always disables (hides) the tooltip. Bound to `mouseleave` and non-keyboard focus changes.\n * @docs-private */\n hideTooltip() {\n this.disabled = true;\n }\n\n /**\n * Whether a text element is narrower than its own text. Text elements that share the parent can take width\n * from each other, so one is clipped while its full text would still fit the parent — which the parent\n * comparison above cannot see. An inline element reports a zero `clientWidth` and never clips.\n * @docs-private */\n private isClippedInOwnBox(element: HTMLElement): boolean {\n return element.clientWidth > 0 && element.scrollWidth > element.clientWidth;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { KbqTitleDirective } from './title.directive';\n\n@NgModule({\n imports: [KbqToolTipModule, KbqTitleDirective],\n exports: [KbqTitleDirective]\n})\nexport class KbqTitleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAyBA;;;;;;;;;;;;;AAaG;AAUG,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;AATxD,IAAA,WAAA,GAAA;;;AAWY,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAkB,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;QAGtF,IAAA,CAAA,aAAa,GAAG,sBAAsB,EAAE;;AAGxC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGpC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAEjD;;;;AAIG;AACM,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA4B,EAAE,gDAAI,KAAK,EAAE,WAAW,EAAA,CAAA,GAAA,CAApB,EAAE,KAAK,EAAE,WAAW,EAAE,GAAC;AAwJpF;AACmB;AACV,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAS;;QAG3B,IAAA,CAAA,gBAAgB,GAAW,GAAG;;AAGvC,QAAA,IAAA,CAAA,kBAAkB,GAAG,YAAY,CAAC,KAAK;;AAEvC,QAAA,IAAA,CAAA,2BAA2B,GAAG,YAAY,CAAC,KAAK;;AAEhD,QAAA,IAAA,CAAA,wBAAwB,GAAG,YAAY,CAAC,KAAK;AA8ExD,IAAA;;IA/OG,IAAI,OAAO,CAAC,KAAa,EAAA;AACrB,QAAA,KAAK,CAAC,OAAO,GAAG,KAAK;IACzB;AAEA;;;;AAIG;AACH,IAAA,IAAI,OAAO,GAAA;QACP,OAAO,aAAa,CAAC,KAAK;IAC9B;AAEA;;;;;AAKG;AACH,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa;;AAGnC,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,OAAO,QAAQ,CAAC,IAAI,CAChB,CAAC,OAAO,KACJ,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW;AAC9C,gBAAA,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY;AAChD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CACtC;QACL;;QAGA,IACI,CAAC,IAAI,CAAC,mBAAmB;aACxB,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EACvF;AACE,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;gBAEnD,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS;AACxC,gBAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;gBAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAChC,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,KAAK,EACzC,OAAO,CAAC,qBAAqB,EAAE,CAAC,KAAK,CACxC;gBAED,OAAO,CAAC,MAAM,EAAE;AAEhB,gBAAA,OAAO,MAAM;YACjB;YAEA,OAAO,IAAI,CAAC,gBAAgB,CACxB,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,KAAK,EACzC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAC3C;QACL;AAEA,QAAA,OAAO,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,mBAAmB;IACjE;;AAGA,IAAA,IAAI,qBAAqB,GAAA;QACrB,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW;IAC5D;;AAGA,IAAA,IAAI,mBAAmB,GAAA;QACnB,OAAO,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY;IAC9D;AAEA;;;;;AAKmB;IACX,gBAAgB,CAAC,WAAmB,EAAE,UAAkB,EAAA;QAC5D,OAAO,IAAI,CAAC,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IACzG;;AAGA,IAAA,IAAI,SAAS,GAAA;AACT,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE;IAClD;AAEA;;;AAGmB;AACnB,IAAA,IAAI,MAAM,GAAA;AACN,QAAA,QACI,IAAI,CAAC,eAAe,EAAE,aAAa;AACnC,YAAA,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,aAAa;AACxD,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa;IAErC;AAEA;AACmB;AACnB,IAAA,IAAI,KAAK,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAChC;;AAGA,IAAA,IAAI,WAAW,GAAA;QACX,QACI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS;IAElH;AAEA;;;;;;;AAOmB;AACnB,IAAA,IAAY,WAAW,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;IACtF;AAEA;AACmB;AACX,IAAA,kBAAkB,CAAC,OAAoB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClF;AAEA;;;;AAImB;AACnB,IAAA,IAAY,aAAa,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE;AAC7B,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,aAAa,CAAC;QACxE;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAChG;AAEA;AACmB;AACnB,IAAA,IAAY,eAAe,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,SAAS;IAChD;AAwBA;;;;AAIG;IACH,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe;;;;AAKnC,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,KAAK,eAAe,CAAC,GAAG,EAAE;YACnE,IAAI,CAAC,iBAAiB,GAAG;AACrB,gBAAA,eAAe,CAAC,GAAG;AACnB,gBAAA,eAAe,CAAC,MAAM;AACtB,gBAAA,eAAe,CAAC,KAAK;AACrB,gBAAA,eAAe,CAAC;aACnB;QACL;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC1B,aAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACxC,aAAA,SAAS,CAAC,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAEzD,QAAA,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;AACnC,aAAA,OAAO,CAAC,IAAI,CAAC,MAAM;AACnB,aAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACxC,SAAS,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW;AACjC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe;AACvC,QAAA,CAAC,CAAC;AAEN,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAChC,aAAA,OAAO,CAAC,IAAI,CAAC,UAAU;aACvB,SAAS,CAAC,CAAC,MAAM,MAAM,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACxG;;IAGA,WAAW,GAAA;QACP,KAAK,CAAC,WAAW,EAAE;AAEnB,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;AACrC,QAAA,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE;AAC9C,QAAA,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE;QAC3C,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;IACrD;AAEA;AACmB;IACnB,kBAAkB,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW;IACrC;AAEA;AACmB;IACnB,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACxB;AAEA;;;;AAImB;AACX,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AAC1C,QAAA,OAAO,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAC/E;kIAnQS,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;sHAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAT7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,IAAI,EAAE;AACF,wBAAA,cAAc,EAAE,sBAAsB;AACtC,wBAAA,cAAc,EAAE,eAAe;AAC/B,wBAAA,iBAAiB,EAAE;AACtB,qBAAA;AACD,oBAAA,QAAQ,EAAE;AACb,iBAAA;;sBA0LI,eAAe;AAAC,gBAAA,IAAA,EAAA,CAAA,cAAc,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;;sBAIrD,YAAY;uBAAC,mBAAmB;;;MCrOxB,cAAc,CAAA;kIAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAd,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,EAAA,OAAA,EAAA,CAHb,gBAAgB,EAAE,iBAAiB,aACnC,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAElB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHb,gBAAgB,CAAA,EAAA,CAAA,CAAA;;4FAGjB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;oBAC9C,OAAO,EAAE,CAAC,iBAAiB;AAC9B,iBAAA;;;ACPD;;AAEG;;;;"}
1
+ {"version":3,"file":"koobiq-components-title.mjs","sources":["../../../packages/components/title/title.directive.ts","../../../packages/components/title/title.module.ts","../../../packages/components/title/koobiq-components-title.ts"],"sourcesContent":["import { ContentObserver } from '@angular/cdk/observers';\nimport { SharedResizeObserver } from '@angular/cdk/observers/private';\nimport {\n AfterViewInit,\n contentChild,\n contentChildren,\n Directive,\n ElementRef,\n inject,\n input,\n Signal,\n TemplateRef\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport {\n KBQ_TITLE_TEXT_REF,\n KBQ_WINDOW,\n kbqInjectNativeElement,\n KbqTitleTextRef,\n PopUpPlacements,\n PopUpTriggers\n} from '@koobiq/components/core';\nimport { KbqTooltipTrigger } from '@koobiq/components/tooltip';\nimport { debounceTime, filter, skip, throttleTime } from 'rxjs';\n\n/**\n * Shows a tooltip with the full text of the host element, but only when that text is truncated —\n * i.e. it overflows horizontally, or vertically when clamped to several lines. The tooltip opens on\n * hover and on keyboard focus, and hides on blur, mouse leave, or a resize of the measured container.\n *\n * By default, the tooltip content is the trimmed `textContent` of the host. Provide explicit content\n * with `[kbq-title]=\"stringOrTemplateRef\"`. For nested markup, mark the measured container with the\n * `#kbqTitleContainer` template reference and the text element(s) with `#kbqTitleText`; several\n * `#kbqTitleText` elements are supported and the tooltip is shown when any of them overflows the container\n * or is clipped by its siblings.\n *\n * Host components that provide `KBQ_TITLE_TEXT_REF` (e.g. `KbqOption`) supply the text and parent\n * elements automatically, so the directive works without explicit template references.\n */\n@Directive({\n selector: '[kbq-title]',\n host: {\n '(mouseenter)': 'handleElementEnter()',\n '(mouseleave)': 'hideTooltip()'\n },\n exportAs: 'kbqTitle'\n})\nexport class KbqTitleDirective extends KbqTooltipTrigger implements AfterViewInit {\n /** Optional host component that exposes the measured text/parent elements via `KBQ_TITLE_TEXT_REF`. */\n private readonly componentInstance = inject<KbqTitleTextRef>(KBQ_TITLE_TEXT_REF, { host: true, optional: true });\n\n /** Host native element the directive is attached to. */\n private readonly nativeElement = kbqInjectNativeElement();\n\n /** SSR-safe window reference used for `getComputedStyle` reads. */\n private readonly window = inject(KBQ_WINDOW);\n\n /** Observes host content mutations to re-evaluate overflow and refresh the resolved tooltip content. */\n private readonly contentObserver = inject(ContentObserver);\n\n /**\n * Application-wide `ResizeObserver` shared by every consumer. One directive instance therefore adds no\n * listener of its own — which matters because `kbq-title` sits on every dropdown item, list option and\n * tree option — and, unlike a `window:resize` listener, it also reacts to container-only resizes\n * (splitter drag, sidebar collapse) that leave the window untouched.\n */\n private readonly resizeObserver = inject(SharedResizeObserver);\n\n /**\n * Optional explicit tooltip content. Accepts a `TemplateRef` (rendered as rich tooltip content) or a string.\n * When omitted (a bare `kbq-title` attribute resolves to an empty string), the directive falls back to the\n * trimmed `textContent` of the host (`viewValue`), preserving the default behavior.\n */\n readonly titleContent = input<TemplateRef<unknown> | string>('', { alias: 'kbq-title' });\n\n /**\n * Overrides the tooltip's hoverable default, as `KbqOptionTooltip` does. The hint spells out text that\n * the host had to truncate, so it floats over the neighbouring content — and a pointer-capturing pane\n * would swallow the clicks meant for it.\n */\n readonly ignoreTooltipPointerEvents = input<boolean>(true);\n\n /**\n * The hint repeats text the host had to clip, so `kbqTooltipDisabled=\"false\"` cannot conjure one for a\n * fully visible title.\n *\n * @docs-private\n */\n protected override readonly derivedDisabledWins = true;\n\n /**\n * `kbqTrigger` is a single input alias shared by the tooltip, the popover and this directive, so a host\n * carrying both `kbq-title` and `kbqPopover` feeds one value to both. The title tooltip ignores it and\n * always behaves as hover + keyboard focus; the setter exists only so such a host keeps working.\n *\n * Unifying the alias family is a breaking change owned by the pop-up base, not a title-local fix.\n */\n set trigger(value: string) {\n super.trigger = value;\n }\n\n /**\n * The pop-up trigger. Always reports `PopUpTriggers.Hover`, so the title tooltip reacts to hover and\n * keyboard focus regardless of the assigned value.\n */\n get trigger(): string {\n return PopUpTriggers.Hover;\n }\n\n /**\n * Whether the host content is clipped and therefore needs a tooltip. Returns `true` if any measured\n * text element overflows the parent — covering multiple `#kbqTitleText` elements, the sub-pixel\n * special case, and both horizontal and vertical overflow — or, with several text elements, if one of\n * them clips its own content.\n */\n get isOverflown(): boolean {\n const elements = this.childElements;\n\n return elements.some(\n (element) => this.isElementOverflown(element) || (elements.length > 1 && this.isClippedInOwnBox(element))\n );\n }\n\n /** Trimmed `textContent` of the measured parent, used as the default tooltip content. */\n get viewValue(): string {\n return (this.parent.textContent || '').trim();\n }\n\n /**\n * Measured container element. Resolved as the projected `#kbqTitleContainer`, otherwise the\n * `KBQ_TITLE_TEXT_REF` host's `parentTextElement`, otherwise the host element itself. Never falsy.\n *\n * @docs-private\n */\n protected get parent(): HTMLElement {\n return (\n this.parentContainer()?.nativeElement ||\n this.componentInstance?.parentTextElement?.nativeElement ||\n this.elementRef.nativeElement\n );\n }\n\n /**\n * Whether the host element contains exactly one child node and that node is a text node.\n */\n private get hasOnlyText(): boolean {\n return (\n this.nativeElement.childNodes.length === 1 && this.nativeElement.childNodes[0].nodeType === Node.TEXT_NODE\n );\n }\n\n /**\n * Effective text elements used for overflow detection. Resolves to the projected `#kbqTitleText` elements,\n * otherwise falls back to the `KbqTitleTextRef` host's `textElement`, otherwise to the host element itself.\n * Always contains at least one element.\n */\n private get childElements(): HTMLElement[] {\n const projected = this.childContainer();\n\n if (projected.length) {\n return projected.map(({ nativeElement }) => nativeElement);\n }\n\n return [this.componentInstance?.textElement?.nativeElement ?? this.elementRef.nativeElement];\n }\n\n /**\n * Resolved tooltip content: the explicit `titleContent` input when provided, otherwise the host text.\n */\n private get resolvedContent(): string | TemplateRef<unknown> {\n return this.titleContent() || this.viewValue;\n }\n\n /** Debounce/throttle interval (ms) applied to the resize and content-observer streams. */\n private readonly debounceInterval: number = 100;\n\n /** Whether the host holds the keyboard focus, as the focus monitor reports it. */\n private keyboardFocused = false;\n\n /**\n * Whether the pointer or the keyboard focus is on the host: the only time the overflow verdict is read. The two\n * are tracked apart — `hovered` comes from the pop-up base, which binds it to the same `mouseenter`/`mouseleave`\n * — because a click on a hovered host reports a mouse focus origin that hides the tooltip while the pointer stays\n * where it was.\n */\n private get entered(): boolean {\n return this.hovered() || this.keyboardFocused;\n }\n\n /** Projected text elements marked with the `#kbqTitleText` template reference. */\n private readonly childContainer: Signal<readonly ElementRef<HTMLElement>[]> = contentChildren('kbqTitleText', {\n descendants: true,\n read: ElementRef\n });\n\n /** Projected container element marked with the `#kbqTitleContainer` template reference. */\n private readonly parentContainer: Signal<ElementRef<HTMLElement> | undefined> = contentChild('kbqTitleContainer', {\n read: ElementRef\n });\n\n constructor() {\n super();\n\n // The input is otherwise read only on hover and on host mutations, neither of which a programmatic\n // rebind triggers: without this, changing `[kbq-title]` while the tooltip is open leaves the overlay\n // showing the previous text, and `disabled` keeps the verdict computed for the old content. Measured\n // here whether or not the host is entered, unlike the observer streams below: a rebind is the\n // consumer's own doing, one host at a time, and `disabled` is public. The initial value is skipped —\n // `ngAfterViewInit` seeds the content once the queries are resolved.\n toObservable(this.titleContent)\n .pipe(skip(1), takeUntilDestroyed())\n .subscribe(() => {\n this.content = this.resolvedContent;\n this.setDerivedDisabled(!this.isOverflown);\n });\n }\n\n /**\n * Sets the initial tooltip content and wires the streams that toggle the tooltip's `disabled` state:\n * container resizes and content mutations re-evaluate overflow, and keyboard focus opens the tooltip\n * while other focus origins hide it.\n */\n ngAfterViewInit() {\n this.content = this.resolvedContent;\n\n // Keep the title tooltip centered on the trigger: fall back only to center-aligned placements\n // (top/bottom center horizontally; left/right center vertically), never to edge-anchored corner\n // positions. Guarded so an explicit consumer `kbqPlacementPriority` or `kbqPlacement` is respected.\n if (!this.placementPriority && this.placement === PopUpPlacements.Top) {\n this.placementPriority = [\n PopUpPlacements.Top,\n PopUpPlacements.Bottom,\n PopUpPlacements.Right,\n PopUpPlacements.Left\n ];\n }\n\n // Measured only while the host is entered: nothing reads the verdict before `handleElementEnter` measures\n // afresh, and `hideTooltip` disables the tooltip on leave. The gate is re-checked when the timer fires, since\n // the pointer may have left in between and the verdict would otherwise re-enable a tooltip the leave had just\n // disabled. A measurement appends a probe span to the container and reads it back, so each one forces a layout\n // of the whole page — see `docs/e2e-flakiness.md` for what that costs on a page of hundreds of titled hosts.\n this.resizeObserver\n .observe(this.parent)\n .pipe(\n debounceTime(this.debounceInterval),\n filter(() => this.entered),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.setDerivedDisabled(!this.isOverflown));\n\n this.contentObserver\n .observe(this.parent)\n .pipe(\n throttleTime(this.debounceInterval),\n filter(() => this.entered),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.setDerivedDisabled(!this.isOverflown);\n this.content = this.resolvedContent;\n });\n\n this.focusMonitor\n .monitor(this.elementRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((origin) => {\n if (origin === 'keyboard') {\n this.keyboardFocused = true;\n this.handleElementEnter();\n // `handleElementEnter()` only re-enables the tooltip. Without an explicit `show()` a\n // keyboard user gets nothing: the trigger is locked to hover, so the base class binds no\n // focus listener that would open it.\n this.show();\n\n return;\n }\n\n if (origin === null) {\n // Stands in for the `blur` listener the base class never binds here: it binds one only for\n // a focus trigger, and this directive reports hover unconditionally. `KbqTooltipTrigger`\n // releases a tooltip muted by a pop-up on the same host on `mouseleave` or `blur` alone, so\n // without this a keyboard-only user who once opened that pop-up would never see the title\n // again — `show()` keeps returning early on the still-muted tooltip.\n this.triggerName = 'blur';\n }\n\n this.keyboardFocused = false;\n // Disabling hides an open tooltip on the way through `setDerivedDisabled`.\n this.hideTooltip();\n });\n }\n\n /**\n * Enables the tooltip only when the content is overflown. Bound to `mouseenter` and keyboard focus.\n *\n * @docs-private\n */\n protected handleElementEnter() {\n this.content = this.resolvedContent;\n this.setDerivedDisabled(!this.isOverflown);\n }\n\n /**\n * Always disables (hides) the tooltip. Bound to `mouseleave` and non-keyboard focus changes.\n *\n * @docs-private\n */\n protected hideTooltip() {\n this.setDerivedDisabled(true);\n }\n\n /**\n * Whether a single measured text element is clipped by the parent container. Both the single- and the\n * multi-element host go through this method, so a filter-bar pipe or a two-line list option gets the same\n * sub-pixel and ellipsis awareness as a plain text host.\n */\n private isElementOverflown(element: HTMLElement | undefined): boolean {\n if (!element) {\n return false;\n }\n\n const { offsetWidth, offsetHeight } = this.parent;\n const isVerticalOverflown = offsetHeight < element.scrollHeight;\n\n /** For special cases where the difference is a fraction of a pixel */\n if (!isVerticalOverflown && (element.scrollWidth === 0 || offsetWidth === element.scrollWidth)) {\n if (this.hasOnlyText) {\n return this.isTextWiderThanContainer(element);\n }\n\n return this.isWidthOverflown(\n this.parent.getBoundingClientRect().width,\n element.getBoundingClientRect().width,\n element\n );\n }\n\n return offsetWidth < element.scrollWidth || isVerticalOverflown;\n }\n\n /**\n * Whether a text element is narrower than its own text. Text elements that share the parent can take width\n * from each other, so one is clipped while its full text would still fit the parent — which the parent\n * comparison above cannot see. An inline element reports a zero `clientWidth` and never clips.\n */\n private isClippedInOwnBox(element: HTMLElement): boolean {\n return element.clientWidth > 0 && element.scrollWidth > element.clientWidth;\n }\n\n /**\n * Compares the container against the width the text occupies when nothing clips it: a probe span\n * carrying the same text is appended to the container, both are measured, and the probe is removed\n * again. `finally` guarantees the probe never outlives the measurement — a throw between the append and\n * the read (e.g. a layout call on a detached tree) would otherwise strand it in the consumer's DOM.\n *\n * The container is measured while the probe is attached, as it has been since the sub-pixel path was\n * introduced: a shrink-to-fit container stretched by the probe must not be reported as clipping it.\n */\n private isTextWiderThanContainer(element: HTMLElement): boolean {\n const wrapper = this.renderer.createElement('span');\n\n wrapper.innerText = element.innerText;\n this.parent.appendChild(wrapper);\n\n try {\n return this.isWidthOverflown(\n this.parent.getBoundingClientRect().width,\n wrapper.getBoundingClientRect().width,\n element\n );\n } finally {\n wrapper.remove();\n }\n }\n\n /**\n * Compares measured widths, treating only *visible* clipping as overflow. With `text-overflow: ellipsis`\n * any positive difference counts (even a sub-pixel overflow shows `…`). With `text-overflow: clip` the\n * widths are rounded to whole CSS pixels first — mirroring the integer `offsetWidth`/`scrollWidth` path —\n * so an imperceptible sub-pixel clip is not treated as truncation.\n */\n private isWidthOverflown(parentWidth: number, childWidth: number, element: HTMLElement): boolean {\n return this.hasEllipsis(element) ? parentWidth < childWidth : Math.round(parentWidth) < Math.round(childWidth);\n }\n\n /**\n * Whether the measured text truncates with an ellipsis on either the text element or its wrapping\n * container. Only then is a sub-pixel overflow actually visible (the trailing glyph is replaced by `…`);\n * with the default `text-overflow: clip` a sub-pixel clip is imperceptible, so it must not be reported as\n * truncation. Both elements are checked because `text-overflow` is not inherited and consumers place it\n * differently: `KbqOption`/`KbqDropdownItem` style the measured text element, whereas `KbqTreeOption`\n * styles the parent container that wraps it.\n */\n private hasEllipsis(element: HTMLElement): boolean {\n return this.elementHasEllipsis(element) || this.elementHasEllipsis(this.parent);\n }\n\n /**\n * Whether the element's computed `text-overflow` renders an ellipsis.\n */\n private elementHasEllipsis(element: HTMLElement): boolean {\n return this.window.getComputedStyle(element).textOverflow.includes('ellipsis');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqToolTipModule } from '@koobiq/components/tooltip';\nimport { KbqTitleDirective } from './title.directive';\n\n@NgModule({\n imports: [KbqToolTipModule, KbqTitleDirective],\n exports: [KbqTitleDirective]\n})\nexport class KbqTitleModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}