@koobiq/components 19.5.0 → 19.7.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 (197) hide show
  1. package/accordion/accordion-content.directive.d.ts +4 -0
  2. package/accordion/accordion-trigger.directive.d.ts +4 -0
  3. package/actions-panel/actions-panel-container.scss +6 -0
  4. package/actions-panel/actions-panel-tokens.scss +4 -1
  5. package/autocomplete/autocomplete.component.d.ts +6 -1
  6. package/autocomplete/autocomplete.module.d.ts +1 -1
  7. package/autocomplete/autocomplete.scss +14 -3
  8. package/badge/badge-tokens.scss +3 -3
  9. package/breadcrumbs/breadcrumbs.scss +0 -4
  10. package/button/button-group.d.ts +45 -0
  11. package/button/button-group.scss +17 -0
  12. package/button/button.component.d.ts +3 -0
  13. package/button/button.module.d.ts +2 -1
  14. package/button/public-api.d.ts +1 -0
  15. package/button-toggle/button-toggle-tokens.scss +1 -1
  16. package/checkbox/checkbox.d.ts +5 -4
  17. package/code-block/code-block-highlight.d.ts +1 -0
  18. package/code-block/code-block-tokens.scss +35 -16
  19. package/code-block/code-block.d.ts +8 -3
  20. package/core/error/error-state-matcher.d.ts +10 -0
  21. package/core/forms/_forms.scss +10 -3
  22. package/core/option/_option-action-theme.scss +1 -0
  23. package/core/option/action-container.scss +4 -6
  24. package/core/option/option.d.ts +8 -0
  25. package/core/option/option.scss +5 -0
  26. package/core/pop-up/pop-up-trigger.d.ts +1 -1
  27. package/core/select/common.d.ts +4 -4
  28. package/core/styles/common/_groups-mixins.scss +79 -0
  29. package/core/styles/common/_groups.scss +4 -34
  30. package/core/styles/common/_overlay.scss +4 -0
  31. package/core/styles/common/_select.scss +4 -0
  32. package/core/styles/theming/scrollbar-tokens.scss +6 -6
  33. package/core/styles/visual/_layout.scss +0 -2
  34. package/core/utils/utils.d.ts +2 -0
  35. package/core/validation/validation.d.ts +1 -1
  36. package/datepicker/datepicker-input.directive.d.ts +1 -0
  37. package/dropdown/dropdown-trigger.directive.d.ts +5 -0
  38. package/ellipsis-center/ellipsis-center.directive.d.ts +0 -1
  39. package/fesm2022/koobiq-components-accordion.mjs +52 -30
  40. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-actions-panel.mjs +12 -12
  42. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-alert.mjs +16 -16
  44. package/fesm2022/koobiq-components-app-switcher.mjs +25 -25
  45. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-autocomplete.mjs +39 -23
  47. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-badge.mjs +14 -14
  49. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-breadcrumbs.mjs +26 -26
  51. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-button-toggle.mjs +12 -12
  53. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-button.mjs +146 -24
  55. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  56. package/fesm2022/koobiq-components-checkbox.mjs +17 -19
  57. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-clamped-text.mjs +13 -13
  59. package/fesm2022/koobiq-components-code-block.mjs +43 -27
  60. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  61. package/fesm2022/koobiq-components-content-panel.mjs +28 -28
  62. package/fesm2022/koobiq-components-core.mjs +290 -250
  63. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-datepicker.mjs +40 -64
  65. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-divider.mjs +7 -7
  67. package/fesm2022/koobiq-components-dl.mjs +13 -13
  68. package/fesm2022/koobiq-components-dropdown.mjs +38 -21
  69. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
  71. package/fesm2022/koobiq-components-ellipsis-center.mjs +8 -9
  72. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  73. package/fesm2022/koobiq-components-empty-state.mjs +19 -19
  74. package/fesm2022/koobiq-components-file-upload.mjs +39 -39
  75. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-filter-bar.mjs +109 -97
  77. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-form-field.mjs +67 -60
  79. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-icon.mjs +31 -27
  81. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-inline-edit.mjs +108 -68
  83. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-input.mjs +22 -22
  85. package/fesm2022/koobiq-components-link.mjs +17 -17
  86. package/fesm2022/koobiq-components-link.mjs.map +1 -1
  87. package/fesm2022/koobiq-components-list.mjs +19 -19
  88. package/fesm2022/koobiq-components-loader-overlay.mjs +28 -19
  89. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-markdown.mjs +54 -22
  91. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-modal.mjs +40 -32
  93. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-navbar-ic.mjs +34 -34
  95. package/fesm2022/koobiq-components-navbar.mjs +45 -45
  96. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  97. package/fesm2022/koobiq-components-notification-center.mjs +16 -16
  98. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  99. package/fesm2022/koobiq-components-overflow-items.mjs +16 -16
  100. package/fesm2022/koobiq-components-popover.mjs +52 -23
  101. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
  103. package/fesm2022/koobiq-components-progress-spinner.mjs +14 -14
  104. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  105. package/fesm2022/koobiq-components-radio.mjs +10 -10
  106. package/fesm2022/koobiq-components-resizer.mjs +10 -10
  107. package/fesm2022/koobiq-components-risk-level.mjs +7 -7
  108. package/fesm2022/koobiq-components-scrollbar.mjs +12 -12
  109. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-search-expandable.mjs +17 -8
  111. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-select.mjs +368 -63
  113. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-sidebar.mjs +13 -13
  115. package/fesm2022/koobiq-components-sidepanel.mjs +27 -27
  116. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  117. package/fesm2022/koobiq-components-skeleton.mjs +51 -18
  118. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  119. package/fesm2022/koobiq-components-split-button.mjs +9 -9
  120. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  121. package/fesm2022/koobiq-components-splitter.mjs +16 -16
  122. package/fesm2022/koobiq-components-table.mjs +10 -10
  123. package/fesm2022/koobiq-components-tabs.mjs +52 -52
  124. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  125. package/fesm2022/koobiq-components-tags.mjs +79 -64
  126. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  127. package/fesm2022/koobiq-components-textarea.mjs +7 -7
  128. package/fesm2022/koobiq-components-time-range.mjs +24 -24
  129. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  130. package/fesm2022/koobiq-components-timepicker.mjs +10 -10
  131. package/fesm2022/koobiq-components-timezone.mjs +26 -26
  132. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  133. package/fesm2022/koobiq-components-title.mjs +8 -9
  134. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  135. package/fesm2022/koobiq-components-toast.mjs +16 -16
  136. package/fesm2022/koobiq-components-toggle.mjs +12 -9
  137. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  138. package/fesm2022/koobiq-components-tooltip.mjs +84 -51
  139. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  140. package/fesm2022/koobiq-components-top-bar.mjs +15 -15
  141. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  142. package/fesm2022/koobiq-components-tree-select.mjs +12 -10
  143. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  144. package/fesm2022/koobiq-components-tree.mjs +41 -42
  145. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  146. package/fesm2022/koobiq-components-username.mjs +28 -28
  147. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  148. package/filter-bar/filter-search.d.ts +10 -1
  149. package/filter-bar/pipes/pipe-date.scss +2 -1
  150. package/form-field/_form-field-theme.scss +10 -2
  151. package/form-field/form-field-tokens.scss +1 -0
  152. package/form-field/form-field.d.ts +19 -1
  153. package/form-field/form-field.scss +41 -2
  154. package/icon/icon-button.component.d.ts +3 -0
  155. package/inline-edit/inline-edit-tokens.scss +3 -3
  156. package/inline-edit/inline-edit.d.ts +30 -11
  157. package/inline-edit/inline-edit.scss +28 -30
  158. package/link/_link-theme.scss +3 -1
  159. package/link/link-tokens.scss +7 -6
  160. package/link/link.component.d.ts +5 -4
  161. package/loader-overlay/_loader-overlay-theme.scss +12 -0
  162. package/loader-overlay/loader-overlay-tokens.scss +1 -0
  163. package/loader-overlay/loader-overlay.component.d.ts +7 -1
  164. package/markdown/_markdown-theme.scss +3 -31
  165. package/markdown/markdown-tokens.scss +0 -11
  166. package/markdown/markdown.component.d.ts +11 -6
  167. package/markdown/markdown.scss +0 -11
  168. package/navbar/navbar.scss +3 -0
  169. package/package.json +4 -5
  170. package/popover/popover.component.d.ts +15 -2
  171. package/prebuilt-themes/dark-theme.css +1 -1
  172. package/prebuilt-themes/light-theme.css +1 -1
  173. package/prebuilt-themes/theme.css +1 -1
  174. package/progress-spinner/progress-spinner.scss +1 -0
  175. package/schematics/ng-add/index.js +4 -5
  176. package/scrollbar/scrollbar-tokens.scss +7 -7
  177. package/search-expandable/search-expandable.d.ts +6 -2
  178. package/select/public-api.d.ts +1 -0
  179. package/select/select-common.d.ts +30 -0
  180. package/select/select-tokens.scss +2 -2
  181. package/select/select.component.d.ts +201 -29
  182. package/select/select.module.d.ts +3 -2
  183. package/sidepanel/sidepanel-config.d.ts +6 -1
  184. package/skeleton/skeleton.d.ts +8 -4
  185. package/skeleton/skeleton.scss +19 -5
  186. package/split-button/_split-button-theme.scss +2 -1
  187. package/tags/tag-list.component.d.ts +15 -11
  188. package/tags/tag-tokens.scss +4 -4
  189. package/tags/tag.component.d.ts +5 -2
  190. package/timezone/timezone-option-tokens.scss +0 -10
  191. package/title/title.directive.d.ts +0 -1
  192. package/toggle/toggle.component.d.ts +4 -3
  193. package/tooltip/_tooltip-theme.scss +5 -1
  194. package/tooltip/tooltip-tokens.scss +4 -4
  195. package/tooltip/tooltip.component.d.ts +20 -2
  196. package/top-bar/top-bar.scss +3 -0
  197. package/tree/tree-option.scss +7 -0
