@koobiq/components 20.1.0 → 20.3.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 (249) hide show
  1. package/accordion/_accordion-theme.scss +6 -2
  2. package/accordion/accordion-tokens.scss +3 -0
  3. package/accordion/{accordion-trigger.component.scss → accordion-trigger.scss} +10 -0
  4. package/accordion/accordion.scss +71 -0
  5. package/accordion/index.d.ts +264 -121
  6. package/actions-panel/index.d.ts +25 -13
  7. package/alert/_alert-theme.scss +14 -0
  8. package/alert/alert.component.scss +24 -13
  9. package/alert/index.d.ts +63 -29
  10. package/app-switcher/app-switcher-dropdown-app.scss +7 -5
  11. package/app-switcher/app-switcher-dropdown-site.scss +6 -4
  12. package/app-switcher/index.d.ts +41 -4
  13. package/app-switcher/kbq-app-switcher-list-item.scss +6 -8
  14. package/autocomplete/autocomplete.scss +2 -1
  15. package/autocomplete/index.d.ts +58 -37
  16. package/badge/index.d.ts +2 -3
  17. package/breadcrumbs/index.d.ts +1 -1
  18. package/button/index.d.ts +2 -2
  19. package/button-toggle/button-toggle-tokens.scss +2 -0
  20. package/button-toggle/button-toggle.scss +9 -0
  21. package/button-toggle/index.d.ts +5 -0
  22. package/checkbox/index.d.ts +33 -29
  23. package/clamped-text/index.d.ts +3 -2
  24. package/code-block/index.d.ts +24 -19
  25. package/content-panel/index.d.ts +1 -1
  26. package/core/index.d.ts +1217 -186
  27. package/core/option/_action-container-mixins.scss +28 -0
  28. package/core/option/_option-theme.scss +24 -0
  29. package/core/option/action.scss +7 -0
  30. package/core/styles/_core.scss +2 -0
  31. package/core/styles/_koobiq-theme.scss +2 -0
  32. package/core/styles/_tokens.scss +1 -0
  33. package/core/styles/common/_animation.scss +31 -24
  34. package/core/styles/common/_connected-overlay.scss +39 -0
  35. package/core/styles/common/_select.scss +19 -2
  36. package/core/styles/common/_tokens.scss +0 -9
  37. package/core/styles/theming/_index.scss +0 -1
  38. package/core/styles/theming/_theming.scss +34 -5
  39. package/datepicker/index.d.ts +46 -15
  40. package/dl/dl.scss +26 -0
  41. package/dl/index.d.ts +8 -1
  42. package/dropdown/_dropdown-theme.scss +28 -2
  43. package/dropdown/dropdown-item.scss +29 -0
  44. package/dropdown/dropdown-tokens.scss +2 -1
  45. package/dropdown/dropdown.scss +16 -1
  46. package/dropdown/index.d.ts +331 -17
  47. package/dynamic-translation/index.d.ts +1 -1
  48. package/fesm2022/koobiq-components-accordion.mjs +480 -317
  49. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-actions-panel.mjs +57 -46
  51. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-alert.mjs +98 -58
  53. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-app-switcher.mjs +233 -38
  55. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  56. package/fesm2022/koobiq-components-autocomplete.mjs +89 -52
  57. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-badge.mjs +18 -17
  59. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-breadcrumbs.mjs +25 -25
  61. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-button-toggle.mjs +17 -12
  63. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-button.mjs +25 -25
  65. package/fesm2022/koobiq-components-checkbox.mjs +69 -92
  66. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  67. package/fesm2022/koobiq-components-clamped-text.mjs +18 -13
  68. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  69. package/fesm2022/koobiq-components-code-block.mjs +56 -69
  70. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  71. package/fesm2022/koobiq-components-content-panel.mjs +29 -29
  72. package/fesm2022/koobiq-components-core.mjs +2485 -735
  73. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-datepicker.mjs +168 -126
  75. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-divider.mjs +7 -7
  77. package/fesm2022/koobiq-components-dl.mjs +23 -15
  78. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  79. package/fesm2022/koobiq-components-dropdown.mjs +814 -136
  80. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  81. package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
  82. package/fesm2022/koobiq-components-ellipsis-center.mjs +7 -7
  83. package/fesm2022/koobiq-components-empty-state.mjs +19 -19
  84. package/fesm2022/koobiq-components-file-upload.mjs +74 -42
  85. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-filter-bar.mjs +783 -199
  87. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-flag.mjs +7 -7
  89. package/fesm2022/koobiq-components-form-field.mjs +350 -162
  90. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  91. package/fesm2022/koobiq-components-icon.mjs +52 -25
  92. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  93. package/fesm2022/koobiq-components-inline-edit.mjs +175 -28
  94. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  95. package/fesm2022/koobiq-components-input.mjs +41 -24
  96. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  97. package/fesm2022/koobiq-components-link.mjs +8 -8
  98. package/fesm2022/koobiq-components-list.mjs +657 -143
  99. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-loader-overlay.mjs +16 -16
  101. package/fesm2022/koobiq-components-markdown.mjs +14 -11
  102. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  103. package/fesm2022/koobiq-components-modal.mjs +59 -35
  104. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  105. package/fesm2022/koobiq-components-navbar.mjs +177 -67
  106. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  107. package/fesm2022/koobiq-components-notification-center.mjs +40 -24
  108. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  109. package/fesm2022/koobiq-components-overflow-items.mjs +16 -17
  110. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  111. package/fesm2022/koobiq-components-popover.mjs +31 -21
  112. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  113. package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
  114. package/fesm2022/koobiq-components-progress-spinner.mjs +13 -13
  115. package/fesm2022/koobiq-components-radio.mjs +10 -10
  116. package/fesm2022/koobiq-components-resizer.mjs +33 -14
  117. package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-scrollbar.mjs +10 -10
  119. package/fesm2022/koobiq-components-search-expandable.mjs +49 -14
  120. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  121. package/fesm2022/koobiq-components-select.mjs +450 -146
  122. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  123. package/fesm2022/koobiq-components-sidebar.mjs +14 -14
  124. package/fesm2022/koobiq-components-sidepanel.mjs +26 -26
  125. package/fesm2022/koobiq-components-skeleton.mjs +10 -10
  126. package/fesm2022/koobiq-components-split-button.mjs +10 -17
  127. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  128. package/fesm2022/koobiq-components-splitter.mjs +17 -17
  129. package/fesm2022/koobiq-components-table.mjs +15 -13
  130. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  131. package/fesm2022/koobiq-components-tabs.mjs +80 -68
  132. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  133. package/fesm2022/koobiq-components-tags.mjs +283 -122
  134. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  135. package/fesm2022/koobiq-components-textarea.mjs +13 -8
  136. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  137. package/fesm2022/koobiq-components-time-range.mjs +29 -24
  138. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  139. package/fesm2022/koobiq-components-timepicker.mjs +61 -30
  140. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  141. package/fesm2022/koobiq-components-timezone.mjs +77 -42
  142. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  143. package/fesm2022/koobiq-components-title.mjs +7 -7
  144. package/fesm2022/koobiq-components-toast.mjs +51 -26
  145. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  146. package/fesm2022/koobiq-components-toggle.mjs +72 -64
  147. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  148. package/fesm2022/koobiq-components-tooltip.mjs +219 -28
  149. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  150. package/fesm2022/koobiq-components-top-bar.mjs +13 -13
  151. package/fesm2022/koobiq-components-tree-select.mjs +222 -80
  152. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  153. package/fesm2022/koobiq-components-tree.mjs +302 -81
  154. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  155. package/fesm2022/koobiq-components-username.mjs +27 -27
  156. package/file-upload/index.d.ts +25 -6
  157. package/file-upload/multiple-file-upload.component.scss +14 -0
  158. package/filter-bar/_filter-bar-theme.scss +0 -10
  159. package/filter-bar/filter-bar-tokens.scss +3 -0
  160. package/filter-bar/filters.scss +3 -2
  161. package/filter-bar/index.d.ts +281 -9
  162. package/filter-bar/pipes/base-pipe.scss +0 -11
  163. package/filter-bar/pipes/pipe-input.scss +10 -0
  164. package/filter-bar/pipes/pipe-multi-tree-select.scss +0 -6
  165. package/filter-bar/pipes/pipe-multiselect.scss +0 -6
  166. package/filter-bar/pipes/pipe-tree-select.scss +0 -6
  167. package/form-field/_form-field-theme.scss +76 -20
  168. package/form-field/fieldset.scss +10 -0
  169. package/form-field/form-field-tokens.scss +15 -1
  170. package/form-field/form-field.scss +15 -19
  171. package/form-field/index.d.ts +147 -65
  172. package/icon/icon-button.scss +3 -1
  173. package/icon/index.d.ts +45 -7
  174. package/inline-edit/index.d.ts +57 -4
  175. package/inline-edit/inline-edit.scss +10 -0
  176. package/input/index.d.ts +17 -2
  177. package/list/_list-theme.scss +42 -10
  178. package/list/index.d.ts +326 -79
  179. package/list/list-tokens.scss +43 -8
  180. package/list/list.scss +186 -12
  181. package/markdown/index.d.ts +1 -1
  182. package/modal/index.d.ts +21 -4
  183. package/modal/modal-tokens.scss +1 -1
  184. package/navbar/_navbar-item_vertical.scss +7 -5
  185. package/navbar/index.d.ts +54 -5
  186. package/navbar/navbar-brand.scss +23 -7
  187. package/navbar/vertical-navbar.scss +6 -0
  188. package/notification-center/index.d.ts +2 -1
  189. package/notification-center/notification-item.scss +6 -0
  190. package/package.json +3 -6
  191. package/popover/index.d.ts +2 -2
  192. package/prebuilt-themes/dark-theme.css +1 -1
  193. package/prebuilt-themes/light-theme.css +1 -1
  194. package/prebuilt-themes/theme.css +1 -1
  195. package/resizer/index.d.ts +12 -0
  196. package/schematics/collection.json +10 -0
  197. package/schematics/migrations/alert-signals/README.md +64 -0
  198. package/schematics/migrations/alert-signals/data.js +70 -0
  199. package/schematics/migrations/alert-signals/index.js +350 -0
  200. package/schematics/migrations/alert-signals/schema.json +20 -0
  201. package/schematics/migrations/autocomplete-panel-width-auto/README.md +68 -0
  202. package/schematics/migrations/autocomplete-panel-width-auto/index.js +70 -0
  203. package/schematics/migrations/autocomplete-panel-width-auto/schema.json +15 -0
  204. package/schematics/migrations/deprecated-icons/README.md +29 -4
  205. package/schematics/migrations/deprecated-icons/data.js +7 -0
  206. package/schematics/migrations/deprecated-icons/index.js +62 -35
  207. package/schematics/migrations/filter-bar-signals/README.md +1 -1
  208. package/schematics/migrations/new-icons-pack/README.md +37 -2
  209. package/schematics/migrations/new-icons-pack/data.js +8 -0
  210. package/schematics/migrations/new-icons-pack/index.js +144 -53
  211. package/schematics/migrations.json +11 -1
  212. package/schematics/ng-add/index.js +3 -3
  213. package/schematics/utils/angular-parsing.js +41 -14
  214. package/schematics/utils/ast.js +31 -0
  215. package/schematics/utils/icon-migration.js +530 -0
  216. package/schematics/utils/typescript.js +44 -0
  217. package/scrollbar/index.d.ts +1 -1
  218. package/search-expandable/index.d.ts +3 -0
  219. package/select/index.d.ts +212 -40
  220. package/select/select-tokens.scss +0 -1
  221. package/select/select.scss +0 -2
  222. package/splitter/index.d.ts +1 -1
  223. package/table/_table-theme.scss +4 -0
  224. package/table/index.d.ts +2 -1
  225. package/table/table.scss +8 -0
  226. package/tabs/_tabs-common.scss +60 -31
  227. package/tabs/_tabs-theme.scss +12 -0
  228. package/tabs/index.d.ts +2 -2
  229. package/tabs/tab-header.scss +14 -0
  230. package/tabs/tab-nav-bar.scss +4 -0
  231. package/tabs/tabs-tokens.scss +1 -0
  232. package/tags/index.d.ts +128 -29
  233. package/textarea/index.d.ts +5 -0
  234. package/time-range/index.d.ts +1 -1
  235. package/timepicker/index.d.ts +4 -0
  236. package/timezone/index.d.ts +10 -8
  237. package/toast/index.d.ts +26 -3
  238. package/toggle/index.d.ts +34 -14
  239. package/tooltip/index.d.ts +119 -7
  240. package/tree/_tree-theme.scss +25 -5
  241. package/tree/index.d.ts +71 -3
  242. package/tree/tree-option.scss +2 -8
  243. package/tree-select/_tree-select-theme.scss +22 -0
  244. package/tree-select/index.d.ts +127 -36
  245. package/accordion/accordion.component.scss +0 -50
  246. package/core/styles/_tokens.kbq.import.scss +0 -4
  247. package/core/styles/theming/_components-theming.scss +0 -1927
  248. package/filter-bar/pipes/pipe-select.scss +0 -5
  249. package/overflow-items/overflow-items.scss +0 -20
