@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
@@ -1,17 +1,19 @@
1
1
  import * as i0 from '@angular/core';
2
- import { QueryList, inject, ElementRef, Directive, isDevMode, Input, ChangeDetectorRef, InjectionToken, LOCALE_ID, Type, Injectable, Renderer2, DestroyRef, afterNextRender, NgModule, Pipe, contentChildren, booleanAttribute, ViewEncapsulation, ChangeDetectionStrategy, Component, input, EventEmitter, Output, ViewChild, numberAttribute, signal, ApplicationRef, TemplateRef, NgZone, ViewContainerRef, RendererFactory2, Version } from '@angular/core';
3
- import { Subject, Subscription, merge, fromEvent, map as map$1, BehaviorSubject, interval, pairwise } from 'rxjs';
2
+ import { QueryList, inject, ElementRef, DestroyRef, signal, forwardRef, InjectionToken, model, computed, Directive, isDevMode, Input, ChangeDetectorRef, LOCALE_ID, Injectable, Type, Renderer2, afterNextRender, NgModule, effect, Pipe, contentChildren, booleanAttribute, ViewEncapsulation, ChangeDetectionStrategy, Component, input, EventEmitter, Output, ViewChild, numberAttribute, ApplicationRef, TemplateRef, NgZone, ViewContainerRef, viewChild, RendererFactory2, Version } from '@angular/core';
3
+ import { Subject, Subscription, merge, fromEvent, map as map$1, BehaviorSubject, of, interval, pairwise } from 'rxjs';
4
4
  import { tap, debounceTime, filter, map, distinctUntilChanged, delay } from 'rxjs/operators';
5
- import { _getEventTarget, Platform } from '@angular/cdk/platform';
6
- import { trigger, state, transition, style, animate, group } from '@angular/animations';
5
+ import { _getEventTarget, _getFocusedElementPierceShadowDom, Platform } from '@angular/cdk/platform';
6
+ import { trigger, state, style, transition, animate, group } from '@angular/animations';
7
+ import { AutofillMonitor } from '@angular/cdk/text-field';
8
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
9
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
10
  import { coerceBooleanProperty, coerceNumberProperty, coerceCssPixelValue } from '@angular/cdk/coercion';
8
- import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
11
  import { DateAdapter as DateAdapter$1 } from '@koobiq/date-adapter';
10
12
  import { DOCUMENT } from '@angular/common';
11
13
  import { DateFormatter as DateFormatter$1 } from '@koobiq/date-formatter';
12
14
  import { FocusMonitor } from '@angular/cdk/a11y';
13
15
  import { SharedResizeObserver } from '@angular/cdk/observers/private';
14
- import { Overlay, OverlayContainer, ScrollDispatcher, CdkScrollable } from '@angular/cdk/overlay';
16
+ import { FlexibleConnectedPositionStrategy, Overlay, CdkOverlayOrigin, OverlayContainer, ScrollDispatcher, CdkScrollable } from '@angular/cdk/overlay';
15
17
  import { TooltipSizeArrowSize } from '@koobiq/design-tokens';
16
18
  import { Directionality } from '@angular/cdk/bidi';
17
19
  import { ComponentPortal } from '@angular/cdk/portal';
@@ -667,6 +669,158 @@ const kbqSelectAnimations = {
667
669
  const transformPanel = kbqSelectAnimations.transformPanel;
668
670
  const fadeInContent = kbqSelectAnimations.fadeInContent;
669
671
 
672
+ /**
673
+ * Tracks whether the current control's value was filled in by the browser, as a signal.
674
+ *
675
+ * Call it from an injection context on a directive whose host is the element the browser actually
676
+ * fills — a text `<input>` or a `<textarea>`. Every `KbqFormFieldControl` that can be autofilled
677
+ * exposes the result as its `autofilled` member.
678
+ *
679
+ * This is a hook for application code, not the mechanism behind the autofill styling. The styling
680
+ * keys on `:autofill` in CSS, which matches in the same style pass the browser fills the field;
681
+ * detection here goes through a zero-length keyframe animation and an `animationstart` listener, so
682
+ * it lands a frame or two later — too late to paint with, and early enough for anything a component
683
+ * wants to do about it.
684
+ *
685
+ * `monitor()` returns EMPTY off the browser platform, so this needs no `Platform` guard.
686
+ */
687
+ const kbqInjectAutofilled = () => {
688
+ const elementRef = inject(ElementRef);
689
+ const autofillMonitor = inject(AutofillMonitor);
690
+ const destroyRef = inject(DestroyRef);
691
+ const autofilled = signal(false, ...(ngDevMode ? [{ debugName: "autofilled" }] : []));
692
+ autofillMonitor
693
+ .monitor(elementRef)
694
+ .pipe(takeUntilDestroyed(destroyRef))
695
+ .subscribe(({ isAutofilled }) => autofilled.set(isAutofilled));
696
+ // `stopMonitoring()` is the load-bearing teardown, not a duplicate of `takeUntilDestroyed()`
697
+ // above: `AutofillMonitor` is `providedIn: 'root'`, so dropping only the subscription would
698
+ // leave the element registered with the app-lifetime service and its marker classes on the DOM
699
+ // node.
700
+ destroyRef.onDestroy(() => autofillMonitor.stopMonitoring(elementRef));
701
+ return autofilled.asReadonly();
702
+ };
703
+
704
+ /**
705
+ * Provider Expression that allows `KbqCheckable` to register as a `ControlValueAccessor`, so any host
706
+ * applying it via `hostDirectives` gets `[(ngModel)]`/`formControl` support without wiring up its own.
707
+ * @docs-private
708
+ */
709
+ const KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR = {
710
+ provide: NG_VALUE_ACCESSOR,
711
+ useExisting: forwardRef(() => KbqCheckable),
712
+ multi: true
713
+ };
714
+ /** Injection token that can be used to specify the default click behavior for checkable controls. */
715
+ const KBQ_CHECKABLE_CLICK_ACTION = new InjectionToken('kbq-checkable-click-action');
716
+ /**
717
+ * Represents the different states that require custom transitions between them.
718
+ * @docs-private
719
+ */
720
+ var TransitionCheckState;
721
+ (function (TransitionCheckState) {
722
+ /** The initial state of the component before any user interaction. */
723
+ TransitionCheckState["Init"] = "init";
724
+ /** The state representing the component when it's becoming checked. */
725
+ TransitionCheckState["Checked"] = "checked";
726
+ /** The state representing the component when it's becoming unchecked. */
727
+ TransitionCheckState["Unchecked"] = "unchecked";
728
+ /** The state representing the component when it's becoming indeterminate. */
729
+ TransitionCheckState["Indeterminate"] = "indeterminate";
730
+ })(TransitionCheckState || (TransitionCheckState = {}));
731
+ /**
732
+ * Shared behavior for checkbox-like controls: checked/disabled/indeterminate/tabIndex state, the click-to-toggle
733
+ * algorithm, ARIA-checked computation, and `ControlValueAccessor` change plumbing.
734
+ *
735
+ * Meant to be applied via `hostDirectives` by components that render their own native `<input type="checkbox">`
736
+ * and markup (e.g. `KbqCheckbox`, `KbqToggleComponent`, or custom checkbox-like primitives). Hosts stay
737
+ * responsible for their own public inputs/outputs, `FocusMonitor` wiring, and emitting their own typed
738
+ * `change` event - this directive only centralizes the state and decisions behind them.
739
+ */
740
+ class KbqCheckable {
741
+ constructor() {
742
+ this.controlValueAccessorChangeFn = () => { };
743
+ /**
744
+ * Called when the control is blurred. Needed to properly implement `ControlValueAccessor`.
745
+ * @docs-private
746
+ */
747
+ this.onTouched = () => { };
748
+ /** @docs-private */
749
+ this.currentCheckState = signal(TransitionCheckState.Init, ...(ngDevMode ? [{ debugName: "currentCheckState" }] : []));
750
+ this.checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
751
+ this.disabled = model(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
752
+ this.indeterminate = model(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : []));
753
+ /** Raw tab index as set by the caller, ignoring `disabled`. Use `effectiveTabIndex` to read the applied value. */
754
+ this.tabIndex = model(0, ...(ngDevMode ? [{ debugName: "tabIndex" }] : []));
755
+ /** The tab index actually applied to the native input: forced to `-1` while disabled. */
756
+ this.effectiveTabIndex = computed(() => (this.disabled() ? -1 : this.tabIndex()), ...(ngDevMode ? [{ debugName: "effectiveTabIndex" }] : []));
757
+ }
758
+ /** Returns the ARIA-checked value: `'true'`, `'false'`, or `'mixed'` when indeterminate. */
759
+ getAriaChecked() {
760
+ return this.checked() ? 'true' : this.indeterminate() ? 'mixed' : 'false';
761
+ }
762
+ /** Toggles the `checked` state and notifies the registered `ControlValueAccessor` change handler. */
763
+ toggle() {
764
+ this.checked.update((value) => !value);
765
+ this.notifyFormValueChange(this.checked());
766
+ }
767
+ /**
768
+ * Resolves what a click on the native input should do, based on the current state and `clickAction`.
769
+ * Pure - does not mutate state. Callers apply `checked`/`indeterminate` themselves and own emitting
770
+ * their own change events, so timing/order stays identical to a hand-written click handler.
771
+ */
772
+ resolveClick(clickAction) {
773
+ if (this.disabled() || clickAction === 'noop') {
774
+ return { shouldToggle: false, shouldClearIndeterminate: false };
775
+ }
776
+ return {
777
+ shouldToggle: true,
778
+ shouldClearIndeterminate: this.indeterminate() && clickAction !== 'check'
779
+ };
780
+ }
781
+ /** Resets the native input to match the current `checked`/`indeterminate` state (used for the `noop` click action). */
782
+ resetNativeInput(nativeInput) {
783
+ nativeInput.checked = this.checked();
784
+ nativeInput.indeterminate = this.indeterminate();
785
+ }
786
+ /** Transitions the animation state, ignoring no-op transitions. @docs-private */
787
+ transitionCheckState(newState) {
788
+ if (this.currentCheckState() === newState)
789
+ return;
790
+ this.currentCheckState.set(newState);
791
+ }
792
+ // Implemented as part of ControlValueAccessor.
793
+ writeValue(value) {
794
+ this.checked.set(!!value);
795
+ }
796
+ /** Stores the `ControlValueAccessor` change handler to be notified by `notifyFormValueChange`. */
797
+ registerOnChange(fn) {
798
+ this.controlValueAccessorChangeFn = fn;
799
+ }
800
+ // Implemented as part of ControlValueAccessor.
801
+ registerOnTouched(fn) {
802
+ this.onTouched = fn;
803
+ }
804
+ // Implemented as part of ControlValueAccessor.
805
+ setDisabledState(isDisabled) {
806
+ this.disabled.set(isDisabled);
807
+ }
808
+ /** Notifies the registered `ControlValueAccessor` change handler. */
809
+ notifyFormValueChange(value) {
810
+ this.controlValueAccessorChangeFn(value);
811
+ }
812
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqCheckable, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
813
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqCheckable, isStandalone: true, selector: "[kbqCheckable]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", disabled: "disabledChange", indeterminate: "indeterminateChange", tabIndex: "tabIndexChange" }, providers: [KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR], exportAs: ["kbqCheckable"], ngImport: i0 }); }
814
+ }
815
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqCheckable, decorators: [{
816
+ type: Directive,
817
+ args: [{
818
+ selector: '[kbqCheckable]',
819
+ providers: [KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR],
820
+ exportAs: 'kbqCheckable'
821
+ }]
822
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }, { type: i0.Output, args: ["indeterminateChange"] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }, { type: i0.Output, args: ["tabIndexChange"] }] } });
823
+
670
824
  class KbqNormalizeWhitespace {
671
825
  constructor() {
672
826
  /** @docs-private */
@@ -682,10 +836,10 @@ class KbqNormalizeWhitespace {
682
836
  $event.clipboardData?.setData('text', value?.replace(/\u2009/g, ' '));
683
837
  }
684
838
  }
685
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNormalizeWhitespace, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
686
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqNormalizeWhitespace, isStandalone: true, selector: "[kbqNormalizeWhitespace]", host: { listeners: { "copy": "onCopy($event)" } }, ngImport: i0 }); }
839
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqNormalizeWhitespace, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
840
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqNormalizeWhitespace, isStandalone: true, selector: "[kbqNormalizeWhitespace]", host: { listeners: { "copy": "onCopy($event)" } }, ngImport: i0 }); }
687
841
  }
688
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqNormalizeWhitespace, decorators: [{
842
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqNormalizeWhitespace, decorators: [{
689
843
  type: Directive,
690
844
  args: [{
691
845
  selector: '[kbqNormalizeWhitespace]',
@@ -776,10 +930,10 @@ class KbqColorDirective {
776
930
  setDefaultColor(color) {
777
931
  this.defaultColor = color;
778
932
  }
779
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqColorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
780
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqColorDirective, isStandalone: true, inputs: { color: "color" }, ngImport: i0 }); }
933
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqColorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
934
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqColorDirective, isStandalone: true, inputs: { color: "color" }, ngImport: i0 }); }
781
935
  }
782
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqColorDirective, decorators: [{
936
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqColorDirective, decorators: [{
783
937
  type: Directive
784
938
  }], ctorParameters: () => [], propDecorators: { color: [{
785
939
  type: Input
@@ -863,6 +1017,28 @@ class KbqErrorStateTracker {
863
1017
  const kbqInjectNativeElement = () => {
864
1018
  return inject((ElementRef)).nativeElement;
865
1019
  };
1020
+ /**
1021
+ * Focuses `element` and scrolls it into view by the shortest distance, leaving a visible one alone.
1022
+ *
1023
+ * The reveal is explicit because the one `focus()` performs implicitly is not portable: WebKit defers it
1024
+ * to a later rendering update, where it lands after — and undoes — any scrolling the reader did in the
1025
+ * meantime. Letting the element reveal itself keeps every consumer working, whatever it uses as a scroll
1026
+ * container, and the browser resolves that container rather than the caller guessing at it.
1027
+ *
1028
+ * Pass `skipReveal` when the pointer caused the focus: the element is already under the cursor, so
1029
+ * revealing it would shift the list out from under it.
1030
+ */
1031
+ const kbqFocusAndReveal = (element, skipReveal = false) => {
1032
+ if (typeof element.focus !== 'function')
1033
+ return;
1034
+ // A focus listener calling back into `focus` must not scroll a second time. Read through shadow
1035
+ // roots, where `document.activeElement` reports the host instead of the element that holds focus.
1036
+ const wasFocused = _getFocusedElementPierceShadowDom() === element;
1037
+ element.focus({ preventScroll: true });
1038
+ if (skipReveal || wasFocused)
1039
+ return;
1040
+ element.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });
1041
+ };
866
1042
 
867
1043
  function isBoolean(value) {
868
1044
  return typeof value === 'boolean';
@@ -910,10 +1086,10 @@ class KbqHover {
910
1086
  */
911
1087
  this.hovered = toSignal(merge(fromEvent(this.element, 'mouseenter'), fromEvent(this.element, 'mouseleave')).pipe(map$1(({ type }) => type === 'mouseenter')), { initialValue: false });
912
1088
  }
913
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
914
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqHover, isStandalone: true, selector: "[kbqHover]", host: { properties: { "class.kbq-hovered": "hovered()" }, classAttribute: "kbq-hover" }, exportAs: ["kbqHover"], ngImport: i0 }); }
1089
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1090
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqHover, isStandalone: true, selector: "[kbqHover]", host: { properties: { "class.kbq-hovered": "hovered()" }, classAttribute: "kbq-hover" }, exportAs: ["kbqHover"], ngImport: i0 }); }
915
1091
  }
916
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHover, decorators: [{
1092
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHover, decorators: [{
917
1093
  type: Directive,
918
1094
  args: [{
919
1095
  selector: '[kbqHover]',
@@ -940,10 +1116,10 @@ class KbqReadStateDirective {
940
1116
  }
941
1117
  this.changeDetectorRef.markForCheck();
942
1118
  }
943
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqReadStateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
944
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqReadStateDirective, isStandalone: true, host: { listeners: { "mouseenter": "mouseenterHandler()", "mouseleave": "mouseleaveHandler()", "click": "read.next(true)" } }, ngImport: i0 }); }
1119
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqReadStateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1120
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqReadStateDirective, isStandalone: true, host: { listeners: { "mouseenter": "mouseenterHandler()", "mouseleave": "mouseleaveHandler()", "click": "read.next(true)" } }, ngImport: i0 }); }
945
1121
  }
946
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqReadStateDirective, decorators: [{
1122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqReadStateDirective, decorators: [{
947
1123
  type: Directive,
948
1124
  args: [{
949
1125
  host: {
@@ -991,6 +1167,145 @@ class DateAdapter extends DateAdapter$1 {
991
1167
 
992
1168
  const KBQ_DATE_FORMATS = new InjectionToken('kbq-date-formats');
993
1169
 
1170
+ /**
1171
+ * InjectionToken for the time zone every date the library formats is rendered in.
1172
+ *
1173
+ * Read once, by the {@link KbqDateTimezoneService} constructor, out of the injector that created the
1174
+ * service — call {@link KbqDateTimezoneService.setTimezone} to change the zone afterwards. Defaults to
1175
+ * `'system'`, the zone of the host the code runs on.
1176
+ */
1177
+ const KBQ_DATE_TIMEZONE = new InjectionToken('KBQ_DATE_TIMEZONE');
1178
+ const MINUTES_PER_HOUR = 60;
1179
+ const SECONDS_PER_MINUTE = 60;
1180
+ /** The largest offset any zone has ever had; anything beyond it is a typo, not a zone. */
1181
+ const MAX_OFFSET_HOURS = 14;
1182
+ const MAX_OFFSET_MINUTES = MAX_OFFSET_HOURS * MINUTES_PER_HOUR;
1183
+ /** `UTC`/`GMT` with no offset — a valid input on its own, and what `Intl` reports for zero-offset zones. */
1184
+ const UTC_ALIAS_PATTERN = /^(?:utc|gmt)$/i;
1185
+ /**
1186
+ * A fixed offset written with separators, with or without a `UTC`/`GMT` prefix and with or without a
1187
+ * sign: `+03:00`, `UTC+3`, `GMT+05:30`, `03:00:00`. The seconds group matches both the `timeZoneName`
1188
+ * `Intl` reports in the `longOffset` style for pre-standard-time instants (`GMT-00:44:30`) and the form
1189
+ * `KbqTimezoneZone.offset` is written in.
1190
+ */
1191
+ const FIXED_OFFSET_PATTERN = /^(?:utc|gmt)?([+-])?(\d{1,2})(?::([0-5]\d)(?::([0-5]\d))?)?$/i;
1192
+ /** The same offset written without separators: `-0530`. Kept apart so `+123` fails instead of backtracking. */
1193
+ const COMPACT_OFFSET_PATTERN = /^(?:utc|gmt)?([+-])?(\d{2})([0-5]\d)$/i;
1194
+ /** Offset in minutes east of UTC of a fixed-offset specifier, or `null` when the value is not one. */
1195
+ const parseFixedOffset = (value) => {
1196
+ if (UTC_ALIAS_PATTERN.test(value))
1197
+ return 0;
1198
+ const match = COMPACT_OFFSET_PATTERN.exec(value) ?? FIXED_OFFSET_PATTERN.exec(value);
1199
+ if (!match)
1200
+ return null;
1201
+ const [, sign, hours, minutes = '0', seconds = '0'] = match;
1202
+ if (Number(hours) > MAX_OFFSET_HOURS)
1203
+ return null;
1204
+ const magnitude = Number(hours) * MINUTES_PER_HOUR + Number(minutes) + Number(seconds) / SECONDS_PER_MINUTE;
1205
+ // Rounded because both date libraries expect whole minutes; only pre-1900 zones have a seconds part.
1206
+ return (sign === '-' ? -1 : 1) * Math.round(magnitude);
1207
+ };
1208
+ /**
1209
+ * One `Intl.DateTimeFormat` per IANA zone: building it is the expensive part of resolving an offset, and
1210
+ * an application uses a handful of zones at most. A `null` entry marks a name `Intl` rejected, so an
1211
+ * invalid zone is reported once instead of throwing on every date.
1212
+ *
1213
+ * Bounded because the zone can come from unvalidated input — a cookie on the server, a picker in the
1214
+ * browser — and this map outlives every request in the process.
1215
+ */
1216
+ const MAX_CACHED_FORMATTERS = 32;
1217
+ const offsetFormatters = new Map();
1218
+ const getOffsetFormatter = (timeZone) => {
1219
+ if (!offsetFormatters.has(timeZone)) {
1220
+ if (offsetFormatters.size >= MAX_CACHED_FORMATTERS) {
1221
+ offsetFormatters.delete(offsetFormatters.keys().next().value);
1222
+ }
1223
+ try {
1224
+ offsetFormatters.set(timeZone, new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'longOffset' }));
1225
+ }
1226
+ catch {
1227
+ if (isDevMode()) {
1228
+ // eslint-disable-next-line no-console
1229
+ console.warn(`Unknown time zone "${timeZone}", dates are left in the host time zone.`);
1230
+ }
1231
+ offsetFormatters.set(timeZone, null);
1232
+ }
1233
+ }
1234
+ return offsetFormatters.get(timeZone);
1235
+ };
1236
+ /**
1237
+ * Offset of `timezone` at `timestamp`, in minutes east of UTC. `null` means "leave the date in the host
1238
+ * zone" — either because `timezone` is `'system'`, or because it is a name no `Intl` implementation knows.
1239
+ *
1240
+ * Takes the instant because an IANA zone has no single offset: `'Europe/Berlin'` is +60 in January and
1241
+ * +120 in July, and one list of dates can span the change.
1242
+ */
1243
+ const kbqResolveTimezoneOffset = (timezone, timestamp) => {
1244
+ if (timezone === 'system')
1245
+ return null;
1246
+ // Bounded and rounded like the string form: a numeric offset comes from the same unvalidated places,
1247
+ // and neither date library reads a fractional minute or a 99-hour offset as anything sensible.
1248
+ if (typeof timezone === 'number') {
1249
+ return Number.isFinite(timezone) && Math.abs(timezone) <= MAX_OFFSET_MINUTES ? Math.round(timezone) : null;
1250
+ }
1251
+ const fixedOffset = parseFixedOffset(timezone);
1252
+ if (fixedOffset !== null)
1253
+ return fixedOffset;
1254
+ // An invalid date has no offset to resolve, and `Intl` throws rather than saying so.
1255
+ if (!Number.isFinite(timestamp))
1256
+ return null;
1257
+ const timeZoneName = getOffsetFormatter(timezone)
1258
+ ?.formatToParts(new Date(timestamp))
1259
+ .find(({ type }) => type === 'timeZoneName')?.value;
1260
+ return timeZoneName ? parseFixedOffset(timeZoneName) : null;
1261
+ };
1262
+ /**
1263
+ * Holds the time zone every date the library creates, parses and formats is rendered in.
1264
+ *
1265
+ * Provided in root, so {@link KBQ_DATE_TIMEZONE} in the application providers configures the whole
1266
+ * application. To scope a zone to one subtree, list {@link kbqDateTimezoneProvider} in that component's
1267
+ * `providers` together with the date adapter and the `DateFormatter`: the adapter captures the service of
1268
+ * the injector that created it, and keeps using it.
1269
+ */
1270
+ class KbqDateTimezoneService {
1271
+ constructor() {
1272
+ this._timezone = signal(inject(KBQ_DATE_TIMEZONE, { optional: true }) ?? 'system', ...(ngDevMode ? [{ debugName: "_timezone" }] : []));
1273
+ this._changes = new Subject();
1274
+ this.timezone = this._timezone.asReadonly();
1275
+ this.changes = this._changes.asObservable();
1276
+ }
1277
+ /** Activates a time zone. */
1278
+ setTimezone(timezone) {
1279
+ this._timezone.set(timezone);
1280
+ this._changes.next(timezone);
1281
+ }
1282
+ /**
1283
+ * Offset of the active zone at `timestamp`, in minutes east of UTC, or `null` when dates are left in
1284
+ * the host zone.
1285
+ */
1286
+ offsetAt(timestamp) {
1287
+ return kbqResolveTimezoneOffset(this._timezone(), timestamp);
1288
+ }
1289
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDateTimezoneService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1290
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDateTimezoneService, providedIn: 'root' }); }
1291
+ }
1292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDateTimezoneService, decorators: [{
1293
+ type: Injectable,
1294
+ args: [{ providedIn: 'root' }]
1295
+ }], ctorParameters: () => [] });
1296
+ /**
1297
+ * Utility provider for the time zone dates are rendered in.
1298
+ *
1299
+ * Provides {@link KbqDateTimezoneService} alongside the token, so listing it in a component's `providers`
1300
+ * scopes the zone to that subtree instead of resolving the root service and silently doing nothing.
1301
+ *
1302
+ * @see KBQ_DATE_TIMEZONE
1303
+ */
1304
+ const kbqDateTimezoneProvider = (timezone) => [
1305
+ KbqDateTimezoneService,
1306
+ { provide: KBQ_DATE_TIMEZONE, useValue: timezone }
1307
+ ];
1308
+
994
1309
  /** Utility provider for `ErrorStateMatcher`. */
995
1310
  const kbqErrorStateMatcherProvider = (errorStateMatcher) => {
996
1311
  if (errorStateMatcher instanceof Type) {
@@ -1012,10 +1327,10 @@ class ShowOnFormSubmitErrorStateMatcher {
1012
1327
  isErrorState(control, form) {
1013
1328
  return !!(control?.invalid && form?.submitted);
1014
1329
  }
1015
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1016
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher }); }
1330
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1331
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher }); }
1017
1332
  }
1018
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher, decorators: [{
1333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnFormSubmitErrorStateMatcher, decorators: [{
1019
1334
  type: Injectable
1020
1335
  }] });
1021
1336
  /**
@@ -1029,10 +1344,10 @@ class ShowRequiredOnSubmitErrorStateMatcher {
1029
1344
  ? !!(control?.invalid && form?.submitted)
1030
1345
  : !!(control?.invalid && control.touched);
1031
1346
  }
1032
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1033
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher }); }
1347
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1348
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher }); }
1034
1349
  }
1035
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher, decorators: [{
1350
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowRequiredOnSubmitErrorStateMatcher, decorators: [{
1036
1351
  type: Injectable
1037
1352
  }] });
1038
1353
  /** Error state matcher that matches when a control is invalid and dirty or form is submitted. */
@@ -1040,10 +1355,10 @@ class ShowOnControlDirtyErrorStateMatcher {
1040
1355
  isErrorState(control, form) {
1041
1356
  return !!(control?.invalid && (control.dirty || form?.submitted));
1042
1357
  }
1043
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1044
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher }); }
1358
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1359
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher }); }
1045
1360
  }
1046
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher, decorators: [{
1361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ShowOnControlDirtyErrorStateMatcher, decorators: [{
1047
1362
  type: Injectable
1048
1363
  }] });
1049
1364
  /**
@@ -1054,10 +1369,10 @@ class ErrorStateMatcher {
1054
1369
  isErrorState(control, form) {
1055
1370
  return !!(control?.invalid && (control.touched || form?.submitted));
1056
1371
  }
1057
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1058
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ErrorStateMatcher, providedIn: 'root' }); }
1372
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ErrorStateMatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1373
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ErrorStateMatcher, providedIn: 'root' }); }
1059
1374
  }
1060
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ErrorStateMatcher, decorators: [{
1375
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ErrorStateMatcher, decorators: [{
1061
1376
  type: Injectable,
1062
1377
  args: [{ providedIn: 'root' }]
1063
1378
  }] });
@@ -1079,39 +1394,72 @@ const KBQ_WINDOW = new InjectionToken('[KBQ_WINDOW]', {
1079
1394
  }
1080
1395
  });
1081
1396
 
1082
- const INITIAL_PROPERTIES = {
1083
- all: 'initial',
1084
- position: 'absolute',
1085
- top: coerceCssPixelValue(0),
1086
- left: coerceCssPixelValue(0),
1087
- width: coerceCssPixelValue(0),
1088
- height: coerceCssPixelValue(0),
1089
- visibility: 'hidden',
1090
- overflow: 'scroll',
1091
- whiteSpace: 'pre',
1092
- pointerEvents: 'none'
1093
- };
1094
1397
  /**
1095
- * Properties that can affect element width and should be inherited from the parent.
1398
+ * Properties that affect the rendered width of the text and have to be mirrored onto the ruler.
1399
+ *
1400
+ * `font-variant` is deliberately absent: the shorthand does not round-trip through the computed style
1401
+ * once a field sets more than one of its longhands, so the longhands are copied instead.
1096
1402
  */
1097
- const WIDTH_INHERITED_PROPERTIES = [
1403
+ const RULER_INHERITED_PROPERTIES = [
1098
1404
  'font',
1099
1405
  'fontFamily',
1100
1406
  'fontFeatureSettings',
1101
1407
  'fontKerning',
1102
1408
  'fontOpticalSizing',
1103
- 'fontSizeAdjust',
1104
1409
  'fontSize',
1410
+ 'fontSizeAdjust',
1105
1411
  'fontStretch',
1412
+ 'fontStyle',
1106
1413
  'fontSynthesis',
1107
- 'fontVariant',
1414
+ 'fontVariantCaps',
1415
+ 'fontVariantEastAsian',
1108
1416
  'fontVariantLigatures',
1417
+ 'fontVariantNumeric',
1109
1418
  'fontVariationSettings',
1110
1419
  'fontWeight',
1111
1420
  'letterSpacing',
1112
1421
  'textIndent',
1113
1422
  'textTransform'
1114
1423
  ];
1424
+ const RULER_PROPERTIES = {
1425
+ all: 'initial',
1426
+ position: 'absolute',
1427
+ top: '0px',
1428
+ left: '0px',
1429
+ width: '0px',
1430
+ height: '0px',
1431
+ visibility: 'hidden',
1432
+ overflow: 'scroll',
1433
+ whiteSpace: 'pre',
1434
+ pointerEvents: 'none'
1435
+ };
1436
+ /**
1437
+ * Builds a hidden element that renders text with the typography of the element `computedStyle` was taken
1438
+ * from. Append it to the document, measure through {@link kbqMeasureRulerText}, and remove it.
1439
+ *
1440
+ * @docs-private
1441
+ */
1442
+ const kbqCreateTextRuler = (document, computedStyle) => {
1443
+ const ruler = document.createElement('span');
1444
+ Object.assign(ruler.style, RULER_PROPERTIES);
1445
+ RULER_INHERITED_PROPERTIES.forEach((property) => {
1446
+ ruler.style[property] = computedStyle[property];
1447
+ });
1448
+ return ruler;
1449
+ };
1450
+ /**
1451
+ * Width of `text` in pixels, in the same coordinate space as `clientWidth` and `scrollLeft`.
1452
+ *
1453
+ * `scrollWidth`, not `getBoundingClientRect()`: the latter reports the transformed box, which disagrees
1454
+ * with the untransformed layout metrics it would be compared against under a scaled ancestor.
1455
+ *
1456
+ * @docs-private
1457
+ */
1458
+ const kbqMeasureRulerText = (ruler, text) => {
1459
+ ruler.textContent = text;
1460
+ return ruler.scrollWidth;
1461
+ };
1462
+
1115
1463
  /**
1116
1464
  * Properties that should be added to the width when `box-sizing: border-box` is applied.
1117
1465
  */
@@ -1149,34 +1497,24 @@ class KbqFieldSizingContent {
1149
1497
  }
1150
1498
  setupWidth() {
1151
1499
  const computedStyle = this.window.getComputedStyle(this.element);
1152
- const ruler = this.createRuler(computedStyle);
1153
- ruler.textContent = this.element.value || this.element.placeholder || '';
1154
- // We should add space to prevent text truncation in Safari/Firefox
1155
- if (ruler.textContent)
1156
- ruler.textContent += ' ';
1500
+ const ruler = kbqCreateTextRuler(this.document, computedStyle);
1501
+ const text = this.element.value || this.element.placeholder || '';
1157
1502
  this.renderer.appendChild(this.document.body, ruler);
1158
- const width = this.calculateWidth(ruler, computedStyle);
1503
+ // We should add space to prevent text truncation in Safari/Firefox
1504
+ const width = this.calculateWidth(kbqMeasureRulerText(ruler, text && `${text} `), computedStyle);
1159
1505
  this.renderer.setStyle(this.element, 'width', coerceCssPixelValue(width));
1160
1506
  this.renderer.removeChild(this.document.body, ruler);
1161
1507
  }
1162
- createRuler(computedStyle) {
1163
- const ruler = this.renderer.createElement('span');
1164
- Object.assign(ruler.style, INITIAL_PROPERTIES);
1165
- WIDTH_INHERITED_PROPERTIES.forEach((property) => {
1166
- ruler.style[property] = computedStyle[property];
1167
- });
1168
- return ruler;
1169
- }
1170
- calculateWidth(ruler, computedStyle) {
1508
+ calculateWidth(textWidth, computedStyle) {
1171
1509
  if (computedStyle.boxSizing === 'border-box') {
1172
- return BOX_SIZING_BORDER_BOX_WIDTH_PROPERTIES.reduce((width, property) => width + (parseFloat(computedStyle[property]) || 0), ruler.scrollWidth);
1510
+ return BOX_SIZING_BORDER_BOX_WIDTH_PROPERTIES.reduce((width, property) => width + (parseFloat(computedStyle[property]) || 0), textWidth);
1173
1511
  }
1174
- return ruler.scrollWidth;
1512
+ return textWidth;
1175
1513
  }
1176
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFieldSizingContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1177
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqFieldSizingContent, isStandalone: true, selector: "[kbqFieldSizingContent]", host: { classAttribute: "kbq-field-sizing-content" }, exportAs: ["kbqFieldSizingContent"], ngImport: i0 }); }
1514
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFieldSizingContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1515
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqFieldSizingContent, isStandalone: true, selector: "[kbqFieldSizingContent]", host: { classAttribute: "kbq-field-sizing-content" }, exportAs: ["kbqFieldSizingContent"], ngImport: i0 }); }
1178
1516
  }