@@ -1,9 +1,11 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, input, booleanAttribute, Directive, inject, InjectionToken, DestroyRef, EventEmitter, output, afterNextRender, isDevMode, ElementRef, TemplateRef, numberAttribute, Input, Output, ContentChild, ContentChildren, ViewChildren, ViewChild, Optional, Host, Self, Inject, ViewEncapsulation, NgModule } from '@angular/core';
3
+ import * as i1 from '@koobiq/components/progress-spinner';
4
+ import { KbqProgressSpinnerModule } from '@koobiq/components/progress-spinner';
1
5
  import { ContentObserver } from '@angular/cdk/observers';
2
6
  import { SharedResizeObserver } from '@angular/cdk/observers/private';
3
- import * as i0 from '@angular/core';
4
- import { inject, Directive, InjectionToken, DestroyRef, EventEmitter, afterNextRender, isDevMode, ElementRef, TemplateRef, booleanAttribute, numberAttribute, Input, Output, ContentChild, ContentChildren, ViewChildren, ViewChild, Optional, Host, Self, Inject, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
5
- import * as i1 from '@koobiq/components/core';
6
- import { KbqAbstractSelect, getKbqSelectDynamicMultipleError, getKbqSelectNonFunctionValueError, KbqVirtualOption, KbqComponentColors, KBQ_VALIDATION, KBQ_WINDOW, defaultOffsetY, isUndefined, getKbqSelectNonArrayValueError, KBQ_SELECT_SCROLL_STRATEGY, KBQ_LOCALE_SERVICE, kbqSelectAnimations, KbqSelectFooter, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqOption, KbqOptgroup, KBQ_OPTION_PARENT_COMPONENT, KBQ_PARENT_POPUP, KbqOptionModule, KbqSelectSearchEmptyResult, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER } from '@koobiq/components/core';
7
+ import * as i1$1 from '@koobiq/components/core';
8
+ import { KbqAbstractSelect, getKbqSelectDynamicMultipleError, getKbqSelectNonFunctionValueError, KbqVirtualOption, KbqComponentColors, KBQ_VALIDATION, KBQ_WINDOW, defaultOffsetY, isUndefined, getKbqSelectNonArrayValueError, KBQ_SELECT_SCROLL_STRATEGY, KBQ_LOCALE_SERVICE, kbqSelectAnimations, KbqSelectFooter, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqOption, KbqOptgroup, KBQ_OPTION_PARENT_COMPONENT, KBQ_PARENT_POPUP, KbqOptionModule, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER } from '@koobiq/components/core';
7
9
  import { KbqTooltipTrigger, KbqToolTipModule } from '@koobiq/components/tooltip';
8
10
  import { CdkMonitorFocus, A11yModule } from '@angular/cdk/a11y';
9
11
  import * as i3 from '@angular/cdk/bidi';
@@ -24,8 +26,99 @@ import * as i6 from '@koobiq/components/icon';
24
26
  import { KbqIconModule } from '@koobiq/components/icon';
25
27
  import { KbqTag, KbqTagsModule } from '@koobiq/components/tags';
26
28
  import { SizeXxs } from '@koobiq/design-tokens';
27
- import { Subject, defer, merge, Subscription, BehaviorSubject, fromEvent } from 'rxjs';
28
- import { switchMap, take, filter, map, delay, debounceTime, distinctUntilChanged, startWith, takeUntil } from 'rxjs/operators';
29
+ import { Subject, defer, merge, EMPTY, Subscription, BehaviorSubject, fromEvent } from 'rxjs';
30
+ import { switchMap, startWith, take, filter, map, delay, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
31
+
32
+ class KbqSelectLoading {
33
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectLoading, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: KbqSelectLoading, isStandalone: true, selector: "kbq-select-loading, [kbq-select-loading]", host: { classAttribute: "kbq-select-loading" }, exportAs: ["kbqSelectLoading"], ngImport: i0, template: `
35
+ <ng-content select="kbq-progress-spinner">
36
+ <div class="layout-row layout-margin-top-4xl layout-margin-bottom-4xl layout-align-center-center">
37
+ <kbq-progress-spinner [mode]="'indeterminate'" />
38
+ </div>
39
+ </ng-content>
40
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: KbqProgressSpinnerModule }, { kind: "component", type: i1.KbqProgressSpinner, selector: "kbq-progress-spinner", inputs: ["id", "value", "mode", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectLoading, decorators: [{
43
+ type: Component,
44
+ args: [{
45
+ selector: 'kbq-select-loading, [kbq-select-loading]',
46
+ imports: [
47
+ KbqProgressSpinnerModule
48
+ ],
49
+ template: `
50
+ <ng-content select="kbq-progress-spinner">
51
+ <div class="layout-row layout-margin-top-4xl layout-margin-bottom-4xl layout-align-center-center">
52
+ <kbq-progress-spinner [mode]="'indeterminate'" />
53
+ </div>
54
+ </ng-content>
55
+ `,
56
+ changeDetection: ChangeDetectionStrategy.OnPush,
57
+ exportAs: 'kbqSelectLoading',
58
+ host: {
59
+ class: 'kbq-select-loading'
60
+ }
61
+ }]
62
+ }] });
63
+ /**
64
+ * This component renders the error for a Select component.
65
+ * The error message can be displayed in two visual variants: a default centered layout (when [paging] is falsy)
66
+ * or a variant with left‑aligned text suitable for pagination controls (when [paging] is truthy).
67
+ */
68
+ class KbqSelectError {
69
+ constructor() {
70
+ /** Indicates whether styles for pagination controls should be used. */
71
+ this.paging = input(false, { transform: booleanAttribute });
72
+ }
73
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
74
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.20", type: KbqSelectError, isStandalone: true, selector: "kbq-select-error, [kbq-select-error]", inputs: { paging: { classPropertyName: "paging", publicName: "paging", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.kbq-select-error_default": "!paging()", "class.kbq-select-error_paging": "paging()" }, classAttribute: "kbq-select-error" }, exportAs: ["kbqSelectError"], ngImport: i0, template: `
75
+ <ng-content />
76
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column}:host.kbq-select-error_default{align-items:center;justify-content:center;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl)}:host.kbq-select-error_paging{justify-content:start}:host.kbq-select-error_paging ::ng-deep .kbq-select-error__text{padding-left:var(--kbq-size-l)}::ng-deep .kbq-select-error__text{margin-top:var(--kbq-size-xs);margin-bottom:var(--kbq-size-3xs);color:var(--kbq-foreground-error)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectError, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'kbq-select-error, [kbq-select-error]', template: `
81
+ <ng-content />
82
+ `, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'kbqSelectError', host: {
83
+ class: 'kbq-select-error',
84
+ '[class.kbq-select-error_default]': '!paging()',
85
+ '[class.kbq-select-error_paging]': 'paging()'
86
+ }, styles: [":host{display:flex;flex-direction:column}:host.kbq-select-error_default{align-items:center;justify-content:center;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl)}:host.kbq-select-error_paging{justify-content:start}:host.kbq-select-error_paging ::ng-deep .kbq-select-error__text{padding-left:var(--kbq-size-l)}::ng-deep .kbq-select-error__text{margin-top:var(--kbq-size-xs);margin-bottom:var(--kbq-size-3xs);color:var(--kbq-foreground-error)}\n"] }]
87
+ }] });
88
+ /**
89
+ * Marks an element as the error text container for a *KbqSelect* component.
90
+ */
91
+ class KbqSelectErrorText {
92
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectErrorText, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
93
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.20", type: KbqSelectErrorText, isStandalone: true, selector: "[kbq-select-error-text]", host: { classAttribute: "kbq-select-error__text" }, exportAs: ["kbqSelectErrorText"], ngImport: i0 }); }
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectErrorText, decorators: [{
96
+ type: Directive,
97
+ args: [{
98
+ selector: '[kbq-select-error-text]',
99
+ exportAs: 'kbqSelectErrorText',
100
+ host: {
101
+ class: 'kbq-select-error__text'
102
+ }
103
+ }]
104
+ }] });
105
+ /**
106
+ * Component that represents the empty state of a select dropdown.
107
+ */
108
+ class KbqSelectNoOptions {
109
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectNoOptions, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
110
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: KbqSelectNoOptions, isStandalone: true, selector: "kbq-select-no-options, [kbq-select-no-options]", host: { classAttribute: "kbq-select-no-options" }, exportAs: ["kbqSelectNoOptions"], ngImport: i0, template: `
111
+ <ng-content />
112
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:var(--kbq-size-3xl);padding-top:var(--kbq-size-3xl);color:var(--kbq-foreground-contrast-secondary)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
113
+ }
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectNoOptions, decorators: [{
115
+ type: Component,
116
+ args: [{ selector: 'kbq-select-no-options, [kbq-select-no-options]', template: `
117
+ <ng-content />
118
+ `, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'kbqSelectNoOptions', host: {
119
+ class: 'kbq-select-no-options'
120
+ }, styles: [":host{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:var(--kbq-size-3xl);padding-top:var(--kbq-size-3xl);color:var(--kbq-foreground-contrast-secondary)}\n"] }]
121
+ }] });
29
122
 
30
123
  class KbqOptionTooltip extends KbqTooltipTrigger {
31
124
  get textElement() {
@@ -73,10 +166,10 @@ class KbqOptionTooltip extends KbqTooltipTrigger {
73
166
  this.disabled = true;
74
167
  this.hide();
75
168
  }
76
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqOptionTooltip, deps: [{ token: i1.KbqOption }], target: i0.ɵɵFactoryTarget.Directive }); }
77
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.19", type: KbqOptionTooltip, isStandalone: true, selector: "kbq-option", host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" } }, usesInheritance: true, ngImport: i0 }); }
169
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqOptionTooltip, deps: [{ token: i1$1.KbqOption }], target: i0.ɵɵFactoryTarget.Directive }); }
170
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.20", type: KbqOptionTooltip, isStandalone: true, selector: "kbq-option", host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" } }, usesInheritance: true, ngImport: i0 }); }
78
171
  }
79
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqOptionTooltip, decorators: [{
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqOptionTooltip, decorators: [{
80
173
  type: Directive,
81
174
  args: [{
82
175
  selector: 'kbq-option',
@@ -87,7 +180,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
87
180
  '(blur)': 'onBlur()'
88
181
  }
89
182
  }]
90
- }], ctorParameters: () => [{ type: i1.KbqOption }] });
183
+ }], ctorParameters: () => [{ type: i1$1.KbqOption }] });
91
184
 
92
185
  let nextUniqueId = 0;
93
186
  /** Change event object that is emitted when the select value has changed. */
@@ -106,11 +199,15 @@ const kbqSelectOptionsProvider = (options) => {
106
199
  useValue: options
107
200
  };
108
201
  };
202
+ /** Delay in milliseconds before displaying a result when there are no options. */
203
+ const delayBeforeDisplayingResultWithoutOptions = 101;
204
+ /** Minimum time in milliseconds to display the loading state. */
205
+ const minimumTimeToDisplayLoading = 300;
109
206
  class KbqSelect extends KbqAbstractSelect {
110
207
  /**
111
208
  * Controls when the search functionality is displayed based on the number of available options.
112
209
  *
113
- * Automatically enables search hiding if value provided, even if `defaultOptions.minOptionsThreshold` is provided.
210
+ * Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
114
211
  * @default undefined
115
212
  */
116
213
  set searchMinOptionsThreshold(value) {
@@ -121,12 +218,20 @@ class KbqSelect extends KbqAbstractSelect {
121
218
  get searchMinOptionsThreshold() {
122
219
  return this._searchMinOptionsThreshold;
123
220
  }
221
+ /**
222
+ * Whether the overlay should have a backdrop.
223
+ * When true, clicking the backdrop will close the select.
224
+ */
124
225
  get hasBackdrop() {
125
226
  return this._hasBackdrop;
126
227
  }
127
228
  set hasBackdrop(value) {
128
229
  this._hasBackdrop = coerceBooleanProperty(value);
129
230
  }
231
+ /**
232
+ * Placeholder text to be shown when no value is selected.
233
+ * Displayed in the trigger when the select is closed and no value is selected.
234
+ */
130
235
  get placeholder() {
131
236
  return this._placeholder;
132
237
  }
@@ -134,6 +239,9 @@ class KbqSelect extends KbqAbstractSelect {
134
239
  this._placeholder = value;
135
240
  this.stateChanges.next();
136
241
  }
242
+ /**
243
+ * Whether the select is required. Affects validation and display of placeholder.
244
+ */
137
245
  get required() {
138
246
  return this._required;
139
247
  }
@@ -141,6 +249,10 @@ class KbqSelect extends KbqAbstractSelect {
141
249
  this._required = coerceBooleanProperty(value);
142
250
  this.stateChanges.next();
143
251
  }
252
+ /**
253
+ * Whether multiple options can be selected.
254
+ * Note: This cannot be changed dynamically after initialization.
255
+ */
144
256
  get multiple() {
145
257
  return this._multiple;
146
258
  }
@@ -151,9 +263,11 @@ class KbqSelect extends KbqAbstractSelect {
151
263
  this._multiple = value;
152
264
  }
153
265
  /**
154
- * Function to compare the option values with the selected values. The first argument
155
- * is a value from an option. The second is a value from the selection. A boolean
156
- * should be returned.
266
+ * Function to compare the option values with the selected values.
267
+ * The first argument is a value from an option.
268
+ * The second is a value from the selection.
269
+ * Should return true if the values match.
270
+ * Defaults to strict equality comparison.
157
271
  */
158
272
  get compareWith() {
159
273
  return this._compareWith;
@@ -169,7 +283,10 @@ class KbqSelect extends KbqAbstractSelect {
169
283
  }
170
284
  }
171
285
  /**
172
- * Function for handling the combination Ctrl + A (select all). By default, the internal handler is used.
286
+ * Function for handling the Ctrl + A (select all) keyboard combination.
287
+ * By default, the internal handler selects all options.
288
+ * @param event The keyboard event that triggered the handler.
289
+ * @param select Reference to this select component.
173
290
  */
174
291
  get selectAllHandler() {
175
292
  return this._selectAllHandler;
@@ -180,7 +297,7 @@ class KbqSelect extends KbqAbstractSelect {
180
297
  }
181
298
  this._selectAllHandler = fn;
182
299
  }
183
- /** Value of the select control. */
300
+ /** Value of the select control. Can be a single value or array of values for multiple selection. */
184
301
  get value() {
185
302
  return this._value;
186
303
  }
@@ -190,6 +307,10 @@ class KbqSelect extends KbqAbstractSelect {
190
307
  this._value = newValue;
191
308
  }
192
309
  }
310
+ /**
311
+ * Unique identifier for the select component.
312
+ * Auto-generates an ID if not provided.
313
+ */
193
314
  get id() {
194
315
  return this._id;
195
316
  }
@@ -197,12 +318,20 @@ class KbqSelect extends KbqAbstractSelect {
197
318
  this._id = value || this.uid;
198
319
  this.stateChanges.next();
199
320
  }
321
+ /**
322
+ * Sets the tabIndex of the select element.
323
+ * Automatically set to -1 when disabled.
324
+ */
200
325
  get tabIndex() {
201
326
  return this.disabled ? -1 : this._tabIndex;
202
327
  }
203
328
  set tabIndex(value) {
204
329
  this._tabIndex = value;
205
330
  }
331
+ /**
332
+ * Whether the select is disabled.
333
+ * When disabled, the select cannot be opened and its value cannot be changed.
334
+ */
206
335
  get disabled() {
207
336
  return this._disabled;
208
337
  }
@@ -225,15 +354,19 @@ class KbqSelect extends KbqAbstractSelect {
225
354
  set focused(value) {
226
355
  this._focused = value;
227
356
  }
357
+ /** Whether the search returned no results. */
228
358
  get isEmptySearchResult() {
229
359
  return this.search && this.options.filter((option) => option.selectable).length === 0 && !!this.search.value();
230
360
  }
361
+ /** Whether the cleaner (clear button) should be shown. */
231
362
  get canShowCleaner() {
232
363
  return !this.disabled && this.cleaner && this.selectionModel.hasValue();
233
364
  }
365
+ /** Returns the currently selected option(s). Single value or array for multiple selection. */
234
366
  get selected() {
235
367
  return this.multiSelection ? this.selectionModel.selected : this.selectionModel.selected[0];
236
368
  }
369
+ /** Returns the display value for the trigger element. */
237
370
  get triggerValue() {
238
371
  if (this.empty)
239
372
  return '';
@@ -242,6 +375,7 @@ class KbqSelect extends KbqAbstractSelect {
242
375
  }
243
376
  return this.selectionModel.selected[0].viewValue;
244
377
  }
378
+ /** Returns all selected options in display order. */
245
379
  get triggerValues() {
246
380
  if (this.empty) {
247
381
  return [];
@@ -250,14 +384,21 @@ class KbqSelect extends KbqAbstractSelect {
250
384
  if (this.isRtl()) {
251
385
  selectedOptions.reverse();
252
386
  }
253
- return selectedOptions;
387
+ return this.triggerValuesLimit > 0 ? selectedOptions.slice(0, this.triggerValuesLimit) : selectedOptions;
254
388
  }
389
+ /** Whether no option is currently selected. */
255
390
  get empty() {
256
391
  return !!this.selectionModel?.isEmpty();
257
392
  }
393
+ /** Whether there are no options available. */
394
+ get noOptions() {
395
+ return this.options?.length === 0;
396
+ }
397
+ /** Returns the first selected option that is not disabled. */
258
398
  get firstSelected() {
259
399
  return this.selectionModel.selected.filter((option) => !option.disabled)[0] || null;
260
400
  }
401
+ /** Whether the first selected option is filtered (not visible in the list). */
261
402
  get firstFiltered() {
262
403
  return !this.options.find((option) => option === this.firstSelected);
263
404
  }
@@ -270,7 +411,7 @@ class KbqSelect extends KbqAbstractSelect {
270
411
  ? KbqComponentColors.Error
271
412
  : KbqComponentColors.ContrastFade;
272
413
  }
273
- /** Whether multiple choice is enabled or not. True if multiple or multiline */
414
+ /** Whether multiple choice is enabled. True if multiple or multiline mode is active. */
274
415
  get multiSelection() {
275
416
  return this.multiple || this.multiline;
276
417
  }
@@ -306,10 +447,11 @@ class KbqSelect extends KbqAbstractSelect {
306
447
  /** A name for this control that can be used by `kbq-form-field`. */
307
448
  this.controlType = 'select';
308
449
  this.hiddenItems = 0;
309
- /** The cached font-size of the trigger element. */
450
+ /** The cached font-size of the trigger element in pixels. */
310
451
  this.triggerFontSize = 0;
452
+ /** Previously selected options before the current selection was made. */
311
453
  this.previousSelectionModelSelected = [];
312
- /** The value of the select panel's transform-origin property. */
454
+ /** The value of the select panel's transform-origin property for animations. */
313
455
  this.transformOrigin = 'top';
314
456
  /** Emits when the panel element is finished transforming in. */
315
457
  this.panelDoneAnimatingStream = new Subject();
@@ -317,7 +459,7 @@ class KbqSelect extends KbqAbstractSelect {
317
459
  this.scrollStrategy = this.scrollStrategyFactory();
318
460
  /**
319
461
  * The y-offset of the overlay panel in relation to the trigger's top start corner.
320
- * This must be adjusted to align the selected option text over the trigger text.
462
+ * This must be adjusted to align the selected option text over the trigger text
321
463
  * when the panel opens. Will change based on the y-position of the selected option.
322
464
  */
323
465
  this.offsetY = defaultOffsetY;
@@ -343,22 +485,42 @@ class KbqSelect extends KbqAbstractSelect {
343
485
  offsetY: -this.offsetY
344
486
  }
345
487
  ];
488
+ /** Template string for hidden items text. Supports {{ number }} placeholder. */
346
489
  this.hiddenItemsText = '+{{ number }}';
490
+ /** Determines whether preselected values are displayed. */
491
+ this.showPreselectedValues = false;
492
+ /**
493
+ * Specifies the maximum number of trigger values allowed.
494
+ * This constant limits the size of the trigger values array to ensure performance
495
+ * and prevent excessive memory usage.
496
+ * A value of `0` indicates that there is no limit.
497
+ */
498
+ this.triggerValuesLimit = 0;
499
+ /** Classes to be passed to the overlay backdrop. */
347
500
  this.backdropClass = 'cdk-overlay-transparent-backdrop';
348
501
  /**
349
- * Whether to use a multiline matcher or not. Default is false
502
+ * Whether to use a multiline matcher or not. Default is false.
503
+ * When true, allows multiple lines of text in the selected value display.
350
504
  */
351
505
  this.multiline = false;
352
506
  this._searchMinOptionsThreshold = this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold);
353
507
  /** Combined stream of all of the child options' change events. */
354
508
  this.optionSelectionChanges = defer(() => {
355
509
  if (this.options) {
356
- return merge(...this.options.map((option) => option.onSelectionChange), ...this.selectionModel.selected.map((option) => option.onSelectionChange), this.options.changes.pipe(switchMap((list) => merge(...list.map((option) => option.onSelectionChange)))));
510
+ return merge(...this.options.map((option) => option.onSelectionChange), this.options.changes.pipe(switchMap((list) => list.length ? merge(...list.map((option) => option.onSelectionChange)) : EMPTY)), this.selectionModel.changed.pipe(startWith(null), switchMap(() => {
511
+ const optionsSet = new Set(this.options.toArray());
512
+ const virtualSelected = this.selectionModel.selected.filter((option) => !optionsSet.has(option));
513
+ return virtualSelected.length
514
+ ? merge(...virtualSelected.map((option) => option.onSelectionChange))
515
+ : EMPTY;
516
+ })));
357
517
  }
358
518
  return this._ngZone.onStable.asObservable().pipe(take(1), switchMap(() => this.optionSelectionChanges));
359
519
  });
360
- /** Event emitted when the select panel has been toggled. */
520
+ /** Event emitted when the select panel has been toggled. Emits true when opened, false when closed. */
361
521
  this.openedChange = new EventEmitter();
522
+ /** Event emitted before the select panel starts opening. */
523
+ this.beforeOpened = output();
362
524
  /** Event emitted when the select has been opened. */
363
525
  this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
364
526
  /** Event emitted when the select has been closed. */
@@ -380,24 +542,33 @@ class KbqSelect extends KbqAbstractSelect {
380
542
  */
381
543
  this.panelWidth = this.defaultOptions?.panelWidth || null;
382
544
  /**
383
- * Minimum width of the panel.
545
+ * Minimum width of the panel in pixels.
384
546
  * If minWidth is larger than window width, it will be ignored.
385
547
  */
386
548
  this.panelMinWidth = this.defaultOptions?.panelMinWidth ?? 200;
387
549
  this._tabIndex = 0;
388
550
  this._disabled = false;
551
+ /** Whether the select panel is currently open. */
389
552
  this.panelOpen = false;
390
553
  this._focused = false;
554
+ /** Subscription to the close event of the overlay. */
391
555
  this.closeSubscription = Subscription.EMPTY;
392
556
  /** The scroll position of the overlay panel, calculated to center the selected option. */
393
557
  this.scrollTop = 0;
394
- /** Unique id for this input. */
558
+ /** Unique id for this input. Auto-incremented for each instance. */
395
559
  this.uid = `kbq-select-${nextUniqueId++}`;
560
+ /** Subject that emits when the component visibility changes. */
396
561
  this.visibleChanges = new BehaviorSubject(false);
562
+ /** Flag indicating if the dropdown class has been added to the overlay container. */
563
+ this.classAddedToOverlayContainer = false;
397
564
  /** `View -> model callback called when value changes` */
398
565
  this.onChange = () => { };
399
566
  /** `View -> model callback called when select has been touched` */
400
567
  this.onTouched = () => { };
568
+ /**
569
+ * Calculates the number of hidden items in multiple selection mode.
570
+ * Updates the hiddenItems property and triggers change detection.
571
+ */
401
572
  this.calculateHiddenItems = () => {
402
573
  if (!this.isBrowser ||
403
574
  this.customTrigger ||
@@ -429,6 +600,7 @@ class KbqSelect extends KbqAbstractSelect {
429
600
  }
430
601
  this._changeDetectorRef.markForCheck();
431
602
  };
603
+ /** Updates locale parameters from the locale service. */
432
604
  this.updateLocaleParams = () => {
433
605
  this.hiddenItemsText = this.localeService?.getParams('select').hiddenItemsText;
434
606
  this._changeDetectorRef.markForCheck();
@@ -451,6 +623,7 @@ class KbqSelect extends KbqAbstractSelect {
451
623
  }
452
624
  });
453
625
  }
626
+ /** Lifecycle hook called after component initialization. Initializes selection model and subscriptions. */
454
627
  ngOnInit() {
455
628
  this.selectionModel = new SelectionModel(this.multiSelection);
456
629
  this.stateChanges.next();
@@ -481,12 +654,14 @@ class KbqSelect extends KbqAbstractSelect {
481
654
  }
482
655
  }, 0));
483
656
  }
657
+ /** Lifecycle hook for change detection. Updates visibility and error state. */
484
658
  ngDoCheck() {
485
659
  this.visibleChanges.next(this.isVisible());
486
660
  if (this.ngControl) {
487
661
  this.updateErrorState();
488
662
  }
489
663
  }
664
+ /** Lifecycle hook after content initialization. Sets up key manager and option subscriptions. */
490
665
  ngAfterContentInit() {
491
666
  this.withVirtualScroll = !!this.cdkVirtualForOf;
492
667
  this.initKeyManager();
@@ -502,10 +677,13 @@ class KbqSelect extends KbqAbstractSelect {
502
677
  .pipe(takeUntilDestroyed(this.destroyRef), delay(0), filter(() => !this.keyManager.activeItem))
503
678
  .subscribe(() => this.keyManager.updateActiveItem(0));
504
679
  }
680
+ /** Lifecycle hook when component is destroyed. Cleans up subscriptions. */
505
681
  ngOnDestroy() {
506
682
  this.stateChanges.complete();
507
683
  this.closeSubscription.unsubscribe();
684
+ clearTimeout(this.openPanelTimeout);
508
685
  }
686
+ /** Updates the error state based on the error state matcher. */
509
687
  updateErrorState() {
510
688
  const oldState = this.errorState;
511
689
  const parent = this.parentFormGroup || this.parentForm;
@@ -517,19 +695,30 @@ class KbqSelect extends KbqAbstractSelect {
517
695
  this.stateChanges.next();
518
696
  }
519
697
  }
698
+ /**
699
+ * Formats the hidden items text with the number of hidden items.
700
+ * @param hiddenItemsText Template string with {{ number }} placeholder.
701
+ * @param hiddenItems Number of hidden items to display.
702
+ * @returns Formatted string with the number of hidden items.
703
+ */
520
704
  hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
521
705
  return hiddenItemsText.replace('{{ number }}', hiddenItems.toString());
522
706
  }
707
+ /**
708
+ * Clears the current selection.
709
+ * @param $event Mouse event to prevent default behavior.
710
+ */
523
711
  clearValue($event) {
524
712
  // need to prevent opening
525
713
  $event.stopPropagation();
526
714
  // need to prevent scrolling
527
715
  $event.preventDefault();
528
- this.selectionModel.clear();
716
+ this.selectionModel.clear(false);
529
717
  this.keyManager.setActiveItem(-1);
530
718
  this.propagateChanges();
531
719
  this.focus();
532
720
  }
721
+ /** Resets the search component if present. */
533
722
  resetSearch() {
534
723
  if (!this.search) {
535
724
  return;
@@ -551,11 +740,32 @@ class KbqSelect extends KbqAbstractSelect {
551
740
  this.open();
552
741
  }
553
742
  }
554
- /** Opens the overlay panel. */
743
+ /**
744
+ * Triggers the opening of the panel component.
745
+ * If the component is disabled or the panel is already open, the call is ignored.
746
+ * Otherwise, the (beforeOpened) event is emitted.
747
+ * When no options are available, the panel is opened after a short delay;
748
+ * if options exist, it opens immediately.
749
+ */
555
750
  open() {
556
- if (this.disabled || !this.options?.length || this.panelOpen) {
751
+ if (this.disabled || this.panelOpen)
557
752
  return;
753
+ this.beforeOpened.emit();
754
+ if (this.noOptions) {
755
+ clearTimeout(this.openPanelTimeout);
756
+ this.openPanelTimeout = setTimeout(() => this.openPanel(), delayBeforeDisplayingResultWithoutOptions);
757
+ }
758
+ else {
759
+ this.openPanel();
558
760
  }
761
+ }
762
+ /**
763
+ * Internal method to open the panel. Handles overlay positioning and sizing.
764
+ * Sets up the overlay dimensions based on trigger size and configured options.
765
+ */
766
+ openPanel() {
767
+ if (!this.trigger)
768
+ return;
559
769
  // add check for form-field bounding rectangles, since it adds extra padding around the trigger
560
770
  this.triggerRect = (this.parentFormField?.getConnectedOverlayOrigin().nativeElement || this.trigger.nativeElement).getBoundingClientRect();
561
771
  // Note: The computed font-size will be a string pixel value (e.g. "16px").
@@ -588,24 +798,20 @@ class KbqSelect extends KbqAbstractSelect {
588
798
  if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
589
799
  this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
590
800
  }
591
- const overlayContainer = this.overlayContainer?.getContainerElement();
592
- if (overlayContainer.childNodes.length === 1) {
593
- this._renderer.addClass(overlayContainer, 'cdk-overlay-container_dropdown');
594
- }
801
+ this.addClassToOverlayContainer();
595
802
  });
596
803
  }
597
804
  /** Closes the overlay panel and focuses the host element. */
598
805
  close() {
599
- if (!this.panelOpen) {
806
+ if (!this.panelOpen)
600
807
  return;
601
- }
602
808
  // the order of calls is important
603
809
  this.resetSearch();
604
810
  this.panelOpen = false;
605
811
  this.keyManager.withHorizontalOrientation(this.isRtl() ? 'rtl' : 'ltr');
606
812
  this._changeDetectorRef.markForCheck();
607
813
  this.onTouched();
608
- this._renderer.removeClass(this.overlayContainer.getContainerElement(), 'cdk-overlay-container_dropdown');
814
+ this.removeClassFromOverlayContainer();
609
815
  }
610
816
  /**
611
817
  * Sets the select's value. Part of the ControlValueAccessor interface
@@ -650,13 +856,21 @@ class KbqSelect extends KbqAbstractSelect {
650
856
  this._changeDetectorRef.markForCheck();
651
857
  this.stateChanges.next();
652
858
  }
859
+ /**
860
+ * Checks if the current direction is RTL (right-to-left).
861
+ * @returns True if RTL mode is active, false otherwise.
862
+ */
653
863
  isRtl() {
654
864
  return this._dir ? this._dir.value === 'rtl' : false;
655
865
  }
866
+ /**
867
+ * Handles all keyboard events for the select.
868
+ * Delegates to appropriate handler based on panel state.
869
+ * @param event The keyboard event to handle.
870
+ */
656
871
  handleKeydown(event) {
657
- if (this.disabled) {
872
+ if (this.disabled)
658
873
  return;
659
- }
660
874
  if (this.panelOpen) {
661
875
  this.handleOpenKeydown(event);
662
876
  }
@@ -664,6 +878,7 @@ class KbqSelect extends KbqAbstractSelect {
664
878
  this.handleClosedKeydown(event);
665
879
  }
666
880
  }
881
+ /** Handles focus event on the select element. */
667
882
  onFocus() {
668
883
  if (!this.disabled) {
669
884
  this._focused = true;
@@ -689,6 +904,7 @@ class KbqSelect extends KbqAbstractSelect {
689
904
  }
690
905
  /**
691
906
  * Callback that is invoked when the overlay panel has been attached.
907
+ * Sets up position change subscription and closing actions.
692
908
  */
693
909
  onAttached() {
694
910
  this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {
@@ -700,7 +916,7 @@ class KbqSelect extends KbqAbstractSelect {
700
916
  this.options.changes.pipe(delay(1)).subscribe(() => this.setOverlayPosition());
701
917
  this.closeSubscription = this.closingActions().subscribe(() => this.close());
702
918
  }
703
- /** Returns the theme to be used on the panel. */
919
+ /** Returns the theme to be used on the panel based on parent form field color. */
704
920
  getPanelTheme() {
705
921
  return this.parentFormField ? `kbq-${this.parentFormField.color}` : '';
706
922
  }
@@ -715,14 +931,27 @@ class KbqSelect extends KbqAbstractSelect {
715
931
  onContainerClick() {
716
932
  this.focus();
717
933
  }
718
- /** Invoked when an option is clicked. */
934
+ /**
935
+ * Handles removal of a matched item in the trigger.
936
+ * @param option The option to remove from selection.
937
+ * @param $event The mouse event that triggered the removal.
938
+ */
719
939
  onRemoveMatcherItem(option, $event) {
720
940
  $event.stopPropagation();
721
941
  option.deselect();
722
942
  }
943
+ /**
944
+ * Gets the height of a single option item.
945
+ * @returns The height in pixels of the first option, or 0 if no options exist.
946
+ */
723
947
  getItemHeight() {
724
948
  return this.options.first ? this.options.first.getHeight() : 0;
725
949
  }
950
+ /**
951
+ * Handles click events on the select.
952
+ * Closes the panel if click is inside the footer.
953
+ * @param $event The mouse event to handle.
954
+ */
726
955
  handleClick($event) {
727
956
  if (this.footer?.nativeElement.contains($event.target)) {
728
957
  this.close();
@@ -761,20 +990,29 @@ class KbqSelect extends KbqAbstractSelect {
761
990
  }
762
991
  /** @docs-private */
763
992
  shouldShowSearch() {
764
- return isUndefined(this.searchMinOptionsThreshold) || this.options.length >= this.searchMinOptionsThreshold;
993
+ return (isUndefined(this.searchMinOptionsThreshold) ||
994
+ !!this.search.value() ||
995
+ this.options.length >= this.searchMinOptionsThreshold);
765
996
  }
997
+ /** Checks if the component is currently visible in the viewport. */
766
998
  isVisible() {
767
999
  return this.elementRef.nativeElement.offsetTop < this.elementRef.nativeElement.offsetHeight;
768
1000
  }
1001
+ /** Gets the current overlay position index in the container. */
769
1002
  currentOverlayPosition() {
770
1003
  const element = this.overlayDir.overlayRef.hostElement;
771
1004
  return Array.from(this.overlayContainer.getContainerElement().childNodes).findIndex((node) => {
772
1005
  return node.firstChild?.['id'] === element.firstChild?.['id'];
773
1006
  });
774
1007
  }
1008
+ /** Gets the position index of modal overlay in the container. */
775
1009
  modalOverlayPosition() {
776
1010
  return Array.from(this.overlayContainer.getContainerElement().childNodes).findIndex((childNode) => childNode.classList.contains('kbq-modal-overlay'));
777
1011
  }
1012
+ /**
1013
+ * Creates an observable of actions that should close the select panel.
1014
+ * Includes outside pointer events and overlay detachments.
1015
+ */
778
1016
  closingActions() {
779
1017
  // used for calling toggle on select from outside of component
780
1018
  const outsidePointerEvents = this.overlayDir
@@ -788,15 +1026,18 @@ class KbqSelect extends KbqAbstractSelect {
788
1026
  }));
789
1027
  return merge(outsidePointerEvents, this.overlayDir.overlayRef.detachments());
790
1028
  }
1029
+ /** Gets the height of the options container element. */
791
1030
  getHeightOfOptionsContainer() {
792
1031
  return this.optionsContainer.nativeElement.getClientRects()[0]?.height;
793
1032
  }
1033
+ /** Updates the keyboard manager scroll size based on options container height. */
794
1034
  updateScrollSize() {
795
1035
  if (!this.options.first) {
796
1036
  return;
797
1037
  }
798
1038
  this.keyManager.withScrollSize(Math.floor(this.getHeightOfOptionsContainer() / this.options.first.getHeight()));
799
1039
  }
1040
+ /** Calculates the total width of all selected items in the matcher. */
800
1041
  getTotalItemsWidthInMatcher() {
801
1042
  const triggerClone = this.buildTriggerClone();
802
1043
  triggerClone.querySelector('.kbq-select__match-hidden-text')?.remove();
@@ -807,6 +1048,11 @@ class KbqSelect extends KbqAbstractSelect {
807
1048
  triggerClone.remove();
808
1049
  return totalItemsWidth;
809
1050
  }
1051
+ /**
1052
+ * Calculates the width of a single item including margins.
1053
+ * @param element The DOM element to measure.
1054
+ * @returns Total width including margins and gap.
1055
+ */
810
1056
  getItemWidth(element) {
811
1057
  const computedStyle = this.window.getComputedStyle(element);
812
1058
  const width = parseInt(computedStyle.width);
@@ -828,7 +1074,7 @@ class KbqSelect extends KbqAbstractSelect {
828
1074
  this.keyManager.onKeydown(event);
829
1075
  }
830
1076
  }
831
- /** Handles keyboard events when the selected is open. */
1077
+ /** Handles keyboard events when the select is open. */
832
1078
  handleOpenKeydown(event) {
833
1079
  const keyCode = event.keyCode;
834
1080
  const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
@@ -879,6 +1125,10 @@ class KbqSelect extends KbqAbstractSelect {
879
1125
  }
880
1126
  }
881
1127
  }
1128
+ /**
1129
+ * Initializes the selection based on the current value.
1130
+ * Defers execution to avoid change detection errors.
1131
+ */
882
1132
  initializeSelection() {
883
1133
  // Defer setting the value in order to avoid the "Expression
884
1134
  // has changed after it was checked" errors from Angular.
@@ -887,8 +1137,9 @@ class KbqSelect extends KbqAbstractSelect {
887
1137
  });
888
1138
  }
889
1139
  /**
890
- * Sets the selected option based on a value. If no option can be
891
- * found with the designated value, the select trigger is cleared.
1140
+ * Sets the selected option based on a value.
1141
+ * If no option can be found with the designated value, the select trigger is cleared.
1142
+ * @param value The value to select. Can be a single value or array for multiple selection.
892
1143
  */
893
1144
  setSelectionByValue(value) {
894
1145
  this.previousSelectionModelSelected = this.selectionModel.selected;
@@ -911,6 +1162,11 @@ class KbqSelect extends KbqAbstractSelect {
911
1162
  }
912
1163
  this._changeDetectorRef.markForCheck();
913
1164
  }
1165
+ /**
1166
+ * Finds the option that corresponds to the given value.
1167
+ * @param value The value to find.
1168
+ * @returns The matching option or undefined if not found.
1169
+ */
914
1170
  getCorrespondOption(value) {
915
1171
  return [
916
1172
  ...this.options.toArray(),
@@ -947,6 +1203,9 @@ class KbqSelect extends KbqAbstractSelect {
947
1203
  this.selectionModel.select(kbqVirtualOption);
948
1204
  }
949
1205
  }
1206
+ else if (this.showPreselectedValues) {
1207
+ this.selectionModel.select(new KbqVirtualOption(value));
1208
+ }
950
1209
  return correspondingOption;
951
1210
  }
952
1211
  /** Sets up a key manager to listen to keyboard events on the overlay panel. */
@@ -979,7 +1238,7 @@ class KbqSelect extends KbqAbstractSelect {
979
1238
  });
980
1239
  // Listen to changes in the internal state of the options and react accordingly.
981
1240
  // Handles cases like the labels of the selected options changing.
982
- merge(...this.options.map((option) => option.stateChanges))
1241
+ (this.options.length ? merge(...this.options.map((option) => option.stateChanges)) : EMPTY)
983
1242
  .pipe(takeUntilDestroyed(this.destroyRef), takeUntil(this.options.changes))
984
1243
  .subscribe(() => {
985
1244
  this._changeDetectorRef.markForCheck();
@@ -1013,7 +1272,7 @@ class KbqSelect extends KbqAbstractSelect {
1013
1272
  }
1014
1273
  this.stateChanges.next();
1015
1274
  }
1016
- /** Sorts the selected values in the selected based on their order in the panel. */
1275
+ /** Sorts the selected values based on their order in the panel. */
1017
1276
  sortValues() {
1018
1277
  if (this.multiSelection) {
1019
1278
  const options = this.options.toArray();
@@ -1075,6 +1334,10 @@ class KbqSelect extends KbqAbstractSelect {
1075
1334
  }
1076
1335
  });
1077
1336
  }
1337
+ /**
1338
+ * Calculates the total width and count of visible items.
1339
+ * @returns Tuple of [totalVisibleItemsWidth, visibleItemsCount].
1340
+ */
1078
1341
  getTotalVisibleItems() {
1079
1342
  const triggerClone = this.buildTriggerClone();
1080
1343
  this._renderer.setStyle(triggerClone.querySelector('.kbq-select__match-hidden-text'), 'display', 'block');
@@ -1090,6 +1353,10 @@ class KbqSelect extends KbqAbstractSelect {
1090
1353
  triggerClone.remove();
1091
1354
  return [totalVisibleItemsWidth, visibleItemsCount];
1092
1355
  }
1356
+ /**
1357
+ * Creates a hidden clone of the trigger element for width calculations.
1358
+ * @returns Clone of the trigger element positioned off-screen.
1359
+ */
1093
1360
  buildTriggerClone() {
1094
1361
  const triggerClone = this.trigger.nativeElement.cloneNode(true);
1095
1362
  this._renderer.setStyle(triggerClone, 'position', 'absolute');
@@ -1098,17 +1365,31 @@ class KbqSelect extends KbqAbstractSelect {
1098
1365
  this._renderer.setStyle(triggerClone, 'left', '0');
1099
1366
  return triggerClone;
1100
1367
  }
1101
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqSelect, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1.ErrorStateMatcher }, { token: i0.ElementRef }, { token: i2.OverlayContainer }, { token: i3.Directionality, optional: true }, { token: i4.NgForm, optional: true }, { token: i4.FormGroupDirective, optional: true }, { token: i5.KbqFormField, host: true, optional: true }, { token: i4.NgControl, optional: true, self: true }, { token: KBQ_SELECT_SCROLL_STRATEGY }, { token: KBQ_LOCALE_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1102
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.19", type: KbqSelect, isStandalone: true, selector: "kbq-select", inputs: { hiddenItemsText: "hiddenItemsText", panelClass: "panelClass", backdropClass: "backdropClass", errorStateMatcher: "errorStateMatcher", sortComparator: "sortComparator", multiline: ["multiline", "multiline", booleanAttribute], searchMinOptionsThreshold: "searchMinOptionsThreshold", hasBackdrop: "hasBackdrop", placeholder: "placeholder", required: "required", multiple: ["multiple", "multiple", booleanAttribute], compareWith: "compareWith", selectAllHandler: "selectAllHandler", panelWidth: "panelWidth", panelMinWidth: ["panelMinWidth", "panelMinWidth", numberAttribute], value: "value", id: "id", tabIndex: ["tabIndex", "tabIndex", numberAttribute], disabled: ["disabled", "disabled", booleanAttribute], hiddenItemsTextFormatter: "hiddenItemsTextFormatter" }, outputs: { openedChange: "openedChange", openedStream: "opened", closedStream: "closed", selectionChange: "selectionChange", valueChange: "valueChange" }, host: { listeners: { "click": "toggle()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.tabindex": "tabIndex", "attr.disabled": "disabled || null", "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline", "class.kbq-disabled": "disabled", "class.kbq-invalid": "errorState" }, classAttribute: "kbq-select" }, providers: [
1368
+ /** Adds the dropdown class to the overlay container when first select opens. */
1369
+ addClassToOverlayContainer() {
1370
+ const overlayContainer = this.overlayContainer?.getContainerElement();
1371
+ if (overlayContainer.childNodes.length === 1) {
1372
+ this.classAddedToOverlayContainer = true;
1373
+ this._renderer.addClass(overlayContainer, 'cdk-overlay-container_dropdown');
1374
+ }
1375
+ }
1376
+ /** Removes the dropdown class from the overlay container when select closes. */
1377
+ removeClassFromOverlayContainer() {
1378
+ if (this.classAddedToOverlayContainer) {
1379
+ this._renderer.removeClass(this.overlayContainer.getContainerElement(), 'cdk-overlay-container_dropdown');
1380
+ }
1381
+ }
1382
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelect, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1$1.ErrorStateMatcher }, { token: i0.ElementRef }, { token: i2.OverlayContainer }, { token: i3.Directionality, optional: true }, { token: i4.NgForm, optional: true }, { token: i4.FormGroupDirective, optional: true }, { token: i5.KbqFormField, host: true, optional: true }, { token: i4.NgControl, optional: true, self: true }, { token: KBQ_SELECT_SCROLL_STRATEGY }, { token: KBQ_LOCALE_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1383
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: KbqSelect, isStandalone: true, selector: "kbq-select", inputs: { hiddenItemsText: "hiddenItemsText", showPreselectedValues: "showPreselectedValues", triggerValuesLimit: "triggerValuesLimit", panelClass: "panelClass", backdropClass: "backdropClass", errorStateMatcher: "errorStateMatcher", sortComparator: "sortComparator", multiline: ["multiline", "multiline", booleanAttribute], searchMinOptionsThreshold: "searchMinOptionsThreshold", hasBackdrop: "hasBackdrop", placeholder: "placeholder", required: "required", multiple: ["multiple", "multiple", booleanAttribute], compareWith: "compareWith", selectAllHandler: "selectAllHandler", panelWidth: "panelWidth", panelMinWidth: ["panelMinWidth", "panelMinWidth", numberAttribute], value: "value", id: "id", tabIndex: ["tabIndex", "tabIndex", numberAttribute], disabled: ["disabled", "disabled", booleanAttribute], hiddenItemsTextFormatter: "hiddenItemsTextFormatter" }, outputs: { openedChange: "openedChange", beforeOpened: "beforeOpened", openedStream: "opened", closedStream: "closed", selectionChange: "selectionChange", valueChange: "valueChange" }, host: { listeners: { "click": "toggle()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "attr.tabindex": "tabIndex", "attr.disabled": "disabled || null", "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline", "class.kbq-disabled": "disabled", "class.kbq-invalid": "errorState" }, classAttribute: "kbq-select" }, providers: [
1103
1384
  { provide: KbqFormFieldControl, useExisting: KbqSelect },
1104
1385
  { provide: KBQ_OPTION_PARENT_COMPONENT, useExisting: KbqSelect },
1105
1386
  { provide: KBQ_PARENT_POPUP, useExisting: KbqSelect }
1106
- ], queries: [{ propertyName: "footer", first: true, predicate: KbqSelectFooter, descendants: true, read: ElementRef }, { propertyName: "cdkVirtualForOf", first: true, predicate: CdkVirtualForOf, descendants: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef }, { propertyName: "cleaner", first: true, predicate: ["kbqSelectCleaner"], descendants: true, static: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true }, { propertyName: "options", predicate: KbqOption, descendants: true }, { propertyName: "optionGroups", predicate: KbqOptgroup }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: KbqTag, descendants: true }], exportAs: ["kbqSelect"], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n [class.kbq-select__match-list]=\"!multiline\"\n [class.kbq-select__multiline-match-list]=\"multiline\"\n >\n @if (!customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveMatcherItem(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n }\n @if (customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"$any(customTagTemplateRef)\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n\n @if (!multiline) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div\n class=\"kbq-select__cleaner\"\n (click)=\"clearValue($event)\"\n (keydown.enter)=\"clearValue($event)\"\n (keydown.space)=\"clearValue($event)\"\n >\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n class=\"kbq-select__panel {{ getPanelTheme() }}\"\n cdkMonitorSubtreeFocus\n [ngClass]=\"panelClass\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.transformOrigin]=\"transformOrigin\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeydown($event)\"\n >\n @if (search && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-select__content\"\n [class.kbq-scrollbar]=\"!withVirtualScroll\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <div class=\"kbq-select__no-options-message\">\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n </div>\n }\n <ng-content />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline){height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-select .kbq-select__match-container .kbq-select__match-hidden-text{flex:0 0 40px;align-self:center;padding-left:4px;padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-select kbq-select-trigger,.kbq-select [kbq-select-trigger]{width:100%}.kbq-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-select__panel{min-width:100%;overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-select__panel .kbq-option{font-size:inherit}.kbq-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-select__content{max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:40px;border-top-width:1px;border-top-style:solid;padding:var(--kbq-size-xxs) var(--kbq-size-l)}.kbq-select__content{box-sizing:initial}.kbq-select__content .kbq-option{position:relative}.kbq-select__content .kbq-option:before,.kbq-select__content .kbq-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-select__content .kbq-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-select__content .kbq-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport{min-height:var(--kbq-select-panel-size-max-height, 256px);max-height:var(--kbq-select-panel-size-max-height, 256px)}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{max-width:100%}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-select{color:var(--kbq-foreground-contrast)}.kbq-select.kbq-control_has-validate-directive.ng-invalid,.kbq-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-select,.kbq-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: var(--kbq-form-field-size-infix-padding);--kbq-select-size-single-padding-right: var(--kbq-form-field-size-suffix-padding);--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-size-max-height: 256px;--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "value", "selectable", "removable", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i6.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }], animations: [
1387
+ ], queries: [{ propertyName: "footer", first: true, predicate: KbqSelectFooter, descendants: true, read: ElementRef }, { propertyName: "cdkVirtualForOf", first: true, predicate: CdkVirtualForOf, descendants: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef }, { propertyName: "cleaner", first: true, predicate: ["kbqSelectCleaner"], descendants: true, static: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true }, { propertyName: "searchEmpty", first: true, predicate: KbqSelectSearchEmptyResult, descendants: true }, { propertyName: "options", predicate: KbqOption, descendants: true }, { propertyName: "optionGroups", predicate: KbqOptgroup }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: KbqTag, descendants: true }], exportAs: ["kbqSelect"], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n [class.kbq-select__match-list]=\"!multiline\"\n [class.kbq-select__multiline-match-list]=\"multiline\"\n >\n @if (!customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveMatcherItem(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n }\n @if (customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"$any(customTagTemplateRef)\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n\n @if (!multiline) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div\n class=\"kbq-select__cleaner\"\n (click)=\"clearValue($event)\"\n (keydown.enter)=\"clearValue($event)\"\n (keydown.space)=\"clearValue($event)\"\n >\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n class=\"kbq-select__panel {{ getPanelTheme() }}\"\n cdkMonitorSubtreeFocus\n [ngClass]=\"panelClass\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.transformOrigin]=\"transformOrigin\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeydown($event)\"\n >\n @if (search && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-select__content\"\n [class.kbq-scrollbar]=\"!withVirtualScroll\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n <ng-content />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline){height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-select .kbq-select__match-container .kbq-select__match-hidden-text{flex:0 0 40px;align-self:center;padding-left:4px;padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-select kbq-select-trigger,.kbq-select [kbq-select-trigger]{width:100%}.kbq-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-select__panel{min-width:100%;overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-select__panel .kbq-option{font-size:inherit}.kbq-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-select__content{max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:40px;border-top-width:1px;border-top-style:solid;padding:var(--kbq-size-xxs) var(--kbq-size-l)}.kbq-select__content{box-sizing:initial}.kbq-select__content .kbq-option{position:relative}.kbq-select__content .kbq-option:before,.kbq-select__content .kbq-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-select__content .kbq-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-select__content .kbq-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport{min-height:var(--kbq-select-panel-size-max-height, 256px);max-height:var(--kbq-select-panel-size-max-height, 256px)}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{max-width:100%}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-select{color:var(--kbq-foreground-contrast)}.kbq-select.kbq-control_has-validate-directive.ng-invalid,.kbq-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-select,.kbq-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-size-max-height: 256px;--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "value", "selectable", "removable", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i6.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }], animations: [
1107
1388
  kbqSelectAnimations.transformPanel,
1108
1389
  kbqSelectAnimations.fadeInContent
1109
1390
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1110
1391
  }
1111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqSelect, decorators: [{
1392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelect, decorators: [{
1112
1393
  type: Component,
1113
1394
  args: [{ selector: 'kbq-select', imports: [
1114
1395
  CdkOverlayOrigin,
@@ -1137,8 +1418,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1137
1418
  { provide: KbqFormFieldControl, useExisting: KbqSelect },
1138
1419
  { provide: KBQ_OPTION_PARENT_COMPONENT, useExisting: KbqSelect },
1139
1420
  { provide: KBQ_PARENT_POPUP, useExisting: KbqSelect }
1140
- ], template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n [class.kbq-select__match-list]=\"!multiline\"\n [class.kbq-select__multiline-match-list]=\"multiline\"\n >\n @if (!customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveMatcherItem(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n }\n @if (customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"$any(customTagTemplateRef)\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n\n @if (!multiline) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div\n class=\"kbq-select__cleaner\"\n (click)=\"clearValue($event)\"\n (keydown.enter)=\"clearValue($event)\"\n (keydown.space)=\"clearValue($event)\"\n >\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n class=\"kbq-select__panel {{ getPanelTheme() }}\"\n cdkMonitorSubtreeFocus\n [ngClass]=\"panelClass\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.transformOrigin]=\"transformOrigin\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeydown($event)\"\n >\n @if (search && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-select__content\"\n [class.kbq-scrollbar]=\"!withVirtualScroll\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <div class=\"kbq-select__no-options-message\">\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n </div>\n }\n <ng-content />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline){height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-select .kbq-select__match-container .kbq-select__match-hidden-text{flex:0 0 40px;align-self:center;padding-left:4px;padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-select kbq-select-trigger,.kbq-select [kbq-select-trigger]{width:100%}.kbq-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-select__panel{min-width:100%;overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-select__panel .kbq-option{font-size:inherit}.kbq-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;box-sizing:border-box;position:relative;max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-select__content{max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:40px;border-top-width:1px;border-top-style:solid;padding:var(--kbq-size-xxs) var(--kbq-size-l)}.kbq-select__content{box-sizing:initial}.kbq-select__content .kbq-option{position:relative}.kbq-select__content .kbq-option:before,.kbq-select__content .kbq-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-select__content .kbq-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-select__content .kbq-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport{min-height:var(--kbq-select-panel-size-max-height, 256px);max-height:var(--kbq-select-panel-size-max-height, 256px)}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{max-width:100%}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-select{color:var(--kbq-foreground-contrast)}.kbq-select.kbq-control_has-validate-directive.ng-invalid,.kbq-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-select,.kbq-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: var(--kbq-form-field-size-infix-padding);--kbq-select-size-single-padding-right: var(--kbq-form-field-size-suffix-padding);--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-size-max-height: 256px;--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"] }]
1141
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1.ErrorStateMatcher }, { type: i0.ElementRef }, { type: i2.OverlayContainer }, { type: i3.Directionality, decorators: [{
1421
+ ], template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n [class.kbq-select__match-list]=\"!multiline\"\n [class.kbq-select__multiline-match-list]=\"multiline\"\n >\n @if (!customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveMatcherItem(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n }\n @if (customTagTemplateRef) {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"$any(customTagTemplateRef)\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n\n @if (!multiline) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div\n class=\"kbq-select__cleaner\"\n (click)=\"clearValue($event)\"\n (keydown.enter)=\"clearValue($event)\"\n (keydown.space)=\"clearValue($event)\"\n >\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOffsetY]=\"offsetY\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n>\n <div\n #panel\n class=\"kbq-select__panel {{ getPanelTheme() }}\"\n cdkMonitorSubtreeFocus\n [ngClass]=\"panelClass\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.transformOrigin]=\"transformOrigin\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeydown($event)\"\n >\n @if (search && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-select__content\"\n [class.kbq-scrollbar]=\"!withVirtualScroll\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n <ng-content />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline){height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-select .kbq-select__match-container .kbq-select__match-hidden-text{flex:0 0 40px;align-self:center;padding-left:4px;padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-select kbq-select-trigger,.kbq-select [kbq-select-trigger]{width:100%}.kbq-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-select__panel{min-width:100%;overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-select__panel .kbq-option{font-size:inherit}.kbq-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-select__content{max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:40px;border-top-width:1px;border-top-style:solid;padding:var(--kbq-size-xxs) var(--kbq-size-l)}.kbq-select__content{box-sizing:initial}.kbq-select__content .kbq-option{position:relative}.kbq-select__content .kbq-option:before,.kbq-select__content .kbq-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-select__content .kbq-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-select__content .kbq-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport{min-height:var(--kbq-select-panel-size-max-height, 256px);max-height:var(--kbq-select-panel-size-max-height, 256px)}.kbq-select__content:not(:has(>.kbq-select__no-options-message)) .cdk-virtual-scroll-viewport.cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{max-width:100%}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-select{color:var(--kbq-foreground-contrast)}.kbq-select.kbq-control_has-validate-directive.ng-invalid,.kbq-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-select,.kbq-select__panel{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-size-max-height: 256px;--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"] }]
1422
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1$1.ErrorStateMatcher }, { type: i0.ElementRef }, { type: i2.OverlayContainer }, { type: i3.Directionality, decorators: [{
1142
1423
  type: Optional
1143
1424
  }] }, { type: i4.NgForm, decorators: [{
1144
1425
  type: Optional
@@ -1155,7 +1436,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1155
1436
  }] }, { type: undefined, decorators: [{
1156
1437
  type: Inject,
1157
1438
  args: [KBQ_SELECT_SCROLL_STRATEGY]
1158
- }] }, { type: i1.KbqLocaleService, decorators: [{
1439
+ }] }, { type: i1$1.KbqLocaleService, decorators: [{
1159
1440
  type: Optional
1160
1441
  }, {
1161
1442
  type: Inject,
@@ -1202,8 +1483,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1202
1483
  }], search: [{
1203
1484
  type: ContentChild,
1204
1485
  args: [KbqSelectSearch, { static: false }]
1486
+ }], searchEmpty: [{
1487
+ type: ContentChild,
1488
+ args: [KbqSelectSearchEmptyResult, { static: false }]
1205
1489
  }], hiddenItemsText: [{
1206
1490
  type: Input
1491
+ }], showPreselectedValues: [{
1492
+ type: Input
1493
+ }], triggerValuesLimit: [{
1494
+ type: Input
1207
1495
  }], panelClass: [{
1208
1496
  type: Input
1209
1497
  }], backdropClass: [{
@@ -1262,8 +1550,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1262
1550
  }] } });
1263
1551
 
1264
1552
  class KbqSelectModule {
1265
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1266
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.19", ngImport: i0, type: KbqSelectModule, imports: [OverlayModule,
1553
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1554
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectModule, imports: [OverlayModule,
1267
1555
  KbqOptionModule,
1268
1556
  KbqIconModule,
1269
1557
  KbqTagsModule,
@@ -1277,7 +1565,11 @@ class KbqSelectModule {
1277
1565
  NgTemplateOutlet,
1278
1566
  A11yModule,
1279
1567
  KbqSelect,
1280
- KbqOptionTooltip], exports: [KbqSelect,
1568
+ KbqOptionTooltip,
1569
+ KbqSelectLoading,
1570
+ KbqSelectError,
1571
+ KbqSelectNoOptions,
1572
+ KbqSelectErrorText], exports: [KbqSelect,
1281
1573
  KbqOptionTooltip,
1282
1574
  KbqOptionModule,
1283
1575
  KbqSelectSearch,
@@ -1285,17 +1577,22 @@ class KbqSelectModule {
1285
1577
  KbqSelectMatcher,
1286
1578
  KbqSelectTrigger,
1287
1579
  KbqSelectSearchEmptyResult,
1288
- KbqFormFieldModule] }); }
1289
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqSelectModule, providers: [KBQ_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [OverlayModule,
1580
+ KbqSelectLoading,
1581
+ KbqFormFieldModule,
1582
+ KbqSelectError,
1583
+ KbqSelectNoOptions,
1584
+ KbqSelectErrorText] }); }
1585
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectModule, providers: [KBQ_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [OverlayModule,
1290
1586
  KbqOptionModule,
1291
1587
  KbqIconModule,
1292
1588
  KbqTagsModule,
1293
1589
  KbqToolTipModule,
1294
1590
  A11yModule,
1295
- KbqSelect, KbqOptionModule,
1591
+ KbqSelect,
1592
+ KbqSelectLoading, KbqOptionModule,
1296
1593
  KbqFormFieldModule] }); }
1297
1594
  }
1298
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: KbqSelectModule, decorators: [{
1595
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectModule, decorators: [{
1299
1596
  type: NgModule,
1300
1597
  args: [{
1301
1598
  imports: [
@@ -1313,7 +1610,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1313
1610
  NgTemplateOutlet,
1314
1611
  A11yModule,
1315
1612
  KbqSelect,
1316
- KbqOptionTooltip
1613
+ KbqOptionTooltip,
1614
+ KbqSelectLoading,
1615
+ KbqSelectError,
1616
+ KbqSelectNoOptions,
1617
+ KbqSelectErrorText
1317
1618
  ],
1318
1619
  exports: [
1319
1620
  KbqSelect,
@@ -1324,7 +1625,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1324
1625
  KbqSelectMatcher,
1325
1626
  KbqSelectTrigger,
1326
1627
  KbqSelectSearchEmptyResult,
1327
- KbqFormFieldModule
1628
+ KbqSelectLoading,
1629
+ KbqFormFieldModule,
1630
+ KbqSelectError,
1631
+ KbqSelectNoOptions,
1632
+ KbqSelectErrorText
1328
1633
  ],
1329
1634
  providers: [KBQ_SELECT_SCROLL_STRATEGY_PROVIDER]
1330
1635
  }]
@@ -1334,5 +1639,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1334
1639
  * Generated bundle index. Do not edit.
1335
1640
  */
1336
1641
 
1337
- export { KBQ_SELECT_OPTIONS, KbqOptionTooltip, KbqSelect, KbqSelectChange, KbqSelectModule, kbqSelectOptionsProvider };
1642
+ export { KBQ_SELECT_OPTIONS, KbqOptionTooltip, KbqSelect, KbqSelectChange, KbqSelectError, KbqSelectErrorText, KbqSelectLoading, KbqSelectModule, KbqSelectNoOptions, delayBeforeDisplayingResultWithoutOptions, kbqSelectOptionsProvider, minimumTimeToDisplayLoading };
1338
1643
  //# sourceMappingURL=koobiq-components-select.mjs.map