@koobiq/components 19.7.0 → 19.8.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 (150) hide show
  1. package/accordion/accordion-content.directive.d.ts +1 -0
  2. package/autocomplete/autocomplete-trigger.directive.d.ts +2 -1
  3. package/autocomplete/autocomplete.component.d.ts +7 -1
  4. package/code-block/_code-block-theme.scss +1 -10
  5. package/code-block/code-block-highlight.d.ts +61 -7
  6. package/code-block/code-block-tokens.scss +5 -10
  7. package/code-block/code-block.d.ts +10 -1
  8. package/code-block/code-block.scss +8 -7
  9. package/core/forms/forms-tokens.scss +1 -1
  10. package/core/option/option.d.ts +2 -1
  11. package/core/styles/common/_groups-mixins.scss +2 -2
  12. package/core/styles/common/_groups.scss +6 -6
  13. package/dropdown/dropdown-item.scss +9 -6
  14. package/dropdown/dropdown-tokens.scss +1 -1
  15. package/dropdown/dropdown-trigger.directive.d.ts +8 -1
  16. package/dropdown/dropdown.component.d.ts +6 -6
  17. package/dropdown/dropdown.scss +1 -1
  18. package/dropdown/dropdown.types.d.ts +19 -7
  19. package/fesm2022/koobiq-components-accordion.mjs +32 -29
  20. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-actions-panel.mjs +10 -10
  22. package/fesm2022/koobiq-components-alert.mjs +16 -16
  23. package/fesm2022/koobiq-components-app-switcher.mjs +25 -25
  24. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-autocomplete.mjs +35 -23
  26. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-badge.mjs +13 -13
  28. package/fesm2022/koobiq-components-breadcrumbs.mjs +25 -25
  29. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-button-toggle.mjs +10 -10
  31. package/fesm2022/koobiq-components-button.mjs +19 -19
  32. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-checkbox.mjs +10 -10
  34. package/fesm2022/koobiq-components-clamped-text.mjs +13 -13
  35. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-code-block.mjs +118 -46
  37. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-content-panel.mjs +28 -28
  39. package/fesm2022/koobiq-components-core.mjs +219 -220
  40. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-datepicker.mjs +37 -42
  42. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-divider.mjs +7 -7
  44. package/fesm2022/koobiq-components-dl.mjs +13 -13
  45. package/fesm2022/koobiq-components-dropdown.mjs +69 -38
  46. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-dynamic-translation.mjs +13 -13
  48. package/fesm2022/koobiq-components-ellipsis-center.mjs +7 -7
  49. package/fesm2022/koobiq-components-empty-state.mjs +19 -19
  50. package/fesm2022/koobiq-components-file-upload.mjs +39 -39
  51. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-filter-bar.mjs +85 -85
  53. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-form-field.mjs +83 -81
  55. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  56. package/fesm2022/koobiq-components-icon.mjs +343 -21
  57. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-inline-edit.mjs +19 -17
  59. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-input.mjs +22 -22
  61. package/fesm2022/koobiq-components-link.mjs +7 -7
  62. package/fesm2022/koobiq-components-list.mjs +19 -19
  63. package/fesm2022/koobiq-components-loader-overlay.mjs +16 -16
  64. package/fesm2022/koobiq-components-markdown.mjs +10 -10
  65. package/fesm2022/koobiq-components-modal.mjs +28 -28
  66. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  67. package/fesm2022/koobiq-components-navbar-ic.mjs +40 -40
  68. package/fesm2022/koobiq-components-navbar-ic.mjs.map +1 -1
  69. package/fesm2022/koobiq-components-navbar.mjs +82 -56
  70. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  71. package/fesm2022/koobiq-components-notification-center.mjs +16 -16
  72. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  73. package/fesm2022/koobiq-components-overflow-items.mjs +16 -16
  74. package/fesm2022/koobiq-components-popover.mjs +18 -18
  75. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-progress-bar.mjs +13 -13
  77. package/fesm2022/koobiq-components-progress-spinner.mjs +13 -13
  78. package/fesm2022/koobiq-components-radio.mjs +10 -10
  79. package/fesm2022/koobiq-components-resizer.mjs +10 -10
  80. package/fesm2022/koobiq-components-risk-level.mjs +7 -7
  81. package/fesm2022/koobiq-components-scrollbar.mjs +12 -12
  82. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  83. package/fesm2022/koobiq-components-search-expandable.mjs +7 -7
  84. package/fesm2022/koobiq-components-select.mjs +129 -64
  85. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-sidebar.mjs +13 -13
  87. package/fesm2022/koobiq-components-sidepanel.mjs +28 -28
  88. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  89. package/fesm2022/koobiq-components-skeleton.mjs +10 -10
  90. package/fesm2022/koobiq-components-split-button.mjs +7 -7
  91. package/fesm2022/koobiq-components-splitter.mjs +16 -16
  92. package/fesm2022/koobiq-components-table.mjs +10 -10
  93. package/fesm2022/koobiq-components-tabs.mjs +52 -52
  94. package/fesm2022/koobiq-components-tags.mjs +38 -31
  95. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-textarea.mjs +7 -7
  97. package/fesm2022/koobiq-components-time-range.mjs +22 -22
  98. package/fesm2022/koobiq-components-timepicker.mjs +11 -26
  99. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-timezone.mjs +58 -37
  101. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-title.mjs +7 -7
  103. package/fesm2022/koobiq-components-toast.mjs +58 -39
  104. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  105. package/fesm2022/koobiq-components-toggle.mjs +7 -7
  106. package/fesm2022/koobiq-components-tooltip.mjs +16 -16
  107. package/fesm2022/koobiq-components-top-bar.mjs +17 -25
  108. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  109. package/fesm2022/koobiq-components-tree-select.mjs +14 -8
  110. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  111. package/fesm2022/koobiq-components-tree.mjs +74 -39
  112. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  113. package/fesm2022/koobiq-components-username.mjs +28 -28
  114. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  115. package/file-upload/multiple-file-upload.component.scss +6 -0
  116. package/file-upload/single-file-upload.component.scss +6 -0
  117. package/form-field/_form-field-theme.scss +9 -4
  118. package/form-field/fieldset-tokens.scss +1 -0
  119. package/form-field/fieldset.scss +1 -0
  120. package/form-field/form-field-tokens.scss +1 -0
  121. package/form-field/password-toggle.scss +1 -1
  122. package/icon/icon-button.scss +5 -0
  123. package/icon/icon-item.scss +5 -0
  124. package/icon/icon-registry-providers.d.ts +34 -0
  125. package/icon/icon-registry.d.ts +50 -0
  126. package/icon/icon.component.d.ts +16 -3
  127. package/icon/icon.scss +7 -0
  128. package/icon/public-api.d.ts +2 -0
  129. package/inline-edit/inline-edit.d.ts +3 -1
  130. package/inline-edit/inline-edit.scss +1 -11
  131. package/link/_link-theme.scss +9 -2
  132. package/navbar/_navbar-theme.scss +0 -4
  133. package/navbar/navbar-brand.component.d.ts +3 -1
  134. package/navbar/navbar-item.component.d.ts +1 -0
  135. package/navbar/navbar.component.d.ts +1 -0
  136. package/package.json +4 -4
  137. package/popover/popover.scss +3 -3
  138. package/prebuilt-themes/dark-theme.css +1 -1
  139. package/prebuilt-themes/light-theme.css +1 -1
  140. package/prebuilt-themes/theme.css +1 -1
  141. package/schematics/ng-add/index.js +4 -4
  142. package/scrollbar/scrollbar-tokens.scss +1 -1
  143. package/select/select-option.directive.d.ts +9 -10
  144. package/select/select.component.d.ts +42 -3
  145. package/timepicker/timepicker.directive.d.ts +1 -0
  146. package/timezone/timezone-option.directive.d.ts +12 -9
  147. package/toast/toast.service.d.ts +5 -3
  148. package/top-bar/top-bar.d.ts +0 -7
  149. package/top-bar/top-bar.scss +3 -9
  150. package/tree/tree-selection.component.d.ts +7 -0