1179
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFieldSizingContent, decorators: [{
1517
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFieldSizingContent, decorators: [{
1180
1518
  type: Directive,
1181
1519
  args: [{
1182
1520
  selector: '[kbqFieldSizingContent]',
@@ -1192,12 +1530,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
1192
1530
  * as alternative token to the actual `KbqFormField` class which would cause unnecessary
1193
1531
  * retention of the `KbqFormField` class and its component metadata.
1194
1532
  *
1195
- * @TODO move into form-field.ts, add correct type for `InjectionToken<KbqFormField>` (#DS-2915)
1533
+ * @deprecated Use `KBQ_FORM_FIELD` from `@koobiq/components/form-field`.
1534
+ *
1535
+ * @docs-private
1196
1536
  */
1197
1537
  const KBQ_FORM_FIELD_REF = new InjectionToken('KbqFormFieldRef');
1538
+ /**
1539
+ * Injection token for `KbqConnectedOverlayOriginProvider`. Provide it on an ancestor
1540
+ * component to redirect where a nested `KbqFormField`'s control positions its overlay.
1541
+ */
1542
+ const KBQ_CONNECTED_OVERLAY_ORIGIN = new InjectionToken('KbqConnectedOverlayOrigin');
1543
+
1544
+ /**
1545
+ * Scrolls a text field horizontally so that its current selection is visible.
1546
+ *
1547
+ * Browsers scroll a field to the caret only for edits the user makes: a selection set from script leaves
1548
+ * the field at whatever offset the last keystroke produced. A masked field re-renders its value and moves
1549
+ * the caret between value parts on every keystroke, so without this the field keeps the offset of the part
1550
+ * that was edited before and clips the one being edited now.
1551
+ *
1552
+ * Leaves the field alone when it is not focused, when it renders something other than its value, and in
1553
+ * right-to-left text, where the browser's own caret following is already correct.
1554
+ */
1555
+ const kbqRevealSelection = (element) => {
1556
+ const document = element.ownerDocument;
1557
+ const window = document.defaultView;
1558
+ // A field the user has left is the browser's to scroll: it resets the offset on blur, and a write
1559
+ // landing after that would park the field mid-value until it is focused again.
1560
+ if (!window || document.activeElement !== element) {
1561
+ return;
1562
+ }
1563
+ // A password field renders bullets, which are not the widths of the characters behind them.
1564
+ if (element.type === 'password') {
1565
+ return;
1566
+ }
1567
+ const maxScrollLeft = element.scrollWidth - element.clientWidth;
1568
+ // The value fits, so any offset the field is left at is an artifact of an earlier, longer value.
1569
+ if (maxScrollLeft <= 0) {
1570
+ element.scrollLeft = 0;
1571
+ return;
1572
+ }
1573
+ const computedStyle = window.getComputedStyle(element);
1574
+ // Every offset below is measured from the left edge, while an RTL field scrolls into negative
1575
+ // `scrollLeft`. Mirroring that needs the visual order of a bidi line rather than a prefix of the
1576
+ // value, so the browser's own caret following is left in place instead of being overwritten.
1577
+ if (computedStyle.direction === 'rtl') {
1578
+ return;
1579
+ }
1580
+ const { value, selectionStart, selectionEnd, clientWidth } = element;
1581
+ const paddingLeft = parseFloat(computedStyle.paddingLeft) || 0;
1582
+ const paddingRight = parseFloat(computedStyle.paddingRight) || 0;
1583
+ const ruler = kbqCreateTextRuler(document, computedStyle);
1584
+ document.body.appendChild(ruler);
1585
+ // `scrollLeft` is measured from the start of the padding box, the text starts one `padding-left` in.
1586
+ const start = paddingLeft + kbqMeasureRulerText(ruler, value.slice(0, selectionStart ?? 0));
1587
+ // A caret is the common case on the typing path, and measuring it twice costs a second layout.
1588
+ const end = selectionEnd === selectionStart
1589
+ ? start
1590
+ : paddingLeft + kbqMeasureRulerText(ruler, value.slice(0, selectionEnd ?? 0));
1591
+ ruler.remove();
1592
+ // The smallest offset that still shows the selection, so that as much as possible of what precedes it
1593
+ // stays on screen. Deriving the offset from the selection alone, instead of nudging the current one,
1594
+ // keeps the result independent of where the last keystroke happened to leave the field.
1595
+ const minimumRevealingEnd = Math.max(end + paddingRight - clientWidth, 0);
1596
+ // A selection wider than the field cannot be shown whole; its start is the half worth keeping.
1597
+ const maximumKeepingStart = Math.max(start - paddingLeft, 0);
1598
+ element.scrollLeft = Math.min(minimumRevealingEnd, maximumKeepingStart, maxScrollLeft);
1599
+ };
1600
+ /**
1601
+ * Selects the `[start, end]` range of a text field and keeps it visible.
1602
+ *
1603
+ * @see {@link kbqRevealSelection}
1604
+ */
1605
+ const kbqSetSelectionRange = (element, start, end) => {
1606
+ element.setSelectionRange(start, end);
1607
+ kbqRevealSelection(element);
1608
+ };
1198
1609
 
1199
1610
  const enUSLocaleData = {
1200
- select: { hiddenItemsText: '+{{ number }}' },
1611
+ a11y: {
1612
+ close: 'Close',
1613
+ save: 'Save',
1614
+ cancel: 'Cancel',
1615
+ removeAll: 'Remove all',
1616
+ expandBreadcrumbs: 'Show hidden breadcrumbs',
1617
+ previousMonth: 'Previous month',
1618
+ currentDate: 'Current date',
1619
+ nextMonth: 'Next month',
1620
+ clear: 'Clear',
1621
+ showPassword: 'Show password',
1622
+ hidePassword: 'Hide password',
1623
+ resizeColumns: 'Resize columns'
1624
+ },
1625
+ select: { hiddenItemsText: '+{{ number }}', selectAll: 'Select all' },
1201
1626
  datepicker: {
1202
1627
  placeholder: 'yyyy-mm-dd',
1203
1628
  dateInput: 'yyyy-MM-dd'
@@ -1291,6 +1716,8 @@ const enUSLocaleData = {
1291
1716
  customPeriodFrom: 'from',
1292
1717
  customPeriodTo: 'to',
1293
1718
  customPeriodErrorHint: 'The period cannot start later than it ends',
1719
+ customPeriodMinIntervalErrorHint: 'The period cannot be shorter than {{ value }}',
1720
+ customPeriodMaxIntervalErrorHint: 'The period cannot be longer than {{ value }}',
1294
1721
  backToPeriodSelection: 'Back'
1295
1722
  }
1296
1723
  },
@@ -1423,7 +1850,24 @@ const enUSLocaleData = {
1423
1850
  };
1424
1851
 
1425
1852
  const esLALocaleData = {
1426
- select: { hiddenItemsText: '+{{ number }}' },
1853
+ a11y: {
1854
+ close: 'Cerrar',
1855
+ save: 'Guardar',
1856
+ cancel: 'Cancelar',
1857
+ removeAll: 'Eliminar todo',
1858
+ expandBreadcrumbs: 'Mostrar elementos ocultos',
1859
+ previousMonth: 'Mes anterior',
1860
+ currentDate: 'Fecha actual',
1861
+ nextMonth: 'Mes siguiente',
1862
+ clear: 'Borrar',
1863
+ showPassword: 'Mostrar la contraseña',
1864
+ hidePassword: 'Ocultar la contraseña',
1865
+ resizeColumns: 'Redimensionar columnas'
1866
+ },
1867
+ select: {
1868
+ hiddenItemsText: '+{{ number }}',
1869
+ selectAll: 'Seleccionar todo'
1870
+ },
1427
1871
  datepicker: {
1428
1872
  placeholder: 'dd/mm/aaaa'
1429
1873
  },
@@ -1516,6 +1960,8 @@ const esLALocaleData = {
1516
1960
  customPeriodFrom: 'desde',
1517
1961
  customPeriodTo: 'hasta',
1518
1962
  customPeriodErrorHint: 'El inicio del período no puede estar después del fin',
1963
+ customPeriodMinIntervalErrorHint: 'El período no puede ser más corto que {{ value }}',
1964
+ customPeriodMaxIntervalErrorHint: 'El período no puede ser más largo que {{ value }}',
1519
1965
  backToPeriodSelection: 'Atrás'
1520
1966
  }
1521
1967
  },
@@ -1647,73 +2093,284 @@ const esLALocaleData = {
1647
2093
  }
1648
2094
  };
1649
2095
 
1650
- const ptBRLocaleData = {
1651
- select: { hiddenItemsText: '+{{ number }}' },
1652
- datepicker: {
1653
- placeholder: 'dd/mm/yyyy'
1654
- },
1655
- timepicker: {
1656
- placeholder: {
1657
- full: 'hh:mm:ss',
1658
- short: 'hh:mm'
2096
+ const enUSFormattersData = {
2097
+ formatters: {
2098
+ number: {
2099
+ rounding: {
2100
+ separator: '',
2101
+ groupSeparator: '.',
2102
+ thousand: 'K',
2103
+ million: 'M',
2104
+ billion: 'B',
2105
+ trillion: 'T'
2106
+ }
1659
2107
  }
1660
2108
  },
1661
- fileUpload: {
1662
- single: {
1663
- captionText: 'Arrastar o arquivo aqui ou {{ browseLink }}',
1664
- captionTextOnlyFolder: 'Arrastar o arquivo aqui ou {{ browseLinkFolder }}',
1665
- captionTextWithFolder: 'Arrastar o arquivo aqui ou {{ browseLink }} ou {{ browseLinkFolderMixed }}',
1666
- browseLink: 'escolher',
1667
- browseLinkFolder: 'pasta',
1668
- browseLinkFolderMixed: 'pasta'
1669
- },
1670
- multiple: {
1671
- captionText: 'Arrastar aqui ou {{ browseLink }}',
1672
- captionTextOnlyFolder: 'Arrastar aqui ou {{ browseLinkFolder }}',
1673
- captionTextWithFolder: 'Arrastar aqui ou {{ browseLink }} ou {{ browseLinkFolderMixed }}',
1674
- captionTextWhenSelected: 'Arrastar mais arquivos aqui ou {{ browseLink }}',
1675
- captionTextForCompactSize: 'Arrastar arquivos ou {{ browseLink }}',
1676
- browseLink: 'escolher',
1677
- browseLinkFolder: 'pasta',
1678
- browseLinkFolderMixed: 'pasta',
1679
- title: 'Carregar arquivos'
2109
+ input: {
2110
+ number: {
2111
+ groupSeparator: [','],
2112
+ fractionSeparator: '.'
1680
2113
  }
1681
2114
  },
1682
- codeBlock: {
1683
- softWrapOnTooltip: 'Ativar quebra de linha',
1684
- softWrapOffTooltip: 'Desativar quebra de linha',
1685
- downloadTooltip: 'Baixar',
1686
- copiedTooltip: '✓ Copiado',
1687
- copyTooltip: 'Copiar',
1688
- viewAllText: 'Mostrar todos',
1689
- viewLessText: 'Mostrar menos',
1690
- openExternalSystemTooltip: 'Abrir em sistema externo'
1691
- },
1692
- timezone: {
1693
- searchPlaceholder: 'Cidade ou fuso horário'
2115
+ sizeUnits: {
2116
+ defaultUnitSystem: 'SI',
2117
+ defaultPrecision: 2,
2118
+ unitSystems: {
2119
+ SI: {
2120
+ abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2121
+ base: 10,
2122
+ power: 3
2123
+ },
2124
+ IEC: {
2125
+ abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2126
+ base: 2,
2127
+ power: 10
2128
+ }
2129
+ }
2130
+ }
2131
+ };
2132
+ const esLAFormattersData = {
2133
+ formatters: {
2134
+ number: {
2135
+ rounding: {
2136
+ separator: '',
2137
+ groupSeparator: ',',
2138
+ thousand: 'K',
2139
+ million: 'M',
2140
+ billion: 'MRD',
2141
+ trillion: 'B'
2142
+ },
2143
+ decimal: {
2144
+ viewGroupSeparator: '\u2009'
2145
+ }
2146
+ }
1694
2147
  },
1695
- actionsPanel: {
1696
- closeTooltip: 'Desmarcar'
2148
+ input: {
2149
+ number: {
2150
+ // nbsp is generated automatically and used by default in spec
2151
+ groupSeparator: [' ', ' ', '\u2009'],
2152
+ fractionSeparator: ',',
2153
+ viewGroupSeparator: '\u2009'
2154
+ }
1697
2155
  },
1698
- filterBar: {
1699
- reset: {
1700
- buttonName: 'Reconfigurar'
1701
- },
1702
- search: {
1703
- tooltip: 'Buscar',
1704
- placeholder: 'Buscar'
1705
- },
1706
- filters: {
1707
- defaultName: 'Filtros',
1708
- saveNewFilterTooltip: 'Salve o filtro novo',
1709
- searchPlaceholder: 'Buscar',
1710
- searchEmptyResult: 'Nada encontrado',
1711
- saveAsNewFilter: 'Salve o filtro novo',
1712
- saveChanges: 'Salve as mudanças',
1713
- saveAsNew: 'Salve como novo',
1714
- change: 'Editar',
1715
- resetChanges: 'Reconfigurar',
1716
- remove: 'Deletar',
2156
+ sizeUnits: {
2157
+ defaultUnitSystem: 'SI',
2158
+ defaultPrecision: 2,
2159
+ unitSystems: {
2160
+ SI: {
2161
+ abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2162
+ base: 10,
2163
+ power: 3
2164
+ },
2165
+ IEC: {
2166
+ abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2167
+ base: 2,
2168
+ power: 10
2169
+ }
2170
+ }
2171
+ }
2172
+ };
2173
+ const ptBRFormattersData = {
2174
+ formatters: {
2175
+ number: {
2176
+ rounding: {
2177
+ separator: ' ',
2178
+ groupSeparator: ',',
2179
+ thousand: 'mil',
2180
+ million: 'mi',
2181
+ billion: 'bi',
2182
+ trillion: 'tri'
2183
+ }
2184
+ }
2185
+ },
2186
+ input: {
2187
+ number: {
2188
+ groupSeparator: ['.'],
2189
+ fractionSeparator: ','
2190
+ }
2191
+ },
2192
+ sizeUnits: {
2193
+ defaultUnitSystem: 'SI',
2194
+ defaultPrecision: 2,
2195
+ unitSystems: {
2196
+ SI: {
2197
+ abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2198
+ base: 10,
2199
+ power: 3
2200
+ },
2201
+ IEC: {
2202
+ abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2203
+ base: 2,
2204
+ power: 10
2205
+ }
2206
+ }
2207
+ }
2208
+ };
2209
+ const ruRUFormattersData = {
2210
+ formatters: {
2211
+ number: {
2212
+ rounding: {
2213
+ separator: ' ',
2214
+ groupSeparator: ',',
2215
+ thousand: 'К',
2216
+ million: 'М',
2217
+ // Latin `B` (U+0042) according to UX Guidelines.
2218
+ billion: 'B',
2219
+ trillion: 'Т'
2220
+ },
2221
+ decimal: {
2222
+ viewGroupSeparator: '\u2009'
2223
+ }
2224
+ }
2225
+ },
2226
+ input: {
2227
+ number: {
2228
+ // nbsp is generated automatically and used by default in spec
2229
+ groupSeparator: [' ', ' ', '\u2009'],
2230
+ fractionSeparator: ',',
2231
+ startFormattingFrom: 4,
2232
+ viewGroupSeparator: '\u2009'
2233
+ }
2234
+ },
2235
+ sizeUnits: {
2236
+ defaultUnitSystem: 'SI',
2237
+ defaultPrecision: 2,
2238
+ unitSystems: {
2239
+ SI: {
2240
+ abbreviations: ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ'],
2241
+ base: 10,
2242
+ power: 3
2243
+ },
2244
+ IEC: {
2245
+ abbreviations: ['Б', 'КиБ', 'МиБ', 'ГиБ', 'ТиБ'],
2246
+ base: 2,
2247
+ power: 10
2248
+ }
2249
+ }
2250
+ }
2251
+ };
2252
+ const tkTMFormattersData = {
2253
+ formatters: {
2254
+ number: {
2255
+ rounding: {
2256
+ separator: ' ',
2257
+ groupSeparator: '',
2258
+ thousand: 'M',
2259
+ million: 'Mn',
2260
+ billion: 'Mr',
2261
+ trillion: 'Tn'
2262
+ }
2263
+ }
2264
+ },
2265
+ input: {
2266
+ number: {
2267
+ groupSeparator: [' ', ' ', '\u2009'],
2268
+ fractionSeparator: ',',
2269
+ viewGroupSeparator: '\u2009'
2270
+ }
2271
+ },
2272
+ sizeUnits: {
2273
+ defaultUnitSystem: 'SI',
2274
+ defaultPrecision: 2,
2275
+ unitSystems: {
2276
+ SI: {
2277
+ abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2278
+ base: 10,
2279
+ power: 3
2280
+ },
2281
+ IEC: {
2282
+ abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2283
+ base: 2,
2284
+ power: 10
2285
+ }
2286
+ }
2287
+ }
2288
+ };
2289
+
2290
+ const ptBRLocaleData = {
2291
+ a11y: {
2292
+ close: 'Fechar',
2293
+ save: 'Salvar',
2294
+ cancel: 'Cancelar',
2295
+ removeAll: 'Remover tudo',
2296
+ expandBreadcrumbs: 'Mostrar itens ocultos',
2297
+ previousMonth: 'Mês anterior',
2298
+ currentDate: 'Data atual',
2299
+ nextMonth: 'Próximo mês',
2300
+ clear: 'Apagar',
2301
+ showPassword: 'Mostrar a senha',
2302
+ hidePassword: 'Ocultar a senha',
2303
+ resizeColumns: 'Redimensionar colunas'
2304
+ },
2305
+ select: {
2306
+ hiddenItemsText: '+{{ number }}',
2307
+ selectAll: 'Selecionar tudo'
2308
+ },
2309
+ datepicker: {
2310
+ placeholder: 'dd/mm/yyyy'
2311
+ },
2312
+ timepicker: {
2313
+ placeholder: {
2314
+ full: 'hh:mm:ss',
2315
+ short: 'hh:mm'
2316
+ }
2317
+ },
2318
+ fileUpload: {
2319
+ single: {
2320
+ captionText: 'Arrastar o arquivo aqui ou {{ browseLink }}',
2321
+ captionTextOnlyFolder: 'Arrastar o arquivo aqui ou {{ browseLinkFolder }}',
2322
+ captionTextWithFolder: 'Arrastar o arquivo aqui ou {{ browseLink }} ou {{ browseLinkFolderMixed }}',
2323
+ browseLink: 'escolher',
2324
+ browseLinkFolder: 'pasta',
2325
+ browseLinkFolderMixed: 'pasta'
2326
+ },
2327
+ multiple: {
2328
+ captionText: 'Arrastar aqui ou {{ browseLink }}',
2329
+ captionTextOnlyFolder: 'Arrastar aqui ou {{ browseLinkFolder }}',
2330
+ captionTextWithFolder: 'Arrastar aqui ou {{ browseLink }} ou {{ browseLinkFolderMixed }}',
2331
+ captionTextWhenSelected: 'Arrastar mais arquivos aqui ou {{ browseLink }}',
2332
+ captionTextForCompactSize: 'Arrastar arquivos ou {{ browseLink }}',
2333
+ browseLink: 'escolher',
2334
+ browseLinkFolder: 'pasta',
2335
+ browseLinkFolderMixed: 'pasta',
2336
+ title: 'Carregar arquivos'
2337
+ }
2338
+ },
2339
+ codeBlock: {
2340
+ softWrapOnTooltip: 'Ativar quebra de linha',
2341
+ softWrapOffTooltip: 'Desativar quebra de linha',
2342
+ downloadTooltip: 'Baixar',
2343
+ copiedTooltip: '✓ Copiado',
2344
+ copyTooltip: 'Copiar',
2345
+ viewAllText: 'Mostrar todos',
2346
+ viewLessText: 'Mostrar menos',
2347
+ openExternalSystemTooltip: 'Abrir em sistema externo'
2348
+ },
2349
+ timezone: {
2350
+ searchPlaceholder: 'Cidade ou fuso horário'
2351
+ },
2352
+ actionsPanel: {
2353
+ closeTooltip: 'Desmarcar'
2354
+ },
2355
+ filterBar: {
2356
+ reset: {
2357
+ buttonName: 'Reconfigurar'
2358
+ },
2359
+ search: {
2360
+ tooltip: 'Buscar',
2361
+ placeholder: 'Buscar'
2362
+ },
2363
+ filters: {
2364
+ defaultName: 'Filtros',
2365
+ saveNewFilterTooltip: 'Salve o filtro novo',
2366
+ searchPlaceholder: 'Buscar',
2367
+ searchEmptyResult: 'Nada encontrado',
2368
+ saveAsNewFilter: 'Salve o filtro novo',
2369
+ saveChanges: 'Salve as mudanças',
2370
+ saveAsNew: 'Salve como novo',
2371
+ change: 'Editar',
2372
+ resetChanges: 'Reconfigurar',
2373
+ remove: 'Deletar',
1717
2374
  name: 'Nome',
1718
2375
  error: 'A busca com esse nome já existe',
1719
2376
  errorHint: 'O filtro não pôde ser salvo. Tente de novo ou entre em contato com o administrador.',
@@ -1741,6 +2398,8 @@ const ptBRLocaleData = {
1741
2398
  customPeriodFrom: 'de',
1742
2399
  customPeriodTo: 'até',
1743
2400
  customPeriodErrorHint: 'O período não pode começar depois de quando acaba',
2401
+ customPeriodMinIntervalErrorHint: 'O período não pode ser menor que {{ value }}',
2402
+ customPeriodMaxIntervalErrorHint: 'O período não pode ser maior que {{ value }}',
1744
2403
  backToPeriodSelection: 'Voltar'
1745
2404
  }
1746
2405
  },
@@ -1873,7 +2532,21 @@ const ptBRLocaleData = {
1873
2532
  };
1874
2533
 
1875
2534
  const ruRULocaleData = {
1876
- select: { hiddenItemsText: '+{{ number }}' },
2535
+ a11y: {
2536
+ close: 'Закрыть',
2537
+ save: 'Сохранить',
2538
+ cancel: 'Отменить',
2539
+ removeAll: 'Удалить все',
2540
+ expandBreadcrumbs: 'Показать скрытые элементы',
2541
+ previousMonth: 'Предыдущий месяц',
2542
+ currentDate: 'Текущая дата',
2543
+ nextMonth: 'Следующий месяц',
2544
+ clear: 'Очистить',
2545
+ showPassword: 'Показать пароль',
2546
+ hidePassword: 'Скрыть пароль',
2547
+ resizeColumns: 'Изменить ширину колонок'
2548
+ },
2549
+ select: { hiddenItemsText: '+{{ number }}', selectAll: 'Выбрать все' },
1877
2550
  datepicker: {
1878
2551
  placeholder: 'дд.мм.гггг',
1879
2552
  dateInput: 'dd.MM.yyyy'
@@ -1967,6 +2640,8 @@ const ruRULocaleData = {
1967
2640
  customPeriodFrom: 'с',
1968
2641
  customPeriodTo: 'по',
1969
2642
  customPeriodErrorHint: 'Начало периода не может быть позже окончания',
2643
+ customPeriodMinIntervalErrorHint: 'Период не может быть короче {{ value }}',
2644
+ customPeriodMaxIntervalErrorHint: 'Период не может быть длиннее {{ value }}',
1970
2645
  backToPeriodSelection: 'Назад'
1971
2646
  }
1972
2647
  },
@@ -2113,7 +2788,24 @@ const ruRULocaleData = {
2113
2788
  };
2114
2789
 
2115
2790
  const tkTMLocaleData = {
2116
- select: { hiddenItemsText: '+{{ number }}' },
2791
+ a11y: {
2792
+ close: 'Ýap',
2793
+ save: 'Ýazdyr',
2794
+ cancel: 'Ýatyr',
2795
+ removeAll: 'Ählisini aýyr',
2796
+ expandBreadcrumbs: 'Gizlenen elementleri görkez',
2797
+ previousMonth: 'Öňki aý',
2798
+ currentDate: 'Şu günki sene',
2799
+ nextMonth: 'Indiki aý',
2800
+ clear: 'Arassala',
2801
+ showPassword: 'Paroly görkez',
2802
+ hidePassword: 'Paroly gizle',
2803
+ resizeColumns: 'Sütünleriň giňligini üýtget'
2804
+ },
2805
+ select: {
2806
+ hiddenItemsText: '+{{ number }}',
2807
+ selectAll: 'Ählisini saýla'
2808
+ },
2117
2809
  datepicker: {
2118
2810
  placeholder: 'gg.aa.ýý.',
2119
2811
  dateInput: 'gg.aa.ýý.'
@@ -2207,6 +2899,8 @@ const tkTMLocaleData = {
2207
2899
  customPeriodFrom: 'başy',
2208
2900
  customPeriodTo: 'soňy',
2209
2901
  customPeriodErrorHint: 'Döwür gutarýan wagtyndan soň başlap bilmeýär',
2902
+ customPeriodMinIntervalErrorHint: 'Döwür azyndan {{ value }} bolmaly',
2903
+ customPeriodMaxIntervalErrorHint: 'Döwür köpi bilen {{ value }} bolmaly',
2210
2904
  backToPeriodSelection: 'Yzyna'
2211
2905
  }
2212
2906
  },
@@ -2281,253 +2975,60 @@ const tkTMLocaleData = {
2281
2975
  }`,
2282
2976
  MINUTES: `{minutes, plural,
2283
2977
  one {minut}
2284
- other {# minut}
2285
- }`,
2286
- SECONDS: `{seconds, plural,
2287
- one {sekunt}
2288
- other {# sekunt}
2289
- }`,
2290
- YEARS_FRACTION: `{years} ýyl`,
2291
- MONTHS_FRACTION: `{months} aý`
2292
- },
2293
- option: {
2294
- SEPARATOR: ' ',
2295
- LAST_PART_SEPARATOR: '',
2296
- YEARS: `{years, plural,
2297
- one {# ýyl}
2298
- other {# ýyl}
2299
- }`,
2300
- MONTHS: `{months, plural,
2301
- one {Aý}
2302
- other {# aý}
2303
- }`,
2304
- WEEKS: `{weeks, plural,
2305
- one {Hepde}
2306
- other {# hepde}
2307
- }`,
2308
- DAYS: `{days, plural,
2309
- one {Gün}
2310
- other {# gün}
2311
- }`,
2312
- HOURS: `{hours, plural,
2313
- one {Sagat}
2314
- other {# sagat}
2315
- }`,
2316
- MINUTES: `{minutes, plural,
2317
- one {Minut}
2318
- other {# minut}
2319
- }`,
2320
- SECONDS: `{seconds, plural,
2321
- one {Sekunt}
2322
- other {# sekunt}
2323
- }`,
2324
- YEARS_FRACTION: `{years} ýyl`,
2325
- MONTHS_FRACTION: `{months} aý`
2326
- }
2327
- }
2328
- },
2329
- notificationCenter: {
2330
- notifications: 'Duýduryşlar',
2331
- remove: 'Aýyr',
2332
- doNotDisturb: 'Alada etme',
2333
- showPopUpNotifications: 'Açylýan bildirişleri görkeziň',
2334
- noNotifications: 'Duýduryş ýok',
2335
- failedToLoadNotifications: 'Duýduryşlary ýükläp bilmedi',
2336
- repeat: 'Gaýtalama',
2337
- loadingMore: 'Duýduryşlar ýüklenýär'
2338
- }
2339
- };
2340
-
2341
- const enUSFormattersData = {
2342
- formatters: {
2343
- number: {
2344
- rounding: {
2345
- separator: '',
2346
- groupSeparator: '.',
2347
- thousand: 'K',
2348
- million: 'M',
2349
- billion: 'B',
2350
- trillion: 'T'
2351
- }
2352
- }
2353
- },
2354
- input: {
2355
- number: {
2356
- groupSeparator: [','],
2357
- fractionSeparator: '.'
2358
- }
2359
- },
2360
- sizeUnits: {
2361
- defaultUnitSystem: 'SI',
2362
- defaultPrecision: 2,
2363
- unitSystems: {
2364
- SI: {
2365
- abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2366
- base: 10,
2367
- power: 3
2368
- },
2369
- IEC: {
2370
- abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2371
- base: 2,
2372
- power: 10
2373
- }
2374
- }
2375
- }
2376
- };
2377
- const esLAFormattersData = {
2378
- formatters: {
2379
- number: {
2380
- rounding: {
2381
- separator: '',
2382
- groupSeparator: ',',
2383
- thousand: 'K',
2384
- million: 'M',
2385
- billion: 'MRD',
2386
- trillion: 'B'
2387
- },
2388
- decimal: {
2389
- viewGroupSeparator: '\u2009'
2390
- }
2391
- }
2392
- },
2393
- input: {
2394
- number: {
2395
- // nbsp is generated automatically and used by default in spec
2396
- groupSeparator: [' ', ' ', '\u2009'],
2397
- fractionSeparator: ',',
2398
- viewGroupSeparator: '\u2009'
2399
- }
2400
- },
2401
- sizeUnits: {
2402
- defaultUnitSystem: 'SI',
2403
- defaultPrecision: 2,
2404
- unitSystems: {
2405
- SI: {
2406
- abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2407
- base: 10,
2408
- power: 3
2409
- },
2410
- IEC: {
2411
- abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2412
- base: 2,
2413
- power: 10
2414
- }
2415
- }
2416
- }
2417
- };
2418
- const ptBRFormattersData = {
2419
- formatters: {
2420
- number: {
2421
- rounding: {
2422
- separator: ' ',
2423
- groupSeparator: ',',
2424
- thousand: 'mil',
2425
- million: 'mi',
2426
- billion: 'bi',
2427
- trillion: 'tri'
2428
- }
2429
- }
2430
- },
2431
- input: {
2432
- number: {
2433
- groupSeparator: ['.'],
2434
- fractionSeparator: ','
2435
- }
2436
- },
2437
- sizeUnits: {
2438
- defaultUnitSystem: 'SI',
2439
- defaultPrecision: 2,
2440
- unitSystems: {
2441
- SI: {
2442
- abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2443
- base: 10,
2444
- power: 3
2445
- },
2446
- IEC: {
2447
- abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2448
- base: 2,
2449
- power: 10
2450
- }
2451
- }
2452
- }
2453
- };
2454
- const ruRUFormattersData = {
2455
- formatters: {
2456
- number: {
2457
- rounding: {
2458
- separator: ' ',
2459
- groupSeparator: ',',
2460
- thousand: 'К',
2461
- million: 'М',
2462
- billion: 'М',
2463
- trillion: 'Т'
2464
- },
2465
- decimal: {
2466
- viewGroupSeparator: '\u2009'
2467
- }
2468
- }
2469
- },
2470
- input: {
2471
- number: {
2472
- // nbsp is generated automatically and used by default in spec
2473
- groupSeparator: [' ', ' ', '\u2009'],
2474
- fractionSeparator: ',',
2475
- startFormattingFrom: 4,
2476
- viewGroupSeparator: '\u2009'
2477
- }
2478
- },
2479
- sizeUnits: {
2480
- defaultUnitSystem: 'SI',
2481
- defaultPrecision: 2,
2482
- unitSystems: {
2483
- SI: {
2484
- abbreviations: ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ'],
2485
- base: 10,
2486
- power: 3
2978
+ other {# minut}
2979
+ }`,
2980
+ SECONDS: `{seconds, plural,
2981
+ one {sekunt}
2982
+ other {# sekunt}
2983
+ }`,
2984
+ YEARS_FRACTION: `{years} ýyl`,
2985
+ MONTHS_FRACTION: `{months} aý`
2487
2986
  },
2488
- IEC: {
2489
- abbreviations: ['Б', 'КиБ', 'МиБ', 'ГиБ', 'ТиБ'],
2490
- base: 2,
2491
- power: 10
2492
- }
2493
- }
2494
- }
2495
- };
2496
- const tkTMFormattersData = {
2497
- formatters: {
2498
- number: {
2499
- rounding: {
2500
- separator: ' ',
2501
- groupSeparator: '',
2502
- thousand: 'M',
2503
- million: 'Mn',
2504
- billion: 'Mr',
2505
- trillion: 'Tn'
2987
+ option: {
2988
+ SEPARATOR: ' ',
2989
+ LAST_PART_SEPARATOR: '',
2990
+ YEARS: `{years, plural,
2991
+ one {# ýyl}
2992
+ other {# ýyl}
2993
+ }`,
2994
+ MONTHS: `{months, plural,
2995
+ one {Aý}
2996
+ other {# aý}
2997
+ }`,
2998
+ WEEKS: `{weeks, plural,
2999
+ one {Hepde}
3000
+ other {# hepde}
3001
+ }`,
3002
+ DAYS: `{days, plural,
3003
+ one {Gün}
3004
+ other {# gün}
3005
+ }`,
3006
+ HOURS: `{hours, plural,
3007
+ one {Sagat}
3008
+ other {# sagat}
3009
+ }`,
3010
+ MINUTES: `{minutes, plural,
3011
+ one {Minut}
3012
+ other {# minut}
3013
+ }`,
3014
+ SECONDS: `{seconds, plural,
3015
+ one {Sekunt}
3016
+ other {# sekunt}
3017
+ }`,
3018
+ YEARS_FRACTION: `{years} ýyl`,
3019
+ MONTHS_FRACTION: `{months} aý`
2506
3020
  }
2507
3021
  }
2508
3022
  },
2509
- input: {
2510
- number: {
2511
- groupSeparator: [' ', ' ', '\u2009'],
2512
- fractionSeparator: ',',
2513
- viewGroupSeparator: '\u2009'
2514
- }
2515
- },
2516
- sizeUnits: {
2517
- defaultUnitSystem: 'SI',
2518
- defaultPrecision: 2,
2519
- unitSystems: {
2520
- SI: {
2521
- abbreviations: ['B', 'KB', 'MB', 'GB', 'TB'],
2522
- base: 10,
2523
- power: 3
2524
- },
2525
- IEC: {
2526
- abbreviations: ['B', 'KiB', 'MiB', 'GiB', 'TiB'],
2527
- base: 2,
2528
- power: 10
2529
- }
2530
- }
3023
+ notificationCenter: {
3024
+ notifications: 'Duýduryşlar',
3025
+ remove: 'Aýyr',
3026
+ doNotDisturb: 'Alada etme',
3027
+ showPopUpNotifications: 'Açylýan bildirişleri görkeziň',
3028
+ noNotifications: 'Duýduryş ýok',
3029
+ failedToLoadNotifications: 'Duýduryşlary ýükläp bilmedi',
3030
+ repeat: 'Gaýtalama',
3031
+ loadingMore: 'Duýduryşlar ýüklenýär'
2531
3032
  }
2532
3033
  };
2533
3034
 
@@ -2601,10 +3102,10 @@ class KbqLocaleService {
2601
3102
  getParams(componentName) {
2602
3103
  return this.current[componentName];
2603
3104
  }
2604
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2605
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleService, providedIn: 'root' }); }
3105
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3106
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleService, providedIn: 'root' }); }
2606
3107
  }
2607
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleService, decorators: [{
3108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleService, decorators: [{
2608
3109
  type: Injectable,
2609
3110
  args: [{ providedIn: 'root' }]
2610
3111
  }], ctorParameters: () => [] });
@@ -2686,14 +3187,38 @@ function checkAndNormalizeLocalizedNumber(num, locale) {
2686
3187
  return numberOutput;
2687
3188
  }
2688
3189
 
3190
+ /** Localization configuration for the accessible names of the icon-only buttons the library renders itself. */
3191
+ const KBQ_A11Y_LOCALE_CONFIGURATION = new InjectionToken('KBQ_A11Y_LOCALE_CONFIGURATION', { factory: () => ruRULocaleData.a11y });
3192
+ /** Utility provider for `KBQ_A11Y_LOCALE_CONFIGURATION`. */
3193
+ const kbqA11yLocaleConfigurationProvider = (configuration) => ({
3194
+ provide: KBQ_A11Y_LOCALE_CONFIGURATION,
3195
+ useValue: configuration
3196
+ });
3197
+ /**
3198
+ * Reactive accessible names for the icon-only buttons the library renders itself.
3199
+ *
3200
+ * Follows `KbqLocaleService` when one is provided, and otherwise stays on whatever
3201
+ * `KBQ_A11Y_LOCALE_CONFIGURATION` resolves to.
3202
+ *
3203
+ * @docs-private
3204
+ */
3205
+ function kbqInjectA11yLocaleConfiguration() {
3206
+ const localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
3207
+ const initialValue = inject(KBQ_A11Y_LOCALE_CONFIGURATION);
3208
+ const configuration = localeService
3209
+ ? localeService.changes.pipe(map$1(() => localeService.getParams('a11y')))
3210
+ : of(initialValue);
3211
+ return toSignal(configuration, { initialValue });
3212
+ }
3213
+
2689
3214
  class KbqLocaleServiceModule {
2690
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleServiceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2691
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleServiceModule }); }
2692
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleServiceModule, providers: [
3215
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleServiceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3216
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleServiceModule }); }
3217
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleServiceModule, providers: [
2693
3218
  { provide: KBQ_LOCALE_SERVICE, useClass: KbqLocaleService }
2694
3219
  ] }); }
2695
3220
  }
2696
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLocaleServiceModule, decorators: [{
3221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLocaleServiceModule, decorators: [{
2697
3222
  type: NgModule,
2698
3223
  args: [{
2699
3224
  providers: [
@@ -2711,13 +3236,74 @@ class DateFormatter extends DateFormatter$1 {
2711
3236
  this.adapter = adapter;
2712
3237
  this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe((locale) => this.setLocale(locale));
2713
3238
  }
2714
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: DateFormatter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2715
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: DateFormatter }); }
3239
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DateFormatter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3240
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DateFormatter }); }
2716
3241
  }
2717
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: DateFormatter, decorators: [{
3242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DateFormatter, decorators: [{
2718
3243
  type: Injectable
2719
3244
  }], ctorParameters: () => [] });
2720
3245
 
3246
+ /**
3247
+ * Identity comparison with a one-level element-wise fallback for arrays, so an input rebuilt on every
3248
+ * change detection cycle — a `[from, to]` tuple returned from a getter or a `computed()`, a `units`
3249
+ * array built in a method — still hits the cache of the impure pipes below. Array literals written
3250
+ * directly in a template are already memoized by Angular (`ɵɵpureFunction`); this covers the rest.
3251
+ *
3252
+ * Compares array elements by reference, like the `a === b` fallback it wraps — it has no notion of two
3253
+ * dates being "equal". Mutating a date already passed to a pipe in place (`Date#setHours`, a Moment
3254
+ * instance updated without cloning, …) keeps the same reference, so a `[from, to]` tuple rebuilt around
3255
+ * that mutated instance still reads as unchanged and the cached, now-stale string is returned. Replace
3256
+ * pipe inputs instead of mutating them — the same requirement Angular's OnPush change detection already
3257
+ * places on any object bound to an OnPush view.
3258
+ */
3259
+ const shallowEqual = (a, b) => {
3260
+ if (a === b)
3261
+ return true;
3262
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
3263
+ return false;
3264
+ return a.every((item, index) => item === b[index]);
3265
+ };
3266
+ /**
3267
+ * Deserializes a pipe input into a date, treating a missing value and an unparseable one alike as
3268
+ * "no date" — `DateAdapter.deserialize()` returns `null` for the former but a truthy *invalid* date
3269
+ * for the latter, so a plain truthiness check is not enough.
3270
+ */
3271
+ const toValidDate = (adapter, value) => {
3272
+ const date = adapter.deserialize(value);
3273
+ return date != null && adapter.isValid(date) ? date : null;
3274
+ };
3275
+ /**
3276
+ * A `[from, to]` tuple with both bounds required; `null` when either is missing or invalid.
3277
+ *
3278
+ * Takes the tuple itself as possibly missing, not just its bounds: a pipe input that has not been
3279
+ * populated yet is `null`/`undefined` rather than `[null, null]`, and destructuring that throws.
3280
+ */
3281
+ const toClosedRange = (adapter, value) => {
3282
+ const [from, to] = value ?? [];
3283
+ const startDate = toValidDate(adapter, from);
3284
+ const endDate = toValidDate(adapter, to);
3285
+ return startDate && endDate ? [startDate, endDate] : null;
3286
+ };
3287
+ /**
3288
+ * A `[from, to]` tuple where one bound may be open; `null` only when neither bound is a valid date.
3289
+ *
3290
+ * The range formatters switch to the opened-range template on their own when a bound is missing, but
3291
+ * throw when both are — and a throwing pipe aborts the rendering of the whole view.
3292
+ */
3293
+ const toOpenedRange = (adapter, value) => {
3294
+ const [from, to] = value ?? [];
3295
+ const startDate = toValidDate(adapter, from);
3296
+ const endDate = toValidDate(adapter, to);
3297
+ return startDate || endDate ? [startDate, endDate] : null;
3298
+ };
3299
+ /**
3300
+ * A `[from, to]` tuple the duration formatters accept: both bounds required and chronologically
3301
+ * ordered. `DateFormatter.duration*` throws on anything else.
3302
+ */
3303
+ const toDurationRange = (adapter, value) => {
3304
+ const range = toClosedRange(adapter, value);
3305
+ return range && adapter.compareDateTime(range[0], range[1]) <= 0 ? range : null;
3306
+ };
2721
3307
  class BaseFormatterPipe {
2722
3308
  constructor() {
2723
3309
  this.adapter = inject((DateAdapter));
@@ -2725,14 +3311,15 @@ class BaseFormatterPipe {
2725
3311
  }
2726
3312
  }
2727
3313
  /**
2728
- * Base class for impure date-formatter pipes that recompute their result
2729
- * whenever the active locale changes via `KbqLocaleService`.
3314
+ * Base class for impure date-formatter pipes that recompute their result whenever the active locale
3315
+ * changes via `KbqLocaleService`, or the active time zone via `KbqDateTimezoneService`.
2730
3316
  *
2731
3317
  * The base class owns:
2732
- * - a subscription to `KbqLocaleService.changes` that invalidates the cache and
2733
- * marks the host for check (the same approach the built-in `AsyncPipe` uses);
2734
- * - caching by `(value, args, localeId)`, so the impure `transform()` only does
2735
- * real work when an input or the active locale actually changed.
3318
+ * - a subscription to `KbqLocaleService.changes` and an `effect` on the active time zone, each of which
3319
+ * invalidates the cache and marks the host for check (the same approach the built-in `AsyncPipe` uses);
3320
+ * - caching by `(value, args, localeId, timezone)`, so the impure `transform()` only does
3321
+ * real work when an input, the active locale or the active time zone actually changed — see
3322
+ * `shallowEqual` for how the comparison works and its limits.
2736
3323
  *
2737
3324
  * Subclasses implement `format()`, which receives the raw pipe input(s) — a
2738
3325
  * single value for absolute/relative pipes, or a `[from, to]` tuple for range
@@ -2746,21 +3333,31 @@ class BaseLocaleAwareFormatterPipe extends BaseFormatterPipe {
2746
3333
  super();
2747
3334
  this.changeDetectorRef = inject(ChangeDetectorRef);
2748
3335
  this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
3336
+ this.timezoneService = inject(KbqDateTimezoneService);
2749
3337
  this.cachedValue = null;
2750
3338
  this.cachedArgs = [];
2751
3339
  this.cachedLocaleId = null;
3340
+ this.cachedTimezone = null;
2752
3341
  this.cachedResult = '';
2753
3342
  this.hasCache = false;
2754
3343
  this.localeService?.changes.pipe(takeUntilDestroyed()).subscribe(() => {
2755
3344
  this.hasCache = false;
2756
3345
  this.changeDetectorRef.markForCheck();
2757
3346
  });
3347
+ // Only wakes an OnPush host up; the cache is invalidated by comparing the zone in `transform()`,
3348
+ // so the run this effect makes on creation costs nothing.
3349
+ effect(() => {
3350
+ this.timezoneService.timezone();
3351
+ this.changeDetectorRef.markForCheck();
3352
+ });
2758
3353
  }
2759
3354
  transform(value, ...args) {
2760
3355
  const currentLocaleId = this.localeService?.id ?? null;
3356
+ const currentTimezone = this.timezoneService.timezone();
2761
3357
  if (this.hasCache &&
2762
- value === this.cachedValue &&
3358
+ shallowEqual(value, this.cachedValue) &&
2763
3359
  currentLocaleId === this.cachedLocaleId &&
3360
+ currentTimezone === this.cachedTimezone &&
2764
3361
  this.argsEqual(args)) {
2765
3362
  return this.cachedResult;
2766
3363
  }
@@ -2768,6 +3365,7 @@ class BaseLocaleAwareFormatterPipe extends BaseFormatterPipe {
2768
3365
  this.cachedValue = value;
2769
3366
  this.cachedArgs = args;
2770
3367
  this.cachedLocaleId = currentLocaleId;
3368
+ this.cachedTimezone = currentTimezone;
2771
3369
  this.hasCache = true;
2772
3370
  return this.cachedResult;
2773
3371
  }
@@ -2775,7 +3373,7 @@ class BaseLocaleAwareFormatterPipe extends BaseFormatterPipe {
2775
3373
  if (args.length !== this.cachedArgs.length)
2776
3374
  return false;
2777
3375
  for (let i = 0; i < args.length; i++) {
2778
- if (args[i] !== this.cachedArgs[i])
3376
+ if (!shallowEqual(args[i], this.cachedArgs[i]))
2779
3377
  return false;
2780
3378
  }
2781
3379
  return true;
@@ -2783,13 +3381,13 @@ class BaseLocaleAwareFormatterPipe extends BaseFormatterPipe {
2783
3381
  }
2784
3382
  class AbsoluteDateFormatterPipe extends BaseFormatterPipe {
2785
3383
  transform(value, currYear) {
2786
- const date = this.adapter.deserialize(value);
3384
+ const date = toValidDate(this.adapter, value);
2787
3385
  return date ? this.formatter.absoluteLongDate(date, currYear) : '';
2788
3386
  }
2789
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2790
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterPipe, isStandalone: true, name: "absoluteLongDate" }); }
3387
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3388
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterPipe, isStandalone: true, name: "absoluteLongDate" }); }
2791
3389
  }
2792
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterPipe, decorators: [{
3390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterPipe, decorators: [{
2793
3391
  type: Pipe,
2794
3392
  args: [{
2795
3393
  name: 'absoluteLongDate'
@@ -2800,10 +3398,10 @@ class AbsoluteDateFormatterImpurePipe extends AbsoluteDateFormatterPipe {
2800
3398
  transform(value, currYear) {
2801
3399
  return super.transform(value, currYear);
2802
3400
  }
2803
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2804
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, isStandalone: true, name: "absoluteLongDateImpurePipe", pure: false }); }
3401
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3402
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, isStandalone: true, name: "absoluteLongDateImpurePipe", pure: false }); }
2805
3403
  }
2806
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, decorators: [{
3404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateFormatterImpurePipe, decorators: [{
2807
3405
  type: Pipe,
2808
3406
  args: [{
2809
3407
  name: 'absoluteLongDateImpurePipe',
@@ -2812,13 +3410,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2812
3410
  }] });
2813
3411
  class AbsoluteDateTimeFormatterPipe extends BaseFormatterPipe {
2814
3412
  transform(value, options) {
2815
- const date = this.adapter.deserialize(value);
3413
+ const date = toValidDate(this.adapter, value);
2816
3414
  return date ? this.formatter.absoluteLongDateTime(date, options) : '';
2817
3415
  }
2818
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2819
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, isStandalone: true, name: "absoluteLongDateTime" }); }
3416
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3417
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, isStandalone: true, name: "absoluteLongDateTime" }); }
2820
3418
  }
2821
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, decorators: [{
3419
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterPipe, decorators: [{
2822
3420
  type: Pipe,
2823
3421
  args: [{
2824
3422
  name: 'absoluteLongDateTime'
@@ -2829,10 +3427,10 @@ class AbsoluteDateTimeFormatterImpurePipe extends AbsoluteDateTimeFormatterPipe
2829
3427
  transform(value, options) {
2830
3428
  return super.transform(value, options);
2831
3429
  }
2832
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2833
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, isStandalone: true, name: "absoluteLongDateTimeImpurePipe", pure: false }); }
3430
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3431
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, isStandalone: true, name: "absoluteLongDateTimeImpurePipe", pure: false }); }
2834
3432
  }
2835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, decorators: [{
3433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateTimeFormatterImpurePipe, decorators: [{
2836
3434
  type: Pipe,
2837
3435
  args: [{
2838
3436
  name: 'absoluteLongDateTimeImpurePipe',
@@ -2841,13 +3439,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2841
3439
  }] });
2842
3440
  class AbsoluteDateShortFormatterPipe extends BaseFormatterPipe {
2843
3441
  transform(value, currYear) {
2844
- const date = this.adapter.deserialize(value);
3442
+ const date = toValidDate(this.adapter, value);
2845
3443
  return date ? this.formatter.absoluteShortDate(date, currYear) : '';
2846
3444
  }
2847
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2848
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterPipe, isStandalone: true, name: "absoluteShortDate" }); }
3445
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3446
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterPipe, isStandalone: true, name: "absoluteShortDate" }); }
2849
3447
  }
2850
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterPipe, decorators: [{
3448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterPipe, decorators: [{
2851
3449
  type: Pipe,
2852
3450
  args: [{
2853
3451
  name: 'absoluteShortDate'
@@ -2858,10 +3456,10 @@ class AbsoluteDateShortFormatterImpurePipe extends AbsoluteDateShortFormatterPip
2858
3456
  transform(value, currYear) {
2859
3457
  return super.transform(value, currYear);
2860
3458
  }
2861
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2862
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, isStandalone: true, name: "absoluteShortDateImpurePipe", pure: false }); }
3459
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3460
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, isStandalone: true, name: "absoluteShortDateImpurePipe", pure: false }); }
2863
3461
  }
2864
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, decorators: [{
3462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteDateShortFormatterImpurePipe, decorators: [{
2865
3463
  type: Pipe,
2866
3464
  args: [{
2867
3465
  name: 'absoluteShortDateImpurePipe',
@@ -2870,13 +3468,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2870
3468
  }] });
2871
3469
  class AbsoluteShortDateTimeFormatterPipe extends BaseFormatterPipe {
2872
3470
  transform(value, options) {
2873
- const date = this.adapter.deserialize(value);
3471
+ const date = toValidDate(this.adapter, value);
2874
3472
  return date ? this.formatter.absoluteShortDateTime(date, options) : '';
2875
3473
  }
2876
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2877
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, isStandalone: true, name: "absoluteShortDateTime" }); }
3474
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3475
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, isStandalone: true, name: "absoluteShortDateTime" }); }
2878
3476
  }
2879
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, decorators: [{
3477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterPipe, decorators: [{
2880
3478
  type: Pipe,
2881
3479
  args: [{
2882
3480
  name: 'absoluteShortDateTime'
@@ -2887,10 +3485,10 @@ class AbsoluteShortDateTimeFormatterImpurePipe extends AbsoluteShortDateTimeForm
2887
3485
  transform(value, options) {
2888
3486
  return super.transform(value, options);
2889
3487
  }
2890
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2891
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, isStandalone: true, name: "absoluteShortDateTimeImpurePipe", pure: false }); }
3488
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3489
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, isStandalone: true, name: "absoluteShortDateTimeImpurePipe", pure: false }); }
2892
3490
  }
2893
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, decorators: [{
3491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: AbsoluteShortDateTimeFormatterImpurePipe, decorators: [{
2894
3492
  type: Pipe,
2895
3493
  args: [{
2896
3494
  name: 'absoluteShortDateTimeImpurePipe',
@@ -2899,13 +3497,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2899
3497
  }] });
2900
3498
  class RelativeDateFormatterPipe extends BaseFormatterPipe {
2901
3499
  transform(value) {
2902
- const date = this.adapter.deserialize(value);
3500
+ const date = toValidDate(this.adapter, value);
2903
3501
  return date ? this.formatter.relativeLongDate(date) : '';
2904
3502
  }
2905
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2906
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterPipe, isStandalone: true, name: "relativeLongDate" }); }
3503
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3504
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterPipe, isStandalone: true, name: "relativeLongDate" }); }
2907
3505
  }
2908
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterPipe, decorators: [{
3506
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterPipe, decorators: [{
2909
3507
  type: Pipe,
2910
3508
  args: [{
2911
3509
  name: 'relativeLongDate'
@@ -2916,10 +3514,10 @@ class RelativeDateFormatterImpurePipe extends RelativeDateFormatterPipe {
2916
3514
  transform(value) {
2917
3515
  return super.transform(value);
2918
3516
  }
2919
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2920
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterImpurePipe, isStandalone: true, name: "relativeLongDateImpurePipe", pure: false }); }
3517
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3518
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterImpurePipe, isStandalone: true, name: "relativeLongDateImpurePipe", pure: false }); }
2921
3519
  }
2922
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateFormatterImpurePipe, decorators: [{
3520
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateFormatterImpurePipe, decorators: [{
2923
3521
  type: Pipe,
2924
3522
  args: [{
2925
3523
  name: 'relativeLongDateImpurePipe',
@@ -2928,13 +3526,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2928
3526
  }] });
2929
3527
  class RelativeDateTimeFormatterPipe extends BaseFormatterPipe {
2930
3528
  transform(value, options) {
2931
- const date = this.adapter.deserialize(value);
3529
+ const date = toValidDate(this.adapter, value);
2932
3530
  return date ? this.formatter.relativeLongDateTime(date, options) : '';
2933
3531
  }
2934
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2935
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterPipe, isStandalone: true, name: "relativeLongDateTime" }); }
3532
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3533
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterPipe, isStandalone: true, name: "relativeLongDateTime" }); }
2936
3534
  }
2937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterPipe, decorators: [{
3535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterPipe, decorators: [{
2938
3536
  type: Pipe,
2939
3537
  args: [{
2940
3538
  name: 'relativeLongDateTime'
@@ -2945,10 +3543,10 @@ class RelativeDateTimeFormatterImpurePipe extends RelativeDateTimeFormatterPipe
2945
3543
  transform(value, options) {
2946
3544
  return super.transform(value, options);
2947
3545
  }
2948
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2949
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, isStandalone: true, name: "relativeLongDateTimeImpurePipe", pure: false }); }
3546
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3547
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, isStandalone: true, name: "relativeLongDateTimeImpurePipe", pure: false }); }
2950
3548
  }
2951
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, decorators: [{
3549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeDateTimeFormatterImpurePipe, decorators: [{
2952
3550
  type: Pipe,
2953
3551
  args: [{
2954
3552
  name: 'relativeLongDateTimeImpurePipe',
@@ -2957,13 +3555,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2957
3555
  }] });
2958
3556
  class RelativeShortDateFormatterPipe extends BaseFormatterPipe {
2959
3557
  transform(value) {
2960
- const date = this.adapter.deserialize(value);
3558
+ const date = toValidDate(this.adapter, value);
2961
3559
  return date ? this.formatter.relativeShortDate(date) : '';
2962
3560
  }
2963
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2964
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterPipe, isStandalone: true, name: "relativeShortDate" }); }
3561
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3562
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterPipe, isStandalone: true, name: "relativeShortDate" }); }
2965
3563
  }
2966
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterPipe, decorators: [{
3564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterPipe, decorators: [{
2967
3565
  type: Pipe,
2968
3566
  args: [{
2969
3567
  name: 'relativeShortDate'
@@ -2974,10 +3572,10 @@ class RelativeShortDateFormatterImpurePipe extends RelativeShortDateFormatterPip
2974
3572
  transform(value) {
2975
3573
  return super.transform(value);
2976
3574
  }
2977
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2978
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, isStandalone: true, name: "relativeShortDateImpurePipe", pure: false }); }
3575
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3576
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, isStandalone: true, name: "relativeShortDateImpurePipe", pure: false }); }
2979
3577
  }
2980
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, decorators: [{
3578
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateFormatterImpurePipe, decorators: [{
2981
3579
  type: Pipe,
2982
3580
  args: [{
2983
3581
  name: 'relativeShortDateImpurePipe',
@@ -2986,13 +3584,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
2986
3584
  }] });
2987
3585
  class RelativeShortDateTimeFormatterPipe extends BaseFormatterPipe {
2988
3586
  transform(value, options) {
2989
- const date = this.adapter.deserialize(value);
3587
+ const date = toValidDate(this.adapter, value);
2990
3588
  return date ? this.formatter.relativeShortDateTime(date, options) : '';
2991
3589
  }
2992
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
2993
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, isStandalone: true, name: "relativeShortDateTime" }); }
3590
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3591
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, isStandalone: true, name: "relativeShortDateTime" }); }
2994
3592
  }
2995
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, decorators: [{
3593
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterPipe, decorators: [{
2996
3594
  type: Pipe,
2997
3595
  args: [{
2998
3596
  name: 'relativeShortDateTime'
@@ -3003,10 +3601,10 @@ class RelativeShortDateTimeFormatterImpurePipe extends RelativeShortDateTimeForm
3003
3601
  transform(value, options) {
3004
3602
  return super.transform(value, options);
3005
3603
  }
3006
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3007
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, isStandalone: true, name: "relativeShortDateTimeImpurePipe", pure: false }); }
3604
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3605
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, isStandalone: true, name: "relativeShortDateTimeImpurePipe", pure: false }); }
3008
3606
  }
3009
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, decorators: [{
3607
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RelativeShortDateTimeFormatterImpurePipe, decorators: [{
3010
3608
  type: Pipe,
3011
3609
  args: [{
3012
3610
  name: 'relativeShortDateTimeImpurePipe',
@@ -3014,15 +3612,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3014
3612
  }]
3015
3613
  }] });
3016
3614
  class RangeDateFormatterPipe extends BaseFormatterPipe {
3017
- transform([value1, value2]) {
3018
- const date1 = this.adapter.deserialize(value1);
3019
- const date2 = this.adapter.deserialize(value2);
3020
- return this.formatter.rangeLongDate(date1, date2);
3615
+ transform(value) {
3616
+ const range = toOpenedRange(this.adapter, value);
3617
+ if (!range)
3618
+ return '';
3619
+ return this.formatter.rangeLongDate(range[0], range[1]);
3021
3620
  }
3022
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3023
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterPipe, isStandalone: true, name: "rangeLongDate" }); }
3621
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3622
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterPipe, isStandalone: true, name: "rangeLongDate" }); }
3024
3623
  }
3025
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterPipe, decorators: [{
3624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterPipe, decorators: [{
3026
3625
  type: Pipe,
3027
3626
  args: [{
3028
3627
  name: 'rangeLongDate'
@@ -3030,13 +3629,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3030
3629
  }] });
3031
3630
  // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3032
3631
  class RangeDateFormatterImpurePipe extends RangeDateFormatterPipe {
3033
- transform([value1, value2]) {
3034
- return super.transform([value1, value2]);
3632
+ transform(value) {
3633
+ return super.transform(value);
3035
3634
  }
3036
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3037
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterImpurePipe, isStandalone: true, name: "rangeLongDateImpurePipe", pure: false }); }
3635
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3636
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterImpurePipe, isStandalone: true, name: "rangeLongDateImpurePipe", pure: false }); }
3038
3637
  }
3039
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateFormatterImpurePipe, decorators: [{
3638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateFormatterImpurePipe, decorators: [{
3040
3639
  type: Pipe,
3041
3640
  args: [{
3042
3641
  name: 'rangeLongDateImpurePipe',
@@ -3044,15 +3643,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3044
3643
  }]
3045
3644
  }] });
3046
3645
  class RangeShortDateFormatterPipe extends BaseFormatterPipe {
3047
- transform([value1, value2]) {
3048
- const date1 = this.adapter.deserialize(value1);
3049
- const date2 = this.adapter.deserialize(value2);
3050
- return this.formatter.rangeShortDate(date1, date2);
3646
+ transform(value) {
3647
+ const range = toOpenedRange(this.adapter, value);
3648
+ if (!range)
3649
+ return '';
3650
+ return this.formatter.rangeShortDate(range[0], range[1] ?? undefined);
3051
3651
  }
3052
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3053
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterPipe, isStandalone: true, name: "rangeShortDate" }); }
3652
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3653
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterPipe, isStandalone: true, name: "rangeShortDate" }); }
3054
3654
  }
3055
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterPipe, decorators: [{
3655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterPipe, decorators: [{
3056
3656
  type: Pipe,
3057
3657
  args: [{
3058
3658
  name: 'rangeShortDate'
@@ -3060,13 +3660,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3060
3660
  }] });
3061
3661
  // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3062
3662
  class RangeShortDateFormatterImpurePipe extends RangeShortDateFormatterPipe {
3063
- transform([value1, value2]) {
3064
- return super.transform([value1, value2]);
3663
+ transform(value) {
3664
+ return super.transform(value);
3065
3665
  }
3066
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3067
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterImpurePipe, isStandalone: true, name: "rangeShortDateImpurePipe", pure: false }); }
3666
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3667
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterImpurePipe, isStandalone: true, name: "rangeShortDateImpurePipe", pure: false }); }
3068
3668
  }
3069
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateFormatterImpurePipe, decorators: [{
3669
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateFormatterImpurePipe, decorators: [{
3070
3670
  type: Pipe,
3071
3671
  args: [{
3072
3672
  name: 'rangeShortDateImpurePipe',
@@ -3074,15 +3674,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3074
3674
  }]
3075
3675
  }] });
3076
3676
  class RangeDateTimeFormatterPipe extends BaseFormatterPipe {
3077
- transform([value1, value2], options) {
3078
- const date1 = this.adapter.deserialize(value1);
3079
- const date2 = this.adapter.deserialize(value2);
3080
- return this.formatter.rangeLongDateTime(date1, date2, options);
3677
+ transform(value, options) {
3678
+ const range = toOpenedRange(this.adapter, value);
3679
+ if (!range)
3680
+ return '';
3681
+ return this.formatter.rangeLongDateTime(range[0], range[1] ?? undefined, options);
3081
3682
  }
3082
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3083
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterPipe, isStandalone: true, name: "rangeLongDateTime" }); }
3683
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3684
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterPipe, isStandalone: true, name: "rangeLongDateTime" }); }
3084
3685
  }
3085
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterPipe, decorators: [{
3686
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterPipe, decorators: [{
3086
3687
  type: Pipe,
3087
3688
  args: [{
3088
3689
  name: 'rangeLongDateTime'
@@ -3090,13 +3691,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3090
3691
  }] });
3091
3692
  // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3092
3693
  class RangeDateTimeFormatterImpurePipe extends RangeDateTimeFormatterPipe {
3093
- transform([value1, value2], options) {
3094
- return super.transform([value1, value2], options);
3694
+ transform(value, options) {
3695
+ return super.transform(value, options);
3095
3696
  }
3096
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3097
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeLongDateTimeImpurePipe", pure: false }); }
3697
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3698
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeLongDateTimeImpurePipe", pure: false }); }
3098
3699
  }
3099
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, decorators: [{
3700
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeDateTimeFormatterImpurePipe, decorators: [{
3100
3701
  type: Pipe,
3101
3702
  args: [{
3102
3703
  name: 'rangeLongDateTimeImpurePipe',
@@ -3104,15 +3705,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3104
3705
  }]
3105
3706
  }] });
3106
3707
  class RangeMiddleDateTimeFormatterPipe extends BaseFormatterPipe {
3107
- transform([value1, value2], options) {
3108
- const date1 = this.adapter.deserialize(value1);
3109
- const date2 = this.adapter.deserialize(value2);
3110
- return this.formatter.rangeMiddleDateTime(date1, date2, options);
3708
+ transform(value, options) {
3709
+ // Unlike the other range formats, the middle one has no opened-range template — both bounds required.
3710
+ const range = toClosedRange(this.adapter, value);
3711
+ if (!range)
3712
+ return '';
3713
+ return this.formatter.rangeMiddleDateTime(range[0], range[1], options);
3111
3714
  }
3112
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3113
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, isStandalone: true, name: "rangeMiddleDateTime" }); }
3715
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3716
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, isStandalone: true, name: "rangeMiddleDateTime" }); }
3114
3717
  }
3115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, decorators: [{
3718
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterPipe, decorators: [{
3116
3719
  type: Pipe,
3117
3720
  args: [{
3118
3721
  name: 'rangeMiddleDateTime'
@@ -3120,13 +3723,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3120
3723
  }] });
3121
3724
  // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3122
3725
  class RangeMiddleDateTimeFormatterImpurePipe extends RangeMiddleDateTimeFormatterPipe {
3123
- transform([value1, value2], options) {
3124
- return super.transform([value1, value2], options);
3726
+ transform(value, options) {
3727
+ return super.transform(value, options);
3125
3728
  }
3126
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3127
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeMiddleDateTimeImpurePipe", pure: false }); }
3729
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3730
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeMiddleDateTimeImpurePipe", pure: false }); }
3128
3731
  }
3129
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, decorators: [{
3732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeMiddleDateTimeFormatterImpurePipe, decorators: [{
3130
3733
  type: Pipe,
3131
3734
  args: [{
3132
3735
  name: 'rangeMiddleDateTimeImpurePipe',
@@ -3134,15 +3737,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3134
3737
  }]
3135
3738
  }] });
3136
3739
  class RangeShortDateTimeFormatterPipe extends BaseFormatterPipe {
3137
- transform([value1, value2], options) {
3138
- const date1 = this.adapter.deserialize(value1);
3139
- const date2 = this.adapter.deserialize(value2);
3140
- return this.formatter.rangeShortDateTime(date1, date2, options);
3740
+ transform(value, options) {
3741
+ const range = toOpenedRange(this.adapter, value);
3742
+ if (!range)
3743
+ return '';
3744
+ return this.formatter.rangeShortDateTime(range[0], range[1], options);
3141
3745
  }
3142
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3143
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterPipe, isStandalone: true, name: "rangeShortDateTime" }); }
3746
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3747
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterPipe, isStandalone: true, name: "rangeShortDateTime" }); }
3144
3748
  }
3145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterPipe, decorators: [{
3749
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterPipe, decorators: [{
3146
3750
  type: Pipe,
3147
3751
  args: [{
3148
3752
  name: 'rangeShortDateTime'
@@ -3150,34 +3754,127 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3150
3754
  }] });
3151
3755
  // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3152
3756
  class RangeShortDateTimeFormatterImpurePipe extends RangeShortDateTimeFormatterPipe {
3153
- transform([value1, value2], options) {
3154
- return super.transform([value1, value2], options);
3757
+ transform(value, options) {
3758
+ return super.transform(value, options);
3155
3759
  }
3156
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3157
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeShortDateTimeImpurePipe", pure: false }); }
3760
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3761
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, isStandalone: true, name: "rangeShortDateTimeImpurePipe", pure: false }); }
3158
3762
  }
3159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, decorators: [{
3763
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: RangeShortDateTimeFormatterImpurePipe, decorators: [{
3160
3764
  type: Pipe,
3161
3765
  args: [{
3162
3766
  name: 'rangeShortDateTimeImpurePipe',
3163
3767
  pure: false
3164
3768
  }]
3165
3769
  }] });
3166
- // Impure pipes that recompute on `KbqLocaleService` locale changes (see `BaseLocaleAwareFormatterPipe`).
3167
- // Prefer these `kbq`-prefixed pipes when the locale can change at runtime; the pure pipes above are
3168
- // kept for static usages and backward compatibility.
3770
+ class DurationShortestFormatterPipe extends BaseFormatterPipe {
3771
+ transform(value, options) {
3772
+ const range = toDurationRange(this.adapter, value);
3773
+ if (!range)
3774
+ return '';
3775
+ return this.formatter.durationShortest(range[0], range[1], options?.seconds, options?.milliseconds);
3776
+ }
3777
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3778
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterPipe, isStandalone: true, name: "durationShortest" }); }
3779
+ }
3780
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterPipe, decorators: [{
3781
+ type: Pipe,
3782
+ args: [{
3783
+ name: 'durationShortest'
3784
+ }]
3785
+ }] });
3786
+ // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3787
+ class DurationShortestFormatterImpurePipe extends DurationShortestFormatterPipe {
3788
+ transform(value, options) {
3789
+ return super.transform(value, options);
3790
+ }
3791
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3792
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterImpurePipe, isStandalone: true, name: "durationShortestImpurePipe", pure: false }); }
3793
+ }
3794
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortestFormatterImpurePipe, decorators: [{
3795
+ type: Pipe,
3796
+ args: [{
3797
+ name: 'durationShortestImpurePipe',
3798
+ pure: false
3799
+ }]
3800
+ }] });
3801
+ class DurationLongFormatterPipe extends BaseFormatterPipe {
3802
+ transform(value, units, fraction) {
3803
+ const range = toDurationRange(this.adapter, value);
3804
+ if (!range)
3805
+ return '';
3806
+ return this.formatter.durationLong(range[0], range[1], units, fraction);
3807
+ }
3808
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3809
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterPipe, isStandalone: true, name: "durationLong" }); }
3810
+ }
3811
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterPipe, decorators: [{
3812
+ type: Pipe,
3813
+ args: [{
3814
+ name: 'durationLong'
3815
+ }]
3816
+ }] });
3817
+ // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3818
+ class DurationLongFormatterImpurePipe extends DurationLongFormatterPipe {
3819
+ transform(value, units, fraction) {
3820
+ return super.transform(value, units, fraction);
3821
+ }
3822
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3823
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterImpurePipe, isStandalone: true, name: "durationLongImpurePipe", pure: false }); }
3824
+ }
3825
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationLongFormatterImpurePipe, decorators: [{
3826
+ type: Pipe,
3827
+ args: [{
3828
+ name: 'durationLongImpurePipe',
3829
+ pure: false
3830
+ }]
3831
+ }] });
3832
+ class DurationShortFormatterPipe extends BaseFormatterPipe {
3833
+ transform(value, units, fraction) {
3834
+ const range = toDurationRange(this.adapter, value);
3835
+ if (!range)
3836
+ return '';
3837
+ return this.formatter.durationShort(range[0], range[1], units, fraction);
3838
+ }
3839
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3840
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterPipe, isStandalone: true, name: "durationShort" }); }
3841
+ }
3842
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterPipe, decorators: [{
3843
+ type: Pipe,
3844
+ args: [{
3845
+ name: 'durationShort'
3846
+ }]
3847
+ }] });
3848
+ // eslint-disable-next-line @angular-eslint/use-pipe-transform-interface
3849
+ class DurationShortFormatterImpurePipe extends DurationShortFormatterPipe {
3850
+ transform(value, units, fraction) {
3851
+ return super.transform(value, units, fraction);
3852
+ }
3853
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterImpurePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3854
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterImpurePipe, isStandalone: true, name: "durationShortImpurePipe", pure: false }); }
3855
+ }
3856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: DurationShortFormatterImpurePipe, decorators: [{
3857
+ type: Pipe,
3858
+ args: [{
3859
+ name: 'durationShortImpurePipe',
3860
+ pure: false
3861
+ }]
3862
+ }] });
3863
+ // Impure pipes that recompute on `KbqLocaleService` locale changes and on `KbqDateTimezoneService` time
3864
+ // zone changes (see `BaseLocaleAwareFormatterPipe`). Prefer these `kbq`-prefixed pipes when either can
3865
+ // change at runtime; the pure pipes above are kept for static usages and backward compatibility.
3169
3866
  class KbqAbsoluteLongDatePipe extends BaseLocaleAwareFormatterPipe {
3170
3867
  transform(value, currYear) {
3171
3868
  return super.transform(value, currYear);
3172
3869
  }
3173
3870
  format(value, currYear) {
3174
- const date = this.adapter.deserialize(value);
3871
+ const date = toValidDate(this.adapter, value);
3175
3872
  return date ? this.formatter.absoluteLongDate(date, currYear) : '';
3176
3873
  }
3177
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3178
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDatePipe, isStandalone: true, name: "kbqAbsoluteLongDate", pure: false }); }
3874
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3875
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDatePipe, isStandalone: true, name: "kbqAbsoluteLongDate", pure: false }); }
3179
3876
  }
3180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDatePipe, decorators: [{
3877
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDatePipe, decorators: [{
3181
3878
  type: Pipe,
3182
3879
  args: [{
3183
3880
  name: 'kbqAbsoluteLongDate',
@@ -3189,13 +3886,13 @@ class KbqAbsoluteShortDatePipe extends BaseLocaleAwareFormatterPipe {
3189
3886
  return super.transform(value, currYear);
3190
3887
  }
3191
3888
  format(value, currYear) {
3192
- const date = this.adapter.deserialize(value);
3889
+ const date = toValidDate(this.adapter, value);
3193
3890
  return date ? this.formatter.absoluteShortDate(date, currYear) : '';
3194
3891
  }
3195
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3196
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDatePipe, isStandalone: true, name: "kbqAbsoluteShortDate", pure: false }); }
3892
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3893
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDatePipe, isStandalone: true, name: "kbqAbsoluteShortDate", pure: false }); }
3197
3894
  }
3198
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDatePipe, decorators: [{
3895
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDatePipe, decorators: [{
3199
3896
  type: Pipe,
3200
3897
  args: [{
3201
3898
  name: 'kbqAbsoluteShortDate',
@@ -3207,13 +3904,13 @@ class KbqAbsoluteLongDateTimePipe extends BaseLocaleAwareFormatterPipe {
3207
3904
  return super.transform(value, options);
3208
3905
  }
3209
3906
  format(value, options) {
3210
- const date = this.adapter.deserialize(value);
3907
+ const date = toValidDate(this.adapter, value);
3211
3908
  return date ? this.formatter.absoluteLongDateTime(date, options) : '';
3212
3909
  }
3213
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3214
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, isStandalone: true, name: "kbqAbsoluteLongDateTime", pure: false }); }
3910
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3911
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, isStandalone: true, name: "kbqAbsoluteLongDateTime", pure: false }); }
3215
3912
  }
3216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, decorators: [{
3913
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteLongDateTimePipe, decorators: [{
3217
3914
  type: Pipe,
3218
3915
  args: [{
3219
3916
  name: 'kbqAbsoluteLongDateTime',
@@ -3225,13 +3922,13 @@ class KbqAbsoluteShortDateTimePipe extends BaseLocaleAwareFormatterPipe {
3225
3922
  return super.transform(value, options);
3226
3923
  }
3227
3924
  format(value, options) {
3228
- const date = this.adapter.deserialize(value);
3925
+ const date = toValidDate(this.adapter, value);
3229
3926
  return date ? this.formatter.absoluteShortDateTime(date, options) : '';
3230
3927
  }
3231
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3232
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, isStandalone: true, name: "kbqAbsoluteShortDateTime", pure: false }); }
3928
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3929
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, isStandalone: true, name: "kbqAbsoluteShortDateTime", pure: false }); }
3233
3930
  }
3234
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, decorators: [{
3931
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbsoluteShortDateTimePipe, decorators: [{
3235
3932
  type: Pipe,
3236
3933
  args: [{
3237
3934
  name: 'kbqAbsoluteShortDateTime',
@@ -3243,13 +3940,13 @@ class KbqRelativeLongDatePipe extends BaseLocaleAwareFormatterPipe {
3243
3940
  return super.transform(value);
3244
3941
  }
3245
3942
  format(value) {
3246
- const date = this.adapter.deserialize(value);
3943
+ const date = toValidDate(this.adapter, value);
3247
3944
  return date ? this.formatter.relativeLongDate(date) : '';
3248
3945
  }
3249
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3250
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDatePipe, isStandalone: true, name: "kbqRelativeLongDate", pure: false }); }
3946
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3947
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDatePipe, isStandalone: true, name: "kbqRelativeLongDate", pure: false }); }
3251
3948
  }
3252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDatePipe, decorators: [{
3949
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDatePipe, decorators: [{
3253
3950
  type: Pipe,
3254
3951
  args: [{
3255
3952
  name: 'kbqRelativeLongDate',
@@ -3261,13 +3958,13 @@ class KbqRelativeShortDatePipe extends BaseLocaleAwareFormatterPipe {
3261
3958
  return super.transform(value);
3262
3959
  }
3263
3960
  format(value) {
3264
- const date = this.adapter.deserialize(value);
3961
+ const date = toValidDate(this.adapter, value);
3265
3962
  return date ? this.formatter.relativeShortDate(date) : '';
3266
3963
  }
3267
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3268
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDatePipe, isStandalone: true, name: "kbqRelativeShortDate", pure: false }); }
3964
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3965
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDatePipe, isStandalone: true, name: "kbqRelativeShortDate", pure: false }); }
3269
3966
  }
3270
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDatePipe, decorators: [{
3967
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDatePipe, decorators: [{
3271
3968
  type: Pipe,
3272
3969
  args: [{
3273
3970
  name: 'kbqRelativeShortDate',
@@ -3279,13 +3976,13 @@ class KbqRelativeLongDateTimePipe extends BaseLocaleAwareFormatterPipe {
3279
3976
  return super.transform(value, options);
3280
3977
  }
3281
3978
  format(value, options) {
3282
- const date = this.adapter.deserialize(value);
3979
+ const date = toValidDate(this.adapter, value);
3283
3980
  return date ? this.formatter.relativeLongDateTime(date, options) : '';
3284
3981
  }
3285
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3286
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDateTimePipe, isStandalone: true, name: "kbqRelativeLongDateTime", pure: false }); }
3982
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3983
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDateTimePipe, isStandalone: true, name: "kbqRelativeLongDateTime", pure: false }); }
3287
3984
  }
3288
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeLongDateTimePipe, decorators: [{
3985
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeLongDateTimePipe, decorators: [{
3289
3986
  type: Pipe,
3290
3987
  args: [{
3291
3988
  name: 'kbqRelativeLongDateTime',
@@ -3297,13 +3994,13 @@ class KbqRelativeShortDateTimePipe extends BaseLocaleAwareFormatterPipe {
3297
3994
  return super.transform(value, options);
3298
3995
  }
3299
3996
  format(value, options) {
3300
- const date = this.adapter.deserialize(value);
3997
+ const date = toValidDate(this.adapter, value);
3301
3998
  return date ? this.formatter.relativeShortDateTime(date, options) : '';
3302
3999
  }
3303
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3304
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDateTimePipe, isStandalone: true, name: "kbqRelativeShortDateTime", pure: false }); }
4000
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4001
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDateTimePipe, isStandalone: true, name: "kbqRelativeShortDateTime", pure: false }); }
3305
4002
  }
3306
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRelativeShortDateTimePipe, decorators: [{
4003
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRelativeShortDateTimePipe, decorators: [{
3307
4004
  type: Pipe,
3308
4005
  args: [{
3309
4006
  name: 'kbqRelativeShortDateTime',
@@ -3314,15 +4011,16 @@ class KbqRangeLongDatePipe extends BaseLocaleAwareFormatterPipe {
3314
4011
  transform(value) {
3315
4012
  return super.transform(value);
3316
4013
  }
3317
- format([value1, value2]) {
3318
- const date1 = this.adapter.deserialize(value1);
3319
- const date2 = this.adapter.deserialize(value2);
3320
- return this.formatter.rangeLongDate(date1, date2);
4014
+ format(value) {
4015
+ const range = toOpenedRange(this.adapter, value);
4016
+ if (!range)
4017
+ return '';
4018
+ return this.formatter.rangeLongDate(range[0], range[1]);
3321
4019
  }
3322
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3323
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDatePipe, isStandalone: true, name: "kbqRangeLongDate", pure: false }); }
4020
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4021
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDatePipe, isStandalone: true, name: "kbqRangeLongDate", pure: false }); }
3324
4022
  }
3325
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDatePipe, decorators: [{
4023
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDatePipe, decorators: [{
3326
4024
  type: Pipe,
3327
4025
  args: [{
3328
4026
  name: 'kbqRangeLongDate',
@@ -3333,15 +4031,16 @@ class KbqRangeShortDatePipe extends BaseLocaleAwareFormatterPipe {
3333
4031
  transform(value) {
3334
4032
  return super.transform(value);
3335
4033
  }
3336
- format([value1, value2]) {
3337
- const date1 = this.adapter.deserialize(value1);
3338
- const date2 = this.adapter.deserialize(value2);
3339
- return this.formatter.rangeShortDate(date1, date2);
4034
+ format(value) {
4035
+ const range = toOpenedRange(this.adapter, value);
4036
+ if (!range)
4037
+ return '';
4038
+ return this.formatter.rangeShortDate(range[0], range[1] ?? undefined);
3340
4039
  }
3341
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3342
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDatePipe, isStandalone: true, name: "kbqRangeShortDate", pure: false }); }
4040
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDatePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4041
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDatePipe, isStandalone: true, name: "kbqRangeShortDate", pure: false }); }
3343
4042
  }
3344
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDatePipe, decorators: [{
4043
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDatePipe, decorators: [{
3345
4044
  type: Pipe,
3346
4045
  args: [{
3347
4046
  name: 'kbqRangeShortDate',
@@ -3352,15 +4051,16 @@ class KbqRangeLongDateTimePipe extends BaseLocaleAwareFormatterPipe {
3352
4051
  transform(value, options) {
3353
4052
  return super.transform(value, options);
3354
4053
  }
3355
- format([value1, value2], options) {
3356
- const date1 = this.adapter.deserialize(value1);
3357
- const date2 = this.adapter.deserialize(value2);
3358
- return this.formatter.rangeLongDateTime(date1, date2, options);
4054
+ format(value, options) {
4055
+ const range = toOpenedRange(this.adapter, value);
4056
+ if (!range)
4057
+ return '';
4058
+ return this.formatter.rangeLongDateTime(range[0], range[1] ?? undefined, options);
3359
4059
  }
3360
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3361
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDateTimePipe, isStandalone: true, name: "kbqRangeLongDateTime", pure: false }); }
4060
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4061
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDateTimePipe, isStandalone: true, name: "kbqRangeLongDateTime", pure: false }); }
3362
4062
  }
3363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeLongDateTimePipe, decorators: [{
4063
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeLongDateTimePipe, decorators: [{
3364
4064
  type: Pipe,
3365
4065
  args: [{
3366
4066
  name: 'kbqRangeLongDateTime',
@@ -3371,15 +4071,17 @@ class KbqRangeMiddleDateTimePipe extends BaseLocaleAwareFormatterPipe {
3371
4071
  transform(value, options) {
3372
4072
  return super.transform(value, options);
3373
4073
  }
3374
- format([value1, value2], options) {
3375
- const date1 = this.adapter.deserialize(value1);
3376
- const date2 = this.adapter.deserialize(value2);
3377
- return this.formatter.rangeMiddleDateTime(date1, date2, options);
4074
+ format(value, options) {
4075
+ // Unlike the other range formats, the middle one has no opened-range template — both bounds required.
4076
+ const range = toClosedRange(this.adapter, value);
4077
+ if (!range)
4078
+ return '';
4079
+ return this.formatter.rangeMiddleDateTime(range[0], range[1], options);
3378
4080
  }
3379
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeMiddleDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3380
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeMiddleDateTimePipe, isStandalone: true, name: "kbqRangeMiddleDateTime", pure: false }); }
4081
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeMiddleDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4082
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeMiddleDateTimePipe, isStandalone: true, name: "kbqRangeMiddleDateTime", pure: false }); }
3381
4083
  }
3382
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeMiddleDateTimePipe, decorators: [{
4084
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeMiddleDateTimePipe, decorators: [{
3383
4085
  type: Pipe,
3384
4086
  args: [{
3385
4087
  name: 'kbqRangeMiddleDateTime',
@@ -3390,21 +4092,130 @@ class KbqRangeShortDateTimePipe extends BaseLocaleAwareFormatterPipe {
3390
4092
  transform(value, options) {
3391
4093
  return super.transform(value, options);
3392
4094
  }
3393
- format([value1, value2], options) {
3394
- const date1 = this.adapter.deserialize(value1);
3395
- const date2 = this.adapter.deserialize(value2);
3396
- return this.formatter.rangeShortDateTime(date1, date2, options);
4095
+ format(value, options) {
4096
+ const range = toOpenedRange(this.adapter, value);
4097
+ if (!range)
4098
+ return '';
4099
+ return this.formatter.rangeShortDateTime(range[0], range[1], options);
3397
4100
  }
3398
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
3399
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDateTimePipe, isStandalone: true, name: "kbqRangeShortDateTime", pure: false }); }
4101
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDateTimePipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4102
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDateTimePipe, isStandalone: true, name: "kbqRangeShortDateTime", pure: false }); }
3400
4103
  }
3401
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRangeShortDateTimePipe, decorators: [{
4104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRangeShortDateTimePipe, decorators: [{
3402
4105
  type: Pipe,
3403
4106
  args: [{
3404
4107
  name: 'kbqRangeShortDateTime',
3405
4108
  pure: false
3406
4109
  }]
3407
4110
  }] });
4111
+ /**
4112
+ * Formats the duration between two dates as a digital-clock value, e.g. `48:02:25`.
4113
+ *
4114
+ * Takes a `[from, to]` tuple, like the range pipes. `options.seconds` defaults to `true` and
4115
+ * `options.milliseconds` to `false`; `options.currYear` is not used by this format.
4116
+ *
4117
+ * Renders an empty string when the tuple itself or one of its bounds is missing or invalid, or when
4118
+ * `from` is later than `to`.
4119
+ *
4120
+ * @example
4121
+ * ```html
4122
+ * {{ [startedAt, finishedAt] | kbqDurationShortest }}
4123
+ * {{ [startedAt, finishedAt] | kbqDurationShortest: { seconds: false } }}
4124
+ * ```
4125
+ */
4126
+ class KbqDurationShortestPipe extends BaseLocaleAwareFormatterPipe {
4127
+ transform(value, options) {
4128
+ return super.transform(value, options);
4129
+ }
4130
+ format(value, options) {
4131
+ const range = toDurationRange(this.adapter, value);
4132
+ if (!range)
4133
+ return '';
4134
+ return this.formatter.durationShortest(range[0], range[1], options?.seconds, options?.milliseconds);
4135
+ }
4136
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortestPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4137
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortestPipe, isStandalone: true, name: "kbqDurationShortest", pure: false }); }
4138
+ }
4139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortestPipe, decorators: [{
4140
+ type: Pipe,
4141
+ args: [{
4142
+ name: 'kbqDurationShortest',
4143
+ pure: false
4144
+ }]
4145
+ }] });
4146
+ /**
4147
+ * Formats the duration between two dates in the long text format, e.g. `2 дня и 4 часа`.
4148
+ *
4149
+ * Takes a `[from, to]` tuple, like the range pipes. `units` restricts the units to show (the
4150
+ * formatter picks them automatically when omitted), `fraction` adds a fractional part for years
4151
+ * and months.
4152
+ *
4153
+ * Renders an empty string when the tuple itself or one of its bounds is missing or invalid, or when
4154
+ * `from` is later than `to`.
4155
+ *
4156
+ * @example
4157
+ * ```html
4158
+ * {{ [startedAt, finishedAt] | kbqDurationLong }}
4159
+ * {{ [startedAt, finishedAt] | kbqDurationLong: ['hours', 'minutes'] }}
4160
+ * {{ [startedAt, finishedAt] | kbqDurationLong: ['years'] : true }}
4161
+ * ```
4162
+ */
4163
+ class KbqDurationLongPipe extends BaseLocaleAwareFormatterPipe {
4164
+ transform(value, units, fraction) {
4165
+ return super.transform(value, units, fraction);
4166
+ }
4167
+ format(value, units, fraction) {
4168
+ const range = toDurationRange(this.adapter, value);
4169
+ if (!range)
4170
+ return '';
4171
+ return this.formatter.durationLong(range[0], range[1], units, fraction);
4172
+ }
4173
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationLongPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4174
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationLongPipe, isStandalone: true, name: "kbqDurationLong", pure: false }); }
4175
+ }
4176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationLongPipe, decorators: [{
4177
+ type: Pipe,
4178
+ args: [{
4179
+ name: 'kbqDurationLong',
4180
+ pure: false
4181
+ }]
4182
+ }] });
4183
+ /**
4184
+ * Formats the duration between two dates in the short text format, e.g. `2 д 4 ч`.
4185
+ *
4186
+ * Takes a `[from, to]` tuple, like the range pipes. `units` restricts the units to show (the
4187
+ * formatter picks them automatically when omitted), `fraction` adds a fractional part for years
4188
+ * and months.
4189
+ *
4190
+ * Renders an empty string when the tuple itself or one of its bounds is missing or invalid, or when
4191
+ * `from` is later than `to`.
4192
+ *
4193
+ * @example
4194
+ * ```html
4195
+ * {{ [startedAt, finishedAt] | kbqDurationShort }}
4196
+ * {{ [startedAt, finishedAt] | kbqDurationShort: ['seconds', 'milliseconds'] }}
4197
+ * ```
4198
+ */
4199
+ class KbqDurationShortPipe extends BaseLocaleAwareFormatterPipe {
4200
+ transform(value, units, fraction) {
4201
+ return super.transform(value, units, fraction);
4202
+ }
4203
+ format(value, units, fraction) {
4204
+ const range = toDurationRange(this.adapter, value);
4205
+ if (!range)
4206
+ return '';
4207
+ return this.formatter.durationShort(range[0], range[1], units, fraction);
4208
+ }
4209
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe }); }
4210
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortPipe, isStandalone: true, name: "kbqDurationShort", pure: false }); }
4211
+ }
4212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDurationShortPipe, decorators: [{
4213
+ type: Pipe,
4214
+ args: [{
4215
+ name: 'kbqDurationShort',
4216
+ pure: false
4217
+ }]
4218
+ }] });
3408
4219
 