@@ -33,25 +33,6 @@
33
33
 
34
34
  outline: none;
35
35
 
36
- &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical) {
37
- padding-left: 14px;
38
- padding-right: 14px;
39
- }
40
-
41
- &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical).kbq-tab-label_with-icon-left {
42
- padding-left: tokens.kbq-difference-series-css-variables(
43
- [tabs-size-tab-item-padding-horizontal,
44
- tabs-size-tab-item-focus-outline-width]
45
- );
46
- }
47
-
48
- &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical).kbq-tab-label_with-icon-right {
49
- padding-right: tokens.kbq-difference-series-css-variables(
50
- [tabs-size-tab-item-padding-horizontal,
51
- tabs-size-tab-item-focus-outline-width]
52
- );
53
- }
54
-
55
36
  &.kbq-selected {
56
37
  cursor: default;
57
38
  }
@@ -75,30 +56,63 @@
75
56
  &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical):before {
76
57
  content: '';
77
58
  position: absolute;
78
- left: 0;
79
- right: 0;
80
- top: -10px;
81
- bottom: -10px;
59
+ inset: calc(-1 * (var(--kbq-size-s) + var(--kbq-tabs-size-tab-item-focus-outline-width)))
60
+ calc(-1 * var(--kbq-tabs-size-tab-item-focus-outline-width));
61
+ }
62
+
63
+ &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical):not(.kbq-tab-label_icon-only):after {
64
+ content: '';
65
+ position: absolute;
66
+ left: calc(
67
+ var(--kbq-tabs-size-tab-item-padding-horizontal) - var(--kbq-tabs-size-tab-item-focus-outline-width)
68
+ );
69
+ right: calc(
70
+ var(--kbq-tabs-size-tab-item-padding-horizontal) - var(--kbq-tabs-size-tab-item-focus-outline-width)
71
+ );
72
+ bottom: calc(-1 * (var(--kbq-size-s) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
73
+ height: 3px;
74
+ border-radius: var(--kbq-size-3xs) var(--kbq-size-3xs) 0 0;
75
+ background: transparent;
76
+ transition: background 0.2s ease-in-out;
77
+ pointer-events: none;
82
78
  }
83
79
 
84
80
  &.kbq-tab-label_icon-only {
85
81
  width: var(--kbq-size-3xl);
86
82
  height: var(--kbq-size-3xl);
87
83
  padding: 0 !important;
88
- margin-inline: var(--kbq-size-xs);
84
+ margin-inline: var(--kbq-size-xxs);
89
85
  box-sizing: content-box;
90
86
 
91
- // Keep the space between icon-only tabs clickable after adding margins.
87
+ &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical) {
88
+ width: var(--kbq-tabs-size-tab-item-underlined-icon-only-size);
89
+ height: var(--kbq-tabs-size-tab-item-underlined-icon-only-size);
90
+
91
+ &:before {
92
+ left: calc(-1 * (var(--kbq-size-xxs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
93
+ right: calc(-1 * (var(--kbq-size-xxs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
94
+ }
95
+
96
+ &:after {
97
+ top: auto;
98
+ bottom: calc(-1 * (var(--kbq-size-s) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
99
+ height: 3px;
100
+ left: calc(-1 * var(--kbq-tabs-size-tab-item-focus-outline-width));
101
+ right: calc(-1 * var(--kbq-tabs-size-tab-item-focus-outline-width));
102
+ border-radius: var(--kbq-size-3xs) var(--kbq-size-3xs) 0 0;
103
+ transition: background 0.2s ease-in-out;
104
+ pointer-events: none;
105
+ }
106
+ }
107
+
92
108
  &:not(.kbq-tab-label_vertical):after {
93
109
  content: '';
94
110
  display: block;
95
111
  position: absolute;
96
112
  top: 0;
97
113
  bottom: 0;
98
- // Absolute offsets are calculated from the padding box, so we add
99
- // focus outline width to fully cover the visual margin gap.
100
- left: calc(-1 * (var(--kbq-size-xs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
101
- right: calc(-1 * (var(--kbq-size-xs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
114
+ left: calc(-1 * (var(--kbq-size-xxs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
115
+ right: calc(-1 * (var(--kbq-size-xxs) + var(--kbq-tabs-size-tab-item-focus-outline-width)));
102
116
  background: transparent;
103
117
  }
104
118
  }
@@ -144,7 +158,18 @@
144
158
  }
145
159
 
146
160
  .kbq-tab-header_underlined:not(.kbq-tab-header_vertical) .kbq-tab-list__content {
147
- padding: 8px 0;
161
+ padding: var(--kbq-size-s) 0;
162
+
163
+ // Negative margin shifts the first tab left so the focus frame can extend beyond the
164
+ // container edge (instead of padding-left:0 which would clip it under overflow:hidden).
165
+ > .kbq-tab-label:first-child:not(.kbq-tab-label_icon-only),
166
+ > .kbq-tab-link:first-child {
167
+ margin-inline-start: calc(-1 * var(--kbq-tabs-size-tab-item-padding-horizontal));
168
+ }
169
+
170
+ > .kbq-tab-label_icon-only:first-child {
171
+ margin-inline-start: 0;
172
+ }
148
173
  }
149
174
 
150
175
  .kbq-tab-header_underlined:not(.kbq-tab-header_vertical):after {
@@ -166,8 +191,12 @@
166
191
  position: absolute;
167
192
  bottom: 0;
168
193
  height: 3px;
169
- border-radius: 2px 2px 0 0;
194
+ border-radius: var(--kbq-size-3xs) var(--kbq-size-3xs) 0 0;
170
195
  background: var(--kbq-line-contrast);
171
196
  transition: all 0.2s ease-in-out;
197
+
198
+ &.kbq-disabled {
199
+ background: var(--kbq-states-icon-disabled);
200
+ }
172
201
  }
173
202
  }
@@ -16,6 +16,14 @@
16
16
 
17
17
  &:is(:hover, .kbq-hover):not(.kbq-disabled) {
18
18
  @include kbq-tab-item-state($type, $sub-type, states-hover);
19
+
20
+ &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical) {
21
+ background: transparent;
22
+
23
+ &:not(.kbq-selected)::after {
24
+ background: var(--kbq-line-contrast-fade);
25
+ }
26
+ }
19
27
  }
20
28
 
21
29
  &.kbq-tab-label_empty {
@@ -27,6 +35,10 @@
27
35
 
28
36
  &.kbq-tab-label_underlined:not(.kbq-tab-label_vertical) {
29
37
  background: none;
38
+
39
+ &::after {
40
+ background: transparent;
41
+ }
30
42
  }
31
43
 
32
44
  &:is(:hover, .kbq-hover) {
package/tabs/index.d.ts CHANGED
@@ -409,10 +409,9 @@ declare class KbqTabHeader extends KbqPaginatedTabHeader {
409
409
  readonly nextPaginator: ElementRef<HTMLElement>;
410
410
  readonly previousPaginator: ElementRef<HTMLElement>;
411
411
  private readonly isBrowser;
412
- /** Width of the active tab, adjusted for icon-only tab margins. */
413
412
  protected get activeTabOffsetWidth(): number | undefined;
414
- /** Left offset of the active tab, adjusted for icon-only tab margins. */
415
413
  protected get activeTabOffsetLeft(): number | undefined;
414
+ protected get activeTabDisabled(): boolean;
416
415
  protected itemSelected(event: KeyboardEvent): void;
417
416
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTabHeader, never>;
418
417
  static ɵcmp: i0.ɵɵComponentDeclaration<KbqTabHeader, "kbq-tab-header", never, { "underlined": { "alias": "underlined"; "required": false; "isSignal": true; }; }, { "selectFocusedIndex": "selectFocusedIndex"; "indexFocused": "indexFocused"; }, ["items"], ["*"], true, never>;
@@ -568,6 +567,7 @@ declare class KbqTabNavBar extends KbqPaginatedTabHeader implements AfterContent
568
567
  get role(): string | null;
569
568
  protected get activeTabOffsetWidth(): number | undefined;
570
569
  protected get activeTabOffsetLeft(): number | undefined;
570
+ protected get activeTabDisabled(): boolean;
571
571
  ngAfterContentInit(): void;
572
572
  protected itemSelected(): void;
573
573
  /** Notifies the component that the active link has been changed. */
@@ -9,6 +9,16 @@
9
9
  position: relative;
10
10
  flex-shrink: 0;
11
11
  border-radius: var(--kbq-tabs-size-tab-stack-horizontal-border-radius);
12
+
13
+ &.kbq-tab-header_underlined {
14
+ .kbq-tab-group:not(.kbq-tab-group_on-surface) & {
15
+ border-radius: 0;
16
+ }
17
+
18
+ &:not(.kbq-tab-header__pagination-controls_enabled) {
19
+ overflow: visible;
20
+ }
21
+ }
12
22
  }
13
23
 
14
24
  .kbq-tab-list__content {
@@ -32,6 +42,10 @@
32
42
  flex-grow: 1;
33
43
  z-index: 1;
34
44
  overflow: hidden;
45
+
46
+ .kbq-tab-header_underlined:not(.kbq-tab-header__pagination-controls_enabled) & {
47
+ overflow: visible;
48
+ }
35
49
  }
36
50
 
37
51
  .kbq-tab-list {
@@ -13,6 +13,10 @@
13
13
  overflow: hidden;
14
14
  }
15
15
 
16
+ &.kbq-tab-header_underlined:not(.kbq-tab-header__pagination-controls_enabled) .kbq-tab-link__container {
17
+ overflow: visible;
18
+ }
19
+
16
20
  .kbq-tab-list {
17
21
  position: relative;
18
22
  width: 100%;
@@ -7,6 +7,7 @@
7
7
  --kbq-tabs-size-tab-item-focus-outline-width: var(--kbq-size-3xs);
8
8
  --kbq-tabs-size-tab-stack-horizontal-border-radius: var(--kbq-size-border-radius);
9
9
  --kbq-tabs-size-tab-stack-vertical-content-gap-vertical: var(--kbq-size-s);
10
+ --kbq-tabs-size-tab-item-underlined-icon-only-size: calc(var(--kbq-size-3xl) - var(--kbq-size-xxs));
10
11
  /* THEME TOKENS */
11
12
  --kbq-tabs-tab-item-filled-on-background-default-background: transparent;
12
13
  --kbq-tabs-tab-item-filled-on-background-default-text-color: var(--kbq-foreground-contrast);
package/tags/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, DoCheck, QueryList, OnChanges, InjectionToken } from '@angular/core';
2
+ import { Signal, OnDestroy, AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, DoCheck, QueryList, InjectionToken, OnChanges, Provider } from '@angular/core';
3
3
  import { NgControl, ControlValueAccessor, NgForm, FormGroupDirective } from '@angular/forms';
4
4
  import { KbqAutocompleteTrigger } from '@koobiq/components/autocomplete';
5
5
  import * as i2 from '@angular/cdk/drag-drop';
@@ -12,14 +12,23 @@ import { FocusOrigin } from '@angular/cdk/a11y';
12
12
  import { KbqIcon } from '@koobiq/components/icon';
13
13
  import * as i1$1 from '@angular/cdk/platform';
14
14
 
15
- /** Interface for a text control that is used to drive interaction with a kbq-tag-list. */
16
-
15
+ /**
16
+ * Interface for a text control that is used to drive interaction with a kbq-tag-list.
17
+ *
18
+ * @docs-private
19
+ */
17
20
  interface KbqTagTextControl {
18
21
  id: string;
19
22
  placeholder: string;
20
23
  focused: boolean;
21
24
  empty: boolean;
22
- ngControl?: NgControl;
25
+ /** Whether the control's value was filled in by the browser. */
26
+ autofilled?: Signal<boolean>;
27
+ /**
28
+ * @deprecated Unused by the library: validation lives on the `<kbq-tag-list>` control.
29
+ * Will be removed in a future major release.
30
+ */
31
+ ngControl?: NgControl | null;
23
32
  focus(): void;
24
33
  }
25
34
 
@@ -389,6 +398,13 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
389
398
  private _placeholder;
390
399
  /** Whether any tags or the kbqTagInput inside of this tag-list has focus. */
391
400
  get focused(): boolean;
401
+ /**
402
+ * Implemented as part of KbqFormFieldControl. Forwarded from the registered `kbqTagInput`, which
403
+ * is the element the browser actually autofills — the tag list itself is not an input.
404
+ *
405
+ * @docs-private
406
+ */
407
+ readonly autofilled: _angular_core.Signal<boolean>;
392
408
  /**
393
409
  * Implemented as part of KbqFormFieldControl.
394
410
  * @docs-private
@@ -469,8 +485,15 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
469
485
  errorState: boolean;
470
486
  /** The tag input to add more tags */
471
487
  private tagInput;
488
+ /**
489
+ * The same control as `tagInput`, kept in a signal so `autofilled` can track it reactively —
490
+ * `registerInput()` runs after the first read.
491
+ */
492
+ private readonly registeredInput;
472
493
  /** True when the next `tags.changes` emission is triggered by a UI action, not programmatic update. */
473
494
  private pendingUIChange;
495
+ /** Shared range selection state used by pointer and keyboard interactions. */
496
+ private rangeSelection;
474
497
  /**
475
498
  * When a tag is destroyed, we store the index of the destroyed tag until the tags
476
499
  * query list notifies about the update. This is necessary because we cannot determine an
@@ -530,6 +553,12 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
530
553
  * @docs-private
531
554
  */
532
555
  focusInput(): void;
556
+ /**
557
+ * Establishes a range origin or extends the current range to the specified tag.
558
+ *
559
+ * @docs-private
560
+ */
561
+ handleSelectionInteraction(tag: KbqTag, extendRange: boolean): void;
533
562
  /**
534
563
  * Pass events to the keyboard manager. Available here for tests.
535
564
  *
@@ -576,6 +605,8 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
576
605
  * @docs-private
577
606
  */
578
607
  removeSelected(): void;
608
+ /** Whether the rendered tags no longer match the value this control last reported. */
609
+ private hasTagsValueChanged;
579
610
  private propagateTagsChanges;
580
611
  private resetTags;
581
612
  /** Listens to user-generated selection events on each tag. */
@@ -588,6 +619,8 @@ declare class KbqTagList implements KbqFormFieldControl<any>, ControlValueAccess
588
619
  private setupDropListInitialProperties;
589
620
  private syncDropListDisabledState;
590
621
  private setupFocusMonitor;
622
+ private extendSelectionTo;
623
+ private setRangeOrigin;
591
624
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagList, never>;
592
625
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqTagList, "kbq-tag-list", ["kbqTagList"], { "value": { "alias": "value"; "required": false; }; "required": { "alias": "required"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; }; }, { "dropped": "dropped"; "valueChange": "valueChange"; "change": "change"; }, ["cleaner", "tags"], ["*", "kbq-cleaner"], true, [{ directive: typeof i2.CdkDropList; inputs: {}; outputs: {}; }]>;
593
626
  static ngAcceptInputType_disabled: unknown;
@@ -602,10 +635,42 @@ interface KbqTagInputEvent {
602
635
  /** The value of the input. */
603
636
  value: string;
604
637
  }
638
+ /** Contexts a `KbqTagSeparator` can be active in. */
639
+ type KbqTagSeparatorContext = 'input' | 'paste';
640
+ /** Defines a character or pattern that ends a tag, and the contexts in which it applies. */
605
641
  interface KbqTagSeparator {
642
+ /** Regular expression used to match/split this separator in text. */
606
643
  symbol: RegExp;
607
- key: string;
644
+ /**
645
+ * `KeyboardEvent.key` that triggers this separator while typing.
646
+ * Omit for separators with no single-keystroke equivalent (e.g. a run of whitespace) —
647
+ * those are implicitly paste-only, since they can never match a `keydown`.
648
+ */
649
+ key?: string;
650
+ /**
651
+ * Numeric key code gating whether this separator is enabled, set via `kbqTagInputSeparatorKeyCodes`.
652
+ * Omit together with `key` for separators that should always be active regardless of that input.
653
+ */
654
+ keyCode?: number;
655
+ /**
656
+ * Contexts this separator applies to.
657
+ * @default ['input', 'paste']
658
+ */
659
+ appliesTo?: KbqTagSeparatorContext[];
660
+ }
661
+ /** Default options for the tags module that can be overridden. */
662
+ interface KbqTagsDefaultOptions {
663
+ /** The list of key codes that will trigger a tagEnd event. */
664
+ separatorKeyCodes: number[];
665
+ /** Custom separator definitions to use instead of the built-in defaults. */
666
+ separators?: KbqTagSeparator[];
667
+ /** Whether the tagEnd event will be emitted when text is pasted. */
668
+ addOnPaste?: boolean;
608
669
  }
670
+ /** Injection token to be used to override the default options. */
671
+ declare const KBQ_TAGS_DEFAULT_OPTIONS: InjectionToken<KbqTagsDefaultOptions>;
672
+ /** Utility provider for `KBQ_TAGS_DEFAULT_OPTIONS`. */
673
+ declare const kbqTagsDefaultOptionsProvider: (options: Partial<KbqTagsDefaultOptions>) => Provider;
609
674
  /**
610
675
  * Directive that adds tag-specific behaviors to an input element inside `<kbq-form-field>`.
611
676
  * May be placed inside or outside of an `<kbq-tag-list>`.
@@ -614,10 +679,28 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
614
679
  private elementRef;
615
680
  private defaultOptions;
616
681
  private trimDirective;
617
- ngControl: NgControl;
682
+ /**
683
+ * The form control instance bound to the input, if any.
684
+ *
685
+ * @deprecated Read only, and unused by the library: validation lives on the `<kbq-tag-list>`
686
+ * control. Binding `[formControl]`/`[ngModel]` to the input itself stays supported — it is what
687
+ * `kbqAutocomplete` drives the input through — only its validators are not consulted.
688
+ * Will be removed in a future major release.
689
+ * @docs-private
690
+ */
691
+ ngControl: NgControl | null;
692
+ /**
693
+ * The autocomplete trigger attached to the input, if any.
694
+ * @docs-private
695
+ */
618
696
  autocompleteTrigger?: KbqAutocompleteTrigger | null | undefined;
619
- /** Whether the control is focused. */
697
+ /**
698
+ * Whether the control is focused.
699
+ * @docs-private
700
+ */
620
701
  focused: boolean;
702
+ /** Whether the control's value was filled in by the browser. */
703
+ readonly autofilled: _angular_core.Signal<boolean>;
621
704
  /**
622
705
  * The list of key codes that will trigger a tagEnd event.
623
706
  *
@@ -625,7 +708,12 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
625
708
  */
626
709
  set separatorKeyCodes(value: number[]);
627
710
  private _separatorKeyCodes;
628
- /** @docs-private */
711
+ /**
712
+ * The effective set of separators: entries gated by `keyCode` are included only when that
713
+ * code is present in `separatorKeyCodes`; entries without a `keyCode` (no single-keystroke
714
+ * equivalent, e.g. a run of whitespace) are always included.
715
+ * @docs-private
716
+ */
629
717
  get separators(): KbqTagSeparator[];
630
718
  private _separators;
631
719
  /** Emitted when a tag is to be added. */
@@ -662,45 +750,56 @@ declare class KbqTagInput implements KbqTagTextControl, OnChanges {
662
750
  ngOnChanges(): void;
663
751
  /** @docs-private */
664
752
  onKeydown(event: KeyboardEvent): void;
665
- /** Checks to see if the blur should emit the (tagEnd) event. */
753
+ /**
754
+ * Checks to see if the blur should emit the (tagEnd) event.
755
+ * @docs-private
756
+ */
666
757
  blur(event: FocusEvent): void;
758
+ /**
759
+ * @deprecated No-op. Validation belongs to the `<kbq-tag-list>` form control, which
760
+ * revalidates itself whenever its value changes. Will be removed in a future major release.
761
+ * @docs-private
762
+ */
667
763
  triggerValidation(): void;
668
- /** Checks to see if the (tagEnd) event needs to be emitted. */
764
+ /**
765
+ * Checks to see if the (tagEnd) event needs to be emitted.
766
+ * @docs-private
767
+ */
669
768
  emitTagEnd(): void;
769
+ /**
770
+ * Whether the current input value duplicates an existing tag.
771
+ * @docs-private
772
+ */
670
773
  get hasDuplicates(): boolean;
774
+ /** @docs-private */
671
775
  onInput(): void;
776
+ /** @docs-private */
672
777
  onPaste($event: ClipboardEvent): void;
673
778
  /** @docs-private */
674
779
  onFocus(): void;
675
780
  /** Focuses the input. */
676
781
  focus(): void;
677
- private getSeparatorsForString;
782
+ private getPasteSeparatorPatterns;
783
+ /**
784
+ * Single path for adding a tag, shared by typed input, blur and paste.
785
+ * `existingValues` is `null` unless `distinct` is on, and is mutated as values are accepted.
786
+ */
787
+ private addTag;
788
+ /** Values to dedupe against, or `null` when duplicates are allowed. */
789
+ private existingTagValues;
790
+ private tagValues;
678
791
  private trimValue;
679
- private getSeparatorByKeyCode;
680
- private hasControl;
681
- /** Checks whether a keycode is one of the configured separators. */
682
- private isSeparatorKey;
792
+ /** Checks whether a keydown event matches a separator that applies to typed input. */
793
+ private matchesInputSeparator;
683
794
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagInput, never>;
684
795
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KbqTagInput, "input[kbqTagInputFor]", ["kbqTagInput", "kbqTagInputFor"], { "separatorKeyCodes": { "alias": "kbqTagInputSeparatorKeyCodes"; "required": false; }; "distinct": { "alias": "distinct"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; }; "id": { "alias": "id"; "required": false; }; "tagList": { "alias": "kbqTagInputFor"; "required": false; }; "addOnBlur": { "alias": "kbqTagInputAddOnBlur"; "required": false; }; "addOnPaste": { "alias": "kbqTagInputAddOnPaste"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "tagEnd": "kbqTagInputTokenEnd"; }, never, never, true, [{ directive: typeof i1.KbqFieldSizingContent; inputs: {}; outputs: {}; }]>;
685
796
  }
686
797
 
687
- /** Default options, for the chips module, that can be overridden. */
688
- interface KbqTagsDefaultOptions {
689
- /** The list of key codes that will trigger a chipEnd event. */
690
- separatorKeyCodes: number[];
691
- separators?: {
692
- [key: number]: KbqTagSeparator;
693
- };
694
- addOnPaste?: boolean;
695
- }
696
- /** Injection token to be used to override the default options for the chips module. */
697
- declare const KBQ_TAGS_DEFAULT_OPTIONS: InjectionToken<KbqTagsDefaultOptions>;
698
-
699
798
  declare class KbqTagsModule {
700
799
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqTagsModule, never>;
701
800
  static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqTagsModule, never, [typeof i1$1.PlatformModule, typeof KbqTagEditSubmit, typeof KbqTagEditInput, typeof KbqTagList, typeof KbqTag, typeof KbqTagInput, typeof KbqTagTrailingIcon, typeof KbqTagAvatar, typeof KbqTagRemove], [typeof KbqTagList, typeof KbqTag, typeof KbqTagInput, typeof KbqTagTrailingIcon, typeof KbqTagAvatar, typeof KbqTagRemove, typeof KbqTagEditSubmit, typeof KbqTagEditInput]>;
702
801
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<KbqTagsModule>;
703
802
  }
704
803
 
705
- export { KBQ_TAGS_DEFAULT_OPTIONS, KbqTag, KbqTagAvatar, KbqTagEditChange, KbqTagEditInput, KbqTagEditSubmit, KbqTagInput, KbqTagList, KbqTagListChange, KbqTagRemove, KbqTagSelectionChange, KbqTagTrailingIcon, KbqTagsModule };
706
- export type { KbqTagDragData, KbqTagEvent, KbqTagFocusEvent, KbqTagInputEvent, KbqTagListDroppedEvent, KbqTagSeparator, KbqTagsDefaultOptions };
804
+ export { KBQ_TAGS_DEFAULT_OPTIONS, KbqTag, KbqTagAvatar, KbqTagEditChange, KbqTagEditInput, KbqTagEditSubmit, KbqTagInput, KbqTagList, KbqTagListChange, KbqTagRemove, KbqTagSelectionChange, KbqTagTrailingIcon, KbqTagsModule, kbqTagsDefaultOptionsProvider };
805
+ export type { KbqTagDragData, KbqTagEvent, KbqTagFocusEvent, KbqTagInputEvent, KbqTagListDroppedEvent, KbqTagSeparator, KbqTagSeparatorContext, KbqTagsDefaultOptions };
@@ -38,6 +38,11 @@ declare class KbqTextarea implements KbqFormFieldControl<any>, OnInit, OnChanges
38
38
  * @docs-private
39
39
  */
40
40
  focused: boolean;
41
+ /**
42
+ * Implemented as part of KbqFormFieldControl.
43
+ * @docs-private
44
+ */
45
+ readonly autofilled: i0.Signal<boolean>;
41
46
  /**
42
47
  * Implemented as part of KbqFormFieldControl.
43
48
  * @docs-private
@@ -1,7 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { InjectionToken, OnInit, TemplateRef, WritableSignal, Provider, Injector } from '@angular/core';
3
3
  import { ValidatorFn, ControlValueAccessor, NgControl, FormControl, Validator, FormGroup, AbstractControl, FormGroupDirective, NgForm, ValidationErrors } from '@angular/forms';
4
- import { DateAdapter, DateFormatter, PopUpSizes, PopUpPlacements, KbqTimeRangeLocaleConfig, ErrorStateMatcher } from '@koobiq/components/core';
4
+ import { DateAdapter, DateFormatter, KbqTimeRangeLocaleConfig, PopUpSizes, PopUpPlacements, ErrorStateMatcher } from '@koobiq/components/core';
5
5
  import { KbqPopoverTrigger } from '@koobiq/components/popover';
6
6
  import { DurationObjectUnits, DurationUnit } from '@koobiq/date-adapter';
7
7
  import { KbqTimepicker, TimeFormats } from '@koobiq/components/timepicker';
@@ -42,6 +42,7 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
42
42
  private renderer;
43
43
  private dateAdapter;
44
44
  private localeService;
45
+ private readonly timezoneService;
45
46
  /**
46
47
  * Implemented as part of KbqFormFieldControl.
47
48
  * @docs-private
@@ -149,6 +150,8 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
149
150
  private formatUserInput;
150
151
  private replaceSymbols;
151
152
  private replaceNumbers;
153
+ /** Clamps a time part to the allowed maximum and trims it to two digits */
154
+ private normalizeTimePart;
152
155
  /** Checks whether the input is invalid based on the native validation. */
153
156
  private isBadInput;
154
157
  private spaceKeyHandler;
@@ -174,6 +177,7 @@ declare class KbqTimepicker<D> implements KbqFormFieldControl<D>, ControlValueAc
174
177
  private maxValidator;
175
178
  private getValidDateOrNull;
176
179
  private setViewValue;
180
+ private setSelection;
177
181
  private updateView;
178
182
  /** @docs-private */
179
183
  updateErrorState(): void;
@@ -5,7 +5,7 @@ import { KbqOption } from '@koobiq/components/core';
5
5
  import * as i6 from '@koobiq/components/tooltip';
6
6
  import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
7
7
  import * as i3 from '@koobiq/components/select';
8
- import { KbqSelect, KbqSelectPanelWidth } from '@koobiq/components/select';
8
+ import { KbqSelect } from '@koobiq/components/select';
9
9
  import * as i1 from '@angular/cdk/overlay';
10
10
  import * as i4 from '@koobiq/components/icon';
11
11
  import * as i5 from '@koobiq/components/tags';
@@ -33,13 +33,15 @@ interface KbqTimezonesByCountry {
33
33
  declare class KbqTimezoneOption extends KbqOption {
34
34
  readonly tooltipContentWrapper: i0.Signal<ElementRef<HTMLElement>>;
35
35
  readonly tooltipContent: i0.Signal<ElementRef<HTMLElement>>;
36
- readonly highlightText: i0.InputSignal<string>;
36
+ readonly highlightText: i0.InputSignal<string | readonly string[]>;
37
+ /** Whether `highlightText` was matched with diacritic folding (e.g. via `createSearchPredicate`) — see `kbqHighlightBackground`. */
38
+ readonly foldDiacritics: i0.InputSignal<boolean>;
37
39
  get timezone(): KbqTimezoneZone;
38
40
  set timezone(zone: KbqTimezoneZone);
39
41
  private _timezone;
40
42
  get viewValue(): string;
41
43
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTimezoneOption, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqTimezoneOption, "kbq-timezone-option", ["kbqTimezoneOption"], { "highlightText": { "alias": "highlightText"; "required": false; "isSignal": true; }; "timezone": { "alias": "timezone"; "required": false; }; }, {}, never, never, true, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqTimezoneOption, "kbq-timezone-option", ["kbqTimezoneOption"], { "highlightText": { "alias": "highlightText"; "required": false; "isSignal": true; }; "foldDiacritics": { "alias": "foldDiacritics"; "required": false; "isSignal": true; }; "timezone": { "alias": "timezone"; "required": false; }; }, {}, never, never, true, never>;
43
45
  }
44
46
 
45
47
  declare const TOOLTIP_VISIBLE_ROWS_COUNT = 3;
@@ -69,8 +71,6 @@ declare class KbqTimezoneSelectTrigger {
69
71
  }
70
72
  declare class KbqTimezoneSelect extends KbqSelect implements AfterContentInit {
71
73
  readonly customTrigger: i0.Signal<KbqTimezoneSelectTrigger | undefined>;
72
- panelWidth: KbqSelectPanelWidth;
73
- panelMinWidth: number;
74
74
  ngAfterContentInit(): void;
75
75
  private updateLocaleParamsForSearch;
76
76
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqTimezoneSelect, never>;
@@ -86,7 +86,7 @@ declare class UtcOffsetPipe implements PipeTransform {
86
86
  }
87
87
 
88
88
  declare class CitiesByFilterPipe implements PipeTransform {
89
- transform(value: string, searchPattern?: string): string;
89
+ transform(value: string, searchPattern?: string | readonly string[]): string;
90
90
  static ɵfac: i0.ɵɵFactoryDeclaration<CitiesByFilterPipe, never>;
91
91
  static ɵpipe: i0.ɵɵPipeDeclaration<CitiesByFilterPipe, "citiesByFilter", true>;
92
92
  }
@@ -115,9 +115,11 @@ declare function offsetFormatterAsObject(value: string): {
115
115
  */
116
116
  declare function timezonesSortComparator(first: KbqTimezoneZone, second: KbqTimezoneZone): number;
117
117
  /**
118
- * Filtering timezone cities by search string
118
+ * Filtering timezone cities by search string. Accepts a single pattern or several (matching a
119
+ * city if it satisfies any one of them) — patterns that look like a bare UTC offset (e.g. `+3`)
120
+ * are ignored here, since they describe the zone rather than a city name.
119
121
  */
120
- declare function filterCitiesBySearchString(cities: string, searchPattern?: string): string;
122
+ declare function filterCitiesBySearchString(cities: string, searchPattern?: string | readonly string[]): string;
121
123
 
122
124
  export { KbqTimezoneModule, KbqTimezoneOption, KbqTimezoneOptionTooltip, KbqTimezoneSelect, KbqTimezoneSelectTrigger, TOOLTIP_VISIBLE_ROWS_COUNT, filterCitiesBySearchString, getZonesGroupedByCountry, offset, offsetFormatter, offsetFormatterAsObject, parseOffset, timezonesSortComparator };
123
125
  export type { KbqTimezoneGroup, KbqTimezoneZone, KbqTimezonesByCountry };
package/toast/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, InjectionToken, Provider, OnDestroy, ElementRef, ComponentRef, EmbeddedViewRef, ViewContainerRef, ViewRef, Injector } from '@angular/core';
2
+ import { InjectionToken, TemplateRef, Provider, OnDestroy, ElementRef, ComponentRef, EmbeddedViewRef, ViewContainerRef, ViewRef, Injector } from '@angular/core';
3
3
  import { CdkScrollable } from '@angular/cdk/overlay';
4
4
  import * as rxjs from 'rxjs';
5
- import { BehaviorSubject } from 'rxjs';
5
+ import { BehaviorSubject, Observable } from 'rxjs';
6
6
  import { AnimationEvent } from '@angular/animations';
7
7
  import * as i1 from '@koobiq/components/core';
8
8
  import { KbqReadStateDirective, ThemePalette } from '@koobiq/components/core';
@@ -144,11 +144,34 @@ declare class KbqToastContainerComponent extends CdkScrollable {
144
144
  private changeDetectorRef;
145
145
  readonly service: KbqToastService<any>;
146
146
  readonly viewContainer: i0.Signal<ViewContainerRef>;
147
- constructor();
147
+ /**
148
+ * Emits while the stack re-lays-out. Toasts are ordinary flow children, so removing one slides the
149
+ * rest for as long as its height animates — and an overlay opened from inside a toast is anchored to
150
+ * a trigger that is moving. CDK only re-measures the origin on a scroll or a viewport resize, so the
151
+ * stack has to say when it moved.
152
+ *
153
+ * The container's own box tracks the reflow exactly: continuously while a leaving toast animates its
154
+ * height away, and once for a removal that is not animated at all, such as a template toast.
155
+ */
156
+ private readonly reflowed;
157
+ /**
158
+ * `ScrollDispatcher` subscribes to this method when the container registers itself, so merging the
159
+ * reflow signal in re-broadcasts it to every overlay that repositions on scroll — which is what
160
+ * `kbq-select` and the dropdown trigger do by default.
161
+ */
162
+ elementScrolled(): Observable<Event>;
148
163
  createToast<C>(data: KbqToastData, componentType: any, onTop: boolean): ComponentRef<C>;
149
164
  createTemplate<C>(data: KbqToastData, template: TemplateRef<any>, onTop: boolean): EmbeddedViewRef<C>;
150
165
  remove(viewRef: ViewRef): void;
151
166
  getInjector(data: KbqToastData): Injector;
167
+ /**
168
+ * Fakes a scroll on the container so that overlays anchored inside a toast are repositioned by their
169
+ * `RepositionScrollStrategy` when the stack shifts.
170
+ *
171
+ * @deprecated The container reports its own reflow through `elementScrolled()`, so nothing calls this.
172
+ * It is kept only for callers that already hold a container reference — the instance created by
173
+ * `KbqToastService` is not exposed.
174
+ */
152
175
  dispatchScrollEvent: () => void;
153
176
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqToastContainerComponent, never>;
154
177
  static ɵcmp: i0.ɵɵComponentDeclaration<KbqToastContainerComponent, "kbq-toast-container", never, {}, {}, never, never, true, never>;