@@ -5,8 +5,10 @@ import { KbqProgressSpinnerModule } from '@koobiq/components/progress-spinner';
5
5
  import { ContentObserver } from '@angular/cdk/observers';
6
6
  import { SharedResizeObserver } from '@angular/cdk/observers/private';
7
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';
8
+ import { KbqOption, KbqAbstractSelect, getKbqSelectDynamicMultipleError, getKbqSelectNonFunctionValueError, KbqComponentColors, KBQ_VALIDATION, KBQ_WINDOW, defaultOffsetY, isUndefined, getKbqSelectNonArrayValueError, KbqVirtualOption, KBQ_SELECT_SCROLL_STRATEGY, KBQ_LOCALE_SERVICE, kbqSelectAnimations, KbqSelectFooter, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqSelectSearchEmptyResult, KbqOptgroup, KBQ_OPTION_PARENT_COMPONENT, KBQ_PARENT_POPUP, KbqOptionModule, KBQ_SELECT_SCROLL_STRATEGY_PROVIDER } from '@koobiq/components/core';
9
9
  import { KbqTooltipTrigger, KbqToolTipModule } from '@koobiq/components/tooltip';
10
+ import { Subscription, throttleTime, Subject, defer, merge, EMPTY, BehaviorSubject, fromEvent } from 'rxjs';
11
+ import { debounceTime, switchMap, startWith, take, filter, map, delay, distinctUntilChanged, auditTime, takeUntil } from 'rxjs/operators';
10
12
  import { CdkMonitorFocus, A11yModule } from '@angular/cdk/a11y';