3409
4220
  /**
3410
4221
  * Available unit systems for file size formatting.
@@ -3561,11 +4372,11 @@ class KbqDecimalPipe {
3561
4372
  grouping === undefined &&
3562
4373
  Math.abs(value) < defaultValueForGroupingInRULocale);
3563
4374
  }
3564
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqDecimalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3565
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqDecimalPipe, isStandalone: true, name: "kbqNumber", pure: false }); }
3566
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqDecimalPipe, providedIn: 'root' }); }
4375
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDecimalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4376
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqDecimalPipe, isStandalone: true, name: "kbqNumber", pure: false }); }
4377
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDecimalPipe, providedIn: 'root' }); }
3567
4378
  }
3568
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqDecimalPipe, decorators: [{
4379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDecimalPipe, decorators: [{
3569
4380
  type: Injectable,
3570
4381
  args: [{ providedIn: 'root' }]
3571
4382
  }, {
@@ -3618,11 +4429,11 @@ class KbqTableNumberPipe {
3618
4429
  throw Error(`InvalidPipeArgument: KbqTableNumberPipe for pipe '${JSON.stringify(error.message)}'`);
3619
4430
  }
3620
4431
  }
3621
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqTableNumberPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3622
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqTableNumberPipe, isStandalone: true, name: "kbqTableNumber", pure: false }); }
3623
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqTableNumberPipe, providedIn: 'root' }); }
4432
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTableNumberPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4433
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqTableNumberPipe, isStandalone: true, name: "kbqTableNumber", pure: false }); }
4434
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTableNumberPipe, providedIn: 'root' }); }
3624
4435
  }
3625
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqTableNumberPipe, decorators: [{
4436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqTableNumberPipe, decorators: [{
3626
4437
  type: Injectable,
3627
4438
  args: [{ providedIn: 'root' }]
3628
4439
  }, {
@@ -3641,6 +4452,7 @@ class KbqRoundDecimalPipe {
3641
4452
  this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
3642
4453
  this.localeService?.changes.subscribe((newId) => (this.id = newId));
3643
4454
  }
4455
+ // @TODO: update returned type to string | null. Breaking change
3644
4456
  transform(value, locale) {
3645
4457
  if (isEmpty(value)) {
3646
4458
  return null;
@@ -3723,11 +4535,11 @@ class KbqRoundDecimalPipe {
3723
4535
  });
3724
4536
  return currentUnit;
3725
4537
  }
3726
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRoundDecimalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3727
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqRoundDecimalPipe, isStandalone: true, name: "kbqRoundNumber", pure: false }); }
3728
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRoundDecimalPipe, providedIn: 'root' }); }
4538
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRoundDecimalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4539
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqRoundDecimalPipe, isStandalone: true, name: "kbqRoundNumber", pure: false }); }
4540
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRoundDecimalPipe, providedIn: 'root' }); }
3729
4541
  }
3730
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRoundDecimalPipe, decorators: [{
4542
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRoundDecimalPipe, decorators: [{
3731
4543
  type: Injectable,
3732
4544
  args: [{ providedIn: 'root' }]
3733
4545
  }, {
@@ -3809,10 +4621,10 @@ class KbqDataSizePipe {
3809
4621
  const formattedValue = this.numberPipe?.transform(value, `1.0-${precision}`, locale) || value;
3810
4622
  return formattedValue ? `${formattedValue}${this.nonBreakingSpace}${unit}` : '';
3811
4623
  }
3812
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqDataSizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3813
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqDataSizePipe, isStandalone: true, name: "kbqDataSize", pure: false }); }
4624
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDataSizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4625
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqDataSizePipe, isStandalone: true, name: "kbqDataSize", pure: false }); }
3814
4626
  }
3815
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqDataSizePipe, decorators: [{
4627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqDataSizePipe, decorators: [{
3816
4628
  type: Pipe,
3817
4629
  args: [{
3818
4630
  name: 'kbqDataSize',
@@ -3821,8 +4633,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3821
4633
  }], ctorParameters: () => [] });
3822
4634
 
3823
4635
  class KbqFormattersModule {
3824
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormattersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3825
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqFormattersModule, imports: [AbsoluteDateFormatterPipe,
4636
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormattersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4637
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqFormattersModule, imports: [AbsoluteDateFormatterPipe,
3826
4638
  AbsoluteDateTimeFormatterPipe,
3827
4639
  AbsoluteDateShortFormatterPipe,
3828
4640
  AbsoluteShortDateTimeFormatterPipe,
@@ -3835,6 +4647,9 @@ class KbqFormattersModule {
3835
4647
  RangeDateTimeFormatterPipe,
3836
4648
  RangeShortDateTimeFormatterPipe,
3837
4649
  RangeMiddleDateTimeFormatterPipe,
4650
+ DurationShortestFormatterPipe,
4651
+ DurationLongFormatterPipe,
4652
+ DurationShortFormatterPipe,
3838
4653
  AbsoluteDateFormatterImpurePipe,
3839
4654
  AbsoluteDateTimeFormatterImpurePipe,
3840
4655
  AbsoluteDateShortFormatterImpurePipe,
@@ -3848,6 +4663,9 @@ class KbqFormattersModule {
3848
4663
  RangeDateTimeFormatterImpurePipe,
3849
4664
  RangeShortDateTimeFormatterImpurePipe,
3850
4665
  RangeMiddleDateTimeFormatterImpurePipe,
4666
+ DurationShortestFormatterImpurePipe,
4667
+ DurationLongFormatterImpurePipe,
4668
+ DurationShortFormatterImpurePipe,
3851
4669
  KbqAbsoluteLongDatePipe,
3852
4670
  KbqAbsoluteLongDateTimePipe,
3853
4671
  KbqAbsoluteShortDatePipe,
@@ -3861,6 +4679,9 @@ class KbqFormattersModule {
3861
4679
  KbqRangeMiddleDateTimePipe,
3862
4680
  KbqRangeShortDatePipe,
3863
4681
  KbqRangeShortDateTimePipe,
4682
+ KbqDurationShortestPipe,
4683
+ KbqDurationLongPipe,
4684
+ KbqDurationShortPipe,
3864
4685
  KbqDataSizePipe,
3865
4686
  KbqDecimalPipe,
3866
4687
  KbqRoundDecimalPipe,
@@ -3880,6 +4701,9 @@ class KbqFormattersModule {
3880
4701
  RangeDateTimeFormatterPipe,
3881
4702
  RangeShortDateTimeFormatterPipe,
3882
4703
  RangeMiddleDateTimeFormatterPipe,
4704
+ DurationShortestFormatterPipe,
4705
+ DurationLongFormatterPipe,
4706
+ DurationShortFormatterPipe,
3883
4707
  AbsoluteDateFormatterImpurePipe,
3884
4708
  AbsoluteDateTimeFormatterImpurePipe,
3885
4709
  AbsoluteDateShortFormatterImpurePipe,
@@ -3893,6 +4717,9 @@ class KbqFormattersModule {
3893
4717
  RangeDateTimeFormatterImpurePipe,
3894
4718
  RangeShortDateTimeFormatterImpurePipe,
3895
4719
  RangeMiddleDateTimeFormatterImpurePipe,
4720
+ DurationShortestFormatterImpurePipe,
4721
+ DurationLongFormatterImpurePipe,
4722
+ DurationShortFormatterImpurePipe,
3896
4723
  KbqAbsoluteLongDatePipe,
3897
4724
  KbqAbsoluteLongDateTimePipe,
3898
4725
  KbqAbsoluteShortDatePipe,
@@ -3906,10 +4733,13 @@ class KbqFormattersModule {
3906
4733
  KbqRangeMiddleDateTimePipe,
3907
4734
  KbqRangeShortDatePipe,
3908
4735
  KbqRangeShortDateTimePipe,
4736
+ KbqDurationShortestPipe,
4737
+ KbqDurationLongPipe,
4738
+ KbqDurationShortPipe,
3909
4739
  KbqDataSizePipe] }); }
3910
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormattersModule, providers: [DateFormatter] }); }
4740
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormattersModule, providers: [DateFormatter] }); }
3911
4741
  }
3912
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormattersModule, decorators: [{
4742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormattersModule, decorators: [{
3913
4743
  type: NgModule,
3914
4744
  args: [{
3915
4745
  imports: [
@@ -3926,6 +4756,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3926
4756
  RangeDateTimeFormatterPipe,
3927
4757
  RangeShortDateTimeFormatterPipe,
3928
4758
  RangeMiddleDateTimeFormatterPipe,
4759
+ DurationShortestFormatterPipe,
4760
+ DurationLongFormatterPipe,
4761
+ DurationShortFormatterPipe,
3929
4762
  AbsoluteDateFormatterImpurePipe,
3930
4763
  AbsoluteDateTimeFormatterImpurePipe,
3931
4764
  AbsoluteDateShortFormatterImpurePipe,
@@ -3939,6 +4772,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3939
4772
  RangeDateTimeFormatterImpurePipe,
3940
4773
  RangeShortDateTimeFormatterImpurePipe,
3941
4774
  RangeMiddleDateTimeFormatterImpurePipe,
4775
+ DurationShortestFormatterImpurePipe,
4776
+ DurationLongFormatterImpurePipe,
4777
+ DurationShortFormatterImpurePipe,
3942
4778
  KbqAbsoluteLongDatePipe,
3943
4779
  KbqAbsoluteLongDateTimePipe,
3944
4780
  KbqAbsoluteShortDatePipe,
@@ -3952,6 +4788,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3952
4788
  KbqRangeMiddleDateTimePipe,
3953
4789
  KbqRangeShortDatePipe,
3954
4790
  KbqRangeShortDateTimePipe,
4791
+ KbqDurationShortestPipe,
4792
+ KbqDurationLongPipe,
4793
+ KbqDurationShortPipe,
3955
4794
  KbqDataSizePipe,
3956
4795
  KbqDecimalPipe,
3957
4796
  KbqRoundDecimalPipe,
@@ -3975,6 +4814,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3975
4814
  RangeDateTimeFormatterPipe,
3976
4815
  RangeShortDateTimeFormatterPipe,
3977
4816
  RangeMiddleDateTimeFormatterPipe,
4817
+ DurationShortestFormatterPipe,
4818
+ DurationLongFormatterPipe,
4819
+ DurationShortFormatterPipe,
3978
4820
  AbsoluteDateFormatterImpurePipe,
3979
4821
  AbsoluteDateTimeFormatterImpurePipe,
3980
4822
  AbsoluteDateShortFormatterImpurePipe,
@@ -3988,6 +4830,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3988
4830
  RangeDateTimeFormatterImpurePipe,
3989
4831
  RangeShortDateTimeFormatterImpurePipe,
3990
4832
  RangeMiddleDateTimeFormatterImpurePipe,
4833
+ DurationShortestFormatterImpurePipe,
4834
+ DurationLongFormatterImpurePipe,
4835
+ DurationShortFormatterImpurePipe,
3991
4836
  KbqAbsoluteLongDatePipe,
3992
4837
  KbqAbsoluteLongDateTimePipe,
3993
4838
  KbqAbsoluteShortDatePipe,
@@ -4001,6 +4846,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4001
4846
  KbqRangeMiddleDateTimePipe,
4002
4847
  KbqRangeShortDatePipe,
4003
4848
  KbqRangeShortDateTimePipe,
4849
+ KbqDurationShortestPipe,
4850
+ KbqDurationLongPipe,
4851
+ KbqDurationShortPipe,
4004
4852
  KbqDataSizePipe
4005
4853
  ]
4006
4854
  }]
@@ -4025,10 +4873,10 @@ class KbqFormElement {
4025
4873
  this.hasLegend = this.element.nativeElement.firstElementChild.classList.contains('kbq-form__legend');
4026
4874
  }
4027
4875
  }
4028
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4029
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.25", type: KbqFormElement, isStandalone: true, selector: ".kbq-form__row, .kbq-form__fieldset, .kbq-form__legend", host: { properties: { "class.kbq-form-row_margin": "margin" } }, queries: [{ propertyName: "elements", predicate: KbqFormElement, isSignal: true }], exportAs: ["kbqFormElement"], ngImport: i0 }); }
4876
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormElement, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4877
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.30", type: KbqFormElement, isStandalone: true, selector: ".kbq-form__row, .kbq-form__fieldset, .kbq-form__legend", host: { properties: { "class.kbq-form-row_margin": "margin" } }, queries: [{ propertyName: "elements", predicate: KbqFormElement, isSignal: true }], exportAs: ["kbqFormElement"], ngImport: i0 }); }
4030
4878
  }
4031
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormElement, decorators: [{
4879
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormElement, decorators: [{
4032
4880
  type: Directive,
4033
4881
  args: [{
4034
4882
  selector: '.kbq-form__row, .kbq-form__fieldset, .kbq-form__legend',
@@ -4054,10 +4902,10 @@ class KbqForm {
4054
4902
  element.margin = !!(nextElement && !nextElement.hasLegend);
4055
4903
  });
4056
4904
  }
4057
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqForm, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4058
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.25", type: KbqForm, isStandalone: true, selector: ".kbq-form-vertical, .kbq-form-horizontal", host: { classAttribute: "kbq-form" }, queries: [{ propertyName: "elements", predicate: KbqFormElement, isSignal: true }], exportAs: ["kbqForm"], ngImport: i0 }); }
4905
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqForm, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4906
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.30", type: KbqForm, isStandalone: true, selector: ".kbq-form-vertical, .kbq-form-horizontal", host: { classAttribute: "kbq-form" }, queries: [{ propertyName: "elements", predicate: KbqFormElement, isSignal: true }], exportAs: ["kbqForm"], ngImport: i0 }); }
4059
4907
  }
4060
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqForm, decorators: [{
4908
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqForm, decorators: [{
4061
4909
  type: Directive,
4062
4910
  args: [{
4063
4911
  selector: '.kbq-form-vertical, .kbq-form-horizontal',
@@ -4069,13 +4917,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4069
4917
  }], propDecorators: { elements: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KbqFormElement), { isSignal: true }] }] } });
4070
4918
 
4071
4919
  class KbqFormsModule {
4072
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4073
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqFormsModule, imports: [KbqForm,
4920
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4921
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqFormsModule, imports: [KbqForm,
4074
4922
  KbqFormElement], exports: [KbqForm,
4075
4923
  KbqFormElement] }); }
4076
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormsModule }); }
4924
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormsModule }); }
4077
4925
  }
4078
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqFormsModule, decorators: [{
4926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFormsModule, decorators: [{
4079
4927
  type: NgModule,
4080
4928
  args: [{
4081
4929
  imports: [
@@ -4271,6 +5119,119 @@ class FileValidators {
4271
5119
  }
4272
5120
  }
4273
5121
 
5122
+ /** Unicode combining marks left behind by NFKD decomposition of accented characters, e.g. `é` → `e` + U+0301. */
5123
+ const COMBINING_MARKS = /[̀-ͯ]/g;
5124
+ /**
5125
+ * `й`/`Й` decompose under NFKD into `и`/`И` + a combining breve, same as any other diacritic. Unlike
5126
+ * Latin diacritics, that breve marks a distinct Cyrillic letter rather than an accented variant, so it's
5127
+ * re-composed after the generic strip instead of being folded away with the rest.
5128
+ */
5129
+ const CYRILLIC_I_BREVE = /[иИ]̆/g;
5130
+ /** The transformation behind {@link normalizeSearchValue}, minus the end-trimming — see {@link findSearchMatchRanges}. */
5131
+ function foldDiacritics(value) {
5132
+ return value
5133
+ .normalize('NFKD')
5134
+ .replace(CYRILLIC_I_BREVE, (match) => (match[0] === 'И' ? 'Й' : 'й'))
5135
+ .replace(COMBINING_MARKS, '')
5136
+ .toLocaleLowerCase();
5137
+ }
5138
+ /**
5139
+ * Normalizes a string for case- and diacritic-insensitive search comparison: trims the ends,
5140
+ * decomposes accented characters (NFKD), strips the resulting combining marks (while preserving
5141
+ * `й`/`Й` as distinct letters), and lowercases using the current locale. Internal whitespace and
5142
+ * punctuation are left untouched.
5143
+ */
5144
+ function normalizeSearchValue(value) {
5145
+ if (typeof value !== 'string' || !value)
5146
+ return '';
5147
+ return foldDiacritics(value.trim());
5148
+ }
5149
+ /**
5150
+ * Locates every case- and diacritic-insensitive match of `tokens` in `value`, returning `[start, end)`
5151
+ * ranges in `value`'s own (unfolded) coordinates — overlapping or adjacent ranges are merged. This is
5152
+ * what a highlighter needs to stay in sync with {@link createSearchPredicate}: matching a folded value
5153
+ * like `cafe` against `Café` only tells you *that* it matched, not *where* in the original string to
5154
+ * mark, since folding can change which letters look alike without changing the string's length.
5155
+ */
5156
+ function findSearchMatchRanges(value, tokens) {
5157
+ const normalizedTokens = tokens.map(normalizeSearchValue).filter((token) => token.length > 0);
5158
+ if (typeof value !== 'string' || !normalizedTokens.length)
5159
+ return [];
5160
+ // Folding is applied one UTF-16 code unit at a time so every character of the normalized value can be
5161
+ // traced back to the original index it came from — this is what makes mapping a match's position back
5162
+ // onto `value` possible. Surrogate pairs are folded as two independent units; neither combining-mark
5163
+ // stripping nor case-folding depends on cross-surrogate context, so this doesn't affect correctness.
5164
+ let normalizedValue = '';
5165
+ const originalIndexOf = [];
5166
+ for (let index = 0; index < value.length; index++) {
5167
+ const folded = foldDiacritics(value[index]);
5168
+ normalizedValue += folded;
5169
+ for (let i = 0; i < folded.length; i++)
5170
+ originalIndexOf.push(index);
5171
+ }
5172
+ const ranges = [];
5173
+ for (const token of normalizedTokens) {
5174
+ let fromIndex = 0;
5175
+ let matchIndex;
5176
+ while ((matchIndex = normalizedValue.indexOf(token, fromIndex)) !== -1) {
5177
+ ranges.push([originalIndexOf[matchIndex], originalIndexOf[matchIndex + token.length - 1] + 1]);
5178
+ fromIndex = matchIndex + token.length;
5179
+ }
5180
+ }
5181
+ return mergeRanges(ranges);
5182
+ }
5183
+ function mergeRanges(ranges) {
5184
+ if (ranges.length < 2)
5185
+ return ranges;
5186
+ const sorted = [...ranges].sort(([aStart, aEnd], [bStart, bEnd]) => aStart - bStart || aEnd - bEnd);
5187
+ const merged = [sorted[0]];
5188
+ for (const [start, end] of sorted.slice(1)) {
5189
+ const last = merged[merged.length - 1];
5190
+ if (start <= last[1]) {
5191
+ last[1] = Math.max(last[1], end);
5192
+ }
5193
+ else {
5194
+ merged.push([start, end]);
5195
+ }
5196
+ }
5197
+ return merged;
5198
+ }
5199
+ const SEARCH_QUERY_TOKEN = /"([^"]*)"|(\S+)/g;
5200
+ /**
5201
+ * Splits a raw query into tokens, treating whitespace as a separator and `"quoted phrases"` as
5202
+ * a single token (spaces inside the quotes are preserved). A `"` with no matching closing quote
5203
+ * stays part of its token instead of being dropped, so a half-open quote yields a token no
5204
+ * realistic haystack contains — and therefore no results — until the quote is closed.
5205
+ */
5206
+ function tokenizeSearchQuery(query) {
5207
+ if (typeof query !== 'string' || !query.trim())
5208
+ return [];
5209
+ const tokens = [];
5210
+ for (const match of query.matchAll(SEARCH_QUERY_TOKEN)) {
5211
+ const token = match[1] ?? match[2];
5212
+ if (token)
5213
+ tokens.push(token);
5214
+ }
5215
+ return tokens;
5216
+ }
5217
+ /**
5218
+ * Builds a case- and diacritic-insensitive substring predicate for the given query. The query is
5219
+ * tokenized (bare words + `"quoted phrases"`) and every token must match (AND) against at least
5220
+ * one of the supplied haystacks (OR across fields) — pass a single string for a single-field
5221
+ * search, or an array for multi-field rows. An empty/whitespace-only query matches everything.
5222
+ */
5223
+ function createSearchPredicate(query) {
5224
+ const tokens = tokenizeSearchQuery(query)
5225
+ .map(normalizeSearchValue)
5226
+ .filter((token) => token.length > 0);
5227
+ if (!tokens.length)
5228
+ return () => true;
5229
+ return (value) => {
5230
+ const haystacks = (Array.isArray(value) ? value : [value]).map(normalizeSearchValue);
5231
+ return tokens.every((token) => haystacks.some((haystack) => haystack.includes(token)));
5232
+ };
5233
+ }
5234
+
4274
5235
  const HTML_ESCAPES = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
4275
5236
  const HTML_SPECIAL_CHARS = /[&<>"']/;
4276
5237
  const HTML_SPECIAL_CHARS_GLOBAL = new RegExp(HTML_SPECIAL_CHARS.source, 'g');
@@ -4286,32 +5247,63 @@ function escapeHtml(value) {
4286
5247
  return value;
4287
5248
  return value.replace(HTML_SPECIAL_CHARS_GLOBAL, (chr) => HTML_ESCAPES[chr] ?? chr);
4288
5249
  }
4289
- /** @docs-private */
4290
- function highlight(value, keyword, mark) {
5250
+ function normalizeKeywords(keyword) {
5251
+ const list = Array.isArray(keyword) ? keyword : [keyword];
5252
+ // Longest first, so a shorter keyword (e.g. "a") can't shadow a longer one that starts
5253
+ // with it (e.g. "all") within the same regex alternation.
5254
+ return list
5255
+ .filter((item) => typeof item === 'string' && item.length > 0)
5256
+ .sort((a, b) => b.length - a.length);
5257
+ }
5258
+ function findLiteralMatchRanges(value, keywords) {
5259
+ const pattern = new RegExp(keywords.map(escapeRegExp).join('|'), 'gi');
5260
+ const ranges = [];
5261
+ let match = pattern.exec(value);
5262
+ while (match !== null) {
5263
+ ranges.push([match.index, match.index + match[0].length]);
5264
+ match = pattern.exec(value);
5265
+ }
5266
+ return ranges;
5267
+ }
5268
+ /**
5269
+ * @docs-private
5270
+ * `keyword` accepts either a single string or an array of strings — every keyword is
5271
+ * highlighted independently, which is what multi-token search queries need.
5272
+ *
5273
+ * By default, matching is literal (case-insensitive substring), same as a plain `.includes`. Pass
5274
+ * `foldDiacritics: true` when the keywords were matched with diacritic folding (e.g. via
5275
+ * {@link createSearchPredicate} from `@koobiq/components/core`) — otherwise a folded match like
5276
+ * `cafe` finding `Café` has nothing in the value for a literal highlighter to mark.
5277
+ */
5278
+ function highlight(value, keyword, mark, foldDiacritics = false) {
4291
5279
  if (typeof value !== 'string')
4292
5280
  return '';
4293
- if (!keyword || typeof keyword !== 'string')
5281
+ const keywords = normalizeKeywords(keyword);
5282
+ if (!keywords.length)
5283
+ return escapeHtml(value);
5284
+ const ranges = foldDiacritics ? findSearchMatchRanges(value, keywords) : findLiteralMatchRanges(value, keywords);
5285
+ if (!ranges.length)
4294
5286
  return escapeHtml(value);
4295
- const parts = value.split(new RegExp(`(${escapeRegExp(keyword)})`, 'gi'));
4296
- return parts
4297
- .map((part, i) => {
4298
- const escaped = escapeHtml(part);
4299
- const isMatch = i % 2 === 1;
4300
- return isMatch ? mark(escaped) : escaped;
4301
- })
4302
- .join('');
5287
+ let result = '';
5288
+ let cursor = 0;
5289
+ for (const [start, end] of ranges) {
5290
+ result += escapeHtml(value.slice(cursor, start));
5291
+ result += mark(escapeHtml(value.slice(start, end)));
5292
+ cursor = end;
5293
+ }
5294
+ return result + escapeHtml(value.slice(cursor));
4303
5295
  }
4304
5296
 
4305
5297
  /** @docs-private */
4306
5298
  const kbqHighlightBackgroundMark = (text) => `<mark class="kbq-highlight-background">${text}</mark>`;
4307
5299
  class KbqHighlightBackgroundPipe {
4308
- transform(value, keyword) {
4309
- return highlight(value, keyword, kbqHighlightBackgroundMark);
5300
+ transform(value, keyword, foldDiacritics = false) {
5301
+ return highlight(value, keyword, kbqHighlightBackgroundMark, foldDiacritics);
4310
5302
  }
4311
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightBackgroundPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4312
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightBackgroundPipe, isStandalone: true, name: "kbqHighlightBackground" }); }
5303
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightBackgroundPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
5304
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightBackgroundPipe, isStandalone: true, name: "kbqHighlightBackground" }); }
4313
5305
  }