11
13
  import * as i3 from '@angular/cdk/bidi';
12
14
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
@@ -14,7 +16,7 @@ import { SelectionModel } from '@angular/cdk/collections';
14
16
  import * as i2 from '@angular/cdk/overlay';
15
17
  import { CdkOverlayOrigin, CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
16
18
  import { Platform } from '@angular/cdk/platform';
17
- import { CdkVirtualForOf } from '@angular/cdk/scrolling';
19
+ import { CdkVirtualForOf, CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
18
20
  import { NgTemplateOutlet, NgClass } from '@angular/common';
19
21
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
20
22
  import * as i4 from '@angular/forms';
@@ -26,12 +28,10 @@ import * as i6 from '@koobiq/components/icon';
26
28
  import { KbqIconModule } from '@koobiq/components/icon';
27
29
  import { KbqTag, KbqTagsModule } from '@koobiq/components/tags';
28
30
  import { SizeXxs } from '@koobiq/design-tokens';
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
31
 
32
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: `
33
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectLoading, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: KbqSelectLoading, isStandalone: true, selector: "kbq-select-loading, [kbq-select-loading]", host: { classAttribute: "kbq-select-loading" }, exportAs: ["kbqSelectLoading"], ngImport: i0, template: `
35
35
  <ng-content select="kbq-progress-spinner">
36
36
  <div class="layout-row layout-margin-top-4xl layout-margin-bottom-4xl layout-align-center-center">
37
37
  <kbq-progress-spinner [mode]="'indeterminate'" />
@@ -39,7 +39,7 @@ class KbqSelectLoading {
39
39
  </ng-content>
40
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
41
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectLoading, decorators: [{
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectLoading, decorators: [{
43
43
  type: Component,
44
44
  args: [{
45
45
  selector: 'kbq-select-loading, [kbq-select-loading]',
@@ -70,12 +70,12 @@ class KbqSelectError {
70
70
  /** Indicates whether styles for pagination controls should be used. */
71
71
  this.paging = input(false, { transform: booleanAttribute });
72
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: `
73
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
74
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", 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
75
  <ng-content />
76
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
77
  }
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectError, decorators: [{
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectError, decorators: [{
79
79
  type: Component,
80
80
  args: [{ selector: 'kbq-select-error, [kbq-select-error]', template: `
81
81
  <ng-content />
@@ -89,10 +89,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
89
89
  * Marks an element as the error text container for a *KbqSelect* component.
90
90
  */
91
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 }); }
92
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectErrorText, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
93
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.21", type: KbqSelectErrorText, isStandalone: true, selector: "[kbq-select-error-text]", host: { classAttribute: "kbq-select-error__text" }, exportAs: ["kbqSelectErrorText"], ngImport: i0 }); }
94
94
  }
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectErrorText, decorators: [{
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectErrorText, decorators: [{
96
96
  type: Directive,
97
97
  args: [{
98
98
  selector: '[kbq-select-error-text]',
@@ -106,12 +106,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
106
106
  * Component that represents the empty state of a select dropdown.
107
107
  */
108
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: `
109
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectNoOptions, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
110
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", 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
111
  <ng-content />
112
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
113
  }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectNoOptions, decorators: [{
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectNoOptions, decorators: [{
115
115
  type: Component,
116
116
  args: [{ selector: 'kbq-select-no-options, [kbq-select-no-options]', template: `
117
117
  <ng-content />
@@ -127,62 +127,63 @@ class KbqOptionTooltip extends KbqTooltipTrigger {
127
127
  get isOverflown() {
128
128
  return this.textElement.clientWidth < this.textElement.scrollWidth;
129
129
  }
130
- constructor(option) {
130
+ constructor() {
131
131
  super();
132
- this.option = option;
132
+ this.option = inject(KbqOption);
133
133
  this.resizeObserver = inject(SharedResizeObserver);
134
- this.resizeObserverSubscription = null;
135
134
  this.contentObserver = inject(ContentObserver);
136
- this.contentObserverSubscription = null;
135
+ this.debounceInterval = 100;
136
+ this.resizeSubscription = Subscription.EMPTY;
137
+ this.contentObserverSubscription = Subscription.EMPTY;
138
+ this.focusMonitorSubscription = Subscription.EMPTY;
137
139
  }
138
140
  ngAfterViewInit() {
141
+ super.ngAfterViewInit();
139
142
  this.content = this.option.viewValue;
143
+ this.disabled = !this.isOverflown;
144
+ this.resizeSubscription = this.resizeObserver
145
+ .observe(this.textElement)
146
+ .pipe(debounceTime(this.debounceInterval))
147
+ .subscribe(() => (this.disabled = !this.isOverflown));
140
148
  this.contentObserverSubscription = this.contentObserver
141
149
  .observe(this.textElement)
142
- .subscribe(() => (this.content = this.option.viewValue));
150
+ .pipe(throttleTime(this.debounceInterval))
151
+ .subscribe(() => {
152
+ this.disabled = !this.isOverflown;
153
+ this.content = this.option.viewValue;
154
+ });
155
+ this.focusMonitorSubscription = this.focusMonitor
156
+ .monitor(this.elementRef)
157
+ .subscribe((origin) => (origin === 'keyboard' ? this.handleElementEnter() : this.handleElementLeave()));
143
158
  }
144
159
  ngOnDestroy() {
160
+ this.resizeSubscription.unsubscribe();
161
+ this.contentObserverSubscription.unsubscribe();
162
+ this.focusMonitorSubscription.unsubscribe();
145
163
  super.ngOnDestroy();
146
- this.resizeObserverSubscription?.unsubscribe();
147
- this.contentObserverSubscription?.unsubscribe();
148
- }
149
- onMouseEnter() {
150
- this.resizeObserverSubscription = this.resizeObserver
151
- .observe(this.textElement)
152
- .subscribe(() => (this.disabled = !this.isOverflown));
153
- this.disabled = !this.isOverflown;
154
- }
155
- onMouseLeave() {
156
- this.resizeObserverSubscription?.unsubscribe();
157
- this.disabled = true;
158
164
  }
159
- onFocus() {
165
+ handleElementEnter() {
160
166
  this.disabled = !this.isOverflown;
161
- if (!this.disabled) {
162
- this.show();
163
- }
164
167
  }
165
- onBlur() {
168
+ handleElementLeave() {
166
169
  this.disabled = true;
167
- this.hide();
168
170
  }
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 }); }
171
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqOptionTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
172
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.21", type: KbqOptionTooltip, isStandalone: true, selector: "kbq-option", host: { listeners: { "mouseenter": "handleElementEnter()", "mouseleave": "handleElementLeave()" } }, usesInheritance: true, ngImport: i0 }); }
171
173
  }
172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqOptionTooltip, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqOptionTooltip, decorators: [{
173
175
  type: Directive,
174
176
  args: [{
175
177
  selector: 'kbq-option',
176
178
  host: {
177
- '(mouseenter)': 'onMouseEnter()',
178
- '(mouseleave)': 'onMouseLeave()',
179
- '(focus)': 'onFocus()',
180
- '(blur)': 'onBlur()'
179
+ '(mouseenter)': 'handleElementEnter()',
180
+ '(mouseleave)': 'handleElementLeave()'
181
181
  }
182
182
  }]
183
- }], ctorParameters: () => [{ type: i1$1.KbqOption }] });
183
+ }], ctorParameters: () => [] });
184
184
 
185
185
  let nextUniqueId = 0;
186
+ const SCROLLED_TO_BOTTOM_THROTTLE_TIME = 100;
186
187
  /** Change event object that is emitted when the select value has changed. */
187
188
  class KbqSelectChange {
188
189
  constructor(source, value) {
@@ -370,9 +371,6 @@ class KbqSelect extends KbqAbstractSelect {
370
371
  get triggerValue() {
371
372
  if (this.empty)
372
373
  return '';
373
- if (this.selectionModel.selected[0] instanceof KbqVirtualOption) {
374
- return this.selectionModel.selected[0].value;
375
- }
376
374
  return this.selectionModel.selected[0].viewValue;
377
375
  }
378
376
  /** Returns all selected options in display order. */
@@ -533,6 +531,13 @@ class KbqSelect extends KbqAbstractSelect {
533
531
  * @docs-private
534
532
  */
535
533
  this.valueChange = new EventEmitter();
534
+ /**
535
+ * Distance in pixels from the bottom of the options panel at which `scrolledToBottom` fires.
536
+ * Default `0` — emits only when the panel is fully scrolled to the bottom.
537
+ */
538
+ this.scrolledToBottomOffset = 0;
539
+ /** Emits when the options panel is scrolled to (or within `scrolledToBottomOffset` of) the bottom. */
540
+ this.scrolledToBottom = new EventEmitter();
536
541
  this._hasBackdrop = false;
537
542
  this._required = false;
538
543
  this._multiple = false;
@@ -553,6 +558,8 @@ class KbqSelect extends KbqAbstractSelect {
553
558
  this._focused = false;
554
559
  /** Subscription to the close event of the overlay. */
555
560
  this.closeSubscription = Subscription.EMPTY;
561
+ /** Subscription to the options panel scroll event used by `scrolledToBottom`. */
562
+ this.scrollSubscription = Subscription.EMPTY;
556
563
  /** The scroll position of the overlay panel, calculated to center the selected option. */
557
564
  this.scrollTop = 0;
558
565
  /** Unique id for this input. Auto-incremented for each instance. */
@@ -674,8 +681,11 @@ class KbqSelect extends KbqAbstractSelect {
674
681
  this.initializeSelection();
675
682
  });
676
683
  this.search?.changes
677
- .pipe(takeUntilDestroyed(this.destroyRef), delay(0), filter(() => !this.keyManager.activeItem))
678
- .subscribe(() => this.keyManager.updateActiveItem(0));
684
+ .pipe(takeUntilDestroyed(this.destroyRef), delay(0), filter(() => {
685
+ const activeItem = this.keyManager.activeItem;
686
+ return !activeItem || !this.options.toArray().includes(activeItem);
687
+ }))
688
+ .subscribe(() => this.keyManager.setFirstItemActive());
679
689
  }
680
690
  /** Lifecycle hook when component is destroyed. Cleans up subscriptions. */
681
691
  ngOnDestroy() {
@@ -799,6 +809,12 @@ class KbqSelect extends KbqAbstractSelect {
799
809
  this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
800
810
  }
801
811
  this.addClassToOverlayContainer();
812
+ if (this.search && !this.overlayWidth) {
813
+ const measuredPanelWidth = this.panel?.nativeElement.getBoundingClientRect().width;
814
+ if (measuredPanelWidth) {
815
+ this.overlayWidth = measuredPanelWidth;
816
+ }
817
+ }
802
818
  });
803
819
  }
804
820
  /** Closes the overlay panel and focuses the host element. */
@@ -912,6 +928,7 @@ class KbqSelect extends KbqAbstractSelect {
912
928
  this.setOverlayPosition();
913
929
  this.optionsContainer.nativeElement.scrollTop = this.scrollTop;
914
930
  this.updateScrollSize();
931
+ this.subscribeToScrolledToBottom();
915
932
  });
916
933
  this.options.changes.pipe(delay(1)).subscribe(() => this.setOverlayPosition());
917
934
  this.closeSubscription = this.closingActions().subscribe(() => this.close());
@@ -1037,6 +1054,28 @@ class KbqSelect extends KbqAbstractSelect {
1037
1054
  }
1038
1055
  this.keyManager.withScrollSize(Math.floor(this.getHeightOfOptionsContainer() / this.options.first.getHeight()));
1039
1056
  }
1057
+ /**
1058
+ * Subscribes to scroll events of the options panel and emits `scrolledToBottom`
1059
+ * when the panel reaches `scrolledToBottomOffset` pixels from the bottom.
1060
+ * Re-subscribes on every panel attach; auto-unsubscribes when the panel closes
1061
+ * or the component is destroyed.
1062
+ */
1063
+ subscribeToScrolledToBottom() {
1064
+ this.scrollSubscription.unsubscribe();
1065
+ const distance = this.withVirtualScroll && this.virtualScrollViewport
1066
+ ? this.virtualScrollViewport
1067
+ .elementScrolled()
1068
+ .pipe(map(() => this.virtualScrollViewport.measureScrollOffset('bottom')))
1069
+ : fromEvent(this.optionsContainer.nativeElement, 'scroll').pipe(map(() => {
1070
+ const element = this.optionsContainer.nativeElement;
1071
+ return element.scrollHeight - element.scrollTop - element.clientHeight;
1072
+ }));
1073
+ this._ngZone.runOutsideAngular(() => {
1074
+ this.scrollSubscription = distance
1075
+ .pipe(auditTime(SCROLLED_TO_BOTTOM_THROTTLE_TIME), map((distance) => distance <= this.scrolledToBottomOffset), distinctUntilChanged(), filter(Boolean), takeUntilDestroyed(this.destroyRef), takeUntil(this.closedStream))
1076
+ .subscribe(() => this._ngZone.run(() => this.scrolledToBottom.emit()));
1077
+ });
1078
+ }
1040
1079
  /** Calculates the total width of all selected items in the matcher. */
1041
1080
  getTotalItemsWidthInMatcher() {
1042
1081
  const triggerClone = this.buildTriggerClone();
@@ -1117,7 +1156,13 @@ class KbqSelect extends KbqAbstractSelect {
1117
1156
  this.keyManager.activeItemIndex !== previouslyFocusedIndex) {
1118
1157
  this.keyManager.activeItem.selectViaInteraction();
1119
1158
  }
1120
- if (this.search) {
1159
+ // Ensure the active option's keyboard-focus indicator is shown even when the
1160
+ // index didn't change (e.g. ArrowDown on a single-option list) — without this
1161
+ // the panel never gains `cdk-keyboard-focused` and the active border is hidden.
1162
+ if (isArrowKey && this.keyManager.activeItemIndex === previouslyFocusedIndex) {
1163
+ this.keyManager.activeItem?.focus();
1164
+ }
1165
+ if (this.search && this.shouldShowSearch()) {
1121
1166
  this.search.focus();
1122
1167
  }
1123
1168
  if (this.search && (this.keyManager.isTyping() || [BACKSPACE, DELETE].includes(keyCode))) {
@@ -1199,15 +1244,24 @@ class KbqSelect extends KbqAbstractSelect {
1199
1244
  const source = this.cdkVirtualForOf?.cdkVirtualForOf;
1200
1245
  const correspondingOptionVirtual = source instanceof Array ? source.find((item) => this.compareWith(item, value)) : undefined;
1201
1246
  if (correspondingOptionVirtual) {
1202
- const kbqVirtualOption = new KbqVirtualOption(correspondingOptionVirtual, this.disabled);
1203
- this.selectionModel.select(kbqVirtualOption);
1247
+ this.selectionModel.select(this.createVirtualOption(correspondingOptionVirtual));
1204
1248
  }
1205
1249
  }
1206
1250
  else if (this.showPreselectedValues) {
1207
- this.selectionModel.select(new KbqVirtualOption(value));
1251
+ this.selectionModel.select(this.createVirtualOption(value));
1208
1252
  }
1209
1253
  return correspondingOption;
1210
1254
  }
1255
+ /**
1256
+ * Single entry point for building a `KbqVirtualOption` from a raw value.
1257
+ * Uses the consumer-provided `virtualOptionFactory` when set, otherwise
1258
+ * wraps the raw value with the select's current `disabled` state.
1259
+ */
1260
+ createVirtualOption(value) {
1261
+ return this.virtualOptionFactory
1262
+ ? this.virtualOptionFactory(value)
1263
+ : new KbqVirtualOption(value, this.disabled);
1264
+ }
1211
1265
  /** Sets up a key manager to listen to keyboard events on the overlay panel. */
1212
1266
  initKeyManager() {
1213
1267
  const typeAheadDebounce = 200;
@@ -1363,6 +1417,7 @@ class KbqSelect extends KbqAbstractSelect {
1363
1417
  this._renderer.setStyle(triggerClone, 'visibility', 'hidden');
1364
1418
  this._renderer.setStyle(triggerClone, 'top', '-100%');
1365
1419
  this._renderer.setStyle(triggerClone, 'left', '0');
1420
+ this._renderer.setStyle(triggerClone, 'max-width', '100%');
1366
1421
  return triggerClone;
1367
1422
  }
1368
1423
  /** Adds the dropdown class to the overlay container when first select opens. */
@@ -1379,17 +1434,17 @@ class KbqSelect extends KbqAbstractSelect {
1379
1434
  this._renderer.removeClass(this.overlayContainer.getContainerElement(), 'cdk-overlay-container_dropdown');
1380
1435
  }
1381
1436
  }
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: [
1437
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", 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 }); }
1438
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", 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", scrolledToBottomOffset: ["scrolledToBottomOffset", "scrolledToBottomOffset", numberAttribute], hasBackdrop: "hasBackdrop", placeholder: "placeholder", required: "required", multiple: ["multiple", "multiple", booleanAttribute], compareWith: "compareWith", virtualOptionFactory: "virtualOptionFactory", 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", scrolledToBottom: "scrolledToBottom" }, 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: [
1384
1439
  { provide: KbqFormFieldControl, useExisting: KbqSelect },
1385
1440
  { provide: KBQ_OPTION_PARENT_COMPONENT, useExisting: KbqSelect },
1386
1441
  { provide: KBQ_PARENT_POPUP, useExisting: KbqSelect }
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: [
1442
+ ], queries: [{ propertyName: "footer", first: true, predicate: KbqSelectFooter, descendants: true, read: ElementRef }, { propertyName: "cdkVirtualForOf", first: true, predicate: CdkVirtualForOf, descendants: true }, { propertyName: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, 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: [
1388
1443
  kbqSelectAnimations.transformPanel,
1389
1444
  kbqSelectAnimations.fadeInContent
1390
1445
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1391
1446
  }
1392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelect, decorators: [{
1447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelect, decorators: [{
1393
1448
  type: Component,
1394
1449
  args: [{ selector: 'kbq-select', imports: [
1395
1450
  CdkOverlayOrigin,
@@ -1459,6 +1514,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1459
1514
  }], cdkVirtualForOf: [{
1460
1515
  type: ContentChild,
1461
1516
  args: [CdkVirtualForOf, { static: false }]
1517
+ }], virtualScrollViewport: [{
1518
+ type: ContentChild,
1519
+ args: [CdkVirtualScrollViewport, { static: false }]
1462
1520
  }], tags: [{
1463
1521
  type: ViewChildren,
1464
1522
  args: [KbqTag]
@@ -1517,6 +1575,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1517
1575
  type: Output
1518
1576
  }], valueChange: [{
1519
1577
  type: Output
1578
+ }], scrolledToBottomOffset: [{
1579
+ type: Input,
1580
+ args: [{ transform: numberAttribute }]
1581
+ }], scrolledToBottom: [{
1582
+ type: Output
1520
1583
  }], hasBackdrop: [{
1521
1584
  type: Input
1522
1585
  }], placeholder: [{
@@ -1528,6 +1591,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1528
1591
  args: [{ transform: booleanAttribute }]
1529
1592
  }], compareWith: [{
1530
1593
  type: Input
1594
+ }], virtualOptionFactory: [{
1595
+ type: Input
1531
1596
  }], selectAllHandler: [{
1532
1597
  type: Input
1533
1598
  }], panelWidth: [{
@@ -1550,8 +1615,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1550
1615
  }] } });
1551
1616
 
1552
1617
  class KbqSelectModule {
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,
1618
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1619
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectModule, imports: [OverlayModule,
1555
1620
  KbqOptionModule,
1556
1621
  KbqIconModule,
1557
1622
  KbqTagsModule,
@@ -1582,7 +1647,7 @@ class KbqSelectModule {
1582
1647
  KbqSelectError,
1583
1648
  KbqSelectNoOptions,
1584
1649
  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,
1650
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectModule, providers: [KBQ_SELECT_SCROLL_STRATEGY_PROVIDER], imports: [OverlayModule,
1586
1651
  KbqOptionModule,
1587
1652
  KbqIconModule,
1588
1653
  KbqTagsModule,
@@ -1592,7 +1657,7 @@ class KbqSelectModule {
1592
1657
  KbqSelectLoading, KbqOptionModule,
1593
1658
  KbqFormFieldModule] }); }
1594
1659
  }
1595
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: KbqSelectModule, decorators: [{
1660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: KbqSelectModule, decorators: [{
1596
1661
  type: NgModule,
1597
1662
  args: [{
1598
1663
  imports: [