4314
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightBackgroundPipe, decorators: [{
5306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightBackgroundPipe, decorators: [{
4315
5307
  type: Pipe,
4316
5308
  args: [{ name: 'kbqHighlightBackground' }]
4317
5309
  }] });
@@ -4319,23 +5311,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4319
5311
  /** @docs-private */
4320
5312
  const kbqHighlightMark = (text) => `<mark class="kbq-highlight">${text}</mark>`;
4321
5313
  class KbqHighlightPipe {
4322
- transform(value, keyword) {
4323
- return highlight(value, keyword, kbqHighlightMark);
5314
+ transform(value, keyword, foldDiacritics = false) {
5315
+ return highlight(value, keyword, kbqHighlightMark, foldDiacritics);
4324
5316
  }
4325
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4326
- /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightPipe, isStandalone: true, name: "mcHighlight" }); }
5317
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
5318
+ /** @nocollapse */ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightPipe, isStandalone: true, name: "mcHighlight" }); }
4327
5319
  }
4328
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightPipe, decorators: [{
5320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightPipe, decorators: [{
4329
5321
  type: Pipe,
4330
5322
  args: [{ name: 'mcHighlight' }]
4331
5323
  }] });
4332
5324
 
4333
5325
  class KbqHighlightModule {
4334
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4335
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightModule, imports: [KbqHighlightPipe, KbqHighlightBackgroundPipe], exports: [KbqHighlightPipe, KbqHighlightBackgroundPipe] }); }
4336
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightModule }); }
5326
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5327
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightModule, imports: [KbqHighlightPipe, KbqHighlightBackgroundPipe], exports: [KbqHighlightPipe, KbqHighlightBackgroundPipe] }); }
5328
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightModule }); }
4337
5329
  }
4338
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqHighlightModule, decorators: [{
5330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqHighlightModule, decorators: [{
4339
5331
  type: NgModule,
4340
5332
  args: [{
4341
5333
  imports: [KbqHighlightPipe, KbqHighlightBackgroundPipe],
@@ -4349,10 +5341,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4349
5341
  * counted by checking the query list's length.
4350
5342
  */
4351
5343
  class KbqLine {
4352
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLine, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4353
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqLine, isStandalone: true, selector: "[kbq-line], [mcLine]", host: { classAttribute: "kbq-line" }, ngImport: i0 }); }
5344
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLine, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5345
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqLine, isStandalone: true, selector: "[kbq-line], [mcLine]", host: { classAttribute: "kbq-line" }, ngImport: i0 }); }
4354
5346
  }
4355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqLine, decorators: [{
5347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqLine, decorators: [{
4356
5348
  type: Directive,
4357
5349
  args: [{
4358
5350
  selector: '[kbq-line], [mcLine]',
@@ -4412,16 +5404,24 @@ class KbqRectangleItem {
4412
5404
  this._collapsed = value;
4413
5405
  this.state.next();
4414
5406
  }
5407
+ /**
5408
+ * Outer width of the item: its border box plus horizontal margins.
5409
+ *
5410
+ * `getComputedStyle().width` resolves to the used content-box width whatever `box-sizing` says,
5411
+ * so it silently drops padding and borders on the `border-box` elements this measures, and the
5412
+ * result would change again under a consuming application's global reset.
5413
+ * `getBoundingClientRect()` is always the border box, which makes it host-independent.
5414
+ */
4415
5415
  getOuterElementWidth() {
4416
5416
  if (!this.isBrowser)
4417
5417
  return 0;
4418
- const { width, marginLeft, marginRight } = this.window.getComputedStyle(this.nativeElement);
4419
- return [width, marginLeft, marginRight].reduce((acc, item) => acc + parseInt(item), 0);
5418
+ const { marginLeft, marginRight } = this.window.getComputedStyle(this.nativeElement);
5419
+ return [marginLeft, marginRight].reduce((acc, item) => acc + (parseFloat(item) || 0), this.nativeElement.getBoundingClientRect().width);
4420
5420
  }
4421
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRectangleItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
4422
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqRectangleItem, isStandalone: true, host: { properties: { "class.kbq-expanded": "!collapsed", "class.kbq-collapsed": "collapsed" } }, ngImport: i0 }); }
5421
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRectangleItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5422
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqRectangleItem, isStandalone: true, host: { properties: { "class.kbq-expanded": "!collapsed", "class.kbq-collapsed": "collapsed" } }, ngImport: i0 }); }
4423
5423
  }
4424
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqRectangleItem, decorators: [{
5424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqRectangleItem, decorators: [{
4425
5425
  type: Directive,
4426
5426
  args: [{
4427
5427
  host: {
@@ -4480,7 +5480,11 @@ class KbqOptionActionComponent {
4480
5480
  else {
4481
5481
  this.nativeElement.focus();
4482
5482
  }
4483
- this.hasFocus = true;
5483
+ // The action lives inside `.kbq-action-container`, which is `display: none` until the option
5484
+ // is hovered or keyboard-focused. Focusing a hidden element is a no-op, so `hasFocus` has to
5485
+ // reflect what actually happened: assuming success would latch `kbq-action-button-focused`
5486
+ // on the option forever, since `FocusMonitor` never emits for an element that never got focus.
5487
+ this.hasFocus = this.nativeElement.ownerDocument.activeElement === this.nativeElement;
4484
5488
  }
4485
5489
  onClick($event) {
4486
5490
  $event.stopPropagation();
@@ -4506,14 +5510,14 @@ class KbqOptionActionComponent {
4506
5510
  this.option.tooltipTrigger.disabled = true;
4507
5511
  setTimeout(() => (this.option.tooltipTrigger.disabled = false));
4508
5512
  }
4509
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4510
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.25", type: KbqOptionActionComponent, isStandalone: true, selector: "kbq-option-action", inputs: { disabled: ["disabled", "disabled", booleanAttribute] }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeyDown($event)" }, properties: { "class.kbq-expanded": "false", "class.kbq-disabled": "disabled", "attr.disabled": "disabled || null", "attr.tabIndex": "-1" }, classAttribute: "kbq-option-action" }, exportAs: ["kbqOptionAction"], ngImport: i0, template: `
5513
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5514
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.30", type: KbqOptionActionComponent, isStandalone: true, selector: "kbq-option-action", inputs: { disabled: ["disabled", "disabled", booleanAttribute] }, host: { listeners: { "click": "onClick($event)", "keydown": "onKeyDown($event)" }, properties: { "class.kbq-expanded": "false", "class.kbq-disabled": "disabled", "attr.disabled": "disabled || null", "attr.tabIndex": "-1" }, classAttribute: "kbq-option-action" }, exportAs: ["kbqOptionAction"], ngImport: i0, template: `
4511
5515
  <ng-content select="[kbq-icon]">
4512
5516
  <i class="kbq kbq-icon kbq-contrast-fade kbq-ellipsis-vertical_16"></i>
4513
5517
  </ng-content>
4514
- `, isInline: true, styles: [".kbq-option-action{display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none;border:var(--kbq-size-3xs) solid transparent;border-radius:var(--kbq-size-xs);width:var(--kbq-size-xl);height:var(--kbq-size-xl)}.kbq-option-action:not(.kbq-disabled):hover .kbq-icon,.kbq-option-action:not(.kbq-disabled):focus .kbq-icon{color:var(--kbq-icon-button-fade-contrast-states-hover)}.kbq-option-action.kbq-disabled{cursor:default}.kbq-option-action.cdk-keyboard-focused{z-index:1;border-color:var(--kbq-states-line-focus-theme)}.kbq-option-action:active .kbq-icon.kbq-empty,.kbq-option-action.kbq-pressed .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-active)}.kbq-option-action:active,.kbq-option-action.kbq-pressed{background-color:var(--kbq-background-transparent)}.kbq-option-action:hover .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-hover)}.kbq-option-action.kbq-disabled .kbq-icon.kbq-empty{color:var(--kbq-states-icon-disabled)}.kbq-option-action.kbq-disabled{background-color:var(--kbq-background-transparent)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5518
+ `, isInline: true, styles: [".kbq-option-action{display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none;box-sizing:content-box;border:var(--kbq-size-3xs) solid transparent;border-radius:var(--kbq-size-xs);width:var(--kbq-size-xl);height:var(--kbq-size-xl)}.kbq-option-action:not(.kbq-disabled):hover .kbq-icon,.kbq-option-action:not(.kbq-disabled):focus .kbq-icon{color:var(--kbq-icon-button-fade-contrast-states-hover)}.kbq-option-action.kbq-disabled{cursor:default}.kbq-option-action.cdk-keyboard-focused{z-index:1;border-color:var(--kbq-states-line-focus-theme)}.kbq-option-action:active .kbq-icon.kbq-empty,.kbq-option-action.kbq-pressed .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-active)}.kbq-option-action:active,.kbq-option-action.kbq-pressed{background-color:var(--kbq-background-transparent)}.kbq-option-action:hover .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-hover)}.kbq-option-action.kbq-disabled .kbq-icon.kbq-empty{color:var(--kbq-states-icon-disabled)}.kbq-option-action.kbq-disabled{background-color:var(--kbq-background-transparent)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4515
5519
  }
4516
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionActionComponent, decorators: [{
5520
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionActionComponent, decorators: [{
4517
5521
  type: Component,
4518
5522
  args: [{ selector: 'kbq-option-action', template: `
4519
5523
  <ng-content select="[kbq-icon]">
@@ -4527,22 +5531,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4527
5531
  '[attr.tabIndex]': '-1',
4528
5532
  '(click)': 'onClick($event)',
4529
5533
  '(keydown)': 'onKeyDown($event)'
4530
- }, exportAs: 'kbqOptionAction', styles: [".kbq-option-action{display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none;border:var(--kbq-size-3xs) solid transparent;border-radius:var(--kbq-size-xs);width:var(--kbq-size-xl);height:var(--kbq-size-xl)}.kbq-option-action:not(.kbq-disabled):hover .kbq-icon,.kbq-option-action:not(.kbq-disabled):focus .kbq-icon{color:var(--kbq-icon-button-fade-contrast-states-hover)}.kbq-option-action.kbq-disabled{cursor:default}.kbq-option-action.cdk-keyboard-focused{z-index:1;border-color:var(--kbq-states-line-focus-theme)}.kbq-option-action:active .kbq-icon.kbq-empty,.kbq-option-action.kbq-pressed .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-active)}.kbq-option-action:active,.kbq-option-action.kbq-pressed{background-color:var(--kbq-background-transparent)}.kbq-option-action:hover .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-hover)}.kbq-option-action.kbq-disabled .kbq-icon.kbq-empty{color:var(--kbq-states-icon-disabled)}.kbq-option-action.kbq-disabled{background-color:var(--kbq-background-transparent)}\n"] }]
5534
+ }, exportAs: 'kbqOptionAction', styles: [".kbq-option-action{display:flex;align-items:center;justify-content:center;cursor:pointer;outline:none;box-sizing:content-box;border:var(--kbq-size-3xs) solid transparent;border-radius:var(--kbq-size-xs);width:var(--kbq-size-xl);height:var(--kbq-size-xl)}.kbq-option-action:not(.kbq-disabled):hover .kbq-icon,.kbq-option-action:not(.kbq-disabled):focus .kbq-icon{color:var(--kbq-icon-button-fade-contrast-states-hover)}.kbq-option-action.kbq-disabled{cursor:default}.kbq-option-action.cdk-keyboard-focused{z-index:1;border-color:var(--kbq-states-line-focus-theme)}.kbq-option-action:active .kbq-icon.kbq-empty,.kbq-option-action.kbq-pressed .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-active)}.kbq-option-action:active,.kbq-option-action.kbq-pressed{background-color:var(--kbq-background-transparent)}.kbq-option-action:hover .kbq-icon.kbq-empty{color:var(--kbq-states-icon-contrast-fade-hover)}.kbq-option-action.kbq-disabled .kbq-icon.kbq-empty{color:var(--kbq-states-icon-disabled)}.kbq-option-action.kbq-disabled{background-color:var(--kbq-background-transparent)}\n"] }]
4531
5535
  }], propDecorators: { disabled: [{
4532
5536
  type: Input,
4533
5537
  args: [{ transform: booleanAttribute }]
4534
5538
  }] } });
5539
+ /**
5540
+ * Moves focus from an option to its trailing action button on Tab.
5541
+ *
5542
+ * Shared by `KbqListOption` and `KbqTreeOption` so the two cannot drift apart. Tab is swallowed only
5543
+ * when focus actually landed: the action lives in a `display: none` container until the option is
5544
+ * hovered or keyboard-focused, and focusing a hidden element is a no-op, so suppressing Tab there
5545
+ * would trap focus on the option.
5546
+ */
5547
+ function kbqFocusOptionActionOnTab($event, actionButton) {
5548
+ if (!actionButton || $event.keyCode !== TAB || $event.shiftKey || actionButton.hasFocus) {
5549
+ return;
5550
+ }
5551
+ actionButton.focus();
5552
+ if (actionButton.hasFocus) {
5553
+ $event.preventDefault();
5554
+ }
5555
+ }
4535
5556
 
4536
5557
  class KbqActionContainer {
4537
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqActionContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4538
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.25", type: KbqActionContainer, isStandalone: true, selector: "kbq-action-container", host: { classAttribute: "kbq-action-container" }, exportAs: ["kbqActionContainer"], ngImport: i0, template: `
5558
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqActionContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5559
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.30", type: KbqActionContainer, isStandalone: true, selector: "kbq-action-container", host: { classAttribute: "kbq-action-container" }, exportAs: ["kbqActionContainer"], ngImport: i0, template: `
4539
5560
  <div class="kbq-action-container__gradient"></div>
4540
5561
  <div class="kbq-action-container__box">
4541
5562
  <ng-content />
4542
5563
  </div>
4543
5564
  `, isInline: true, styles: [".kbq-action-container{box-sizing:border-box;position:absolute;right:0;top:0;bottom:0;display:none;align-items:center;overflow:hidden;border:1px solid transparent;border-top-right-radius:var(--kbq-size-xs);border-bottom-right-radius:var(--kbq-size-xs)}.kbq-action-container__gradient{display:flex;margin-right:calc(var(--kbq-size-xs) * -1);width:var(--kbq-size-3xl);height:100%;background:linear-gradient(var(--kbq-option-background),var(--kbq-option-background)),var(--kbq-background-bg);-webkit-mask-image:linear-gradient(to right,transparent 0%,black var(--kbq-size-xxl));mask-image:linear-gradient(to right,transparent 0%,black var(--kbq-size-xxl))}.kbq-action-container__box{height:100%;display:flex;align-items:center;justify-content:center;background:linear-gradient(var(--kbq-option-background),var(--kbq-option-background)),var(--kbq-background-bg)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4544
5565
  }
4545
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqActionContainer, decorators: [{
5566
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqActionContainer, decorators: [{
4546
5567
  type: Component,
4547
5568
  args: [{ selector: 'kbq-action-container', template: `
4548
5569
  <div class="kbq-action-container__gradient"></div>
@@ -4576,13 +5597,15 @@ class KbqOptgroup {
4576
5597
  this._disabled = value;
4577
5598
  }
4578
5599
  }
4579
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptgroup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4580
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.25", type: KbqOptgroup, isStandalone: true, selector: "kbq-optgroup", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute } }, host: { properties: { "class.kbq-disabled": "disabled" }, classAttribute: "kbq-optgroup" }, exportAs: ["kbqOptgroup"], ngImport: i0, template: "<label class=\"kbq-optgroup-label\" [id]=\"labelId\">\n {{ label() }}\n</label>\n<ng-content select=\"kbq-option, kbq-list-option, kbq-timezone-option, ng-container\" />\n", styles: [".kbq-optgroup-label{display:flex;align-items:center;box-sizing:border-box;padding:var(--kbq-size-s) var(--kbq-size-l) var(--kbq-size-s) var(--kbq-size-m);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-foreground-contrast-secondary);color:var(--kbq-optgroup-label-color)}.kbq-disabled .kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-states-foreground-disabled)}.kbq-optgroup-label{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5600
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptgroup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5601
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.30", type: KbqOptgroup, isStandalone: true, selector: "kbq-optgroup", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute } }, host: { attributes: { "role": "group" }, properties: { "attr.aria-labelledby": "labelId", "class.kbq-disabled": "disabled" }, classAttribute: "kbq-optgroup" }, exportAs: ["kbqOptgroup"], ngImport: i0, template: "<label class=\"kbq-optgroup-label\" [id]=\"labelId\">\n {{ label() }}\n</label>\n<ng-content select=\"kbq-option, kbq-list-option, kbq-timezone-option, ng-container\" />\n", styles: [".kbq-optgroup-label{display:flex;align-items:center;box-sizing:border-box;padding:var(--kbq-size-s) var(--kbq-size-l) var(--kbq-size-s) var(--kbq-size-m);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-foreground-contrast-secondary);color:var(--kbq-optgroup-label-color)}.kbq-disabled .kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-states-foreground-disabled)}.kbq-optgroup-label{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4581
5602
  }
4582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptgroup, decorators: [{
5603
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptgroup, decorators: [{
4583
5604
  type: Component,
4584
5605
  args: [{ selector: 'kbq-optgroup', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
4585
5606
  class: 'kbq-optgroup',
5607
+ role: 'group',
5608
+ '[attr.aria-labelledby]': 'labelId',
4586
5609
  '[class.kbq-disabled]': 'disabled'
4587
5610
  }, exportAs: 'kbqOptgroup', template: "<label class=\"kbq-optgroup-label\" [id]=\"labelId\">\n {{ label() }}\n</label>\n<ng-content select=\"kbq-option, kbq-list-option, kbq-timezone-option, ng-container\" />\n", styles: [".kbq-optgroup-label{display:flex;align-items:center;box-sizing:border-box;padding:var(--kbq-size-s) var(--kbq-size-l) var(--kbq-size-s) var(--kbq-size-m);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-foreground-contrast-secondary);color:var(--kbq-optgroup-label-color)}.kbq-disabled .kbq-optgroup-label{--kbq-optgroup-label-color: var(--kbq-states-foreground-disabled)}.kbq-optgroup-label{font-size:var(--kbq-typography-caps-compact-strong-font-size);font-style:var(--kbq-typography-caps-compact-strong-font-style);font-weight:var(--kbq-typography-caps-compact-strong-font-weight);line-height:var(--kbq-typography-caps-compact-strong-line-height);font-family:var(--kbq-typography-caps-compact-strong-font-family);text-transform:var(--kbq-typography-caps-compact-strong-text-transform);font-feature-settings:var(--kbq-typography-caps-compact-strong-font-feature-settings);letter-spacing:var(--kbq-typography-caps-compact-strong-letter-spacing)}\n"] }]
4588
5611
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], disabled: [{
@@ -4616,10 +5639,10 @@ class KbqPseudoCheckbox extends KbqColorDirective {
4616
5639
  this.state = input('unchecked', ...(ngDevMode ? [{ debugName: "state" }] : []));
4617
5640
  this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
4618
5641
  }
4619
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckbox, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4620
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.25", type: KbqPseudoCheckbox, isStandalone: true, selector: "kbq-pseudo-checkbox", inputs: { big: { classPropertyName: "big", publicName: "big", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.kbq-checkbox_big": "big()", "class.kbq-indeterminate": "state() === \"indeterminate\"", "class.kbq-checked": "state() === true || state() === \"checked\"", "class.kbq-disabled": "disabled()" }, classAttribute: "kbq-pseudo-checkbox" }, usesInheritance: true, ngImport: i0, template: "<i class=\"kbq-checkbox-checkmark kbq kbq-check-s_16\"></i>\n<i class=\"kbq-checkbox-mixedmark kbq kbq-minus-s_16\"></i>\n", styles: [".kbq-pseudo-checkbox{position:relative;display:inline-flex;box-sizing:border-box;align-items:center;justify-content:center;width:var(--kbq-checkbox-size-normal-width);height:var(--kbq-checkbox-size-normal-width);border-radius:var(--kbq-checkbox-size-normal-border-radius);border-width:var(--kbq-checkbox-size-normal-border-width);border-style:solid;cursor:pointer;vertical-align:middle;flex-shrink:0}.kbq-pseudo-checkbox .kbq-checkbox-checkmark,.kbq-pseudo-checkbox .kbq-checkbox-mixedmark{display:none}.kbq-pseudo-checkbox.kbq-pseudo-checkbox-checked,.kbq-pseudo-checkbox.kbq-pseudo-checkbox-indeterminate{border-color:transparent}.kbq-pseudo-checkbox.kbq-checked .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-indeterminate .kbq-checkbox-mixedmark{display:inline-block}.kbq-pseudo-checkbox.kbq-disabled{cursor:default}.kbq-pseudo-checkbox.kbq-pseudo-checkbox_big{width:var(--kbq-checkbox-size-big-width);height:var(--kbq-checkbox-size-big-width);border-radius:var(--kbq-checkbox-size-big-border-radius);border-width:var(--kbq-checkbox-size-big-border-width)}.kbq-pseudo-checkbox{border-color:var(--kbq-checkbox-theme-default-border);background:var(--kbq-checkbox-theme-default-background)}.kbq-pseudo-checkbox .kbq-checkbox-checkmark,.kbq-pseudo-checkbox .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-theme-default-color)}.kbq-pseudo-checkbox.kbq-checked,.kbq-pseudo-checkbox.kbq-indeterminate{border-color:var(--kbq-checkbox-theme-states-checked-border);background:var(--kbq-checkbox-theme-states-checked-background)}.kbq-pseudo-checkbox.kbq-disabled .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-disabled .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-theme-states-disabled-color)}.kbq-pseudo-checkbox.kbq-disabled{border-color:var(--kbq-checkbox-theme-states-disabled-border);background:var(--kbq-checkbox-theme-states-disabled-background)}.kbq-pseudo-checkbox.kbq-error{border-color:var(--kbq-checkbox-error-default-border);background:var(--kbq-checkbox-error-default-background)}.kbq-pseudo-checkbox.kbq-error .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-error .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-error-default-color)}.kbq-pseudo-checkbox.kbq-error.kbq-checked,.kbq-pseudo-checkbox.kbq-error.kbq-indeterminate{border-color:var(--kbq-checkbox-error-states-checked-border);background:var(--kbq-checkbox-error-states-checked-background)}.kbq-pseudo-checkbox.kbq-error.kbq-disabled .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-error.kbq-disabled .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-error-states-disabled-color)}.kbq-pseudo-checkbox.kbq-error.kbq-disabled{border-color:var(--kbq-checkbox-error-states-disabled-border);background:var(--kbq-checkbox-error-states-disabled-background)}\n", ".kbq-pseudo-checkbox{--kbq-checkbox-size-normal-width: var(--kbq-size-l);--kbq-checkbox-size-normal-border-width: var(--kbq-size-border-width);--kbq-checkbox-size-normal-border-radius: var(--kbq-size-xxs);--kbq-checkbox-size-normal-horizontal-content-padding: var(--kbq-size-s);--kbq-checkbox-size-normal-vertical-content-padding: var(--kbq-size-3xs);--kbq-checkbox-size-normal-top: var(--kbq-size-3xs);--kbq-checkbox-size-big-width: var(--kbq-size-l);--kbq-checkbox-size-big-border-width: var(--kbq-size-border-width);--kbq-checkbox-size-big-border-radius: var(--kbq-size-xxs);--kbq-checkbox-size-big-horizontal-content-padding: var(--kbq-size-s);--kbq-checkbox-size-big-vertical-content-padding: var(--kbq-size-3xs);--kbq-checkbox-size-big-top: var(--kbq-size-xxs);--kbq-checkbox-theme-default-border: var(--kbq-line-contrast-fade);--kbq-checkbox-theme-default-color: var(--kbq-icon-white);--kbq-checkbox-theme-default-text: var(--kbq-foreground-contrast);--kbq-checkbox-theme-default-background: var(--kbq-background-bg);--kbq-checkbox-theme-default-caption: var(--kbq-foreground-contrast-secondary);--kbq-checkbox-theme-states-hover-border: var(--kbq-line-contrast-fade);--kbq-checkbox-theme-states-hover-background: var(--kbq-states-background-transparent-hover);--kbq-checkbox-theme-states-checked-border: transparent;--kbq-checkbox-theme-states-checked-background: var(--kbq-background-theme);--kbq-checkbox-theme-states-checked-hover-border: transparent;--kbq-checkbox-theme-states-checked-hover-background: var(--kbq-states-background-theme-hover);--kbq-checkbox-theme-states-focused-border: var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-focused-background: var(--kbq-background-bg);--kbq-checkbox-theme-states-focused-outline: 1px solid var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-checked-focused-border: var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-checked-focused-background: var(--kbq-background-theme);--kbq-checkbox-theme-states-checked-focused-outline: 1px solid var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-disabled-border: var(--kbq-states-line-disabled);--kbq-checkbox-theme-states-disabled-color: var(--kbq-states-icon-disabled);--kbq-checkbox-theme-states-disabled-text: var(--kbq-states-foreground-disabled);--kbq-checkbox-theme-states-disabled-background: var(--kbq-states-background-disabled);--kbq-checkbox-theme-states-disabled-caption: var(--kbq-states-icon-disabled);--kbq-checkbox-error-default-border: var(--kbq-line-error);--kbq-checkbox-error-default-color: var(--kbq-icon-white);--kbq-checkbox-error-default-text: var(--kbq-foreground-contrast);--kbq-checkbox-error-default-background: var(--kbq-background-error-less);--kbq-checkbox-error-default-caption: var(--kbq-foreground-contrast-secondary);--kbq-checkbox-error-states-hover-border: var(--kbq-line-error);--kbq-checkbox-error-states-hover-background: var(--kbq-states-background-error-fade-hover);--kbq-checkbox-error-states-checked-border: transparent;--kbq-checkbox-error-states-checked-background: var(--kbq-background-error);--kbq-checkbox-error-states-checked-hover-border: transparent;--kbq-checkbox-error-states-checked-hover-background: var(--kbq-states-background-error-hover);--kbq-checkbox-error-states-focused-border: var(--kbq-line-error);--kbq-checkbox-error-states-focused-background: var(--kbq-background-error-less);--kbq-checkbox-error-states-focused-outline: 1px solid var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-checked-focused-border: var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-checked-focused-background: var(--kbq-background-error);--kbq-checkbox-error-states-checked-focused-outline: 1px solid var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-disabled-border: var(--kbq-states-line-disabled);--kbq-checkbox-error-states-disabled-color: var(--kbq-states-icon-disabled);--kbq-checkbox-error-states-disabled-text: var(--kbq-states-foreground-disabled);--kbq-checkbox-error-states-disabled-background: var(--kbq-states-background-disabled);--kbq-checkbox-error-states-disabled-caption: var(--kbq-states-icon-disabled)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5642
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckbox, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5643
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.30", type: KbqPseudoCheckbox, isStandalone: true, selector: "kbq-pseudo-checkbox", inputs: { big: { classPropertyName: "big", publicName: "big", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.kbq-checkbox_big": "big()", "class.kbq-indeterminate": "state() === \"indeterminate\"", "class.kbq-checked": "state() === true || state() === \"checked\"", "class.kbq-disabled": "disabled()" }, classAttribute: "kbq-pseudo-checkbox" }, usesInheritance: true, ngImport: i0, template: "<i class=\"kbq-checkbox-checkmark kbq kbq-check-s_16\"></i>\n<i class=\"kbq-checkbox-mixedmark kbq kbq-minus-s_16\"></i>\n", styles: [".kbq-pseudo-checkbox{position:relative;display:inline-flex;box-sizing:border-box;align-items:center;justify-content:center;width:var(--kbq-checkbox-size-normal-width);height:var(--kbq-checkbox-size-normal-width);border-radius:var(--kbq-checkbox-size-normal-border-radius);border-width:var(--kbq-checkbox-size-normal-border-width);border-style:solid;cursor:pointer;vertical-align:middle;flex-shrink:0}.kbq-pseudo-checkbox .kbq-checkbox-checkmark,.kbq-pseudo-checkbox .kbq-checkbox-mixedmark{display:none}.kbq-pseudo-checkbox.kbq-pseudo-checkbox-checked,.kbq-pseudo-checkbox.kbq-pseudo-checkbox-indeterminate{border-color:transparent}.kbq-pseudo-checkbox.kbq-checked .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-indeterminate .kbq-checkbox-mixedmark{display:inline-block}.kbq-pseudo-checkbox.kbq-disabled{cursor:default}.kbq-pseudo-checkbox.kbq-pseudo-checkbox_big{width:var(--kbq-checkbox-size-big-width);height:var(--kbq-checkbox-size-big-width);border-radius:var(--kbq-checkbox-size-big-border-radius);border-width:var(--kbq-checkbox-size-big-border-width)}.kbq-pseudo-checkbox{border-color:var(--kbq-checkbox-theme-default-border);background:var(--kbq-checkbox-theme-default-background)}.kbq-pseudo-checkbox .kbq-checkbox-checkmark,.kbq-pseudo-checkbox .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-theme-default-color)}.kbq-pseudo-checkbox.kbq-checked,.kbq-pseudo-checkbox.kbq-indeterminate{border-color:var(--kbq-checkbox-theme-states-checked-border);background:var(--kbq-checkbox-theme-states-checked-background)}.kbq-pseudo-checkbox.kbq-disabled .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-disabled .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-theme-states-disabled-color)}.kbq-pseudo-checkbox.kbq-disabled{border-color:var(--kbq-checkbox-theme-states-disabled-border);background:var(--kbq-checkbox-theme-states-disabled-background)}.kbq-pseudo-checkbox.kbq-error{border-color:var(--kbq-checkbox-error-default-border);background:var(--kbq-checkbox-error-default-background)}.kbq-pseudo-checkbox.kbq-error .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-error .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-error-default-color)}.kbq-pseudo-checkbox.kbq-error.kbq-checked,.kbq-pseudo-checkbox.kbq-error.kbq-indeterminate{border-color:var(--kbq-checkbox-error-states-checked-border);background:var(--kbq-checkbox-error-states-checked-background)}.kbq-pseudo-checkbox.kbq-error.kbq-disabled .kbq-checkbox-checkmark,.kbq-pseudo-checkbox.kbq-error.kbq-disabled .kbq-checkbox-mixedmark{color:var(--kbq-checkbox-error-states-disabled-color)}.kbq-pseudo-checkbox.kbq-error.kbq-disabled{border-color:var(--kbq-checkbox-error-states-disabled-border);background:var(--kbq-checkbox-error-states-disabled-background)}\n", ".kbq-pseudo-checkbox{--kbq-checkbox-size-normal-width: var(--kbq-size-l);--kbq-checkbox-size-normal-border-width: var(--kbq-size-border-width);--kbq-checkbox-size-normal-border-radius: var(--kbq-size-xxs);--kbq-checkbox-size-normal-horizontal-content-padding: var(--kbq-size-s);--kbq-checkbox-size-normal-vertical-content-padding: var(--kbq-size-3xs);--kbq-checkbox-size-normal-top: var(--kbq-size-3xs);--kbq-checkbox-size-big-width: var(--kbq-size-l);--kbq-checkbox-size-big-border-width: var(--kbq-size-border-width);--kbq-checkbox-size-big-border-radius: var(--kbq-size-xxs);--kbq-checkbox-size-big-horizontal-content-padding: var(--kbq-size-s);--kbq-checkbox-size-big-vertical-content-padding: var(--kbq-size-3xs);--kbq-checkbox-size-big-top: var(--kbq-size-xxs);--kbq-checkbox-theme-default-border: var(--kbq-line-contrast-fade);--kbq-checkbox-theme-default-color: var(--kbq-icon-white);--kbq-checkbox-theme-default-text: var(--kbq-foreground-contrast);--kbq-checkbox-theme-default-background: var(--kbq-background-bg);--kbq-checkbox-theme-default-caption: var(--kbq-foreground-contrast-secondary);--kbq-checkbox-theme-states-hover-border: var(--kbq-line-contrast-fade);--kbq-checkbox-theme-states-hover-background: var(--kbq-states-background-transparent-hover);--kbq-checkbox-theme-states-checked-border: transparent;--kbq-checkbox-theme-states-checked-background: var(--kbq-background-theme);--kbq-checkbox-theme-states-checked-hover-border: transparent;--kbq-checkbox-theme-states-checked-hover-background: var(--kbq-states-background-theme-hover);--kbq-checkbox-theme-states-focused-border: var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-focused-background: var(--kbq-background-bg);--kbq-checkbox-theme-states-focused-outline: 1px solid var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-checked-focused-border: var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-checked-focused-background: var(--kbq-background-theme);--kbq-checkbox-theme-states-checked-focused-outline: 1px solid var(--kbq-states-line-focus-theme);--kbq-checkbox-theme-states-disabled-border: var(--kbq-states-line-disabled);--kbq-checkbox-theme-states-disabled-color: var(--kbq-states-icon-disabled);--kbq-checkbox-theme-states-disabled-text: var(--kbq-states-foreground-disabled);--kbq-checkbox-theme-states-disabled-background: var(--kbq-states-background-disabled);--kbq-checkbox-theme-states-disabled-caption: var(--kbq-states-icon-disabled);--kbq-checkbox-error-default-border: var(--kbq-line-error);--kbq-checkbox-error-default-color: var(--kbq-icon-white);--kbq-checkbox-error-default-text: var(--kbq-foreground-contrast);--kbq-checkbox-error-default-background: var(--kbq-background-error-less);--kbq-checkbox-error-default-caption: var(--kbq-foreground-contrast-secondary);--kbq-checkbox-error-states-hover-border: var(--kbq-line-error);--kbq-checkbox-error-states-hover-background: var(--kbq-states-background-error-fade-hover);--kbq-checkbox-error-states-checked-border: transparent;--kbq-checkbox-error-states-checked-background: var(--kbq-background-error);--kbq-checkbox-error-states-checked-hover-border: transparent;--kbq-checkbox-error-states-checked-hover-background: var(--kbq-states-background-error-hover);--kbq-checkbox-error-states-focused-border: var(--kbq-line-error);--kbq-checkbox-error-states-focused-background: var(--kbq-background-error-less);--kbq-checkbox-error-states-focused-outline: 1px solid var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-checked-focused-border: var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-checked-focused-background: var(--kbq-background-error);--kbq-checkbox-error-states-checked-focused-outline: 1px solid var(--kbq-states-line-focus-error);--kbq-checkbox-error-states-disabled-border: var(--kbq-states-line-disabled);--kbq-checkbox-error-states-disabled-color: var(--kbq-states-icon-disabled);--kbq-checkbox-error-states-disabled-text: var(--kbq-states-foreground-disabled);--kbq-checkbox-error-states-disabled-background: var(--kbq-states-background-disabled);--kbq-checkbox-error-states-disabled-caption: var(--kbq-states-icon-disabled)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4621
5644
  }
4622
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckbox, decorators: [{
5645
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckbox, decorators: [{
4623
5646
  type: Component,
4624
5647
  args: [{ selector: 'kbq-pseudo-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
4625
5648
  class: 'kbq-pseudo-checkbox',
@@ -4631,11 +5654,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4631
5654
  }], propDecorators: { big: [{ type: i0.Input, args: [{ isSignal: true, alias: "big", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
4632
5655
 
4633
5656
  class KbqPseudoCheckboxModule {
4634
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
4635
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckboxModule, imports: [KbqPseudoCheckbox], exports: [KbqPseudoCheckbox] }); }
4636
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckboxModule }); }
5657
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5658
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckboxModule, imports: [KbqPseudoCheckbox], exports: [KbqPseudoCheckbox] }); }
5659
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckboxModule }); }
4637
5660
  }
4638
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPseudoCheckboxModule, decorators: [{
5661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPseudoCheckboxModule, decorators: [{
4639
5662
  type: NgModule,
4640
5663
  args: [{
4641
5664
  imports: [KbqPseudoCheckbox],
@@ -4662,6 +5685,24 @@ function toggleSelectAll(adapter, options) {
4662
5685
  selectable.forEach((item) => adapter.setSelected(item, shouldSelect));
4663
5686
  return changed;
4664
5687
  }
5688
+ /**
5689
+ * State of a "select all" master checkbox over the same items {@link toggleSelectAll} would act on.
5690
+ *
5691
+ * Considers only selectable items, so items the toggle cannot reach (disabled, non-selectable) never
5692
+ * pin the checkbox to `indeterminate`. An empty selectable set reads as `unchecked`: there is nothing
5693
+ * to select, and `[].every()` being `true` would otherwise report a full selection.
5694
+ */
5695
+ function getSelectAllState(adapter) {
5696
+ const selectable = adapter.items.filter((item) => adapter.isSelectable(item));
5697
+ if (selectable.length === 0) {
5698
+ return 'unchecked';
5699
+ }
5700
+ const selected = selectable.filter((item) => adapter.isSelected(item)).length;
5701
+ if (selected === 0) {
5702
+ return 'unchecked';
5703
+ }
5704
+ return selected === selectable.length ? 'checked' : 'indeterminate';
5705
+ }
4665
5706
  /** Event emitted by the `onSelectAll` outputs when the select-all toggle runs. */
4666
5707
  class KbqSelectAllEvent {
4667
5708
  constructor(
@@ -4776,13 +5817,11 @@ class KbqOption extends KbqOptionBase {
4776
5817
  this._active = false;
4777
5818
  this.mostRecentViewValue = '';
4778
5819
  /**
4779
- * Flag that indicates whether the component is currently focused by a mouse interaction.
4780
- *
4781
- * When set to `true`, the component has focus resulting from a mouse click or
4782
- * other pointer event. It is automatically cleared when the component loses
4783
- * focus or if focus is obtained through keyboard navigation or programmatic means.
5820
+ * Whether the pointer is currently over this option. Cleared on `mouseleave` rather than when the
5821
+ * option is focused: hovering the option that is already active does not move the key manager's
5822
+ * index, so no focus follows and a flag cleared only there would stay armed indefinitely.
4784
5823
  */
4785
- this.isFocusedByMouse = false;
5824
+ this.hoveredByPointer = false;
4786
5825
  }
4787
5826
  // TODO: Skipped for migration because:
4788
5827
  // Accessor inputs cannot be migrated as they are too complex.
@@ -4868,12 +5907,9 @@ class KbqOption extends KbqOptionBase {
4868
5907
  this.emitSelectionChangeEvent();
4869
5908
  }
4870
5909
  }
5910
+ /** Moves keyboard focus to this option and reveals it — see {@link kbqFocusAndReveal}. */
4871
5911
  focus() {
4872
- const element = this.getHostElement();
4873
- if (typeof element.focus === 'function') {
4874
- element.focus({ preventScroll: this.isFocusedByMouse });
4875
- this.isFocusedByMouse = false;
4876
- }
5912
+ kbqFocusAndReveal(this.getHostElement(), this.hoveredByPointer);
4877
5913
  }
4878
5914
  /**
4879
5915
  * This method sets display styles on the option to make it appear
@@ -4912,7 +5948,11 @@ class KbqOption extends KbqOptionBase {
4912
5948
  }
4913
5949
  /** Ensures the option is selected when activated from the keyboard. */
4914
5950
  handleKeydown(event) {
4915
- if (event.keyCode === ENTER || event.keyCode === SPACE) {
5951
+ // Only claim the event when the option is actually going to react to it: a non-selectable
5952
+ // or disabled option has nothing to do with ENTER/SPACE, and swallowing the event anyway
5953
+ // would stop it from reaching an ancestor that might (e.g. a custom row built on top of a
5954
+ // non-selectable option, like a "select all" master checkbox).
5955
+ if ((event.keyCode === ENTER || event.keyCode === SPACE) && !this.disabled && this.selectable()) {
4916
5956
  this.selectViaInteraction();
4917
5957
  // Prevent the page from scrolling down and form submits.
4918
5958
  event.preventDefault();
@@ -4942,18 +5982,22 @@ class KbqOption extends KbqOptionBase {
4942
5982
  onMouseenter() {
4943
5983
  if (this.disabled)
4944
5984
  return;
4945
- this.isFocusedByMouse = true;
5985
+ this.hoveredByPointer = true;
4946
5986
  this.parent?.keyManager?.setActiveItem(this);
4947
5987
  }
4948
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOption, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
4949
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: KbqOption, isStandalone: true, selector: "kbq-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, userSelect: { classPropertyName: "userSelect", publicName: "userSelect", isSignal: true, isRequired: false, transformFunction: null }, showCheckbox: { classPropertyName: "showCheckbox", publicName: "showCheckbox", isSignal: false, isRequired: false, transformFunction: null }, viewValue: { classPropertyName: "viewValue", publicName: "viewValue", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onSelectionChange: "onSelectionChange" }, host: { listeners: { "click": "handleClick($event)", "mouseenter": "onMouseenter()", "keydown": "handleKeydown($event)" }, properties: { "attr.tabindex": "getTabIndex()", "class.kbq-selected": "selected", "class.kbq-option-multiple": "multiple", "class.kbq-active": "active", "class.kbq-disabled": "disabled", "id": "id" }, classAttribute: "kbq-option" }, providers: [
5988
+ /** @docs-private */
5989
+ onMouseleave() {
5990
+ this.hoveredByPointer = false;
5991
+ }
5992
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOption, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5993
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.30", type: KbqOption, isStandalone: true, selector: "kbq-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, userSelect: { classPropertyName: "userSelect", publicName: "userSelect", isSignal: true, isRequired: false, transformFunction: null }, showCheckbox: { classPropertyName: "showCheckbox", publicName: "showCheckbox", isSignal: false, isRequired: false, transformFunction: null }, viewValue: { classPropertyName: "viewValue", publicName: "viewValue", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onSelectionChange: "onSelectionChange" }, host: { listeners: { "click": "handleClick($event)", "mouseenter": "onMouseenter()", "mouseleave": "onMouseleave()", "keydown": "handleKeydown($event)" }, properties: { "attr.tabindex": "getTabIndex()", "class.kbq-selected": "selected", "class.kbq-option-multiple": "multiple", "class.kbq-active": "active", "class.kbq-disabled": "disabled", "id": "id" }, classAttribute: "kbq-option" }, providers: [
4950
5994
  {
4951
5995
  provide: KBQ_TITLE_TEXT_REF,
4952
5996
  useExisting: KbqOption
4953
5997
  }
4954
- ], viewQueries: [{ propertyName: "textElement", first: true, predicate: ["kbqTitleText"], descendants: true }], exportAs: ["kbqOption"], usesInheritance: true, ngImport: i0, template: "@if (showCheckbox) {\n <ng-content select=\"kbq-pseudo-checkbox\">\n <kbq-pseudo-checkbox [disabled]=\"disabled\" [state]=\"selected ? 'checked' : 'unchecked'\" />\n </ng-content>\n}\n\n<span #kbqTitleText class=\"kbq-option-text\">\n <ng-content />\n</span>\n", styles: [".kbq-truncate-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option{position:relative;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;outline:none;-webkit-tap-highlight-color:transparent;min-height:32px;gap:var(--kbq-size-s);border:var(--kbq-size-3xs) solid transparent;padding:var(--kbq-size-xxs) calc(var(--kbq-size-m) - var(--kbq-size-3xs))}.kbq-option .kbq-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option .kbq-list-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option .kbq-list-text:empty{display:none}.kbq-option .kbq-list-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option .kbq-list-option-caption{padding-top:var(--kbq-size-3xs)}.kbq-option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option>.kbq-pseudo-checkbox{margin-top:var(--kbq-size-3xs);align-self:baseline}.kbq-option{border-radius:var(--kbq-option-border-radius)}.kbq-option:not(.kbq-disabled){cursor:pointer}.kbq-option-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option-text:empty{display:none}.kbq-option-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option{background:var(--kbq-list-default-container-background)}.kbq-option .kbq-option-text{color:var(--kbq-list-default-text-color)}.kbq-option .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-default-icon-button-color)}.kbq-option .kbq-option-caption{color:var(--kbq-list-default-caption-color)}.kbq-option.kbq-active:not(.kbq-disabled){background:var(--kbq-list-states-hover-container-background)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-hover-text-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-hover-icon-button-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-hover-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-states-selected-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-selected-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-selected-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-states-selected-hover-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-states-selected-hover-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-hover-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-states-selected-hover-caption-color)}.kbq-option.kbq-disabled{background:var(--kbq-list-states-disabled-container-background)}.kbq-option.kbq-disabled .kbq-option-text{color:var(--kbq-list-states-disabled-text-color)}.kbq-option.kbq-disabled .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-disabled-icon-button-color)}.kbq-option.kbq-disabled .kbq-option-caption{color:var(--kbq-list-states-disabled-caption-color)}.kbq-option:is(.kbq-selected,.kbq-active):has(+:is(.kbq-selected,.kbq-active)){border-bottom-left-radius:0;border-bottom-right-radius:0}.kbq-option:is(.kbq-selected,.kbq-active)+:is(.kbq-selected,.kbq-active){border-top-left-radius:0;border-top-right-radius:0}.kbq-option-multiple.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-multiple-states-selected-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-multiple-states-selected-hover-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-multiple-states-selected-hover-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-hover-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-hover-caption-color)}.kbq-option{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-list-option-caption{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n", ".kbq-list,.kbq-list-selection{--kbq-list-size-container-padding-left: var(--kbq-size-m);--kbq-list-size-container-padding-right: var(--kbq-size-m);--kbq-list-size-container-padding-vertical: var(--kbq-size-xs);--kbq-list-size-container-content-gap-horizontal: var(--kbq-size-s);--kbq-list-size-container-content-gap-vertical: var(--kbq-size-3xs);--kbq-list-size-container-focus-outline-width: var(--kbq-size-3xs);--kbq-list-size-header-padding-top: var(--kbq-size-s);--kbq-list-size-header-padding-bottom: var(--kbq-size-xxs);--kbq-list-size-header-padding-horizontal: var(--kbq-size-m);--kbq-list-size-subheading-padding-top: var(--kbq-size-m);--kbq-list-size-subheading-padding-bottom: var(--kbq-size-xxs);--kbq-list-size-subheading-padding-horizontal: var(--kbq-size-m);--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled)}.kbq-option{--kbq-option-size-horizontal-padding: var(--kbq-size-m);--kbq-option-size-height: var(--kbq-size-3xl);--kbq-option-size-border-width: 2px;--kbq-option-border-radius: var(--kbq-size-xs)}.kbq-option{--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled)}\n"], dependencies: [{ kind: "ngmodule", type: KbqPseudoCheckboxModule }, { kind: "component", type: KbqPseudoCheckbox, selector: "kbq-pseudo-checkbox", inputs: ["big", "state", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5998
+ ], viewQueries: [{ propertyName: "textElement", first: true, predicate: ["kbqTitleText"], descendants: true }], exportAs: ["kbqOption"], usesInheritance: true, ngImport: i0, template: "@if (showCheckbox) {\n <ng-content select=\"kbq-pseudo-checkbox\">\n <kbq-pseudo-checkbox [disabled]=\"disabled\" [state]=\"selected ? 'checked' : 'unchecked'\" />\n </ng-content>\n}\n\n<span #kbqTitleText class=\"kbq-option-text\">\n <ng-content />\n</span>\n", styles: [".kbq-truncate-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option{position:relative;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;outline:none;-webkit-tap-highlight-color:transparent;min-height:32px;gap:var(--kbq-size-s);border:var(--kbq-size-3xs) solid transparent;padding:var(--kbq-size-xxs) calc(var(--kbq-size-m) - var(--kbq-size-3xs))}.kbq-option .kbq-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option .kbq-list-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option .kbq-list-text:empty{display:none}.kbq-option .kbq-list-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option .kbq-list-option-caption{padding-top:var(--kbq-size-3xs)}.kbq-option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option>.kbq-pseudo-checkbox{margin-top:var(--kbq-size-3xs);align-self:baseline}.kbq-option{border-radius:var(--kbq-option-border-radius)}.kbq-option:not(.kbq-disabled){cursor:pointer}.kbq-option-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option-text:empty{display:none}.kbq-option-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option{background:var(--kbq-list-default-container-background)}.kbq-option .kbq-option-text{color:var(--kbq-list-default-text-color)}.kbq-option .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-default-icon-button-color)}.kbq-option .kbq-option-caption{color:var(--kbq-list-default-caption-color)}.kbq-option.kbq-active:not(.kbq-disabled){background:var(--kbq-list-states-hover-container-background)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-hover-text-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-hover-icon-button-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-hover-caption-color)}.kbq-option:active:not(.kbq-disabled),.kbq-option.kbq-pressed:not(.kbq-disabled){background:var(--kbq-list-states-active-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-states-selected-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-selected-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-selected-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-states-selected-hover-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-states-selected-hover-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-hover-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-states-selected-hover-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled):active,.kbq-option.kbq-selected:not(.kbq-disabled).kbq-pressed{background:var(--kbq-list-states-selected-active-container-background)}.kbq-option.kbq-disabled{background:var(--kbq-list-states-disabled-container-background)}.kbq-option.kbq-disabled .kbq-option-text{color:var(--kbq-list-states-disabled-text-color)}.kbq-option.kbq-disabled .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-disabled-icon-button-color)}.kbq-option.kbq-disabled .kbq-option-caption{color:var(--kbq-list-states-disabled-caption-color)}.kbq-option.kbq-selected.kbq-disabled{background:var(--kbq-list-states-selected-container-background)}.kbq-option:is(.kbq-selected,.kbq-active):has(+:is(.kbq-selected,.kbq-active)){border-bottom-left-radius:0;border-bottom-right-radius:0}.kbq-option:is(.kbq-selected,.kbq-active)+:is(.kbq-selected,.kbq-active){border-top-left-radius:0;border-top-right-radius:0}.kbq-option-multiple.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-multiple-states-selected-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-multiple-states-selected-hover-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-multiple-states-selected-hover-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-hover-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-hover-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled):active,.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-pressed{background:var(--kbq-list-multiple-states-selected-active-container-background)}.kbq-option-multiple.kbq-selected.kbq-disabled{background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-list-option-caption{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n", "@charset \"UTF-8\";.kbq-list,.kbq-list-selection,.kbq-list-option.cdk-drag-preview,.kbq-list-drag-preview_text{--kbq-list-size-container-padding-left: var(--kbq-size-m);--kbq-list-size-container-padding-right: var(--kbq-size-m);--kbq-list-size-container-padding-vertical: var(--kbq-size-xxs);--kbq-list-size-container-content-gap-horizontal: var(--kbq-size-s);--kbq-list-size-container-content-gap-vertical: var(--kbq-size-3xs);--kbq-list-size-container-focus-outline-width: var(--kbq-size-3xs);--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled);--kbq-list-states-dragged-container-background: var(--kbq-background-card);--kbq-list-states-dragged-container-shadow: var(--kbq-shadow-popup)}.kbq-list-selection{--kbq-list-size-dragged-indicator-thickness: var(--kbq-size-3xs);--kbq-list-states-dragged-indicator-color: var(--kbq-line-theme)}.kbq-list-drag-preview_text{--kbq-list-size-drag-preview-max-width: 480px;--kbq-list-states-drag-preview-background: color-mix( in srgb, var(--kbq-background-card) calc(var(--kbq-opacity-overlay) * 100%), transparent )}.kbq-option{--kbq-option-size-horizontal-padding: var(--kbq-size-m);--kbq-option-size-height: var(--kbq-size-3xl);--kbq-option-size-border-width: 2px;--kbq-option-border-radius: var(--kbq-size-xs)}.kbq-option{--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled);--kbq-list-states-dragged-container-background: var(--kbq-background-card);--kbq-list-states-dragged-container-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "ngmodule", type: KbqPseudoCheckboxModule }, { kind: "component", type: KbqPseudoCheckbox, selector: "kbq-pseudo-checkbox", inputs: ["big", "state", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4955
5999
  }
4956
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOption, decorators: [{
6000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOption, decorators: [{
4957
6001
  type: Component,
4958
6002
  args: [{ selector: 'kbq-option', imports: [
4959
6003
  KbqPseudoCheckboxModule
@@ -4972,8 +6016,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
4972
6016
  '[id]': 'id',
4973
6017
  '(click)': 'handleClick($event)',
4974
6018
  '(mouseenter)': 'onMouseenter()',
6019
+ '(mouseleave)': 'onMouseleave()',
4975
6020
  '(keydown)': 'handleKeydown($event)'
4976
- }, exportAs: 'kbqOption', template: "@if (showCheckbox) {\n <ng-content select=\"kbq-pseudo-checkbox\">\n <kbq-pseudo-checkbox [disabled]=\"disabled\" [state]=\"selected ? 'checked' : 'unchecked'\" />\n </ng-content>\n}\n\n<span #kbqTitleText class=\"kbq-option-text\">\n <ng-content />\n</span>\n", styles: [".kbq-truncate-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option{position:relative;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;outline:none;-webkit-tap-highlight-color:transparent;min-height:32px;gap:var(--kbq-size-s);border:var(--kbq-size-3xs) solid transparent;padding:var(--kbq-size-xxs) calc(var(--kbq-size-m) - var(--kbq-size-3xs))}.kbq-option .kbq-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option .kbq-list-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option .kbq-list-text:empty{display:none}.kbq-option .kbq-list-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option .kbq-list-option-caption{padding-top:var(--kbq-size-3xs)}.kbq-option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option>.kbq-pseudo-checkbox{margin-top:var(--kbq-size-3xs);align-self:baseline}.kbq-option{border-radius:var(--kbq-option-border-radius)}.kbq-option:not(.kbq-disabled){cursor:pointer}.kbq-option-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option-text:empty{display:none}.kbq-option-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option{background:var(--kbq-list-default-container-background)}.kbq-option .kbq-option-text{color:var(--kbq-list-default-text-color)}.kbq-option .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-default-icon-button-color)}.kbq-option .kbq-option-caption{color:var(--kbq-list-default-caption-color)}.kbq-option.kbq-active:not(.kbq-disabled){background:var(--kbq-list-states-hover-container-background)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-hover-text-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-hover-icon-button-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-hover-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-states-selected-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-selected-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-selected-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-states-selected-hover-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-states-selected-hover-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-hover-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-states-selected-hover-caption-color)}.kbq-option.kbq-disabled{background:var(--kbq-list-states-disabled-container-background)}.kbq-option.kbq-disabled .kbq-option-text{color:var(--kbq-list-states-disabled-text-color)}.kbq-option.kbq-disabled .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-disabled-icon-button-color)}.kbq-option.kbq-disabled .kbq-option-caption{color:var(--kbq-list-states-disabled-caption-color)}.kbq-option:is(.kbq-selected,.kbq-active):has(+:is(.kbq-selected,.kbq-active)){border-bottom-left-radius:0;border-bottom-right-radius:0}.kbq-option:is(.kbq-selected,.kbq-active)+:is(.kbq-selected,.kbq-active){border-top-left-radius:0;border-top-right-radius:0}.kbq-option-multiple.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-multiple-states-selected-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-multiple-states-selected-hover-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-multiple-states-selected-hover-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-hover-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-hover-caption-color)}.kbq-option{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-list-option-caption{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n", ".kbq-list,.kbq-list-selection{--kbq-list-size-container-padding-left: var(--kbq-size-m);--kbq-list-size-container-padding-right: var(--kbq-size-m);--kbq-list-size-container-padding-vertical: var(--kbq-size-xs);--kbq-list-size-container-content-gap-horizontal: var(--kbq-size-s);--kbq-list-size-container-content-gap-vertical: var(--kbq-size-3xs);--kbq-list-size-container-focus-outline-width: var(--kbq-size-3xs);--kbq-list-size-header-padding-top: var(--kbq-size-s);--kbq-list-size-header-padding-bottom: var(--kbq-size-xxs);--kbq-list-size-header-padding-horizontal: var(--kbq-size-m);--kbq-list-size-subheading-padding-top: var(--kbq-size-m);--kbq-list-size-subheading-padding-bottom: var(--kbq-size-xxs);--kbq-list-size-subheading-padding-horizontal: var(--kbq-size-m);--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled)}.kbq-option{--kbq-option-size-horizontal-padding: var(--kbq-size-m);--kbq-option-size-height: var(--kbq-size-3xl);--kbq-option-size-border-width: 2px;--kbq-option-border-radius: var(--kbq-size-xs)}.kbq-option{--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled)}\n"] }]
6021
+ }, exportAs: 'kbqOption', template: "@if (showCheckbox) {\n <ng-content select=\"kbq-pseudo-checkbox\">\n <kbq-pseudo-checkbox [disabled]=\"disabled\" [state]=\"selected ? 'checked' : 'unchecked'\" />\n </ng-content>\n}\n\n<span #kbqTitleText class=\"kbq-option-text\">\n <ng-content />\n</span>\n", styles: [".kbq-truncate-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option{position:relative;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;outline:none;-webkit-tap-highlight-color:transparent;min-height:32px;gap:var(--kbq-size-s);border:var(--kbq-size-3xs) solid transparent;padding:var(--kbq-size-xxs) calc(var(--kbq-size-m) - var(--kbq-size-3xs))}.kbq-option .kbq-list-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option .kbq-list-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option .kbq-list-text:empty{display:none}.kbq-option .kbq-list-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option .kbq-list-option-caption{padding-top:var(--kbq-size-3xs)}.kbq-option{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.kbq-option>.kbq-pseudo-checkbox{margin-top:var(--kbq-size-3xs);align-self:baseline}.kbq-option{border-radius:var(--kbq-option-border-radius)}.kbq-option:not(.kbq-disabled){cursor:pointer}.kbq-option-text>*{margin:0;padding:0;font-weight:400;font-size:inherit}.kbq-option-text{display:flex;flex-direction:column;width:100%;box-sizing:content-box;overflow:hidden}.kbq-option-text:empty{display:none}.kbq-option-text{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kbq-option{background:var(--kbq-list-default-container-background)}.kbq-option .kbq-option-text{color:var(--kbq-list-default-text-color)}.kbq-option .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-default-icon-button-color)}.kbq-option .kbq-option-caption{color:var(--kbq-list-default-caption-color)}.kbq-option.kbq-active:not(.kbq-disabled){background:var(--kbq-list-states-hover-container-background)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-hover-text-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-hover-icon-button-color)}.kbq-option.kbq-active:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-hover-caption-color)}.kbq-option:active:not(.kbq-disabled),.kbq-option.kbq-pressed:not(.kbq-disabled){background:var(--kbq-list-states-active-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-states-selected-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-states-selected-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-states-selected-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-states-selected-hover-container-background)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-states-selected-hover-text-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-selected-hover-icon-button-color)}.kbq-option.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-states-selected-hover-caption-color)}.kbq-option.kbq-selected:not(.kbq-disabled):active,.kbq-option.kbq-selected:not(.kbq-disabled).kbq-pressed{background:var(--kbq-list-states-selected-active-container-background)}.kbq-option.kbq-disabled{background:var(--kbq-list-states-disabled-container-background)}.kbq-option.kbq-disabled .kbq-option-text{color:var(--kbq-list-states-disabled-text-color)}.kbq-option.kbq-disabled .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-states-disabled-icon-button-color)}.kbq-option.kbq-disabled .kbq-option-caption{color:var(--kbq-list-states-disabled-caption-color)}.kbq-option.kbq-selected.kbq-disabled{background:var(--kbq-list-states-selected-container-background)}.kbq-option:is(.kbq-selected,.kbq-active):has(+:is(.kbq-selected,.kbq-active)){border-bottom-left-radius:0;border-bottom-right-radius:0}.kbq-option:is(.kbq-selected,.kbq-active)+:is(.kbq-selected,.kbq-active){border-top-left-radius:0;border-top-right-radius:0}.kbq-option-multiple.kbq-selected:not(.kbq-disabled){background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-text{color:var(--kbq-list-multiple-states-selected-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled) .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active{background:var(--kbq-list-multiple-states-selected-hover-container-background)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-text{color:var(--kbq-list-multiple-states-selected-hover-text-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-list-multiple-states-selected-hover-icon-button-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-active .kbq-option-caption{color:var(--kbq-list-multiple-states-selected-hover-caption-color)}.kbq-option-multiple.kbq-selected:not(.kbq-disabled):active,.kbq-option-multiple.kbq-selected:not(.kbq-disabled).kbq-pressed{background:var(--kbq-list-multiple-states-selected-active-container-background)}.kbq-option-multiple.kbq-selected.kbq-disabled{background:var(--kbq-list-multiple-states-selected-container-background)}.kbq-option{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-list-option-caption{font-size:var(--kbq-typography-text-compact-font-size);font-style:var(--kbq-typography-text-compact-font-style);font-weight:var(--kbq-typography-text-compact-font-weight);line-height:var(--kbq-typography-text-compact-line-height);font-family:var(--kbq-typography-text-compact-font-family);text-transform:var(--kbq-typography-text-compact-text-transform);font-feature-settings:var(--kbq-typography-text-compact-font-feature-settings);letter-spacing:var(--kbq-typography-text-compact-letter-spacing)}\n", "@charset \"UTF-8\";.kbq-list,.kbq-list-selection,.kbq-list-option.cdk-drag-preview,.kbq-list-drag-preview_text{--kbq-list-size-container-padding-left: var(--kbq-size-m);--kbq-list-size-container-padding-right: var(--kbq-size-m);--kbq-list-size-container-padding-vertical: var(--kbq-size-xxs);--kbq-list-size-container-content-gap-horizontal: var(--kbq-size-s);--kbq-list-size-container-content-gap-vertical: var(--kbq-size-3xs);--kbq-list-size-container-focus-outline-width: var(--kbq-size-3xs);--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled);--kbq-list-states-dragged-container-background: var(--kbq-background-card);--kbq-list-states-dragged-container-shadow: var(--kbq-shadow-popup)}.kbq-list-selection{--kbq-list-size-dragged-indicator-thickness: var(--kbq-size-3xs);--kbq-list-states-dragged-indicator-color: var(--kbq-line-theme)}.kbq-list-drag-preview_text{--kbq-list-size-drag-preview-max-width: 480px;--kbq-list-states-drag-preview-background: color-mix( in srgb, var(--kbq-background-card) calc(var(--kbq-opacity-overlay) * 100%), transparent )}.kbq-option{--kbq-option-size-horizontal-padding: var(--kbq-size-m);--kbq-option-size-height: var(--kbq-size-3xl);--kbq-option-size-border-width: 2px;--kbq-option-border-radius: var(--kbq-size-xs)}.kbq-option{--kbq-list-default-container-background: transparent;--kbq-list-default-text-color: var(--kbq-foreground-contrast);--kbq-list-default-icon-color: var(--kbq-icon-contrast);--kbq-list-default-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-default-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-hover-container-background: var(--kbq-states-background-transparent-hover);--kbq-list-states-active-container-background: var(--kbq-states-background-transparent-active);--kbq-list-states-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-container-background: var(--kbq-background-theme-less);--kbq-list-multiple-states-selected-container-background: var(--kbq-background-contrast-less);--kbq-list-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-selected-hover-container-background: var(--kbq-states-background-theme-less-hover);--kbq-list-multiple-states-selected-hover-container-background: var(--kbq-states-background-contrast-less-hover);--kbq-list-states-selected-active-container-background: var(--kbq-states-background-theme-less-active);--kbq-list-multiple-states-selected-active-container-background: var(--kbq-states-background-contrast-less-active);--kbq-list-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-multiple-states-selected-hover-text-color: var(--kbq-foreground-contrast);--kbq-list-multiple-states-selected-hover-icon-color: var(--kbq-icon-contrast);--kbq-list-multiple-states-selected-hover-icon-button-color: var(--kbq-icon-contrast-fade);--kbq-list-multiple-states-selected-hover-caption-color: var(--kbq-foreground-contrast-secondary);--kbq-list-states-focused-focus-outline-color: var(--kbq-states-line-focus-theme);--kbq-list-states-disabled-container-background: transparent;--kbq-list-states-disabled-text-color: var(--kbq-states-foreground-disabled);--kbq-list-states-disabled-icon-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-icon-button-color: var(--kbq-states-icon-disabled);--kbq-list-states-disabled-caption-color: var(--kbq-states-foreground-disabled);--kbq-list-states-dragged-container-background: var(--kbq-background-card);--kbq-list-states-dragged-container-shadow: var(--kbq-shadow-popup)}\n"] }]
4977
6022
  }], propDecorators: { textElement: [{
4978
6023
  type: ViewChild,
4979
6024
  args: ['kbqTitleText', { static: false }]
@@ -5016,6 +6061,9 @@ function countGroupLabelsBeforeOption(optionIndex, options, optionGroups) {
5016
6061
  * @param currentScrollPosition Current scroll position of the panel.
5017
6062
  * @param panelHeight Height of the panel.
5018
6063
  * @docs-private
6064
+ * @deprecated Unused — an option reveals itself on focus through `KbqOption.focus`, which lets the
6065
+ * browser resolve the scroll container instead of computing an offset from a uniform row height. Will be
6066
+ * removed in the next major release.
5019
6067
  */
5020
6068
  function getOptionScrollPosition(optionIndex, optionHeight, currentScrollPosition, panelHeight) {
5021
6069
  const optionOffset = optionIndex * optionHeight;
@@ -5029,11 +6077,11 @@ function getOptionScrollPosition(optionIndex, optionHeight, currentScrollPositio
5029
6077
  }
5030
6078
 
5031
6079
  class KbqOptionModule {
5032
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
5033
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionModule, imports: [KbqPseudoCheckbox, KbqOption, KbqOptgroup, KbqOptionActionComponent], exports: [KbqOption, KbqOptgroup, KbqOptionActionComponent] }); }
5034
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionModule }); }
6080
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6081
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionModule, imports: [KbqPseudoCheckbox, KbqOption, KbqOptgroup, KbqOptionActionComponent], exports: [KbqOption, KbqOptgroup, KbqOptionActionComponent] }); }
6082
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionModule }); }
5035
6083
  }
5036
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOptionModule, decorators: [{
6084
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOptionModule, decorators: [{
5037
6085
  type: NgModule,
5038
6086
  args: [{
5039
6087
  imports: [KbqPseudoCheckbox, KbqOption, KbqOptgroup, KbqOptionActionComponent],
@@ -5114,10 +6162,10 @@ class KbqOverflowShadowContainer {
5114
6162
  .pipe(takeUntilDestroyed(this.destroyRef))
5115
6163
  .subscribe(() => this.checkOverflow());
5116
6164
  }
5117
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowContainer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5118
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.25", type: KbqOverflowShadowContainer, isStandalone: true, selector: "[kbqOverflowShadowContainer]", inputs: { debounce: { classPropertyName: "debounce", publicName: "debounce", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["kbqOverflowShadowContainer"], ngImport: i0 }); }
6165
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowContainer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6166
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqOverflowShadowContainer, isStandalone: true, selector: "[kbqOverflowShadowContainer]", inputs: { debounce: { classPropertyName: "debounce", publicName: "debounce", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["kbqOverflowShadowContainer"], ngImport: i0 }); }
5119
6167
  }
5120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowContainer, decorators: [{
6168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowContainer, decorators: [{
5121
6169
  type: Directive,
5122
6170
  args: [{
5123
6171
  selector: '[kbqOverflowShadowContainer]',
@@ -5144,10 +6192,10 @@ class KbqOverflowShadowTop {
5144
6192
  /** Value of `box-shadow` when the shadow is active. Defaults to the standard Koobiq token. */
5145
6193
  this.shadow = input('var(--kbq-shadow-overflow-normal-bottom)', ...(ngDevMode ? [{ debugName: "shadow" }] : []));
5146
6194
  }
5147
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowTop, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5148
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.25", type: KbqOverflowShadowTop, isStandalone: true, selector: "[kbqOverflowShadowTop]", inputs: { ref: { classPropertyName: "ref", publicName: "kbqOverflowShadowTop", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.box-shadow": "ref()?.overflow()?.top ? shadow() : null" } }, exportAs: ["kbqOverflowShadowTop"], ngImport: i0 }); }
6195
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowTop, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6196
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqOverflowShadowTop, isStandalone: true, selector: "[kbqOverflowShadowTop]", inputs: { ref: { classPropertyName: "ref", publicName: "kbqOverflowShadowTop", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.box-shadow": "ref()?.overflow()?.top ? shadow() : null" } }, exportAs: ["kbqOverflowShadowTop"], ngImport: i0 }); }
5149
6197
  }
5150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowTop, decorators: [{
6198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowTop, decorators: [{
5151
6199
  type: Directive,
5152
6200
  args: [{
5153
6201
  selector: '[kbqOverflowShadowTop]',
@@ -5170,10 +6218,10 @@ class KbqOverflowShadowBottom {
5170
6218
  /** Value of `box-shadow` when the shadow is active. Defaults to the standard Koobiq token. */
5171
6219
  this.shadow = input('var(--kbq-shadow-overflow-normal-top)', ...(ngDevMode ? [{ debugName: "shadow" }] : []));
5172
6220
  }
5173
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowBottom, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5174
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.25", type: KbqOverflowShadowBottom, isStandalone: true, selector: "[kbqOverflowShadowBottom]", inputs: { ref: { classPropertyName: "ref", publicName: "kbqOverflowShadowBottom", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.box-shadow": "ref()?.overflow()?.bottom ? shadow() : null" } }, exportAs: ["kbqOverflowShadowBottom"], ngImport: i0 }); }
6221
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowBottom, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6222
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqOverflowShadowBottom, isStandalone: true, selector: "[kbqOverflowShadowBottom]", inputs: { ref: { classPropertyName: "ref", publicName: "kbqOverflowShadowBottom", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.box-shadow": "ref()?.overflow()?.bottom ? shadow() : null" } }, exportAs: ["kbqOverflowShadowBottom"], ngImport: i0 }); }
5175
6223
  }
5176
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqOverflowShadowBottom, decorators: [{
6224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqOverflowShadowBottom, decorators: [{
5177
6225
  type: Directive,
5178
6226
  args: [{
5179
6227
  selector: '[kbqOverflowShadowBottom]',
@@ -5184,6 +6232,136 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5184
6232
  }]
5185
6233
  }], propDecorators: { ref: [{ type: i0.Input, args: [{ isSignal: true, alias: "kbqOverflowShadowBottom", required: false }] }], shadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "shadow", required: false }] }] } });
5186
6234
 
6235
+ /**
6236
+ * Scroll strategy that repositions the overlay on scroll and reports when the tracked element
6237
+ * moves outside its boundary:
6238
+ *
6239
+ * - With `originElement`: tracks the origin against each ancestor `CdkScrollable` container.
6240
+ * - Without `originElement`: tracks the overlay panel against the viewport.
6241
+ *
6242
+ * Two ways to react to the out-of-bounds event, usable independently or together:
6243
+ * - Subscribe to `hide` — a handle for callers that don't control how this strategy is
6244
+ * constructed (e.g. reaching into an existing component's `overlayRef.getConfig().scrollStrategy`
6245
+ * from the outside).
6246
+ * - Pass `onHide` via the factory returned by `kbqAutoHideScrollStrategyFactory` — for callers
6247
+ * that construct the strategy themselves.
6248
+ */
6249
+ class KbqAutoHideScrollStrategy {
6250
+ constructor(scrollDispatcher, viewportRuler, ngZone, config = {}, hooks) {
6251
+ this.scrollDispatcher = scrollDispatcher;
6252
+ this.viewportRuler = viewportRuler;
6253
+ this.ngZone = ngZone;
6254
+ this.config = config;
6255
+ this.hooks = hooks;
6256
+ this.hideSubject = new Subject();
6257
+ /** Emits once when the tracked element scrolls outside its boundary. */
6258
+ this.hide = this.hideSubject.asObservable();
6259
+ this.overlayRef = null;
6260
+ this.scrollSubscription = null;
6261
+ this.originElement = null;
6262
+ this.ancestorScrollContainers = null;
6263
+ }
6264
+ /** @docs-private */
6265
+ attach(overlayRef) {
6266
+ if (this.overlayRef && isDevMode()) {
6267
+ throw new Error('KbqAutoHideScrollStrategy: attach() has already been called for this instance.');
6268
+ }
6269
+ this.overlayRef = overlayRef;
6270
+ }
6271
+ /** Subscribes to scroll events and starts repositioning / out-of-bounds detection. */
6272
+ enable() {
6273
+ if (this.scrollSubscription)
6274
+ return;
6275
+ if (!this.overlayRef) {
6276
+ throw new Error('KbqAutoHideScrollStrategy: enable() was called before attach(). Call attach() first.');
6277
+ }
6278
+ const overlayRef = this.overlayRef;
6279
+ const { scrollThrottle = 20 } = this.config;
6280
+ this.originElement = this.config.originElement ?? this.resolveOriginElement(overlayRef);
6281
+ this.ancestorScrollContainers = this.originElement
6282
+ ? this.scrollDispatcher.getAncestorScrollContainers(this.originElement)
6283
+ : null;
6284
+ this.scrollSubscription = this.scrollDispatcher
6285
+ .scrolled(scrollThrottle)
6286
+ .pipe(filter((scrollable) => !scrollable || !overlayRef.overlayElement.contains(scrollable.getElementRef().nativeElement)))
6287
+ .subscribe(() => {
6288
+ const isOutside = this.originElement
6289
+ ? this.isOriginOutsideAncestors(this.originElement)
6290
+ : this.isOverlayOutsideViewport(overlayRef);
6291
+ if (isOutside) {
6292
+ this.disable();
6293
+ this.ngZone.run(() => {
6294
+ this.hideSubject.next();
6295
+ this.hooks?.onHide?.();
6296
+ });
6297
+ return;
6298
+ }
6299
+ overlayRef.updatePosition();
6300
+ });
6301
+ }
6302
+ /** Unsubscribes from scroll events. */
6303
+ disable() {
6304
+ this.scrollSubscription?.unsubscribe();
6305
+ this.scrollSubscription = null;
6306
+ }
6307
+ /** Disables the strategy and completes `hide`. */
6308
+ detach() {
6309
+ this.disable();
6310
+ this.hideSubject.complete();
6311
+ this.hooks = undefined;
6312
+ this.overlayRef = null;
6313
+ this.originElement = null;
6314
+ this.ancestorScrollContainers = null;
6315
+ }
6316
+ resolveOriginElement(overlayRef) {
6317
+ const positionStrategy = overlayRef.getConfig().positionStrategy;
6318
+ if (positionStrategy instanceof FlexibleConnectedPositionStrategy) {
6319
+ return this.coerceOriginElement(positionStrategy._origin);
6320
+ }
6321
+ return null;
6322
+ }
6323
+ isOriginOutsideAncestors(originElement) {
6324
+ const originRect = originElement.getBoundingClientRect();
6325
+ return (this.ancestorScrollContainers ?? []).some((scrollable) => this.isOutsideBounds(originRect, scrollable.getElementRef().nativeElement.getBoundingClientRect()));
6326
+ }
6327
+ isOverlayOutsideViewport(overlayRef) {
6328
+ const overlayRect = overlayRef.overlayElement.getBoundingClientRect();
6329
+ const { width, height } = this.viewportRuler.getViewportSize();
6330
+ return this.isOutsideBounds(overlayRect, { top: 0, left: 0, bottom: height, right: width });
6331
+ }
6332
+ isOutsideBounds(rect, containerRect) {
6333
+ return (rect.bottom < containerRect.top ||
6334
+ rect.top > containerRect.bottom ||
6335
+ rect.right < containerRect.left ||
6336
+ rect.left > containerRect.right);
6337
+ }
6338
+ coerceOriginElement(raw) {
6339
+ if (raw instanceof HTMLElement) {
6340
+ return raw;
6341
+ }
6342
+ else if (raw instanceof ElementRef && raw.nativeElement instanceof HTMLElement) {
6343
+ return raw.nativeElement;
6344
+ }
6345
+ return null;
6346
+ }
6347
+ }
6348
+ /**
6349
+ * Factory function for `KbqAutoHideScrollStrategy`. Use it directly as a `useFactory` value
6350
+ * when providing a component-level scroll strategy token (e.g. `KBQ_POPOVER_SCROLL_STRATEGY`).
6351
+ *
6352
+ * The returned function accepts an optional `hooks` object (see `KbqAutoHideScrollStrategyHooks`)
6353
+ * and an optional `config` (see `KbqAutoHideScrollStrategyConfig`).
6354
+ *
6355
+ * @example
6356
+ * ```ts
6357
+ * const createScrollStrategy = kbqAutoHideScrollStrategyFactory(scrollDispatcher, viewportRuler, ngZone);
6358
+ * const strategy = createScrollStrategy({ onHide: () => this.hide() }, { originElement });
6359
+ * ```
6360
+ */
6361
+ function kbqAutoHideScrollStrategyFactory(scrollDispatcher, viewportRuler, ngZone) {
6362
+ return (hooks, config) => new KbqAutoHideScrollStrategy(scrollDispatcher, viewportRuler, ngZone, config ?? {}, hooks);
6363
+ }
6364
+
5187
6365
  const POSITION_MAP = {
5188
6366
  top: {
5189
6367
  originX: 'center',
@@ -5434,6 +6612,200 @@ function objectValues(object) {
5434
6612
  return object === null ? [] : baseValues(object, Object.keys(object));
5435
6613
  }
5436
6614
 
6615
+ /**
6616
+ * Renders `panelMaxHeight` as a CSS length for the `--kbq-select-panel-size-max-height` token.
6617
+ *
6618
+ * A non-finite value yields `null` so that Angular removes the inline custom property and the stylesheet
6619
+ * default applies again. A negative value is clamped to `0` because `max-height` rejects negative lengths
6620
+ * at computed-value time, which would drop the declaration and leave the list unbounded rather than at
6621
+ * its default height.
6622
+ * @docs-private
6623
+ */
6624
+ function kbqResolvePanelMaxHeightToken(panelMaxHeight) {
6625
+ // `numberAttribute` coerces `null` and other invalid bindings to `NaN`, so guard on finiteness
6626
+ // rather than on `null`, which never reaches us from a template binding.
6627
+ return Number.isFinite(panelMaxHeight) ? coerceCssPixelValue(Math.max(panelMaxHeight, 0)) : null;
6628
+ }
6629
+ /**
6630
+ * Default cap of an overlay panel's scrollable content, in pixels. Mirrors the stylesheet default of
6631
+ * `--kbq-select-panel-size-max-height` so that the two cannot drift apart.
6632
+ * @docs-private
6633
+ */
6634
+ const KBQ_PANEL_DEFAULT_MAX_HEIGHT = 256;
6635
+ /**
6636
+ * Measures how much room the panel's scrollable list has on either side of the trigger.
6637
+ *
6638
+ * Returns `null` for geometry that cannot be trusted — a collapsed trigger rect or a zero-height viewport, which
6639
+ * is what a DOM without layout reports, on the server and under jsdom.
6640
+ * @docs-private
6641
+ */
6642
+ function kbqResolvePanelSideSpace(context) {
6643
+ const { triggerTop, triggerBottom, viewportHeight, viewportMargin, chromeHeight } = context;
6644
+ if (![triggerTop, triggerBottom, viewportHeight, viewportMargin, chromeHeight].every(Number.isFinite)) {
6645
+ return null;
6646
+ }
6647
+ if (viewportHeight <= 0 || triggerBottom <= triggerTop)
6648
+ return null;
6649
+ return {
6650
+ above: triggerTop - viewportMargin - chromeHeight,
6651
+ below: viewportHeight - triggerBottom - viewportMargin - chromeHeight
6652
+ };
6653
+ }
6654
+ /**
6655
+ * Distance from the trigger's top edge down to where a panel would start if the trigger had a single row —
6656
+ * equivalently, the trigger's height with rows 2..N removed.
6657
+ *
6658
+ * Returns `null` for geometry that cannot be trusted: a collapsed rect (the server, a DOM without layout), or
6659
+ * a row container that is not what drives the trigger's height, which a result reaching past the trigger's own
6660
+ * bottom edge gives away.
6661
+ * @docs-private
6662
+ */
6663
+ function kbqResolveTriggerFirstRowOffset(measurements) {
6664
+ const { originTop, originBottom, listTop, listBottom, firstRowBottom, listScrollTop } = measurements;
6665
+ if (![originTop, originBottom, listTop, listBottom, firstRowBottom, listScrollTop].every(Number.isFinite)) {
6666
+ return null;
6667
+ }
6668
+ const originHeight = originBottom - originTop;
6669
+ if (originHeight <= 0)
6670
+ return null;
6671
+ // The first row measured in the container's own, unscrolled coordinates, plus the chrome the trigger keeps
6672
+ // above and below its rows — the matcher's padding and the field's border.
6673
+ const firstRowHeight = firstRowBottom + listScrollTop - listTop;
6674
+ const offset = listTop - originTop + firstRowHeight + (originBottom - listBottom);
6675
+ return offset > 0 && offset <= originHeight ? offset : null;
6676
+ }
6677
+ /**
6678
+ * Room the panel's scrollable list has when it is anchored to the trigger's first row instead of to the
6679
+ * trigger's bottom edge. The same arithmetic as {@link kbqResolvePanelSideSpace}, on a trigger cut to one row.
6680
+ * @docs-private
6681
+ */
6682
+ function kbqResolveOverlapPanelSpace(context, firstRowOffset) {
6683
+ const space = kbqResolvePanelSideSpace({ ...context, triggerBottom: context.triggerTop + firstRowOffset });
6684
+ return space && space.below;
6685
+ }
6686
+ /**
6687
+ * Whether the panel should be anchored below the trigger's first row and rendered over the rest of it.
6688
+ *
6689
+ * Three things have to hold. The trigger must have more than one row, or there is nothing to overlap. It must
6690
+ * be taller than the panel, or the room beside it is the better trade and the panel belongs on a side. And
6691
+ * the panel must fit there at its full height — the caller adds this as a THIRD `ConnectedPosition`,
6692
+ * and when no position fits the overlay falls back to whichever goes off-screen the least, so an anchor that
6693
+ * does not fit would outrank `above`/`below` on that fallback and move panels that have no business moving.
6694
+ * Gating on the fit keeps the fallback ranking exactly as it is without this anchor.
6695
+ *
6696
+ * `anchored` widens the height test by one row, so that deselecting a single option cannot bounce a panel
6697
+ * sitting right on the boundary across several hundred pixels.
6698
+ * @docs-private
6699
+ */
6700
+ function kbqShouldAnchorPanelToFirstRow(context, { firstRowOffset, naturalListHeight, anchored = false }) {
6701
+ if (firstRowOffset === null)
6702
+ return false;
6703
+ if (!Number.isFinite(naturalListHeight))
6704
+ return false;
6705
+ // Read off the same rect the space calculation uses, so the two can never disagree.
6706
+ const triggerHeight = context.triggerBottom - context.triggerTop;
6707
+ // A single-row trigger has nothing to overlap.
6708
+ if (triggerHeight - firstRowOffset <= 1)
6709
+ return false;
6710
+ const hysteresis = anchored ? firstRowOffset : 0;
6711
+ if (triggerHeight + hysteresis <= context.chromeHeight + naturalListHeight)
6712
+ return false;
6713
+ // The overlay rejects a position whose top edge is off the top of the viewport, which a trigger scrolled
6714
+ // past the fold produces.
6715
+ if (context.triggerTop + firstRowOffset < 0)
6716
+ return false;
6717
+ const space = kbqResolveOverlapPanelSpace(context, firstRowOffset);
6718
+ return space !== null && space >= naturalListHeight;
6719
+ }
6720
+
6721
+ /**
6722
+ * Default minimum width of an overlay panel, in pixels.
6723
+ *
6724
+ * Kept in sync by hand with `--kbq-dropdown-size-container-width-min` in `dropdown-tokens.scss`,
6725
+ * which expresses the same default for the dropdown's CSS-driven sizing.
6726
+ */
6727
+ const KBQ_PANEL_DEFAULT_MIN_WIDTH = 200;
6728
+ /**
6729
+ * Measures the rendered width of a panel's trigger.
6730
+ *
6731
+ * Uses `getBoundingClientRect()` because `getComputedStyle().width` resolves to the used
6732
+ * content-box width regardless of `box-sizing`, so subtracting borders from it double-counts them.
6733
+ * @docs-private
6734
+ */
6735
+ function kbqGetPanelWidthOrigin(origin) {
6736
+ const element = origin instanceof CdkOverlayOrigin
6737
+ ? origin.elementRef.nativeElement
6738
+ : origin instanceof ElementRef
6739
+ ? origin.nativeElement
6740
+ : origin;
6741
+ return element.getBoundingClientRect().width;
6742
+ }
6743
+ /**
6744
+ * Resolves `panelWidth` and `panelMinWidth` into the `width` and `minWidth` of the overlay pane.
6745
+ *
6746
+ * `panelWidth` selects the sizing policy. The "never narrower than the trigger" rule belongs to the
6747
+ * automatic policies (`null` and `'auto'`); an explicit width is taken at face value.
6748
+ * @docs-private
6749
+ */
6750
+ function kbqResolvePanelWidth(panelWidth, panelMinWidth, triggerWidth) {
6751
+ // `numberAttribute` coerces `null` and other invalid bindings to `NaN`, so guard on finiteness
6752
+ // rather than on `null`, which never reaches us from a template binding.
6753
+ const min = Number.isFinite(panelMinWidth) ? Math.max(panelMinWidth, 0) : 0;
6754
+ const floor = Math.max(min, Number.isFinite(triggerWidth) ? triggerWidth : 0);
6755
+ // Trigger-sized. The floor is resolved here rather than emitted as `minWidth` because
6756
+ // `KbqAbstractSelect.setOverlayPosition()` clears `minWidth` on viewport overflow, after having
6757
+ // derived the panel offset from the pre-clear width.
6758
+ if (panelWidth === 'auto') {
6759
+ return { width: floor, minWidth: '' };
6760
+ }
6761
+ // Content-sized. Only `null`/`undefined`/`''` opt in — `0` is an explicit width. A non-finite
6762
+ // `panelWidth` (e.g. `NaN` from an upstream computation) is treated the same way rather than
6763
+ // reaching the DOM unguarded, mirroring how `panelMinWidth`/`triggerWidth` are handled above.
6764
+ if (panelWidth == null || panelWidth === '' || (typeof panelWidth === 'number' && !Number.isFinite(panelWidth))) {
6765
+ return { width: '', minWidth: floor };
6766
+ }
6767
+ // Explicit width. `panelMinWidth` is not applied.
6768
+ return { width: panelWidth, minWidth: '' };
6769
+ }
6770
+
6771
+ /**
6772
+ * Whether `point` lies within (or on the edge of) `rect`.
6773
+ * @docs-private
6774
+ */
6775
+ function isPointInRect(point, rect) {
6776
+ return point.x >= rect.left && point.x <= rect.right && point.y >= rect.top && point.y <= rect.bottom;
6777
+ }
6778
+ /**
6779
+ * Whether `point` lies within (or on the edge of) `triangle`.
6780
+ *
6781
+ * Uses the sign of the cross product of each triangle edge with the point: the point is inside
6782
+ * only if it's consistently on the same side of all three edges.
6783
+ * @docs-private
6784
+ */
6785
+ function isPointInTriangle(point, triangle) {
6786
+ const { a, b, c } = triangle;
6787
+ const sign = (p1, p2, p3) => (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
6788
+ const d1 = sign(point, a, b);
6789
+ const d2 = sign(point, b, c);
6790
+ const d3 = sign(point, c, a);
6791
+ const hasNegative = d1 < 0 || d2 < 0 || d3 < 0;
6792
+ const hasPositive = d1 > 0 || d2 > 0 || d3 > 0;
6793
+ return !(hasNegative && hasPositive);
6794
+ }
6795
+ /**
6796
+ * Builds the "safe triangle" connecting `origin` (typically the pointer position where it left a
6797
+ * trigger) to the top and bottom corners of `targetRect` (typically a submenu panel) that are nearest
6798
+ * to `origin` — the submenu can open on either side of its trigger, so the nearest edge is picked by
6799
+ * comparing distances rather than assuming a fixed side.
6800
+ * @docs-private
6801
+ */
6802
+ function getSafeTriangleVertices(origin, targetRect) {
6803
+ const nearX = Math.abs(targetRect.left - origin.x) <= Math.abs(targetRect.right - origin.x)
6804
+ ? targetRect.left
6805
+ : targetRect.right;
6806
+ return { a: origin, b: { x: nearX, y: targetRect.top }, c: { x: nearX, y: targetRect.bottom } };
6807
+ }
6808
+
5437
6809
  /**
5438
6810
  * Element used by {@link KbqShadowDomOverlayContainer} to locate the shadow root that should host overlays.
5439
6811
  *
@@ -5539,10 +6911,10 @@ class KbqShadowDomOverlayContainer extends OverlayContainer {
5539
6911
  // No explicit host provided — fall back to the application root component element.
5540
6912
  return this.applicationRef.components[0]?.location.nativeElement ?? null;
5541
6913
  }
5542
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqShadowDomOverlayContainer, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5543
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqShadowDomOverlayContainer }); }
6914
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqShadowDomOverlayContainer, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
6915
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqShadowDomOverlayContainer }); }
5544
6916
  }
5545
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqShadowDomOverlayContainer, decorators: [{
6917
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqShadowDomOverlayContainer, decorators: [{
5546
6918
  type: Injectable
5547
6919
  }] });
5548
6920
  /**
@@ -5575,6 +6947,24 @@ const kbqShadowDomOverlayProvider = (host) => {
5575
6947
  * InjectionToken for providing component with popup. Used in select and tree-select for tooltip.
5576
6948
  */
5577
6949
  const KBQ_PARENT_POPUP = new InjectionToken('kbq-parent-popup');
6950
+ /**
6951
+ * Element-level token for pop-ups sharing their trigger element with a tooltip. Multi-provided, so a single
6952
+ * element can carry several pop-ups at once — for example the filter-bar button with both a popover and a
6953
+ * dropdown attached to it.
6954
+ */
6955
+ const KBQ_SIBLING_POPUP = new InjectionToken('kbq-sibling-popup');
6956
+ /**
6957
+ * Builds the multi-provider entry a pop-up trigger adds to its own `providers` to announce itself to a
6958
+ * tooltip on the same element.
6959
+ *
6960
+ * Every concrete trigger has to add it on its own: Angular copies `providers` to a subclass only when that
6961
+ * subclass has no decorator of its own, so inheriting from an already-announced trigger is not enough.
6962
+ */
6963
+ const kbqSiblingPopupProvider = (popup) => ({
6964
+ provide: KBQ_SIBLING_POPUP,
6965
+ useExisting: popup,
6966
+ multi: true
6967
+ });
5578
6968
  var PopUpPlacements;
5579
6969
  (function (PopUpPlacements) {
5580
6970
  PopUpPlacements["Top"] = "top";
@@ -5616,6 +7006,32 @@ var PopUpSizes;
5616
7006
  * Tags Input, Timezone, TreeSelect).
5617
7007
  */
5618
7008
  const defaultOffsetY = 4;
7009
+ /**
7010
+ * Pane class applied to a connected overlay whose panel is positioned BELOW its trigger.
7011
+ *
7012
+ * Used instead of a physical `offsetY` gap: the pane sits flush with the trigger and the visual gap is
7013
+ * recreated as transparent `padding-top` inside the pane (see the `kbq-connected-overlay-gap` styles), so the
7014
+ * gap is covered by the pane (`pointer-events: auto`) and can no longer be clicked/hovered through.
7015
+ */
7016
+ const KBQ_CONNECTED_OVERLAY_BELOW_CLASS = 'kbq-connected-overlay_below';
7017
+ /**
7018
+ * Pane class applied to a connected overlay whose panel is positioned ABOVE its trigger (flipped).
7019
+ *
7020
+ * Mirror of {@link KBQ_CONNECTED_OVERLAY_BELOW_CLASS}: the visual gap is recreated as transparent
7021
+ * `padding-bottom` inside the pane so the flipped gap is not click/hover-through.
7022
+ */
7023
+ const KBQ_CONNECTED_OVERLAY_ABOVE_CLASS = 'kbq-connected-overlay_above';
7024
+ /**
7025
+ * Pane class applied to a connected overlay whose panel is anchored to the FIRST ROW of a trigger it
7026
+ * OVERLAPS — a multiline select whose tag rows have made it taller than the panel itself, with too little
7027
+ * room to open on either side of it.
7028
+ *
7029
+ * The panel ends up where it would for a single-row trigger, so the gap is the same transparent
7030
+ * `padding-top` as {@link KBQ_CONNECTED_OVERLAY_BELOW_CLASS}. It is a separate class because the room left
7031
+ * for the panel has to be measured from the first row rather than from the trigger's bottom edge, and the
7032
+ * class is how the component tells the two apart.
7033
+ */
7034
+ const KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS = 'kbq-connected-overlay_overlap';
5619
7035
  /**
5620
7036
  * Variable used for offsetY(X) calculations when applying Angular Overlay
5621
7037
  *
@@ -5770,10 +7186,10 @@ class KbqPopUp {
5770
7186
  this.renderer.setStyle(this.trigger.overlayRef?.overlayElement, oppositeSide, 'unset');
5771
7187
  }
5772
7188
  }
5773
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPopUp, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5774
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqPopUp, isStandalone: true, host: { listeners: { "mouseenter": "hovered.next(true)", "mouseleave": "hovered.next(false)" } }, ngImport: i0 }); }
7189
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPopUp, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7190
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqPopUp, isStandalone: true, host: { listeners: { "mouseenter": "hovered.next(true)", "mouseleave": "hovered.next(false)" } }, ngImport: i0 }); }
5775
7191
  }
5776
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPopUp, decorators: [{
7192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPopUp, decorators: [{
5777
7193
  type: Directive,
5778
7194
  args: [{
5779
7195
  host: {
@@ -5955,6 +7371,20 @@ class KbqPopUpTrigger {
5955
7371
  this._isOpen = value;
5956
7372
  this.popUpChangeDetectorRef.markForCheck();
5957
7373
  }
7374
+ /**
7375
+ * Whether the pop-up overlay is currently attached.
7376
+ *
7377
+ * Unlike `isOpen`, which follows the visibility of the pop-up component and therefore lags a task behind
7378
+ * `show()`/`hide()`, this flips synchronously — it is the window during which the overlay (and its
7379
+ * backdrop) is present in the DOM. Part of the {@link KbqSiblingPopup} contract.
7380
+ */
7381
+ get isAttached() {
7382
+ return !!this.instance;
7383
+ }
7384
+ /** Emits `true` when the pop-up opens and `false` when it closes. Part of the {@link KbqSiblingPopup} contract. */
7385
+ get openedChange() {
7386
+ return this.visibleChange;
7387
+ }
5958
7388
  /** Binds the DOM event listeners for the configured triggers. */
5959
7389
  ngOnInit() {
5960
7390
  this.initListeners();
@@ -6236,10 +7666,10 @@ class KbqPopUpTrigger {
6236
7666
  this.hide();
6237
7667
  });
6238
7668
  }
6239
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPopUpTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6240
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqPopUpTrigger, isStandalone: true, host: { listeners: { "mouseenter": "hovered.next(true)", "mouseleave": "hovered.next(false)" } }, ngImport: i0 }); }
7669
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPopUpTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7670
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqPopUpTrigger, isStandalone: true, host: { listeners: { "mouseenter": "hovered.next(true)", "mouseleave": "hovered.next(false)" } }, ngImport: i0 }); }
6241
7671
  }
6242
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqPopUpTrigger, decorators: [{
7672
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqPopUpTrigger, decorators: [{
6243
7673
  type: Directive,
6244
7674
  args: [{
6245
7675
  host: {
@@ -6259,8 +7689,18 @@ const KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD = 10;
6259
7689
  * this value or more away from the viewport boundary.
6260
7690
  */
6261
7691
  const SELECT_PANEL_VIEWPORT_PADDING = 8;
6262
- /** Injection token that determines the scroll handling while a select is open. */
6263
- const KBQ_SELECT_SCROLL_STRATEGY = new InjectionToken('kbq-select-scroll-strategy');
7692
+ /**
7693
+ * Injection token that determines the scroll handling while a select is open.
7694
+ *
7695
+ * The root default keeps the select usable when it is reached outside `KbqSelectModule`'s injector - imported
7696
+ * as a bare standalone component, pulled in through another standalone component (`KbqTimezoneSelect`,
7697
+ * `KbqCalendarHeader`), or rendered in a component built from the root injector, as `KbqModalService` does.
7698
+ * Providing the token anywhere still wins over this default.
7699
+ */
7700
+ const KBQ_SELECT_SCROLL_STRATEGY = new InjectionToken('kbq-select-scroll-strategy', {
7701
+ providedIn: 'root',
7702
+ factory: () => kbqSelectScrollStrategyProviderFactory(inject(Overlay))
7703
+ });
6264
7704
  /** @docs-private */
6265
7705
  function kbqSelectScrollStrategyProviderFactory(overlay) {
6266
7706
  return () => overlay.scrollStrategies.reposition();
@@ -6273,10 +7713,10 @@ const KBQ_SELECT_SCROLL_STRATEGY_PROVIDER = {
6273
7713
  };
6274
7714
 
6275
7715
  class KbqSelectTrigger {
6276
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6277
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqSelectTrigger, isStandalone: true, selector: "kbq-select-trigger, [kbq-select-trigger]", ngImport: i0 }); }
7716
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7717
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqSelectTrigger, isStandalone: true, selector: "kbq-select-trigger, [kbq-select-trigger]", ngImport: i0 }); }
6278
7718
  }
6279
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectTrigger, decorators: [{
7719
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectTrigger, decorators: [{
6280
7720
  type: Directive,
6281
7721
  args: [{
6282
7722
  selector: 'kbq-select-trigger, [kbq-select-trigger]'
@@ -6286,20 +7726,20 @@ class KbqSelectMatcher {
6286
7726
  constructor() {
6287
7727
  this.useDefaultHandlers = input(true, ...(ngDevMode ? [{ debugName: "useDefaultHandlers", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
6288
7728
  }
6289
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectMatcher, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6290
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.25", type: KbqSelectMatcher, isStandalone: true, selector: "kbq-select-matcher, [kbq-select-matcher]", inputs: { useDefaultHandlers: { classPropertyName: "useDefaultHandlers", publicName: "useDefaultHandlers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
7729
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectMatcher, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7730
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqSelectMatcher, isStandalone: true, selector: "kbq-select-matcher, [kbq-select-matcher]", inputs: { useDefaultHandlers: { classPropertyName: "useDefaultHandlers", publicName: "useDefaultHandlers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
6291
7731
  }
6292
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectMatcher, decorators: [{
7732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectMatcher, decorators: [{
6293
7733
  type: Directive,
6294
7734
  args: [{
6295
7735
  selector: 'kbq-select-matcher, [kbq-select-matcher]'
6296
7736
  }]
6297
7737
  }], propDecorators: { useDefaultHandlers: [{ type: i0.Input, args: [{ isSignal: true, alias: "useDefaultHandlers", required: false }] }] } });
6298
7738
  class KbqSelectSearchEmptyResult {
6299
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectSearchEmptyResult, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6300
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqSelectSearchEmptyResult, isStandalone: true, selector: "[kbq-select-search-empty-result]", host: { classAttribute: "kbq-select-search-empty-result kbq-select__no-options-message" }, exportAs: ["kbqSelectSearchEmptyResult"], ngImport: i0 }); }
7739
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectSearchEmptyResult, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7740
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqSelectSearchEmptyResult, isStandalone: true, selector: "[kbq-select-search-empty-result]", host: { classAttribute: "kbq-select-search-empty-result kbq-select__no-options-message" }, exportAs: ["kbqSelectSearchEmptyResult"], ngImport: i0 }); }
6301
7741
  }
6302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectSearchEmptyResult, decorators: [{
7742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectSearchEmptyResult, decorators: [{
6303
7743
  type: Directive,
6304
7744
  args: [{
6305
7745
  selector: '[kbq-select-search-empty-result]',
@@ -6310,10 +7750,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6310
7750
  }]
6311
7751
  }] });
6312
7752
  class KbqSelectFooter {
6313
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6314
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqSelectFooter, isStandalone: true, selector: "kbq-select-footer, [kbq-select-footer]", host: { classAttribute: "kbq-select__footer" }, ngImport: i0 }); }
7753
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7754
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqSelectFooter, isStandalone: true, selector: "kbq-select-footer, [kbq-select-footer]", host: { classAttribute: "kbq-select__footer" }, ngImport: i0 }); }
6315
7755
  }
6316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectFooter, decorators: [{
7756
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectFooter, decorators: [{
6317
7757
  type: Directive,
6318
7758
  args: [{
6319
7759
  selector: 'kbq-select-footer, [kbq-select-footer]',
@@ -6375,10 +7815,10 @@ class KbqSelectSearch {
6375
7815
  event.stopPropagation();
6376
7816
  }
6377
7817
  }
6378
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectSearch, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6379
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqSelectSearch, isStandalone: true, selector: "[kbqSelectSearch]", host: { listeners: { "keydown": "handleKeydown($event)" } }, exportAs: ["kbqSelectSearch"], ngImport: i0 }); }
7818
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectSearch, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
7819
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqSelectSearch, isStandalone: true, selector: "[kbqSelectSearch]", host: { listeners: { "keydown": "handleKeydown($event)" } }, exportAs: ["kbqSelectSearch"], ngImport: i0 }); }
6380
7820
  }
6381
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqSelectSearch, decorators: [{
7821
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqSelectSearch, decorators: [{
6382
7822
  type: Directive,
6383
7823
  args: [{
6384
7824
  selector: '[kbqSelectSearch]',
@@ -6396,8 +7836,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6396
7836
  */
6397
7837
  class KbqAbstractSelect {
6398
7838
  constructor() {
7839
+ /**
7840
+ * Row container of a multi-selection trigger. Absent for a single value, an empty trigger and a custom
7841
+ * matcher or trigger — all of which have no rows for the panel to anchor to.
7842
+ */
7843
+ this.multilineMatchList = viewChild('multilineMatchList', ...(ngDevMode ? [{ debugName: "multilineMatchList" }] : []));
7844
+ this.changeDetectorRef = inject(ChangeDetectorRef);
7845
+ this.window = inject(KBQ_WINDOW);
6399
7846
  /** Overlay panel class. */
6400
7847
  this.overlayPanelClass = 'kbq-select-overlay';
7848
+ /** Width of the overlay panel. */
7849
+ this.overlayWidth = '';
7850
+ /** Minimum width of the overlay panel. */
7851
+ this.overlayMinWidth = '';
7852
+ /**
7853
+ * Height of everything in the panel that is not the option list — the trigger gap the pane pads itself
7854
+ * with, the list padding, a search field and a footer.
7855
+ *
7856
+ * The same for every anchor: the below and overlap panes pad the top, the above pane pads the bottom, and
7857
+ * all three pad by the same gap — which is what keeps the anchor decision from feeding back into itself.
7858
+ */
7859
+ this.panelChromeHeight = 0;
7860
+ /** Transparent gap the pane pads itself with, which the anchor has to be raised by. */
7861
+ this.panelGapHeight = 0;
7862
+ /**
7863
+ * Cap the option list is rendered with, in pixels. Measured off the panel rather than derived from
7864
+ * `panelMaxHeight`, because `--kbq-select-panel-size-max-height` is what the list actually obeys and a
7865
+ * consumer can override it. Seeded with the stylesheet's own default, which is what a DOM that computes
7866
+ * no layout — the server, jsdom — leaves in force.
7867
+ */
7868
+ this.panelMaxHeightCap = KBQ_PANEL_DEFAULT_MAX_HEIGHT;
7869
+ this.resizeSubscription = Subscription.EMPTY;
7870
+ }
7871
+ /**
7872
+ * Resolves the overlay panel size for the current trigger geometry and stores it for the
7873
+ * `cdkConnectedOverlay` width bindings.
7874
+ */
7875
+ updateOverlayWidth(panelWidth, panelMinWidth, origin) {
7876
+ const { width, minWidth } = kbqResolvePanelWidth(panelWidth, panelMinWidth, kbqGetPanelWidthOrigin(origin));
7877
+ this.overlayWidth = width;
7878
+ this.overlayMinWidth = minWidth;
7879
+ }
7880
+ /**
7881
+ * Freezes the panel at its rendered width so that filtering the options does not reflow it.
7882
+ * Does nothing when the width is already pinned.
7883
+ */
7884
+ lockOverlayWidthForSearch(panel) {
7885
+ // Compare against the unset sentinel rather than a truthy check — `overlayWidth` can
7886
+ // legitimately resolve to `0` for an explicit zero-width panel, which is falsy but pinned.
7887
+ if (this.overlayWidth !== '')
7888
+ return;
7889
+ const measuredPanelWidth = panel?.nativeElement.getBoundingClientRect().width;
7890
+ if (measuredPanelWidth) {
7891
+ this.overlayWidth = measuredPanelWidth;
7892
+ }
6401
7893
  }
6402
7894
  setOverlayPosition() {
6403
7895
  if (!this.overlayDir.overlayRef)
@@ -6450,15 +7942,273 @@ class KbqAbstractSelect {
6450
7942
  this.overlayDir.overlayRef.overlayElement.style.maxWidth = 'unset';
6451
7943
  this.overlayDir.overlayRef.updatePosition();
6452
7944
  }
7945
+ /**
7946
+ * Returns `positions` with the first-row anchor added, updated or removed, or `null` when the array
7947
+ * already says what it should — so that the caller can skip the change detection an edit would need.
7948
+ *
7949
+ * The anchor goes LAST. The overlay returns on the first position that fits completely, so an entry at the
7950
+ * end is reached exactly when neither the below nor the above position works, which is the rule this
7951
+ * implements. Pass `null` to drop it again.
7952
+ *
7953
+ * The result is meant to be assigned to the field the `cdkConnectedOverlayPositions` input reads, NOT
7954
+ * handed to `withPositions()` on the strategy: `CdkConnectedOverlay.ngOnChanges` rebuilds the strategy
7955
+ * from that field on ANY input change — the width `lockOverlayWidthForSearch` pins is one — so a list
7956
+ * applied only to the strategy would be dropped again without a trace.
7957
+ */
7958
+ withOverlapPosition(positions, offsetY) {
7959
+ // `panelClass` is `string | string[]`, and `positions` is public, so an anchor can come back in a
7960
+ // shape a strict comparison would miss — which would append a second anchor on every recompute and
7961
+ // leave every one of them behind on close.
7962
+ const isOverlap = ({ panelClass }) => Array.isArray(panelClass)
7963
+ ? panelClass.includes(KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS)
7964
+ : panelClass === KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS;
7965
+ const current = positions.find(isOverlap);
7966
+ const withoutOverlap = () => positions.filter((position) => !isOverlap(position));
7967
+ if (offsetY === null)
7968
+ return current ? withoutOverlap() : null;
7969
+ // Rounded so that sub-pixel layout jitter cannot rebuild the array on every selection change.
7970
+ const roundedOffsetY = Math.round(offsetY);
7971
+ if (current?.offsetY === roundedOffsetY)
7972
+ return null;
7973
+ return [
7974
+ ...withoutOverlap(),
7975
+ {
7976
+ originX: 'start',
7977
+ originY: 'top',
7978
+ overlayX: 'start',
7979
+ overlayY: 'top',
7980
+ offsetY: roundedOffsetY,
7981
+ panelClass: KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS
7982
+ }
7983
+ ];
7984
+ }
7985
+ /**
7986
+ * Re-resolves the panel position with the first-row anchor brought up to date.
7987
+ *
7988
+ * Never call this from a `positionChange` subscriber: CDK records the position it applied AFTER the
7989
+ * subscriber returns, so an anchor resolved from inside that frame is overwritten by the pre-anchor
7990
+ * position, and `cdkConnectedOverlayLockPosition` then replays that stale one on the next scroll.
7991
+ */
7992
+ reanchorPanel() {
7993
+ // `hostElement` is nulled by `OverlayRef.dispose()`, which is what a queued call landing after the
7994
+ // component was destroyed has to be told apart by — `overlayRef` itself outlives disposal.
7995
+ if (!this.overlayDir?.overlayRef?.hostElement)
7996
+ return;
7997
+ // Only when the anchor actually moved. `setOverlayPosition()` is a one-shot: it clears the pane's
7998
+ // `minWidth` and derives the panel offset from the width it had before that, so a second run over
7999
+ // the same open measures a narrower pane. In RTL the pane's x is `documentWidth - (x + paneWidth)`,
8000
+ // so that narrower measurement moves the panel; in LTR only `left` is written and nothing moves.
8001
+ if (this.updatePanelAnchor()) {
8002
+ this.setOverlayPosition();
8003
+ }
8004
+ }
8005
+ /**
8006
+ * Re-resolves the anchor while the panel is open. A resize rewraps the trigger's rows and changes the
8007
+ * room beside it at once, and CDK re-applies the position on its own, so without this the anchor it
8008
+ * resolves against is the one measured for the old viewport.
8009
+ */
8010
+ subscribeToPanelResize() {
8011
+ this.resizeSubscription.unsubscribe();
8012
+ if (!this.multiline())
8013
+ return;
8014
+ this.resizeSubscription = fromEvent(this.window, 'resize')
8015
+ .pipe(debounceTime(50))
8016
+ .subscribe(() => this.reanchorPanel());
8017
+ }
8018
+ /** Drops the resize subscription the open set up. */
8019
+ unsubscribeFromPanelResize() {
8020
+ this.resizeSubscription.unsubscribe();
8021
+ }
8022
+ /**
8023
+ * Keeps the first-row anchor in `positions`: a third position that puts the panel just below the
8024
+ * trigger's first row and over the rest of it, for a multiline trigger that has grown taller than the
8025
+ * panel and fits on neither side of it.
8026
+ *
8027
+ * The anchor goes last, and the overlay stops at the first position that fits completely, so it is
8028
+ * reached exactly when neither `below` nor `above` works. `kbqShouldAnchorPanelToFirstRow` holds the
8029
+ * rest of the rule.
8030
+ *
8031
+ * Returns whether the array changed, so that a caller can skip the reposition an unchanged anchor does
8032
+ * not need. Updating the array is all there is to do here — `setOverlayPosition()` rebuilds the strategy
8033
+ * and resolves the position again.
8034
+ */
8035
+ updatePanelAnchor() {
8036
+ if (!this.multiline() || !this.isPanelOpen() || !this.overlayDir?.overlayRef)
8037
+ return false;
8038
+ // A measurement that cannot be trusted would leave the seeds in force, and a zero chrome height
8039
+ // overstates the room beside the trigger by the whole of a search field and a footer.
8040
+ if (!this.measurePanelChrome())
8041
+ return false;
8042
+ const context = this.resolvePanelSpaceContext();
8043
+ if (!context)
8044
+ return false;
8045
+ const firstRowOffset = this.resolveFirstRowOffset();
8046
+ const anchorToFirstRow = kbqShouldAnchorPanelToFirstRow(context, {
8047
+ firstRowOffset,
8048
+ naturalListHeight: this.measureNaturalListHeight(),
8049
+ anchored: this.isPanelAnchoredToFirstRow()
8050
+ });
8051
+ // The pane pads the gap inside itself, so the anchor is raised by it: the painted panel then starts
8052
+ // where the second row does, instead of leaving the top of that row's tags showing through the band.
8053
+ const offsetY = anchorToFirstRow && firstRowOffset !== null ? firstRowOffset - this.panelGapHeight : null;
8054
+ const positions = this.withOverlapPosition(this.positions, offsetY);
8055
+ if (!positions)
8056
+ return false;
8057
+ this.positions = positions;
8058
+ // Pushes the new array into `CdkConnectedOverlay`: the strategy is rebuilt from the directive's
8059
+ // input, not from this field, so without this the reposition would resolve against the old list.
8060
+ this.changeDetectorRef.detectChanges();
8061
+ return true;
8062
+ }
8063
+ /**
8064
+ * Distance from the origin's top edge to just below the trigger's first row, or `null` when there is no
8065
+ * row to anchor to.
8066
+ */
8067
+ resolveFirstRowOffset() {
8068
+ const origin = this.getOverlayOriginElement();
8069
+ const list = this.multilineMatchList()?.nativeElement;
8070
+ if (!origin || !list)
8071
+ return null;
8072
+ // The rows follow document order, so the scan stops at the first child that starts lower. Collapsed
8073
+ // children are skipped: a custom tag template can render a hidden node, and its all-zero rect would
8074
+ // otherwise be taken for the topmost row and push every real tag out of it.
8075
+ let firstRowTop = null;
8076
+ let firstRowBottom = Number.NEGATIVE_INFINITY;
8077
+ for (const child of Array.from(list.children)) {
8078
+ const { top, bottom, width, height } = child.getBoundingClientRect();
8079
+ // A collapsed child occupies no row and adds nothing to one, so it is skipped whichever way it
8080
+ // collapsed — its rect would otherwise be read as a row of its own.
8081
+ if (width === 0 || height === 0)
8082
+ continue;
8083
+ if (firstRowTop === null) {
8084
+ firstRowTop = top;
8085
+ // Sub-pixel layout only makes the tops of one row equal to within a pixel, and a custom tag
8086
+ // template can put several elements on the same row.
8087
+ }
8088
+ else if (top - firstRowTop >= 1) {
8089
+ break;
8090
+ }
8091
+ firstRowBottom = Math.max(firstRowBottom, bottom);
8092
+ }
8093
+ if (firstRowTop === null)
8094
+ return null;
8095
+ const originRect = origin.getBoundingClientRect();
8096
+ const listRect = list.getBoundingClientRect();
8097
+ return kbqResolveTriggerFirstRowOffset({
8098
+ originTop: originRect.top,
8099
+ originBottom: originRect.bottom,
8100
+ listTop: listRect.top,
8101
+ listBottom: listRect.bottom,
8102
+ firstRowBottom,
8103
+ // The rows keep their laid-out position while their container scrolls, so the scroll offset is
8104
+ // what converts them back into the list's own coordinates.
8105
+ listScrollTop: list.scrollTop
8106
+ });
8107
+ }
8108
+ /**
8109
+ * Height the option list takes with no viewport clamp in force.
8110
+ *
8111
+ * Read from `scrollHeight`, which reports the whole content rather than what the pane happens to show
8112
+ * right now — the anchor decision runs on a pane the overlay may be about to move.
8113
+ */
8114
+ measureNaturalListHeight() {
8115
+ if (this.isListHeightPinnedToCap())
8116
+ return this.panelMaxHeightCap;
8117
+ const content = this.optionsContainer()?.nativeElement;
8118
+ if (!content)
8119
+ return this.panelMaxHeightCap;
8120
+ // `clientHeight` less the computed content box is the list's own vertical padding, which
8121
+ // `scrollHeight` counts and the cap does not.
8122
+ const padding = content.clientHeight - parseFloat(this.window.getComputedStyle(content).height);
8123
+ return Math.min(this.panelMaxHeightCap, content.scrollHeight - (Number.isFinite(padding) ? padding : 0));
8124
+ }
8125
+ /**
8126
+ * Whether the option list renders at the cap whatever its content is, which a
8127
+ * `cdk-virtual-scroll-viewport` does by pinning both its `min-height` and its `max-height` to the token.
8128
+ */
8129
+ isListHeightPinnedToCap() {
8130
+ return false;
8131
+ }
8132
+ /** Geometry the panel height calculation needs, or `null` when there is nothing to measure against. */
8133
+ resolvePanelSpaceContext() {
8134
+ const origin = this.getOverlayOriginElement();
8135
+ if (!origin)
8136
+ return null;
8137
+ const { top, bottom } = origin.getBoundingClientRect();
8138
+ return {
8139
+ triggerTop: top,
8140
+ triggerBottom: bottom,
8141
+ // `clientHeight`, not `innerHeight`: the overlay narrows the viewport the same way, and the two
8142
+ // differ by the horizontal scrollbar — enough for a position we think fits to be rejected.
8143
+ viewportHeight: this.window.document.documentElement.clientHeight,
8144
+ viewportMargin: this.viewportMargin,
8145
+ chromeHeight: this.panelChromeHeight
8146
+ };
8147
+ }
8148
+ /** Whether the panel is currently drawn over the trigger, read from the class the overlay applies. */
8149
+ isPanelAnchoredToFirstRow() {
8150
+ return this.overlayDir.overlayRef.overlayElement.classList.contains(KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS);
8151
+ }
8152
+ /**
8153
+ * Records the part of the panel that is not the option list, the gap the pane pads itself with, and the
8154
+ * cap the list is rendered with. Returns `false` when the panel cannot be measured, which is the caller's
8155
+ * signal to leave the anchor alone rather than decide against a stale value.
8156
+ */
8157
+ measurePanelChrome() {
8158
+ const pane = this.overlayDir.overlayRef.overlayElement;
8159
+ const content = this.optionsContainer()?.nativeElement;
8160
+ if (!content)
8161
+ return false;
8162
+ // `--kbq-select-panel-size-max-height` caps the list's *content box* — the scroller is `box-sizing:
8163
+ // initial` — so its own padding counts as chrome. The computed `height` is that content box, which is
8164
+ // exactly what the cap has to be measured against.
8165
+ const { height, maxHeight } = this.window.getComputedStyle(content);
8166
+ const { paddingTop, paddingBottom } = this.window.getComputedStyle(pane);
8167
+ const chromeHeight = pane.getBoundingClientRect().height - parseFloat(height);
8168
+ const cap = parseFloat(maxHeight);
8169
+ if (!Number.isFinite(chromeHeight) || chromeHeight < 0)
8170
+ return false;
8171
+ this.panelChromeHeight = chromeHeight;
8172
+ // Whichever side the current position pads, the gap is the same one the anchored pane will pad.
8173
+ this.panelGapHeight = Math.max(parseFloat(paddingTop) || 0, parseFloat(paddingBottom) || 0);
8174
+ // `none`, `''` and a DOM without layout all yield NaN, which leaves the seed in force.
8175
+ if (Number.isFinite(cap) && cap > 0) {
8176
+ this.panelMaxHeightCap = cap;
8177
+ }
8178
+ return true;
8179
+ }
6453
8180
  resolveSearchMinOptionsThreshold(value) {
6454
8181
  return value === 'auto' ? KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD : value;
6455
8182
  }
6456
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbstractSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
6457
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.25", type: KbqAbstractSelect, isStandalone: true, ngImport: i0 }); }
8183
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbstractSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
8184
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.30", type: KbqAbstractSelect, isStandalone: true, viewQueries: [{ propertyName: "multilineMatchList", first: true, predicate: ["multilineMatchList"], descendants: true, isSignal: true }], ngImport: i0 }); }
6458
8185
  }
6459
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqAbstractSelect, decorators: [{
8186
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqAbstractSelect, decorators: [{
6460
8187
  type: Directive
6461
- }] });
8188
+ }], propDecorators: { multilineMatchList: [{ type: i0.ViewChild, args: ['multilineMatchList', { isSignal: true }] }] } });
8189
+
8190
+ /**
8191
+ * Runs a consumer-supplied `compareWith` defensively: a comparator that throws is reported in dev mode
8192
+ * and treated as "no match", so one bad comparison cannot take a whole selection down with it.
8193
+ *
8194
+ * Callers own the `null` policy — `KbqSelect` refuses to match a `null` option value, `KbqListSelection`
8195
+ * lets the comparator decide — so nothing is filtered here.
8196
+ *
8197
+ * @docs-private
8198
+ */
8199
+ function runCompareWith(compareWith, first, second) {
8200
+ try {
8201
+ return compareWith(first, second);
8202
+ }
8203
+ catch (error) {
8204
+ if (isDevMode()) {
8205
+ // Notify developers of errors in their comparator.
8206
+ // eslint-disable-next-line no-console
8207
+ console.warn(error);
8208
+ }
8209
+ return false;
8210
+ }
8211
+ }
6462
8212
 
6463
8213
  /**
6464
8214
  * Returns an exception to be thrown when attempting to change a select's `multiple` option
@@ -6524,10 +8274,10 @@ class KbqMeasureScrollbarService {
6524
8274
  this.document.body.removeChild(scrollDiv);
6525
8275
  this._scrollBarWidth = width;
6526
8276
  }
6527
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqMeasureScrollbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6528
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqMeasureScrollbarService, providedIn: 'root' }); }
8277
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqMeasureScrollbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8278
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqMeasureScrollbarService, providedIn: 'root' }); }
6529
8279
  }
6530
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: KbqMeasureScrollbarService, decorators: [{
8280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqMeasureScrollbarService, decorators: [{
6531
8281
  type: Injectable,
6532
8282
  args: [{ providedIn: 'root' }]
6533
8283
  }], ctorParameters: () => [] });
@@ -6600,10 +8350,10 @@ class ThemeService {
6600
8350
  getTheme() {
6601
8351
  return this.current.value;
6602
8352
  }
6603
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6604
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ThemeService, providedIn: 'root' }); }
8353
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8354
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ThemeService, providedIn: 'root' }); }
6605
8355
  }
6606
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ThemeService, decorators: [{
8356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: ThemeService, decorators: [{
6607
8357
  type: Injectable,
6608
8358
  args: [{ providedIn: 'root' }]
6609
8359
  }], ctorParameters: () => [] });
@@ -6667,9 +8417,9 @@ function dispatchEvent(node, event) {
6667
8417
  function dispatchFakeEvent(node, type, canBubble) {
6668
8418
  return dispatchEvent(node, createFakeEvent(type, canBubble));
6669
8419
  }
6670
- /** Shorthand to dispatch a keyboard event with a specified key code. */
6671
- function dispatchKeyboardEvent(node, type, keyCode, target) {
6672
- return dispatchEvent(node, createKeyboardEvent(type, keyCode, target));
8420
+ /** Shorthand to dispatch a keyboard event with a specified key code and, optionally, a `KeyboardEvent.key`. */
8421
+ function dispatchKeyboardEvent(node, type, keyCode, target, key) {
8422
+ return dispatchEvent(node, createKeyboardEvent(type, keyCode, target, key));
6673
8423
  }
6674
8424
  /** Shorthand to dispatch a mouse event on the specified coordinates. */
6675
8425
  function dispatchMouseEvent(node, type, x = 0, y = 0, event = createMouseEvent(type, x, y)) {
@@ -6711,10 +8461,10 @@ class MockNgZone extends NgZone {
6711
8461
  simulateZoneExit() {
6712
8462
  this.onStable.emit(null);
6713
8463
  }
6714
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: MockNgZone, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6715
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: MockNgZone }); }
8464
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: MockNgZone, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8465
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: MockNgZone }); }
6716
8466
  }
6717
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: MockNgZone, decorators: [{
8467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: MockNgZone, decorators: [{
6718
8468
  type: Injectable
6719
8469
  }], ctorParameters: () => [] });
6720
8470
 
@@ -6744,11 +8494,11 @@ const validationTooltipShowDelay = 10;
6744
8494
  */
6745
8495
  const validationTooltipHideDelay = 3000;
6746
8496
 
6747
- const VERSION = new Version('20.1.0+sha-ba927bf');
8497
+ const VERSION = new Version('20.3.0+sha-47e0f25');
6748
8498
 
6749
8499
  /**
6750
8500
  * Generated bundle index. Do not edit.
6751
8501
  */
6752
8502
 
6753
- export { A, ALT, APOSTROPHE, ARROW_BOTTOM_MARGIN_AND_HALF_HEIGHT, AT_SIGN, AbsoluteDateFormatterImpurePipe, AbsoluteDateFormatterPipe, AbsoluteDateShortFormatterImpurePipe, AbsoluteDateShortFormatterPipe, AbsoluteDateTimeFormatterImpurePipe, AbsoluteDateTimeFormatterPipe, AbsoluteShortDateTimeFormatterImpurePipe, AbsoluteShortDateTimeFormatterPipe, ActiveDescendantKeyManager, B, BACKSLASH, BACKSPACE, BOTTOM_LEFT_POSITION_PRIORITY, BOTTOM_POSITION_PRIORITY, BOTTOM_RIGHT_POSITION_PRIORITY, BaseFormatterPipe, BaseLocaleAwareFormatterPipe, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, DateAdapter, DateFormatter, E, EIGHT, END, ENTER, EQUALS, ESCAPE, EXTENDED_OVERLAY_POSITIONS, EmptyFocusTrapStrategy, ErrorStateMatcher, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, FileValidators, FocusKeyManager, G, H, HOME, I, INSERT, J, K, KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER, KBQ_DATE_FORMATS, KBQ_DATE_LOCALE, KBQ_DATE_LOCALE_FACTORY, KBQ_DEFAULT_LOCALE_DATA_FACTORY, KBQ_DEFAULT_LOCALE_ID, KBQ_DEFAULT_PRECISION_SEPARATOR, KBQ_FORM_FIELD_REF, KBQ_INVALID_VALUE_ERROR, KBQ_LOCALE_DATA, KBQ_LOCALE_ID, KBQ_LOCALE_SERVICE, KBQ_LOCALE_SERVICE_LANG_ATTR_NAME, KBQ_NUMBER_FORMATTER_DEFAULT_OPTIONS, KBQ_NUMBER_FORMATTER_OPTIONS, KBQ_OPTION_ACTION_PARENT, KBQ_OPTION_PARENT_COMPONENT, KBQ_OVERFLOW_SHADOW_SOURCE, KBQ_PARENT_ANIMATION_COMPONENT, KBQ_PARENT_POPUP, KBQ_SELECT_SCROLL_STRATEGY, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER, KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD, KBQ_SHADOW_DOM_OVERLAY_HOST, KBQ_SIZE_UNITS_CONFIG, KBQ_SIZE_UNITS_DEFAULT_CONFIG, KBQ_TITLE_TEXT_REF, KBQ_WINDOW, KbqAbsoluteLongDatePipe, KbqAbsoluteLongDateTimePipe, KbqAbsoluteShortDatePipe, KbqAbsoluteShortDateTimePipe, KbqAbstractSelect, KbqActionContainer, KbqAnimationCurves, KbqAnimationDurations, KbqColorDirective, KbqComponentColors, KbqDataSizePipe, KbqDecimalPipe, KbqDefaultThemes, KbqErrorStateTracker, KbqFieldSizingContent, KbqForm, KbqFormElement, KbqFormattersModule, KbqFormsModule, KbqHighlightBackgroundPipe, KbqHighlightModule, KbqHighlightPipe, KbqHover, KbqLine, KbqLineSetter, KbqLocaleService, KbqLocaleServiceModule, KbqMeasureScrollbarService, KbqMeasurementSystem, KbqNormalizeWhitespace, KbqOptgroup, KbqOption, KbqOptionActionComponent, KbqOptionBase, KbqOptionModule, KbqOptionSelectionChange, KbqOverflowShadowBottom, KbqOverflowShadowContainer, KbqOverflowShadowTop, KbqPopUp, KbqPopUpTrigger, KbqPseudoCheckbox, KbqPseudoCheckboxModule, KbqRangeLongDatePipe, KbqRangeLongDateTimePipe, KbqRangeMiddleDateTimePipe, KbqRangeShortDatePipe, KbqRangeShortDateTimePipe, KbqReadStateDirective, KbqRectangleItem, KbqRelativeLongDatePipe, KbqRelativeLongDateTimePipe, KbqRelativeShortDatePipe, KbqRelativeShortDateTimePipe, KbqRoundDecimalPipe, KbqSelectAllEvent, KbqSelectFooter, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqSelectTrigger, KbqShadowDomOverlayContainer, KbqTableNumberPipe, KbqThemeSelector, KbqVirtualOption, L, LAST_MEDIA, LEFT_ARROW, LEFT_BOTTOM_POSITION_PRIORITY, LEFT_POSITION_PRIORITY, LEFT_TOP_POSITION_PRIORITY, ListKeyManager, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, MockNgZone, MultipleMode, N, NINE, NUMBER_FORMAT_REGEXP, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, POSITION_MAP, POSITION_PRIORITY_STRATEGY, POSITION_TO_CSS_MAP, PRINT_SCREEN, PasswordValidators, PopUpPlacements, PopUpSizes, PopUpTriggers, PopUpVisibility, Q, QUESTION_MARK, R, RIGHT_ARROW, RIGHT_BOTTOM_POSITION_PRIORITY, RIGHT_POSITION_PRIORITY, RIGHT_TOP_POSITION_PRIORITY, RangeDateFormatterImpurePipe, RangeDateFormatterPipe, RangeDateTimeFormatterImpurePipe, RangeDateTimeFormatterPipe, RangeMiddleDateTimeFormatterImpurePipe, RangeMiddleDateTimeFormatterPipe, RangeShortDateFormatterImpurePipe, RangeShortDateFormatterPipe, RangeShortDateTimeFormatterImpurePipe, RangeShortDateTimeFormatterPipe, RelativeDateFormatterImpurePipe, RelativeDateFormatterPipe, RelativeDateTimeFormatterImpurePipe, RelativeDateTimeFormatterPipe, RelativeShortDateFormatterImpurePipe, RelativeShortDateFormatterPipe, RelativeShortDateTimeFormatterImpurePipe, RelativeShortDateTimeFormatterPipe, S, SCROLL_LOCK, SELECT_PANEL_VIEWPORT_PADDING, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, ShowOnControlDirtyErrorStateMatcher, ShowOnFormSubmitErrorStateMatcher, ShowRequiredOnSubmitErrorStateMatcher, T, TAB, THREE, TILDE, TOP_LEFT_POSITION_PRIORITY, TOP_POSITION_PRIORITY, TOP_RIGHT_POSITION_PRIORITY, TWO, ThemePalette, ThemeService, U, UP_ARROW, V, VERSION, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, applyPopupMargins, checkAndNormalizeLocalizedNumber, countGroupLabelsBeforeOption, createFakeEvent, createKeyboardEvent, createMouseEvent, createTouchEvent, defaultOffsetY, dispatchEvent, dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent, dispatchTouchEvent, enUSFormattersData, enUSLocaleData, esLAFormattersData, esLALocaleData, escapeRegExp, fadeAnimation, formatNumberWithLocale, getFormattedSizeParts, getHumanizedBytes, getKbqSelectDynamicMultipleError, getKbqSelectNonArrayValueError, getKbqSelectNonFunctionValueError, getNodesWithoutComments, getOptionScrollPosition, hasModifierKey, isBoolean, isControl, isCopy, isDigit, isElement, isFunctionKey, isHorizontalMovement, isHtmlElement, isHtmlElementOrNull, isInput, isLeftBracket, isLetterKey, isMac, isNull, isNumberKey, isNumpadKey, isRightBracket, isSelectAll, isUndefined, isVerticalMovement, isWithin, kbqErrorStateMatcherProvider, kbqFilesizeFormatterConfigurationProvider, kbqHighlightBackgroundMark, kbqHighlightMark, kbqInjectNativeElement, kbqLocaleServiceLangAttrNameProvider, kbqSelectAnimations, kbqSelectScrollStrategyProviderFactory, kbqShadowDomOverlayProvider, leftIconClassName, mixinColor, mixinDisabled, mixinErrorState, mixinTabIndex, normalizeNumber, numberByParts, patchElementFocus, ptBRFormattersData, ptBRLocaleData, rightIconClassName, ruRUFormattersData, ruRULocaleData, selectEvents, shouldSelectSearchText, tkTMFormattersData, tkTMLocaleData, toggleSelectAll, typeInElement, validationTooltipHideDelay, validationTooltipShowDelay, wrappedErrorMessage };
8503
+ export { A, ALT, APOSTROPHE, ARROW_BOTTOM_MARGIN_AND_HALF_HEIGHT, AT_SIGN, AbsoluteDateFormatterImpurePipe, AbsoluteDateFormatterPipe, AbsoluteDateShortFormatterImpurePipe, AbsoluteDateShortFormatterPipe, AbsoluteDateTimeFormatterImpurePipe, AbsoluteDateTimeFormatterPipe, AbsoluteShortDateTimeFormatterImpurePipe, AbsoluteShortDateTimeFormatterPipe, ActiveDescendantKeyManager, B, BACKSLASH, BACKSPACE, BOTTOM_LEFT_POSITION_PRIORITY, BOTTOM_POSITION_PRIORITY, BOTTOM_RIGHT_POSITION_PRIORITY, BaseFormatterPipe, BaseLocaleAwareFormatterPipe, C, CAPS_LOCK, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, D, DASH, DELETE, DOWN_ARROW, DateAdapter, DateFormatter, DurationLongFormatterImpurePipe, DurationLongFormatterPipe, DurationShortFormatterImpurePipe, DurationShortFormatterPipe, DurationShortestFormatterImpurePipe, DurationShortestFormatterPipe, E, EIGHT, END, ENTER, EQUALS, ESCAPE, EXTENDED_OVERLAY_POSITIONS, EmptyFocusTrapStrategy, ErrorStateMatcher, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FOUR, FileValidators, FocusKeyManager, G, H, HOME, I, INSERT, J, K, KBQ_A11Y_LOCALE_CONFIGURATION, KBQ_CHECKABLE_CLICK_ACTION, KBQ_CHECKABLE_CONTROL_VALUE_ACCESSOR, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ORIGIN, KBQ_CONNECTED_OVERLAY_OVERLAP_CLASS, KBQ_CUSTOM_SCROLL_STRATEGY_PROVIDER, KBQ_DATE_FORMATS, KBQ_DATE_LOCALE, KBQ_DATE_LOCALE_FACTORY, KBQ_DATE_TIMEZONE, KBQ_DEFAULT_LOCALE_DATA_FACTORY, KBQ_DEFAULT_LOCALE_ID, KBQ_DEFAULT_PRECISION_SEPARATOR, KBQ_FORM_FIELD_REF, KBQ_INVALID_VALUE_ERROR, KBQ_LOCALE_DATA, KBQ_LOCALE_ID, KBQ_LOCALE_SERVICE, KBQ_LOCALE_SERVICE_LANG_ATTR_NAME, KBQ_NUMBER_FORMATTER_DEFAULT_OPTIONS, KBQ_NUMBER_FORMATTER_OPTIONS, KBQ_OPTION_ACTION_PARENT, KBQ_OPTION_PARENT_COMPONENT, KBQ_OVERFLOW_SHADOW_SOURCE, KBQ_PANEL_DEFAULT_MIN_WIDTH, KBQ_PARENT_ANIMATION_COMPONENT, KBQ_PARENT_POPUP, KBQ_SELECT_SCROLL_STRATEGY, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER, KBQ_SELECT_SEARCH_MIN_OPTIONS_THRESHOLD, KBQ_SHADOW_DOM_OVERLAY_HOST, KBQ_SIBLING_POPUP, KBQ_SIZE_UNITS_CONFIG, KBQ_SIZE_UNITS_DEFAULT_CONFIG, KBQ_TITLE_TEXT_REF, KBQ_WINDOW, KbqAbsoluteLongDatePipe, KbqAbsoluteLongDateTimePipe, KbqAbsoluteShortDatePipe, KbqAbsoluteShortDateTimePipe, KbqAbstractSelect, KbqActionContainer, KbqAnimationCurves, KbqAnimationDurations, KbqAutoHideScrollStrategy, KbqCheckable, KbqColorDirective, KbqComponentColors, KbqDataSizePipe, KbqDateTimezoneService, KbqDecimalPipe, KbqDefaultThemes, KbqDurationLongPipe, KbqDurationShortPipe, KbqDurationShortestPipe, KbqErrorStateTracker, KbqFieldSizingContent, KbqForm, KbqFormElement, KbqFormattersModule, KbqFormsModule, KbqHighlightBackgroundPipe, KbqHighlightModule, KbqHighlightPipe, KbqHover, KbqLine, KbqLineSetter, KbqLocaleService, KbqLocaleServiceModule, KbqMeasureScrollbarService, KbqMeasurementSystem, KbqNormalizeWhitespace, KbqOptgroup, KbqOption, KbqOptionActionComponent, KbqOptionBase, KbqOptionModule, KbqOptionSelectionChange, KbqOverflowShadowBottom, KbqOverflowShadowContainer, KbqOverflowShadowTop, KbqPopUp, KbqPopUpTrigger, KbqPseudoCheckbox, KbqPseudoCheckboxModule, KbqRangeLongDatePipe, KbqRangeLongDateTimePipe, KbqRangeMiddleDateTimePipe, KbqRangeShortDatePipe, KbqRangeShortDateTimePipe, KbqReadStateDirective, KbqRectangleItem, KbqRelativeLongDatePipe, KbqRelativeLongDateTimePipe, KbqRelativeShortDatePipe, KbqRelativeShortDateTimePipe, KbqRoundDecimalPipe, KbqSelectAllEvent, KbqSelectFooter, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqSelectTrigger, KbqShadowDomOverlayContainer, KbqTableNumberPipe, KbqThemeSelector, KbqVirtualOption, L, LAST_MEDIA, LEFT_ARROW, LEFT_BOTTOM_POSITION_PRIORITY, LEFT_POSITION_PRIORITY, LEFT_TOP_POSITION_PRIORITY, ListKeyManager, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, META, MUTE, MockNgZone, MultipleMode, N, NINE, NUMBER_FORMAT_REGEXP, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PAUSE, PERIOD, PLUS_SIGN, POSITION_MAP, POSITION_PRIORITY_STRATEGY, POSITION_TO_CSS_MAP, PRINT_SCREEN, PasswordValidators, PopUpPlacements, PopUpSizes, PopUpTriggers, PopUpVisibility, Q, QUESTION_MARK, R, RIGHT_ARROW, RIGHT_BOTTOM_POSITION_PRIORITY, RIGHT_POSITION_PRIORITY, RIGHT_TOP_POSITION_PRIORITY, RangeDateFormatterImpurePipe, RangeDateFormatterPipe, RangeDateTimeFormatterImpurePipe, RangeDateTimeFormatterPipe, RangeMiddleDateTimeFormatterImpurePipe, RangeMiddleDateTimeFormatterPipe, RangeShortDateFormatterImpurePipe, RangeShortDateFormatterPipe, RangeShortDateTimeFormatterImpurePipe, RangeShortDateTimeFormatterPipe, RelativeDateFormatterImpurePipe, RelativeDateFormatterPipe, RelativeDateTimeFormatterImpurePipe, RelativeDateTimeFormatterPipe, RelativeShortDateFormatterImpurePipe, RelativeShortDateFormatterPipe, RelativeShortDateTimeFormatterImpurePipe, RelativeShortDateTimeFormatterPipe, S, SCROLL_LOCK, SELECT_PANEL_VIEWPORT_PADDING, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, ShowOnControlDirtyErrorStateMatcher, ShowOnFormSubmitErrorStateMatcher, ShowRequiredOnSubmitErrorStateMatcher, T, TAB, THREE, TILDE, TOP_LEFT_POSITION_PRIORITY, TOP_POSITION_PRIORITY, TOP_RIGHT_POSITION_PRIORITY, TWO, ThemePalette, ThemeService, TransitionCheckState, U, UP_ARROW, V, VERSION, VOLUME_DOWN, VOLUME_UP, W, X, Y, Z, ZERO, applyPopupMargins, checkAndNormalizeLocalizedNumber, countGroupLabelsBeforeOption, createFakeEvent, createKeyboardEvent, createMouseEvent, createSearchPredicate, createTouchEvent, defaultOffsetY, dispatchEvent, dispatchFakeEvent, dispatchKeyboardEvent, dispatchMouseEvent, dispatchTouchEvent, enUSFormattersData, enUSLocaleData, esLAFormattersData, esLALocaleData, escapeRegExp, fadeAnimation, findSearchMatchRanges, formatNumberWithLocale, getFormattedSizeParts, getHumanizedBytes, getKbqSelectDynamicMultipleError, getKbqSelectNonArrayValueError, getKbqSelectNonFunctionValueError, getNodesWithoutComments, getOptionScrollPosition, getSafeTriangleVertices, getSelectAllState, hasModifierKey, isBoolean, isControl, isCopy, isDigit, isElement, isFunctionKey, isHorizontalMovement, isHtmlElement, isHtmlElementOrNull, isInput, isLeftBracket, isLetterKey, isMac, isNull, isNumberKey, isNumpadKey, isPointInRect, isPointInTriangle, isRightBracket, isSelectAll, isUndefined, isVerticalMovement, isWithin, kbqA11yLocaleConfigurationProvider, kbqAutoHideScrollStrategyFactory, kbqDateTimezoneProvider, kbqErrorStateMatcherProvider, kbqFilesizeFormatterConfigurationProvider, kbqFocusAndReveal, kbqFocusOptionActionOnTab, kbqGetPanelWidthOrigin, kbqHighlightBackgroundMark, kbqHighlightMark, kbqInjectA11yLocaleConfiguration, kbqInjectAutofilled, kbqInjectNativeElement, kbqLocaleServiceLangAttrNameProvider, kbqResolvePanelMaxHeightToken, kbqResolvePanelWidth, kbqResolveTimezoneOffset, kbqRevealSelection, kbqSelectAnimations, kbqSelectScrollStrategyProviderFactory, kbqSetSelectionRange, kbqShadowDomOverlayProvider, kbqSiblingPopupProvider, leftIconClassName, mixinColor, mixinDisabled, mixinErrorState, mixinTabIndex, normalizeNumber, normalizeSearchValue, numberByParts, patchElementFocus, ptBRFormattersData, ptBRLocaleData, rightIconClassName, ruRUFormattersData, ruRULocaleData, runCompareWith, selectEvents, shouldSelectSearchText, tkTMFormattersData, tkTMLocaleData, toggleSelectAll, tokenizeSearchQuery, typeInElement, validationTooltipHideDelay, validationTooltipShowDelay, wrappedErrorMessage };
6754
8504
  //# sourceMappingURL=koobiq-components-core.mjs.map