ngx-bsl 0.0.11 → 0.0.16

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.
@@ -1,17 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ViewEncapsulation, ChangeDetectionStrategy, Component, input, inject, computed, output, contentChildren, ElementRef, signal, forwardRef, HostListener, Pipe, viewChild, effect, afterNextRender, model, Renderer2, DOCUMENT, Directive } from '@angular/core';
2
+ import { ViewEncapsulation, ChangeDetectionStrategy, Component, input, contentChildren, ElementRef, signal, Directive, inject, DestroyRef, output, model, computed, effect, forwardRef, HostListener, afterNextRender, viewChild, Renderer2, DOCUMENT } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
5
  import { CdkOverlayOrigin, CdkConnectedOverlay, Overlay } from '@angular/cdk/overlay';
6
+ import { Subject } from 'rxjs';
5
7
  import { CdkTrapFocus } from '@angular/cdk/a11y';
6
8
  import { ComponentPortal } from '@angular/cdk/portal';
7
9
 
8
- class IdGenerator {
9
- id = 0;
10
- nextId() {
11
- return this.id++;
12
- }
13
- }
14
-
15
10
  /*
16
11
  eslint-disable max-len,
17
12
  @typescript-eslint/no-extraneous-class
@@ -36,16 +31,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
36
31
  class ListBoxOptionComponent {
37
32
  value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
38
33
  id = input.required(...(ngDevMode ? [{ debugName: "id" }] : []));
39
- optionIdGenerator = inject(IdGenerator);
40
- listBoxOptionId = computed(() => {
41
- const id = this.optionIdGenerator.nextId();
42
- return `${this.id()}-${id}`;
43
- }, ...(ngDevMode ? [{ debugName: "listBoxOptionId" }] : []));
44
34
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.0", type: ListBoxOptionComponent, isStandalone: true, selector: "ngx-bsl-list-box-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "option" }, properties: { "attr.id": "listBoxOptionId()" } }, ngImport: i0, template: `
35
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.0", type: ListBoxOptionComponent, isStandalone: true, selector: "ngx-bsl-list-box-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "option" }, properties: { "attr.id": "id()" } }, ngImport: i0, template: `
46
36
  <ng-content></ng-content>
47
37
  <ngx-bsl-icon-check></ngx-bsl-icon-check>
48
- `, isInline: true, styles: ["ngx-bsl-list-box-option{position:relative;padding:.375rem 1.25rem .375rem .5rem;border-radius:4px;font:var(--bsl-font-sm);color:var(--bsl-textColor);cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}ngx-bsl-list-box-option:hover,ngx-bsl-list-box-option.visual-focus{background-color:var(--bsl-list-box-backgroundColor-hover)}ngx-bsl-list-box-option[aria-selected=true] ngx-bsl-icon-check{display:inline;visibility:visible}ngx-bsl-list-box-option ngx-bsl-icon-check{display:none;visibility:hidden;position:absolute;right:0;color:var(--bsl-textColor)}\n"], dependencies: [{ kind: "component", type: IconCheckComponent, selector: "ngx-bsl-icon-check" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
38
+ `, isInline: true, styles: ["ngx-bsl-list-box-option{position:relative;padding:.375rem 1.25rem .375rem 1rem;border-radius:4px;font:var(--bsl-font-sm);color:var(--bsl-textColor);cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}ngx-bsl-list-box-option:hover,ngx-bsl-list-box-option.visual-focus{background-color:var(--bsl-list-box-backgroundColor-hover)}ngx-bsl-list-box-option[aria-selected=true] ngx-bsl-icon-check{display:inline;visibility:visible}ngx-bsl-list-box-option ngx-bsl-icon-check{display:none;visibility:hidden;position:absolute;right:0;color:var(--bsl-textColor)}\n"], dependencies: [{ kind: "component", type: IconCheckComponent, selector: "ngx-bsl-icon-check" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
49
39
  }
50
40
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxOptionComponent, decorators: [{
51
41
  type: Component,
@@ -56,33 +46,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
56
46
  <ngx-bsl-icon-check></ngx-bsl-icon-check>
57
47
  `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
58
48
  'role': 'option',
59
- '[attr.id]': 'listBoxOptionId()',
60
- }, styles: ["ngx-bsl-list-box-option{position:relative;padding:.375rem 1.25rem .375rem .5rem;border-radius:4px;font:var(--bsl-font-sm);color:var(--bsl-textColor);cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}ngx-bsl-list-box-option:hover,ngx-bsl-list-box-option.visual-focus{background-color:var(--bsl-list-box-backgroundColor-hover)}ngx-bsl-list-box-option[aria-selected=true] ngx-bsl-icon-check{display:inline;visibility:visible}ngx-bsl-list-box-option ngx-bsl-icon-check{display:none;visibility:hidden;position:absolute;right:0;color:var(--bsl-textColor)}\n"] }]
49
+ '[attr.id]': 'id()',
50
+ }, styles: ["ngx-bsl-list-box-option{position:relative;padding:.375rem 1.25rem .375rem 1rem;border-radius:4px;font:var(--bsl-font-sm);color:var(--bsl-textColor);cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}ngx-bsl-list-box-option:hover,ngx-bsl-list-box-option.visual-focus{background-color:var(--bsl-list-box-backgroundColor-hover)}ngx-bsl-list-box-option[aria-selected=true] ngx-bsl-icon-check{display:inline;visibility:visible}ngx-bsl-list-box-option ngx-bsl-icon-check{display:none;visibility:hidden;position:absolute;right:0;color:var(--bsl-textColor)}\n"] }]
61
51
  }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }] } });
62
52
 
63
- class ListBoxComponent {
64
- id = input.required(...(ngDevMode ? [{ debugName: "id" }] : []));
65
- ariaLabel = input(...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : []));
66
- ariaLabelledby = input(...(ngDevMode ? [undefined, { debugName: "ariaLabelledby" }] : []));
67
- exposeAriaActiveDescendant = input(false, ...(ngDevMode ? [{ debugName: "exposeAriaActiveDescendant" }] : []));
68
- comparisonField = input(...(ngDevMode ? [undefined, { debugName: "comparisonField" }] : []));
69
- initialValue = input(...(ngDevMode ? [undefined, { debugName: "initialValue" }] : []));
70
- initialFocusedOptionIndex = input(null, ...(ngDevMode ? [{ debugName: "initialFocusedOptionIndex" }] : []));
71
- selectOption = output();
72
- listBoxOptions = contentChildren((ListBoxOptionComponent), ...(ngDevMode ? [{ debugName: "listBoxOptions" }] : []));
53
+ class ListBoxDirective {
54
+ listBoxId = input(...(ngDevMode ? [undefined, { debugName: "listBoxId" }] : []));
55
+ listBoxAriaLabel = input(...(ngDevMode ? [undefined, { debugName: "listBoxAriaLabel" }] : []));
56
+ listBoxAriaLabelledby = input(...(ngDevMode ? [undefined, { debugName: "listBoxAriaLabelledby" }] : []));
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ optionValueEquality = input((value, optionValue) => value === optionValue, ...(ngDevMode ? [{ debugName: "optionValueEquality" }] : []));
59
+ listBoxOptions = contentChildren((ListBoxOptionComponent), ...(ngDevMode ? [{ debugName: "listBoxOptions", descendants: true }] : [{ descendants: true }]));
73
60
  listBoxOptionRefs = contentChildren(ListBoxOptionComponent, ...(ngDevMode ? [{ debugName: "listBoxOptionRefs", descendants: true, read: (ElementRef) }] : [{ descendants: true, read: (ElementRef) }]));
74
61
  ariaActiveDescendant = signal(null, ...(ngDevMode ? [{ debugName: "ariaActiveDescendant" }] : []));
75
- onChange = (_value) => { };
76
- onTouch = () => { };
77
- value = null;
78
- ngOnInit() {
79
- const initialValue = this.initialValue();
80
- if (initialValue) {
81
- this.value = initialValue;
62
+ selectOption = new Subject();
63
+ hasAriaSelected = true;
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ setVisualMarkups(value) {
66
+ this.clearVisualFocus();
67
+ this.removeSelectedAttribute();
68
+ const optionIndex = this.listBoxOptions()
69
+ .findIndex(option => this.optionValueEquality()(value, option.value()));
70
+ if (optionIndex !== -1) {
71
+ this.setSelectedAttribute(optionIndex);
72
+ this.setVisualFocus(optionIndex);
73
+ return true;
82
74
  }
83
- }
84
- ngAfterContentInit() {
85
- this.initSelectedOption();
75
+ return false;
86
76
  }
87
77
  onClick(event) {
88
78
  const element = event.target;
@@ -93,9 +83,7 @@ class ListBoxComponent {
93
83
  const optionIndex = this.listBoxOptionRefs().findIndex(o => o.nativeElement.id === element.id);
94
84
  this.setSelectedAttribute(optionIndex);
95
85
  this.setVisualFocus(optionIndex);
96
- this.value = this.listBoxOptions()[optionIndex].value();
97
- this.onChange(this.value);
98
- this.selectOption.emit(this.value);
86
+ this.selectOption.next(this.listBoxOptions()[optionIndex].value());
99
87
  }
100
88
  }
101
89
  onKeydown(event) {
@@ -110,35 +98,19 @@ class ListBoxComponent {
110
98
  return;
111
99
  }
112
100
  }
113
- initSelectedOption() {
114
- const optionIndex = this.listBoxOptions().findIndex(o => this.equalsToCurrentValue(o.value()));
115
- if (optionIndex !== -1) {
116
- this.setSelectedAttribute(optionIndex);
117
- this.setVisualFocus(optionIndex);
118
- return;
119
- }
120
- if (this.initialFocusedOptionIndex() !== null) {
121
- this.setVisualFocus(this.initialFocusedOptionIndex());
122
- }
123
- }
124
- equalsToCurrentValue(value) {
125
- const comparisonField = this.comparisonField();
126
- return comparisonField && this.value && typeof this.value === 'object' && comparisonField in this.value
127
- ? this.value[comparisonField] === value[comparisonField]
128
- : this.value === value;
129
- }
130
101
  handleSelectionKeys() {
131
- const optionIndex = this.getVisuallyFocusedListBoxOptionRefIndex();
102
+ const optionIndex = this.getVisuallyFocusedOptionRefIndex();
132
103
  if (optionIndex !== -1) {
133
104
  this.removeSelectedAttribute();
134
105
  this.setSelectedAttribute(optionIndex);
135
- this.value = this.listBoxOptions()[optionIndex].value();
136
- this.onChange(this.value);
137
- this.selectOption.emit(this.value);
106
+ this.selectOption.next(this.listBoxOptions()[optionIndex].value());
107
+ }
108
+ else {
109
+ this.selectOption.next(null);
138
110
  }
139
111
  }
140
112
  handleArrowKeys(event) {
141
- const optionIndex = this.getVisuallyFocusedListBoxOptionRefIndex();
113
+ const optionIndex = this.getVisuallyFocusedOptionRefIndex();
142
114
  const firstOption = 0;
143
115
  const lastOption = this.listBoxOptionRefs().length - 1;
144
116
  if (optionIndex === -1) {
@@ -168,7 +140,7 @@ class ListBoxComponent {
168
140
  }
169
141
  }
170
142
  }
171
- getVisuallyFocusedListBoxOptionRefIndex() {
143
+ getVisuallyFocusedOptionRefIndex() {
172
144
  return this.listBoxOptionRefs().findIndex(r => r.nativeElement.classList.contains('visual-focus'));
173
145
  }
174
146
  setVisualFocus(optionIndex) {
@@ -181,150 +153,82 @@ class ListBoxComponent {
181
153
  this.ariaActiveDescendant.set(null);
182
154
  }
183
155
  clearVisualFocus() {
184
- const optionIndex = this.getVisuallyFocusedListBoxOptionRefIndex();
156
+ const optionIndex = this.getVisuallyFocusedOptionRefIndex();
185
157
  if (optionIndex !== -1) {
186
158
  this.removeVisualFocus(optionIndex);
187
159
  }
188
160
  }
189
161
  setSelectedAttribute(optionIndex) {
162
+ if (!this.hasAriaSelected)
163
+ return;
190
164
  this.listBoxOptionRefs()[optionIndex].nativeElement.setAttribute('aria-selected', 'true');
191
165
  }
192
166
  removeSelectedAttribute() {
167
+ if (!this.hasAriaSelected)
168
+ return;
193
169
  this.listBoxOptionRefs()
194
- .find(o => o.nativeElement.hasAttribute('aria-selected'))
195
- ?.nativeElement.removeAttribute('aria-selected');
170
+ .find(o => o.nativeElement.hasAttribute('aria-selected'))?.nativeElement.removeAttribute('aria-selected');
196
171
  }
197
- registerOnChange(onChange) {
198
- this.onChange = onChange;
199
- }
200
- registerOnTouched(onTouch) {
201
- this.onTouch = onTouch;
202
- }
203
- writeValue(value) {
204
- this.value = value;
205
- }
206
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
207
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.0", type: ListBoxComponent, isStandalone: true, selector: "ngx-bsl-list-box", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, exposeAriaActiveDescendant: { classPropertyName: "exposeAriaActiveDescendant", publicName: "exposeAriaActiveDescendant", isSignal: true, isRequired: false, transformFunction: null }, comparisonField: { classPropertyName: "comparisonField", publicName: "comparisonField", isSignal: true, isRequired: false, transformFunction: null }, initialValue: { classPropertyName: "initialValue", publicName: "initialValue", isSignal: true, isRequired: false, transformFunction: null }, initialFocusedOptionIndex: { classPropertyName: "initialFocusedOptionIndex", publicName: "initialFocusedOptionIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectOption: "selectOption" }, host: { attributes: { "role": "listbox" }, listeners: { "click": "onClick($event)", "keydown": "onKeydown($event)" }, properties: { "attr.id": "id()", "attr.aria-label": "ariaLabel()", "attr.aria-labelledby": "ariaLabelledby()", "attr.aria-activedescendant": "exposeAriaActiveDescendant() ? null : ariaActiveDescendant()" } }, providers: [
208
- IdGenerator,
209
- {
210
- provide: NG_VALUE_ACCESSOR,
211
- useExisting: forwardRef(() => ListBoxComponent),
212
- multi: true,
213
- },
214
- ], queries: [{ propertyName: "listBoxOptions", predicate: (ListBoxOptionComponent), isSignal: true }, { propertyName: "listBoxOptionRefs", predicate: ListBoxOptionComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: ["ngx-bsl-list-box{width:100%;display:flex;flex-direction:column;padding:4px;border:1px solid var(--bsl-list-box-borderColor);border-radius:6px;background-color:var(--bsl-list-box-backgroundColor);overflow:hidden}ngx-bsl-list-box .list-box-no-options-message{padding:4px;display:flex;justify-content:center;font:var(--bsl-font-sm);color:var(--bsl-textColor)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
172
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
173
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.0.0", type: ListBoxDirective, isStandalone: true, selector: "[ngxBslListBox]", inputs: { listBoxId: { classPropertyName: "listBoxId", publicName: "listBoxId", isSignal: true, isRequired: false, transformFunction: null }, listBoxAriaLabel: { classPropertyName: "listBoxAriaLabel", publicName: "listBoxAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, listBoxAriaLabelledby: { classPropertyName: "listBoxAriaLabelledby", publicName: "listBoxAriaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, optionValueEquality: { classPropertyName: "optionValueEquality", publicName: "optionValueEquality", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "listBoxOptions", predicate: (ListBoxOptionComponent), descendants: true, isSignal: true }, { propertyName: "listBoxOptionRefs", predicate: ListBoxOptionComponent, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0 });
215
174
  }
216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxComponent, decorators: [{
217
- type: Component,
218
- args: [{ selector: 'ngx-bsl-list-box', imports: [], template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
219
- IdGenerator,
220
- {
221
- provide: NG_VALUE_ACCESSOR,
222
- useExisting: forwardRef(() => ListBoxComponent),
223
- multi: true,
224
- },
225
- ], host: {
226
- 'role': 'listbox',
227
- '[attr.id]': 'id()',
228
- '[attr.aria-label]': 'ariaLabel()',
229
- '[attr.aria-labelledby]': 'ariaLabelledby()',
230
- '[attr.aria-activedescendant]': 'exposeAriaActiveDescendant() ? null : ariaActiveDescendant()',
231
- }, styles: ["ngx-bsl-list-box{width:100%;display:flex;flex-direction:column;padding:4px;border:1px solid var(--bsl-list-box-borderColor);border-radius:6px;background-color:var(--bsl-list-box-backgroundColor);overflow:hidden}ngx-bsl-list-box .list-box-no-options-message{padding:4px;display:flex;justify-content:center;font:var(--bsl-font-sm);color:var(--bsl-textColor)}\n"] }]
232
- }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledby", required: false }] }], exposeAriaActiveDescendant: [{ type: i0.Input, args: [{ isSignal: true, alias: "exposeAriaActiveDescendant", required: false }] }], comparisonField: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparisonField", required: false }] }], initialValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValue", required: false }] }], initialFocusedOptionIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialFocusedOptionIndex", required: false }] }], selectOption: [{ type: i0.Output, args: ["selectOption"] }], listBoxOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ListBoxOptionComponent), { isSignal: true }] }], listBoxOptionRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ListBoxOptionComponent), { ...{ descendants: true, read: (ElementRef) }, isSignal: true }] }], onClick: [{
233
- type: HostListener,
234
- args: ['click', ['$event']]
235
- }], onKeydown: [{
236
- type: HostListener,
237
- args: ['keydown', ['$event']]
238
- }] } });
239
-
240
- class ListBoxGroupComponent {
241
- title = input(...(ngDevMode ? [undefined, { debugName: "title" }] : []));
242
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
243
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: ListBoxGroupComponent, isStandalone: true, selector: "ngx-bsl-list-box-group", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
244
- @if (title()) {
245
- <div class="group-title">{{ title() }}</div>
246
- }
247
- <ng-content></ng-content>
248
- `, isInline: true, styles: [".group-title{padding:.375rem .5rem;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted);font-weight:500}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
249
- }
250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxGroupComponent, decorators: [{
251
- type: Component,
252
- args: [{ selector: 'ngx-bsl-list-box-group', imports: [], template: `
253
- @if (title()) {
254
- <div class="group-title">{{ title() }}</div>
255
- }
256
- <ng-content></ng-content>
257
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".group-title{padding:.375rem .5rem;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted);font-weight:500}\n"] }]
258
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }] } });
259
-
260
- class ListBoxOptionValueConverterPipe {
261
- transform(value, bindLabel) {
262
- if (!value) {
263
- return '';
264
- }
265
- if (typeof value === 'string') {
266
- return value;
267
- }
268
- if (typeof value === 'number') {
269
- return value.toString();
270
- }
271
- if (typeof value === 'object' && bindLabel) {
272
- if (bindLabel in value) {
273
- return value[bindLabel];
274
- }
275
- throw new Error('Provided label is incorrect');
276
- }
277
- throw new Error('Cannot parse the value');
278
- }
279
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxOptionValueConverterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
280
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: ListBoxOptionValueConverterPipe, isStandalone: true, name: "listBoxOptionValueConverter" });
281
- }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxOptionValueConverterPipe, decorators: [{
283
- type: Pipe,
284
- args: [{ name: 'listBoxOptionValueConverter' }]
285
- }] });
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxDirective, decorators: [{
176
+ type: Directive,
177
+ args: [{ selector: '[ngxBslListBox]' }]
178
+ }], propDecorators: { listBoxId: [{ type: i0.Input, args: [{ isSignal: true, alias: "listBoxId", required: false }] }], listBoxAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "listBoxAriaLabel", required: false }] }], listBoxAriaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "listBoxAriaLabelledby", required: false }] }], optionValueEquality: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValueEquality", required: false }] }], listBoxOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ListBoxOptionComponent), { ...{ descendants: true }, isSignal: true }] }], listBoxOptionRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ListBoxOptionComponent), { ...{ descendants: true, read: (ElementRef) }, isSignal: true }] }] } });
286
179
 
287
180
  class ComboboxComponent {
181
+ listBox = inject((ListBoxDirective));
182
+ destroyRef = inject(DestroyRef);
288
183
  id = input.required(...(ngDevMode ? [{ debugName: "id" }] : []));
289
- options = input.required(...(ngDevMode ? [{ debugName: "options" }] : []));
290
- bindLabel = input(...(ngDevMode ? [undefined, { debugName: "bindLabel" }] : []));
291
- groupBy = input(...(ngDevMode ? [undefined, { debugName: "groupBy" }] : []));
292
- comparisonField = input(...(ngDevMode ? [undefined, { debugName: "comparisonField" }] : []));
293
184
  placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
294
185
  ariaLabel = input(...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : []));
295
186
  ariaLabelledBy = input(...(ngDevMode ? [undefined, { debugName: "ariaLabelledBy" }] : []));
187
+ optionValueParse = input((option) => option, ...(ngDevMode ? [{ debugName: "optionValueParse" }] : []));
296
188
  confirmSelection = output();
297
- listBox = viewChild(ListBoxComponent, ...(ngDevMode ? [{ debugName: "listBox" }] : []));
298
189
  onChange = (_value) => { };
299
190
  onTouch = () => { };
300
- value = signal('', ...(ngDevMode ? [{ debugName: "value" }] : []));
191
+ value = model('', ...(ngDevMode ? [{ debugName: "value" }] : []));
301
192
  open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
302
- ariaActiveDescendant = computed(() => this.listBox()?.ariaActiveDescendant() ?? null, ...(ngDevMode ? [{ debugName: "ariaActiveDescendant" }] : []));
303
- initialFocusedOptionIndex = signal(null, ...(ngDevMode ? [{ debugName: "initialFocusedOptionIndex" }] : []));
304
- groupedOptions = computed(() => {
305
- const groupByKey = this.groupBy();
306
- if (groupByKey) {
307
- return this.groupDataBy(groupByKey, this.options());
308
- }
309
- return [];
310
- }, ...(ngDevMode ? [{ debugName: "groupedOptions" }] : []));
311
- ignoreOptionsUpdate = false;
193
+ ariaActiveDescendant = computed(() => this.listBox.ariaActiveDescendant() ?? null, ...(ngDevMode ? [{ debugName: "ariaActiveDescendant" }] : []));
194
+ optionSelecting = false;
195
+ optionChangedBy = null;
312
196
  constructor() {
313
197
  effect(() => {
314
- if (!this.options().length || this.ignoreOptionsUpdate) {
315
- this.ignoreOptionsUpdate = false;
198
+ const hasOptions = this.listBox.listBoxOptions().length;
199
+ if (this.optionChangedBy === 'input' && hasOptions) {
200
+ this.showListBox();
201
+ // Must be set after option components initialization.
202
+ setTimeout(() => this.listBox.setVisualMarkups(this.value()));
203
+ }
204
+ else if (this.optionChangedBy === 'selection' || !hasOptions) {
316
205
  this.hideListBox();
317
206
  }
318
- else {
319
- this.showListBox();
207
+ this.optionChangedBy = null;
208
+ });
209
+ }
210
+ ngOnInit() {
211
+ this.listBox.hasAriaSelected = false;
212
+ this.subscribeSelectOption();
213
+ }
214
+ subscribeSelectOption() {
215
+ this.listBox.selectOption.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(option => {
216
+ if (option) {
217
+ this.optionChangedBy = 'selection';
218
+ this.value.set(this.optionValueParse()(option));
219
+ this.onChange(this.value());
320
220
  }
221
+ this.hideListBox();
321
222
  });
322
223
  }
323
224
  showListBox() {
225
+ if (this.open())
226
+ return;
324
227
  this.open.set(true);
325
228
  }
326
229
  hideListBox() {
327
- this.initialFocusedOptionIndex.set(null);
230
+ if (!this.open())
231
+ return;
328
232
  this.open.set(false);
329
233
  }
330
234
  onClick() {
@@ -332,73 +236,50 @@ class ComboboxComponent {
332
236
  this.hideListBox();
333
237
  }
334
238
  else {
335
- if (this.options().length) {
239
+ if (this.listBox.listBoxOptions().length) {
336
240
  this.showListBox();
241
+ this.listBox.setVisualMarkups(this.value());
337
242
  }
338
243
  }
339
244
  }
340
- onSelectOption(value) {
341
- let valueToSet;
342
- if (typeof value === 'string') {
343
- valueToSet = value;
344
- }
345
- else {
346
- const comparisonField = this.comparisonField();
347
- if (comparisonField) {
348
- if (typeof value[comparisonField] === 'string') {
349
- valueToSet = value[comparisonField];
350
- }
351
- else {
352
- throw new Error('Type of property pointed by comparisonField must be a string.');
353
- }
354
- }
355
- else {
356
- throw new Error('comparisonField is not provided.');
357
- }
245
+ onBlur() {
246
+ if (!this.optionSelecting) {
247
+ this.hideListBox();
358
248
  }
359
- this.ignoreOptionsUpdate = true;
360
- this.value.set(valueToSet);
361
- this.onChange(this.value());
362
- this.hideListBox();
249
+ }
250
+ onListBoxPointerDown(event) {
251
+ event.preventDefault();
252
+ this.optionSelecting = true;
253
+ }
254
+ onListBoxClick(event) {
255
+ this.listBox.onClick(event);
256
+ this.optionSelecting = false;
363
257
  }
364
258
  onInputChange(event) {
365
259
  const value = event.target.value;
366
260
  this.value.set(value);
261
+ this.optionChangedBy = 'input';
262
+ if (this.listBox.listBoxOptions().length) {
263
+ this.showListBox();
264
+ this.listBox.setVisualMarkups(this.value());
265
+ }
367
266
  this.onChange(this.value());
368
267
  }
369
268
  onKeydown(event) {
370
269
  event.preventDefault();
371
- if (!this.open()) {
372
- if (event.code === 'ArrowUp') {
373
- if (!this.options().length)
374
- return;
375
- this.initialFocusedOptionIndex.set(this.options().length - 1);
376
- this.showListBox();
377
- }
378
- else if (event.code === 'ArrowDown') {
379
- if (!this.options().length)
380
- return;
381
- this.initialFocusedOptionIndex.set(0);
382
- this.showListBox();
383
- }
384
- else if (event.code === 'Enter') {
385
- this.confirmSelection.emit();
386
- }
270
+ if (this.open()) {
271
+ this.listBox.onKeydown(event);
387
272
  }
388
- else {
389
- this.listBox()?.onKeydown(event);
273
+ else if (event.code === 'Enter') {
274
+ this.confirmSelection.emit();
390
275
  }
391
- }
392
- groupDataBy(field, data) {
393
- const groupsMap = data.reduce((map, value) => {
394
- const key = value[field];
395
- if (!map.has(key)) {
396
- map.set(key, []);
276
+ else {
277
+ this.showListBox();
278
+ const markupsSet = this.listBox.setVisualMarkups(this.value());
279
+ if (!markupsSet) {
280
+ this.listBox.onKeydown(event);
397
281
  }
398
- map.get(key)?.push(value);
399
- return map;
400
- }, new Map);
401
- return Array.from(groupsMap, ([group, data]) => ({ group, data }));
282
+ }
402
283
  }
403
284
  registerOnChange(onChange) {
404
285
  this.onChange = onChange;
@@ -410,36 +291,37 @@ class ComboboxComponent {
410
291
  this.value.set(value);
411
292
  }
412
293
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
413
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: ComboboxComponent, isStandalone: true, selector: "ngx-bsl-combobox", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, bindLabel: { classPropertyName: "bindLabel", publicName: "bindLabel", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, comparisonField: { classPropertyName: "comparisonField", publicName: "comparisonField", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { confirmSelection: "confirmSelection" }, providers: [
294
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.0", type: ComboboxComponent, isStandalone: true, selector: "ngx-bsl-combobox", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null }, optionValueParse: { classPropertyName: "optionValueParse", publicName: "optionValueParse", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { confirmSelection: "confirmSelection", value: "valueChange" }, providers: [
414
295
  {
415
296
  provide: NG_VALUE_ACCESSOR,
416
297
  useExisting: forwardRef(() => ComboboxComponent),
417
298
  multi: true,
418
299
  },
419
- ], viewQueries: [{ propertyName: "listBox", first: true, predicate: ListBoxComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<input\n type=\"text\"\n role=\"combobox\"\n #comboboxInput\n cdkOverlayOrigin\n [value]=\"value() | listBoxOptionValueConverter : bindLabel()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"'list-box-' + id()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n (input)=\"onInputChange($any($event))\"\n (blur)=\"hideListBox()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\"\n>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxInput\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"comboboxInput.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <ngx-bsl-list-box\n [initialFocusedOptionIndex]=\"initialFocusedOptionIndex()\"\n [comparisonField]=\"comparisonField()\"\n [id]=\"'list-box-' + id()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaLabelledby]=\"ariaLabelledBy()\"\n [exposeAriaActiveDescendant]=\"true\"\n (selectOption)=\"onSelectOption($event)\">\n @if (options() && !groupBy()) {\n @for (option of options(); track option; let index = $index) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n }\n @if (groupedOptions() && groupBy()) {\n @for (group of groupedOptions(); track group) {\n <ngx-bsl-list-box-group [title]=\"group.group\"></ngx-bsl-list-box-group>\n @for (option of group.data; track option; let index = $index) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n }\n }\n </ngx-bsl-list-box>\n</ng-template>\n", dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: ListBoxComponent, selector: "ngx-bsl-list-box", inputs: ["id", "ariaLabel", "ariaLabelledby", "exposeAriaActiveDescendant", "comparisonField", "initialValue", "initialFocusedOptionIndex"], outputs: ["selectOption"] }, { kind: "component", type: ListBoxOptionComponent, selector: "ngx-bsl-list-box-option", inputs: ["value", "id"] }, { kind: "component", type: ListBoxGroupComponent, selector: "ngx-bsl-list-box-group", inputs: ["title"] }, { kind: "pipe", type: ListBoxOptionValueConverterPipe, name: "listBoxOptionValueConverter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
300
+ ], hostDirectives: [{ directive: ListBoxDirective, inputs: ["listBoxId", "listBoxId", "listBoxAriaLabel", "listBoxAriaLabel", "listBoxAriaLabelledby", "listBoxAriaLabelledby", "optionValueEquality", "optionValueEquality"] }], ngImport: i0, template: "<input\n type=\"text\"\n role=\"combobox\"\n #comboboxInput\n cdkOverlayOrigin\n [value]=\"value()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n (input)=\"onInputChange($any($event))\"\n (blur)=\"onBlur()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\"\n>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxInput\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"comboboxInput.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <!-- eslint-disable-next-line\n @angular-eslint/template/interactive-supports-focus,\n @angular-eslint/template/click-events-have-key-events -->\n <div\n role=\"listbox\"\n class=\"ngx-bsl-list-box\"\n [id]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"listBox.listBoxAriaLabel()\"\n [attr.aria-labelledby]=\"listBox.listBoxAriaLabelledby()\"\n [attr.aria-activedescendant]=\"listBox.ariaActiveDescendant()\"\n (pointerdown)=\"onListBoxPointerDown($event)\"\n (click)=\"onListBoxClick($event)\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
420
301
  }
421
302
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ComboboxComponent, decorators: [{
422
303
  type: Component,
423
304
  args: [{ selector: 'ngx-bsl-combobox', imports: [
424
305
  CdkOverlayOrigin,
425
306
  CdkConnectedOverlay,
426
- ListBoxComponent,
427
- ListBoxOptionComponent,
428
- ListBoxGroupComponent,
429
- ListBoxOptionValueConverterPipe,
430
307
  ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
431
308
  {
432
309
  provide: NG_VALUE_ACCESSOR,
433
310
  useExisting: forwardRef(() => ComboboxComponent),
434
311
  multi: true,
435
312
  },
436
- ], template: "<input\n type=\"text\"\n role=\"combobox\"\n #comboboxInput\n cdkOverlayOrigin\n [value]=\"value() | listBoxOptionValueConverter : bindLabel()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"'list-box-' + id()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n (input)=\"onInputChange($any($event))\"\n (blur)=\"hideListBox()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\"\n>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxInput\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"comboboxInput.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <ngx-bsl-list-box\n [initialFocusedOptionIndex]=\"initialFocusedOptionIndex()\"\n [comparisonField]=\"comparisonField()\"\n [id]=\"'list-box-' + id()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaLabelledby]=\"ariaLabelledBy()\"\n [exposeAriaActiveDescendant]=\"true\"\n (selectOption)=\"onSelectOption($event)\">\n @if (options() && !groupBy()) {\n @for (option of options(); track option; let index = $index) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n }\n @if (groupedOptions() && groupBy()) {\n @for (group of groupedOptions(); track group) {\n <ngx-bsl-list-box-group [title]=\"group.group\"></ngx-bsl-list-box-group>\n @for (option of group.data; track option; let index = $index) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n }\n }\n </ngx-bsl-list-box>\n</ng-template>\n" }]
437
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], bindLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "bindLabel", required: false }] }], groupBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupBy", required: false }] }], comparisonField: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparisonField", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], confirmSelection: [{ type: i0.Output, args: ["confirmSelection"] }], listBox: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ListBoxComponent), { isSignal: true }] }] } });
313
+ ], hostDirectives: [
314
+ {
315
+ directive: ListBoxDirective,
316
+ inputs: ['listBoxId', 'listBoxAriaLabel', 'listBoxAriaLabelledby', 'optionValueEquality'],
317
+ },
318
+ ], template: "<input\n type=\"text\"\n role=\"combobox\"\n #comboboxInput\n cdkOverlayOrigin\n [value]=\"value()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n (input)=\"onInputChange($any($event))\"\n (blur)=\"onBlur()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\"\n>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"comboboxInput\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"comboboxInput.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <!-- eslint-disable-next-line\n @angular-eslint/template/interactive-supports-focus,\n @angular-eslint/template/click-events-have-key-events -->\n <div\n role=\"listbox\"\n class=\"ngx-bsl-list-box\"\n [id]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"listBox.listBoxAriaLabel()\"\n [attr.aria-labelledby]=\"listBox.listBoxAriaLabelledby()\"\n [attr.aria-activedescendant]=\"listBox.ariaActiveDescendant()\"\n (pointerdown)=\"onListBoxPointerDown($event)\"\n (click)=\"onListBoxClick($event)\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n" }]
319
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], optionValueParse: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValueParse", required: false }] }], confirmSelection: [{ type: i0.Output, args: ["confirmSelection"] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
438
320
 
439
321
  class CheckboxComponent {
440
322
  id = input.required(...(ngDevMode ? [{ debugName: "id" }] : []));
323
+ disabled = model(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
441
324
  checked = signal(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
442
- disabled = signal(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
443
325
  onChange = (_value) => { };
444
326
  onTouch = () => { };
445
327
  registerOnChange(onChange) {
@@ -465,13 +347,13 @@ class CheckboxComponent {
465
347
  this.onChange(this.checked());
466
348
  }
467
349
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
468
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: CheckboxComponent, isStandalone: true, selector: "ngx-bsl-checkbox", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "keydown.enter": "onKeydown($event)", "keydown.space": "onKeydown($event)", "click": "onSelect()", "keyup.enter": "onSelect()", "keyup.space": "onSelect()" } }, providers: [
350
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: CheckboxComponent, isStandalone: true, selector: "ngx-bsl-checkbox", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange" }, host: { listeners: { "keydown.enter": "onKeydown($event)", "keydown.space": "onKeydown($event)", "click": "onSelect()", "keyup.enter": "onSelect()", "keyup.space": "onSelect()" } }, providers: [
469
351
  {
470
352
  provide: NG_VALUE_ACCESSOR,
471
353
  multi: true,
472
354
  useExisting: CheckboxComponent,
473
355
  },
474
- ], ngImport: i0, template: "<span role=\"checkbox\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n [id]=\"id()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n class=\"bsl-checkbox\">\n @if (checked()) {\n <ngx-bsl-icon-check></ngx-bsl-icon-check>\n }\n</span>\n\n<span [id]=\"id() + '-label'\">\n <ng-content></ng-content>\n</span>\n", styles: ["ngx-bsl-checkbox{width:fit-content;display:flex;align-items:center;gap:.5rem;font:var(--bsl-font-sm);cursor:default}.bsl-checkbox{width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;background-color:var(--bsl-checkbox-backgroundColor);border:1px solid var(--bsl-checkbox-borderColor);border-radius:4px;color:var(--bsl-checkbox-textColor)}.bsl-checkbox:focus-visible{outline-offset:2px}.bsl-checkbox:hover{border-color:var(--bsl-checkbox-borderColor-hover)}.bsl-checkbox.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "component", type: IconCheckComponent, selector: "ngx-bsl-icon-check" }], encapsulation: i0.ViewEncapsulation.None });
356
+ ], ngImport: i0, template: "<span role=\"checkbox\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n [id]=\"id()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n class=\"bsl-checkbox\">\n @if (checked()) {\n <ngx-bsl-icon-check></ngx-bsl-icon-check>\n }\n</span>\n\n<span [id]=\"id() + '-label'\">\n <ng-content></ng-content>\n</span>\n", styles: ["ngx-bsl-checkbox{width:fit-content;display:flex;align-items:center;gap:.5rem;font:var(--bsl-font-sm);cursor:default}.bsl-checkbox{width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;background-color:var(--bsl-checkbox-backgroundColor);border:1px solid var(--bsl-checkbox-borderColor);border-radius:4px;color:var(--bsl-checkbox-textColor)}.bsl-checkbox:focus-visible{outline-offset:2px}.bsl-checkbox:hover{border-color:var(--bsl-checkbox-borderColor-hover)}.bsl-checkbox.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "component", type: IconCheckComponent, selector: "ngx-bsl-icon-check" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
475
357
  }
476
358
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: CheckboxComponent, decorators: [{
477
359
  type: Component,
@@ -483,8 +365,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
483
365
  multi: true,
484
366
  useExisting: CheckboxComponent,
485
367
  },
486
- ], encapsulation: ViewEncapsulation.None, template: "<span role=\"checkbox\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n [id]=\"id()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n class=\"bsl-checkbox\">\n @if (checked()) {\n <ngx-bsl-icon-check></ngx-bsl-icon-check>\n }\n</span>\n\n<span [id]=\"id() + '-label'\">\n <ng-content></ng-content>\n</span>\n", styles: ["ngx-bsl-checkbox{width:fit-content;display:flex;align-items:center;gap:.5rem;font:var(--bsl-font-sm);cursor:default}.bsl-checkbox{width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;background-color:var(--bsl-checkbox-backgroundColor);border:1px solid var(--bsl-checkbox-borderColor);border-radius:4px;color:var(--bsl-checkbox-textColor)}.bsl-checkbox:focus-visible{outline-offset:2px}.bsl-checkbox:hover{border-color:var(--bsl-checkbox-borderColor-hover)}.bsl-checkbox.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"] }]
487
- }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], onKeydown: [{
368
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<span role=\"checkbox\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-labelledby]=\"id() + '-label'\"\n [id]=\"id()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n class=\"bsl-checkbox\">\n @if (checked()) {\n <ngx-bsl-icon-check></ngx-bsl-icon-check>\n }\n</span>\n\n<span [id]=\"id() + '-label'\">\n <ng-content></ng-content>\n</span>\n", styles: ["ngx-bsl-checkbox{width:fit-content;display:flex;align-items:center;gap:.5rem;font:var(--bsl-font-sm);cursor:default}.bsl-checkbox{width:1rem;height:1rem;display:flex;justify-content:center;align-items:center;background-color:var(--bsl-checkbox-backgroundColor);border:1px solid var(--bsl-checkbox-borderColor);border-radius:4px;color:var(--bsl-checkbox-textColor)}.bsl-checkbox:focus-visible{outline-offset:2px}.bsl-checkbox:hover{border-color:var(--bsl-checkbox-borderColor-hover)}.bsl-checkbox.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"] }]
369
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], onKeydown: [{
488
370
  type: HostListener,
489
371
  args: ['keydown.enter', ['$event']]
490
372
  }, {
@@ -538,6 +420,7 @@ class DrawerComponent {
538
420
  }
539
421
  close() {
540
422
  this.isClosed.set(true);
423
+ this.closed.emit();
541
424
  }
542
425
  onTransitionEnd(event) {
543
426
  if (this.elementRef.nativeElement === event.target) {
@@ -547,22 +430,42 @@ class DrawerComponent {
547
430
  }
548
431
  }
549
432
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
550
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: DrawerComponent, isStandalone: true, selector: "ngx-bsl-drawer", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closed: "closed" }, host: { attributes: { "role": "dialog", "aria-modal": "true" }, listeners: { "transitionend": "onTransitionEnd($event)" }, properties: { "attr.aria-label": "title()", "class.ngx-bsl-drawer-closed": "isClosed()" } }, ngImport: i0, template: "<div cdkTrapFocus\n cdkTrapFocusAutoCapture=\"true\"\n class=\"ngx-bsl-drawer-container\">\n <header class=\"ngx-bsl-drawer-header\">\n <button class=\"button-icon\"\n (click)=\"close()\">\n <ngx-bsl-icon-x-mark></ngx-bsl-icon-x-mark>\n </button>\n @if (title()) {\n <h2 class=\"text-ellipsis\">{{ title() }}</h2>\n }\n </header>\n <div class=\"ngx-bsl-drawer-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["ngx-bsl-drawer{position:fixed;left:0;right:0;bottom:0;max-height:95vh;height:100%;transform:translateY(0);transition:transform .15s cubic-bezier(0,0,.2,1)}ngx-bsl-drawer.ngx-bsl-drawer-closed{transform:translateY(100%)}.ngx-bsl-drawer-container{height:100%;padding:24px;display:flex;flex-direction:column;background-color:var(--bsl-backgroundColor);border:1px solid var(--bsl-borderColor-emphasis);border-top-left-radius:1rem;border-top-right-radius:1rem}ngx-bsl-drawer-header{margin-bottom:1rem;display:flex;justify-content:space-between;flex-direction:row-reverse}.ngx-bsl-drawer-content{overflow-y:auto;height:100%}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: IconXMarkComponent, selector: "ngx-bsl-icon-x-mark" }] });
433
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: DrawerComponent, isStandalone: true, selector: "ngx-bsl-drawer", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closed: "closed" }, host: { attributes: { "role": "dialog", "aria-modal": "true" }, listeners: { "transitionend": "onTransitionEnd($event)" }, properties: { "attr.aria-label": "title()", "class.bsl-drawer-closed": "isClosed()" } }, ngImport: i0, template: "<div cdkTrapFocus\n cdkTrapFocusAutoCapture=\"true\"\n class=\"bsl-drawer-container\">\n <header class=\"bsl-drawer-header\">\n <button class=\"bsl-button-icon\"\n (click)=\"close()\">\n <ngx-bsl-icon-x-mark></ngx-bsl-icon-x-mark>\n </button>\n @if (title()) {\n <h2 class=\"text-ellipsis\">{{ title() }}</h2>\n }\n </header>\n <div class=\"bsl-drawer-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["ngx-bsl-drawer{position:fixed;left:0;right:0;bottom:0;max-height:95vh;height:100%;transform:translateY(0);transition:transform .15s cubic-bezier(0,0,.2,1)}ngx-bsl-drawer.bsl-drawer-closed{transform:translateY(100%)}.bsl-drawer-container{height:100%;padding:24px;display:flex;flex-direction:column;background-color:var(--bsl-backgroundColor);border:1px solid var(--bsl-borderColor-emphasis);border-top-left-radius:1rem;border-top-right-radius:1rem}.bsl-drawer-header{margin-bottom:1rem;display:flex;justify-content:space-between;flex-direction:row-reverse}.bsl-drawer-content{overflow-y:auto;height:100%}\n"], dependencies: [{ kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: IconXMarkComponent, selector: "ngx-bsl-icon-x-mark" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
551
434
  }
552
435
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: DrawerComponent, decorators: [{
553
436
  type: Component,
554
437
  args: [{ selector: 'ngx-bsl-drawer', imports: [
555
438
  CdkTrapFocus,
556
439
  IconXMarkComponent,
557
- ], host: {
440
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
558
441
  'role': 'dialog',
559
442
  'aria-modal': 'true',
560
443
  '[attr.aria-label]': 'title()',
561
- '[class.ngx-bsl-drawer-closed]': 'isClosed()',
444
+ '[class.bsl-drawer-closed]': 'isClosed()',
562
445
  '(transitionend)': 'onTransitionEnd($event)',
563
- }, template: "<div cdkTrapFocus\n cdkTrapFocusAutoCapture=\"true\"\n class=\"ngx-bsl-drawer-container\">\n <header class=\"ngx-bsl-drawer-header\">\n <button class=\"button-icon\"\n (click)=\"close()\">\n <ngx-bsl-icon-x-mark></ngx-bsl-icon-x-mark>\n </button>\n @if (title()) {\n <h2 class=\"text-ellipsis\">{{ title() }}</h2>\n }\n </header>\n <div class=\"ngx-bsl-drawer-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["ngx-bsl-drawer{position:fixed;left:0;right:0;bottom:0;max-height:95vh;height:100%;transform:translateY(0);transition:transform .15s cubic-bezier(0,0,.2,1)}ngx-bsl-drawer.ngx-bsl-drawer-closed{transform:translateY(100%)}.ngx-bsl-drawer-container{height:100%;padding:24px;display:flex;flex-direction:column;background-color:var(--bsl-backgroundColor);border:1px solid var(--bsl-borderColor-emphasis);border-top-left-radius:1rem;border-top-right-radius:1rem}ngx-bsl-drawer-header{margin-bottom:1rem;display:flex;justify-content:space-between;flex-direction:row-reverse}.ngx-bsl-drawer-content{overflow-y:auto;height:100%}\n"] }]
446
+ }, template: "<div cdkTrapFocus\n cdkTrapFocusAutoCapture=\"true\"\n class=\"bsl-drawer-container\">\n <header class=\"bsl-drawer-header\">\n <button class=\"bsl-button-icon\"\n (click)=\"close()\">\n <ngx-bsl-icon-x-mark></ngx-bsl-icon-x-mark>\n </button>\n @if (title()) {\n <h2 class=\"text-ellipsis\">{{ title() }}</h2>\n }\n </header>\n <div class=\"bsl-drawer-content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: ["ngx-bsl-drawer{position:fixed;left:0;right:0;bottom:0;max-height:95vh;height:100%;transform:translateY(0);transition:transform .15s cubic-bezier(0,0,.2,1)}ngx-bsl-drawer.bsl-drawer-closed{transform:translateY(100%)}.bsl-drawer-container{height:100%;padding:24px;display:flex;flex-direction:column;background-color:var(--bsl-backgroundColor);border:1px solid var(--bsl-borderColor-emphasis);border-top-left-radius:1rem;border-top-right-radius:1rem}.bsl-drawer-header{margin-bottom:1rem;display:flex;justify-content:space-between;flex-direction:row-reverse}.bsl-drawer-content{overflow-y:auto;height:100%}\n"] }]
564
447
  }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
565
448
 
449
+ class ListBoxGroupComponent {
450
+ title = input(...(ngDevMode ? [undefined, { debugName: "title" }] : []));
451
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
452
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: ListBoxGroupComponent, isStandalone: true, selector: "ngx-bsl-list-box-group", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
453
+ @if (title()) {
454
+ <div class="ngx-bsl-list-box-group-title">{{ title() }}</div>
455
+ }
456
+ <ng-content></ng-content>
457
+ `, isInline: true, styles: ["ngx-bsl-list-box-group{display:flex;flex-direction:column;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted)}.ngx-bsl-list-box-group-title{padding:.375rem .5rem;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted);font-weight:500}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
458
+ }
459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxGroupComponent, decorators: [{
460
+ type: Component,
461
+ args: [{ selector: 'ngx-bsl-list-box-group', imports: [], template: `
462
+ @if (title()) {
463
+ <div class="ngx-bsl-list-box-group-title">{{ title() }}</div>
464
+ }
465
+ <ng-content></ng-content>
466
+ `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: ["ngx-bsl-list-box-group{display:flex;flex-direction:column;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted)}.ngx-bsl-list-box-group-title{padding:.375rem .5rem;font:var(--bsl-font-xs);color:var(--bsl-textColor-muted);font-weight:500}\n"] }]
467
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }] } });
468
+
566
469
  // eslint-disable-next-line @typescript-eslint/no-extraneous-class
567
470
  class ListBoxSeparatorComponent {
568
471
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ListBoxSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -573,6 +476,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
573
476
  args: [{ selector: 'ngx-bsl-list-box-separator', imports: [], template: '', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: ["ngx-bsl-list-box-separator{display:block;height:1px;background-color:var(--bsl-list-box-borderColor)}\n"] }]
574
477
  }] });
575
478
 
479
+ /*
480
+ eslint-disable max-len,
481
+ @typescript-eslint/no-extraneous-class
482
+ */
483
+ class IconArrowLeftComponent {
484
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
485
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowLeftComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-left", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
486
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" >
487
+ <path fill="currentColor" d="M 16.453 0.282 C 16.536 0.195 16.636 0.124 16.744 0.075 C 16.853 0.025 16.971 0 17.091 0 C 17.211 0 17.331 0.025 17.439 0.075 C 17.547 0.124 17.647 0.195 17.731 0.282 C 17.902 0.469 17.997 0.714 17.997 0.975 C 17.997 1.23 17.902 1.48 17.731 1.662 L 8.166 11.995 L 17.731 22.333 C 17.817 22.425 17.883 22.536 17.931 22.657 C 17.979 22.777 18.003 22.905 18 23.032 C 17.997 23.161 17.971 23.293 17.922 23.413 C 17.874 23.532 17.803 23.641 17.715 23.728 C 17.631 23.815 17.535 23.883 17.425 23.928 C 17.314 23.976 17.199 24 17.079 24 C 16.962 23.995 16.849 23.968 16.741 23.92 C 16.633 23.871 16.533 23.8 16.453 23.713 L 6.279 12.718 C 6.102 12.525 6 12.267 6 11.995 C 6 11.727 6.102 11.467 6.279 11.274 L 16.453 0.282 Z"></path>
488
+ </svg>
489
+ `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
490
+ }
491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftComponent, decorators: [{
492
+ type: Component,
493
+ args: [{ selector: 'ngx-bsl-icon-arrow-left', imports: [], template: `
494
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" >
495
+ <path fill="currentColor" d="M 16.453 0.282 C 16.536 0.195 16.636 0.124 16.744 0.075 C 16.853 0.025 16.971 0 17.091 0 C 17.211 0 17.331 0.025 17.439 0.075 C 17.547 0.124 17.647 0.195 17.731 0.282 C 17.902 0.469 17.997 0.714 17.997 0.975 C 17.997 1.23 17.902 1.48 17.731 1.662 L 8.166 11.995 L 17.731 22.333 C 17.817 22.425 17.883 22.536 17.931 22.657 C 17.979 22.777 18.003 22.905 18 23.032 C 17.997 23.161 17.971 23.293 17.922 23.413 C 17.874 23.532 17.803 23.641 17.715 23.728 C 17.631 23.815 17.535 23.883 17.425 23.928 C 17.314 23.976 17.199 24 17.079 24 C 16.962 23.995 16.849 23.968 16.741 23.92 C 16.633 23.871 16.533 23.8 16.453 23.713 L 6.279 12.718 C 6.102 12.525 6 12.267 6 11.995 C 6 11.727 6.102 11.467 6.279 11.274 L 16.453 0.282 Z"></path>
496
+ </svg>
497
+ `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
498
+ }] });
499
+
500
+ /*
501
+ eslint-disable max-len,
502
+ @typescript-eslint/no-extraneous-class
503
+ */
504
+ class IconArrowRightComponent {
505
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
506
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowRightComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-right", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
507
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
508
+ <path fill="currentColor" d="M 7.547 0.284 C 7.464 0.194 7.364 0.123 7.255 0.074 C 7.145 0.025 7.026 0 6.907 0 C 6.788 0 6.67 0.025 6.56 0.074 C 6.45 0.123 6.35 0.194 6.267 0.284 C 6.096 0.469 6.001 0.716 6.001 0.974 C 6.001 1.231 6.096 1.479 6.267 1.663 L 15.834 11.998 L 6.267 22.334 C 6.181 22.427 6.113 22.537 6.067 22.657 C 6.021 22.778 5.999 22.907 6 23.036 C 6.001 23.166 6.027 23.294 6.076 23.414 C 6.124 23.533 6.195 23.641 6.283 23.732 C 6.367 23.818 6.466 23.886 6.575 23.932 C 6.684 23.978 6.801 24.001 6.918 24 C 7.036 23.998 7.152 23.972 7.26 23.923 C 7.368 23.875 7.465 23.804 7.547 23.715 L 17.721 12.719 C 17.9 12.526 18 12.267 18 11.998 C 18 11.728 17.9 11.469 17.721 11.276 L 7.547 0.284 Z"></path>
509
+ </svg>
510
+ `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
511
+ }
512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightComponent, decorators: [{
513
+ type: Component,
514
+ args: [{ selector: 'ngx-bsl-icon-arrow-right', imports: [], template: `
515
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
516
+ <path fill="currentColor" d="M 7.547 0.284 C 7.464 0.194 7.364 0.123 7.255 0.074 C 7.145 0.025 7.026 0 6.907 0 C 6.788 0 6.67 0.025 6.56 0.074 C 6.45 0.123 6.35 0.194 6.267 0.284 C 6.096 0.469 6.001 0.716 6.001 0.974 C 6.001 1.231 6.096 1.479 6.267 1.663 L 15.834 11.998 L 6.267 22.334 C 6.181 22.427 6.113 22.537 6.067 22.657 C 6.021 22.778 5.999 22.907 6 23.036 C 6.001 23.166 6.027 23.294 6.076 23.414 C 6.124 23.533 6.195 23.641 6.283 23.732 C 6.367 23.818 6.466 23.886 6.575 23.932 C 6.684 23.978 6.801 24.001 6.918 24 C 7.036 23.998 7.152 23.972 7.26 23.923 C 7.368 23.875 7.465 23.804 7.547 23.715 L 17.721 12.719 C 17.9 12.526 18 12.267 18 11.998 C 18 11.728 17.9 11.469 17.721 11.276 L 7.547 0.284 Z"></path>
517
+ </svg>
518
+ `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
519
+ }] });
520
+
521
+ /*
522
+ eslint-disable max-len,
523
+ @typescript-eslint/no-extraneous-class
524
+ */
525
+ class IconArrowLeftDoubleComponent {
526
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftDoubleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
527
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowLeftDoubleComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-left-double", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
528
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
529
+ <path fill="currentColor" d="M 12.529 0.284 C 12.614 0.194 12.714 0.123 12.825 0.074 C 12.936 0.025 13.055 0 13.175 0 C 13.295 0 13.414 0.025 13.524 0.074 C 13.636 0.123 13.736 0.194 13.82 0.284 C 13.992 0.469 14.087 0.716 14.087 0.974 C 14.087 1.232 13.992 1.479 13.82 1.664 L 4.181 11.998 L 13.82 22.334 C 13.906 22.427 13.975 22.537 14.021 22.657 C 14.067 22.778 14.089 22.907 14.088 23.037 C 14.087 23.166 14.061 23.295 14.013 23.414 C 13.963 23.533 13.893 23.641 13.803 23.732 C 13.719 23.818 13.619 23.887 13.509 23.933 C 13.399 23.979 13.282 24.001 13.163 24 C 13.045 23.998 12.928 23.972 12.82 23.924 C 12.711 23.875 12.613 23.804 12.529 23.715 L 2.281 12.72 C 2.101 12.526 2 12.268 2 11.998 C 2 11.728 2.101 11.469 2.281 11.276 L 12.529 0.284 Z M 20.441 0.284 C 20.525 0.194 20.625 0.123 20.736 0.074 C 20.847 0.025 20.966 0 21.086 0 C 21.206 0 21.325 0.025 21.436 0.074 C 21.546 0.123 21.647 0.194 21.729 0.284 C 21.903 0.469 21.999 0.716 21.999 0.974 C 21.999 1.232 21.903 1.479 21.729 1.664 L 12.093 11.998 L 21.729 22.334 C 21.818 22.427 21.886 22.537 21.933 22.657 C 21.978 22.778 22.001 22.907 22 23.037 C 21.999 23.166 21.973 23.295 21.923 23.414 C 21.875 23.533 21.804 23.641 21.715 23.732 C 21.629 23.818 21.529 23.887 21.42 23.933 C 21.309 23.979 21.194 24.001 21.075 24 C 20.957 23.998 20.84 23.972 20.729 23.924 C 20.622 23.875 20.524 23.804 20.441 23.715 L 10.193 12.72 C 10.013 12.526 9.912 12.268 9.912 11.998 C 9.912 11.728 10.013 11.469 10.193 11.276 L 20.441 0.284 Z"></path>
530
+ </svg>
531
+ `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
532
+ }
533
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftDoubleComponent, decorators: [{
534
+ type: Component,
535
+ args: [{ selector: 'ngx-bsl-icon-arrow-left-double', imports: [], template: `
536
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
537
+ <path fill="currentColor" d="M 12.529 0.284 C 12.614 0.194 12.714 0.123 12.825 0.074 C 12.936 0.025 13.055 0 13.175 0 C 13.295 0 13.414 0.025 13.524 0.074 C 13.636 0.123 13.736 0.194 13.82 0.284 C 13.992 0.469 14.087 0.716 14.087 0.974 C 14.087 1.232 13.992 1.479 13.82 1.664 L 4.181 11.998 L 13.82 22.334 C 13.906 22.427 13.975 22.537 14.021 22.657 C 14.067 22.778 14.089 22.907 14.088 23.037 C 14.087 23.166 14.061 23.295 14.013 23.414 C 13.963 23.533 13.893 23.641 13.803 23.732 C 13.719 23.818 13.619 23.887 13.509 23.933 C 13.399 23.979 13.282 24.001 13.163 24 C 13.045 23.998 12.928 23.972 12.82 23.924 C 12.711 23.875 12.613 23.804 12.529 23.715 L 2.281 12.72 C 2.101 12.526 2 12.268 2 11.998 C 2 11.728 2.101 11.469 2.281 11.276 L 12.529 0.284 Z M 20.441 0.284 C 20.525 0.194 20.625 0.123 20.736 0.074 C 20.847 0.025 20.966 0 21.086 0 C 21.206 0 21.325 0.025 21.436 0.074 C 21.546 0.123 21.647 0.194 21.729 0.284 C 21.903 0.469 21.999 0.716 21.999 0.974 C 21.999 1.232 21.903 1.479 21.729 1.664 L 12.093 11.998 L 21.729 22.334 C 21.818 22.427 21.886 22.537 21.933 22.657 C 21.978 22.778 22.001 22.907 22 23.037 C 21.999 23.166 21.973 23.295 21.923 23.414 C 21.875 23.533 21.804 23.641 21.715 23.732 C 21.629 23.818 21.529 23.887 21.42 23.933 C 21.309 23.979 21.194 24.001 21.075 24 C 20.957 23.998 20.84 23.972 20.729 23.924 C 20.622 23.875 20.524 23.804 20.441 23.715 L 10.193 12.72 C 10.013 12.526 9.912 12.268 9.912 11.998 C 9.912 11.728 10.013 11.469 10.193 11.276 L 20.441 0.284 Z"></path>
538
+ </svg>
539
+ `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
540
+ }] });
541
+
542
+ /*
543
+ eslint-disable max-len,
544
+ @typescript-eslint/no-extraneous-class
545
+ */
546
+ class IconArrowRightDoubleComponent {
547
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightDoubleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowRightDoubleComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-right-double", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
549
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
550
+ <path fill="currentColor" d="M 12.523 0.284 C 12.448 0.194 12.358 0.123 12.257 0.074 C 12.158 0.025 12.051 0 11.943 0 C 11.835 0 11.728 0.025 11.628 0.074 C 11.528 0.123 11.438 0.194 11.362 0.284 C 11.208 0.469 11.121 0.716 11.121 0.974 C 11.121 1.232 11.208 1.479 11.362 1.664 L 20.037 11.998 L 11.362 22.334 C 11.284 22.427 11.223 22.537 11.181 22.657 C 11.139 22.778 11.119 22.907 11.12 23.037 C 11.121 23.166 11.145 23.295 11.189 23.414 C 11.233 23.533 11.297 23.641 11.376 23.732 C 11.453 23.818 11.543 23.887 11.641 23.933 C 11.741 23.979 11.846 24.001 11.953 24 C 12.059 23.998 12.164 23.972 12.262 23.924 C 12.361 23.875 12.449 23.804 12.523 23.715 L 21.747 12.72 C 21.909 12.526 22 12.268 22 11.998 C 22 11.728 21.909 11.469 21.747 11.276 L 12.523 0.284 Z M 5.403 0.284 C 5.327 0.194 5.237 0.123 5.138 0.074 C 5.037 0.025 4.93 0 4.822 0 C 4.714 0 4.607 0.025 4.508 0.074 C 4.408 0.123 4.317 0.194 4.243 0.284 C 4.087 0.469 4.001 0.716 4.001 0.974 C 4.001 1.232 4.087 1.479 4.243 1.664 L 12.917 11.998 L 4.243 22.334 C 4.164 22.427 4.102 22.537 4.061 22.657 C 4.02 22.778 3.999 22.907 4 23.037 C 4.001 23.166 4.025 23.295 4.069 23.414 C 4.113 23.533 4.176 23.641 4.257 23.732 C 4.333 23.818 4.423 23.887 4.522 23.933 C 4.621 23.979 4.726 24.001 4.833 24 C 4.939 23.998 5.044 23.972 5.143 23.924 C 5.24 23.875 5.328 23.804 5.403 23.715 L 14.627 12.72 C 14.789 12.526 14.88 12.268 14.88 11.998 C 14.88 11.728 14.789 11.469 14.627 11.276 L 5.403 0.284 Z"></path>
551
+ </svg>
552
+ `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
553
+ }
554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightDoubleComponent, decorators: [{
555
+ type: Component,
556
+ args: [{ selector: 'ngx-bsl-icon-arrow-right-double', imports: [], template: `
557
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
558
+ <path fill="currentColor" d="M 12.523 0.284 C 12.448 0.194 12.358 0.123 12.257 0.074 C 12.158 0.025 12.051 0 11.943 0 C 11.835 0 11.728 0.025 11.628 0.074 C 11.528 0.123 11.438 0.194 11.362 0.284 C 11.208 0.469 11.121 0.716 11.121 0.974 C 11.121 1.232 11.208 1.479 11.362 1.664 L 20.037 11.998 L 11.362 22.334 C 11.284 22.427 11.223 22.537 11.181 22.657 C 11.139 22.778 11.119 22.907 11.12 23.037 C 11.121 23.166 11.145 23.295 11.189 23.414 C 11.233 23.533 11.297 23.641 11.376 23.732 C 11.453 23.818 11.543 23.887 11.641 23.933 C 11.741 23.979 11.846 24.001 11.953 24 C 12.059 23.998 12.164 23.972 12.262 23.924 C 12.361 23.875 12.449 23.804 12.523 23.715 L 21.747 12.72 C 21.909 12.526 22 12.268 22 11.998 C 22 11.728 21.909 11.469 21.747 11.276 L 12.523 0.284 Z M 5.403 0.284 C 5.327 0.194 5.237 0.123 5.138 0.074 C 5.037 0.025 4.93 0 4.822 0 C 4.714 0 4.607 0.025 4.508 0.074 C 4.408 0.123 4.317 0.194 4.243 0.284 C 4.087 0.469 4.001 0.716 4.001 0.974 C 4.001 1.232 4.087 1.479 4.243 1.664 L 12.917 11.998 L 4.243 22.334 C 4.164 22.427 4.102 22.537 4.061 22.657 C 4.02 22.778 3.999 22.907 4 23.037 C 4.001 23.166 4.025 23.295 4.069 23.414 C 4.113 23.533 4.176 23.641 4.257 23.732 C 4.333 23.818 4.423 23.887 4.522 23.933 C 4.621 23.979 4.726 24.001 4.833 24 C 4.939 23.998 5.044 23.972 5.143 23.924 C 5.24 23.875 5.328 23.804 5.403 23.715 L 14.627 12.72 C 14.789 12.526 14.88 12.268 14.88 11.998 C 14.88 11.728 14.789 11.469 14.627 11.276 L 5.403 0.284 Z"></path>
559
+ </svg>
560
+ `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
561
+ }] });
562
+
563
+ /*
564
+ eslint-disable @typescript-eslint/no-extraneous-class
565
+ */
566
+ class IconBurgerComponent {
567
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconBurgerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
568
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconBurgerComponent, isStandalone: true, selector: "ngx-bsl-icon-burger", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
569
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
570
+ <path d="M4 18L20 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
571
+ <path d="M4 12L20 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
572
+ <path d="M4 6L20 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
573
+ </svg>
574
+ `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
575
+ }
576
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconBurgerComponent, decorators: [{
577
+ type: Component,
578
+ args: [{ selector: 'ngx-bsl-icon-burger', imports: [], template: `
579
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
580
+ <path d="M4 18L20 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
581
+ <path d="M4 12L20 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
582
+ <path d="M4 6L20 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
583
+ </svg>
584
+ `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
585
+ }] });
586
+
576
587
  /*
577
588
  eslint-disable max-len,
578
589
  @typescript-eslint/no-extraneous-class
@@ -727,90 +738,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
727
738
  `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
728
739
  }] });
729
740
 
730
- /*
731
- eslint-disable max-len,
732
- @typescript-eslint/no-extraneous-class
733
- */
734
- class IconArrowLeftComponent {
735
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
736
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowLeftComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-left", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
737
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" >
738
- <path fill="currentColor" d="M 16.453 0.282 C 16.536 0.195 16.636 0.124 16.744 0.075 C 16.853 0.025 16.971 0 17.091 0 C 17.211 0 17.331 0.025 17.439 0.075 C 17.547 0.124 17.647 0.195 17.731 0.282 C 17.902 0.469 17.997 0.714 17.997 0.975 C 17.997 1.23 17.902 1.48 17.731 1.662 L 8.166 11.995 L 17.731 22.333 C 17.817 22.425 17.883 22.536 17.931 22.657 C 17.979 22.777 18.003 22.905 18 23.032 C 17.997 23.161 17.971 23.293 17.922 23.413 C 17.874 23.532 17.803 23.641 17.715 23.728 C 17.631 23.815 17.535 23.883 17.425 23.928 C 17.314 23.976 17.199 24 17.079 24 C 16.962 23.995 16.849 23.968 16.741 23.92 C 16.633 23.871 16.533 23.8 16.453 23.713 L 6.279 12.718 C 6.102 12.525 6 12.267 6 11.995 C 6 11.727 6.102 11.467 6.279 11.274 L 16.453 0.282 Z"></path>
739
- </svg>
740
- `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
741
- }
742
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftComponent, decorators: [{
743
- type: Component,
744
- args: [{ selector: 'ngx-bsl-icon-arrow-left', imports: [], template: `
745
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" >
746
- <path fill="currentColor" d="M 16.453 0.282 C 16.536 0.195 16.636 0.124 16.744 0.075 C 16.853 0.025 16.971 0 17.091 0 C 17.211 0 17.331 0.025 17.439 0.075 C 17.547 0.124 17.647 0.195 17.731 0.282 C 17.902 0.469 17.997 0.714 17.997 0.975 C 17.997 1.23 17.902 1.48 17.731 1.662 L 8.166 11.995 L 17.731 22.333 C 17.817 22.425 17.883 22.536 17.931 22.657 C 17.979 22.777 18.003 22.905 18 23.032 C 17.997 23.161 17.971 23.293 17.922 23.413 C 17.874 23.532 17.803 23.641 17.715 23.728 C 17.631 23.815 17.535 23.883 17.425 23.928 C 17.314 23.976 17.199 24 17.079 24 C 16.962 23.995 16.849 23.968 16.741 23.92 C 16.633 23.871 16.533 23.8 16.453 23.713 L 6.279 12.718 C 6.102 12.525 6 12.267 6 11.995 C 6 11.727 6.102 11.467 6.279 11.274 L 16.453 0.282 Z"></path>
747
- </svg>
748
- `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
749
- }] });
750
-
751
- /*
752
- eslint-disable max-len,
753
- @typescript-eslint/no-extraneous-class
754
- */
755
- class IconArrowRightComponent {
756
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
757
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowRightComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-right", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
758
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
759
- <path fill="currentColor" d="M 7.547 0.284 C 7.464 0.194 7.364 0.123 7.255 0.074 C 7.145 0.025 7.026 0 6.907 0 C 6.788 0 6.67 0.025 6.56 0.074 C 6.45 0.123 6.35 0.194 6.267 0.284 C 6.096 0.469 6.001 0.716 6.001 0.974 C 6.001 1.231 6.096 1.479 6.267 1.663 L 15.834 11.998 L 6.267 22.334 C 6.181 22.427 6.113 22.537 6.067 22.657 C 6.021 22.778 5.999 22.907 6 23.036 C 6.001 23.166 6.027 23.294 6.076 23.414 C 6.124 23.533 6.195 23.641 6.283 23.732 C 6.367 23.818 6.466 23.886 6.575 23.932 C 6.684 23.978 6.801 24.001 6.918 24 C 7.036 23.998 7.152 23.972 7.26 23.923 C 7.368 23.875 7.465 23.804 7.547 23.715 L 17.721 12.719 C 17.9 12.526 18 12.267 18 11.998 C 18 11.728 17.9 11.469 17.721 11.276 L 7.547 0.284 Z"></path>
760
- </svg>
761
- `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
762
- }
763
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightComponent, decorators: [{
764
- type: Component,
765
- args: [{ selector: 'ngx-bsl-icon-arrow-right', imports: [], template: `
766
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
767
- <path fill="currentColor" d="M 7.547 0.284 C 7.464 0.194 7.364 0.123 7.255 0.074 C 7.145 0.025 7.026 0 6.907 0 C 6.788 0 6.67 0.025 6.56 0.074 C 6.45 0.123 6.35 0.194 6.267 0.284 C 6.096 0.469 6.001 0.716 6.001 0.974 C 6.001 1.231 6.096 1.479 6.267 1.663 L 15.834 11.998 L 6.267 22.334 C 6.181 22.427 6.113 22.537 6.067 22.657 C 6.021 22.778 5.999 22.907 6 23.036 C 6.001 23.166 6.027 23.294 6.076 23.414 C 6.124 23.533 6.195 23.641 6.283 23.732 C 6.367 23.818 6.466 23.886 6.575 23.932 C 6.684 23.978 6.801 24.001 6.918 24 C 7.036 23.998 7.152 23.972 7.26 23.923 C 7.368 23.875 7.465 23.804 7.547 23.715 L 17.721 12.719 C 17.9 12.526 18 12.267 18 11.998 C 18 11.728 17.9 11.469 17.721 11.276 L 7.547 0.284 Z"></path>
768
- </svg>
769
- `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
770
- }] });
771
-
772
- /*
773
- eslint-disable max-len,
774
- @typescript-eslint/no-extraneous-class
775
- */
776
- class IconArrowLeftDoubleComponent {
777
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftDoubleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
778
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowLeftDoubleComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-left-double", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
779
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
780
- <path fill="currentColor" d="M 12.529 0.284 C 12.614 0.194 12.714 0.123 12.825 0.074 C 12.936 0.025 13.055 0 13.175 0 C 13.295 0 13.414 0.025 13.524 0.074 C 13.636 0.123 13.736 0.194 13.82 0.284 C 13.992 0.469 14.087 0.716 14.087 0.974 C 14.087 1.232 13.992 1.479 13.82 1.664 L 4.181 11.998 L 13.82 22.334 C 13.906 22.427 13.975 22.537 14.021 22.657 C 14.067 22.778 14.089 22.907 14.088 23.037 C 14.087 23.166 14.061 23.295 14.013 23.414 C 13.963 23.533 13.893 23.641 13.803 23.732 C 13.719 23.818 13.619 23.887 13.509 23.933 C 13.399 23.979 13.282 24.001 13.163 24 C 13.045 23.998 12.928 23.972 12.82 23.924 C 12.711 23.875 12.613 23.804 12.529 23.715 L 2.281 12.72 C 2.101 12.526 2 12.268 2 11.998 C 2 11.728 2.101 11.469 2.281 11.276 L 12.529 0.284 Z M 20.441 0.284 C 20.525 0.194 20.625 0.123 20.736 0.074 C 20.847 0.025 20.966 0 21.086 0 C 21.206 0 21.325 0.025 21.436 0.074 C 21.546 0.123 21.647 0.194 21.729 0.284 C 21.903 0.469 21.999 0.716 21.999 0.974 C 21.999 1.232 21.903 1.479 21.729 1.664 L 12.093 11.998 L 21.729 22.334 C 21.818 22.427 21.886 22.537 21.933 22.657 C 21.978 22.778 22.001 22.907 22 23.037 C 21.999 23.166 21.973 23.295 21.923 23.414 C 21.875 23.533 21.804 23.641 21.715 23.732 C 21.629 23.818 21.529 23.887 21.42 23.933 C 21.309 23.979 21.194 24.001 21.075 24 C 20.957 23.998 20.84 23.972 20.729 23.924 C 20.622 23.875 20.524 23.804 20.441 23.715 L 10.193 12.72 C 10.013 12.526 9.912 12.268 9.912 11.998 C 9.912 11.728 10.013 11.469 10.193 11.276 L 20.441 0.284 Z"></path>
781
- </svg>
782
- `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
783
- }
784
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowLeftDoubleComponent, decorators: [{
785
- type: Component,
786
- args: [{ selector: 'ngx-bsl-icon-arrow-left-double', imports: [], template: `
787
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
788
- <path fill="currentColor" d="M 12.529 0.284 C 12.614 0.194 12.714 0.123 12.825 0.074 C 12.936 0.025 13.055 0 13.175 0 C 13.295 0 13.414 0.025 13.524 0.074 C 13.636 0.123 13.736 0.194 13.82 0.284 C 13.992 0.469 14.087 0.716 14.087 0.974 C 14.087 1.232 13.992 1.479 13.82 1.664 L 4.181 11.998 L 13.82 22.334 C 13.906 22.427 13.975 22.537 14.021 22.657 C 14.067 22.778 14.089 22.907 14.088 23.037 C 14.087 23.166 14.061 23.295 14.013 23.414 C 13.963 23.533 13.893 23.641 13.803 23.732 C 13.719 23.818 13.619 23.887 13.509 23.933 C 13.399 23.979 13.282 24.001 13.163 24 C 13.045 23.998 12.928 23.972 12.82 23.924 C 12.711 23.875 12.613 23.804 12.529 23.715 L 2.281 12.72 C 2.101 12.526 2 12.268 2 11.998 C 2 11.728 2.101 11.469 2.281 11.276 L 12.529 0.284 Z M 20.441 0.284 C 20.525 0.194 20.625 0.123 20.736 0.074 C 20.847 0.025 20.966 0 21.086 0 C 21.206 0 21.325 0.025 21.436 0.074 C 21.546 0.123 21.647 0.194 21.729 0.284 C 21.903 0.469 21.999 0.716 21.999 0.974 C 21.999 1.232 21.903 1.479 21.729 1.664 L 12.093 11.998 L 21.729 22.334 C 21.818 22.427 21.886 22.537 21.933 22.657 C 21.978 22.778 22.001 22.907 22 23.037 C 21.999 23.166 21.973 23.295 21.923 23.414 C 21.875 23.533 21.804 23.641 21.715 23.732 C 21.629 23.818 21.529 23.887 21.42 23.933 C 21.309 23.979 21.194 24.001 21.075 24 C 20.957 23.998 20.84 23.972 20.729 23.924 C 20.622 23.875 20.524 23.804 20.441 23.715 L 10.193 12.72 C 10.013 12.526 9.912 12.268 9.912 11.998 C 9.912 11.728 10.013 11.469 10.193 11.276 L 20.441 0.284 Z"></path>
789
- </svg>
790
- `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
791
- }] });
792
-
793
- /*
794
- eslint-disable max-len,
795
- @typescript-eslint/no-extraneous-class
796
- */
797
- class IconArrowRightDoubleComponent {
798
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightDoubleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
799
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: IconArrowRightDoubleComponent, isStandalone: true, selector: "ngx-bsl-icon-arrow-right-double", host: { properties: { "class.bsl-icon": "true" } }, ngImport: i0, template: `
800
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
801
- <path fill="currentColor" d="M 12.523 0.284 C 12.448 0.194 12.358 0.123 12.257 0.074 C 12.158 0.025 12.051 0 11.943 0 C 11.835 0 11.728 0.025 11.628 0.074 C 11.528 0.123 11.438 0.194 11.362 0.284 C 11.208 0.469 11.121 0.716 11.121 0.974 C 11.121 1.232 11.208 1.479 11.362 1.664 L 20.037 11.998 L 11.362 22.334 C 11.284 22.427 11.223 22.537 11.181 22.657 C 11.139 22.778 11.119 22.907 11.12 23.037 C 11.121 23.166 11.145 23.295 11.189 23.414 C 11.233 23.533 11.297 23.641 11.376 23.732 C 11.453 23.818 11.543 23.887 11.641 23.933 C 11.741 23.979 11.846 24.001 11.953 24 C 12.059 23.998 12.164 23.972 12.262 23.924 C 12.361 23.875 12.449 23.804 12.523 23.715 L 21.747 12.72 C 21.909 12.526 22 12.268 22 11.998 C 22 11.728 21.909 11.469 21.747 11.276 L 12.523 0.284 Z M 5.403 0.284 C 5.327 0.194 5.237 0.123 5.138 0.074 C 5.037 0.025 4.93 0 4.822 0 C 4.714 0 4.607 0.025 4.508 0.074 C 4.408 0.123 4.317 0.194 4.243 0.284 C 4.087 0.469 4.001 0.716 4.001 0.974 C 4.001 1.232 4.087 1.479 4.243 1.664 L 12.917 11.998 L 4.243 22.334 C 4.164 22.427 4.102 22.537 4.061 22.657 C 4.02 22.778 3.999 22.907 4 23.037 C 4.001 23.166 4.025 23.295 4.069 23.414 C 4.113 23.533 4.176 23.641 4.257 23.732 C 4.333 23.818 4.423 23.887 4.522 23.933 C 4.621 23.979 4.726 24.001 4.833 24 C 4.939 23.998 5.044 23.972 5.143 23.924 C 5.24 23.875 5.328 23.804 5.403 23.715 L 14.627 12.72 C 14.789 12.526 14.88 12.268 14.88 11.998 C 14.88 11.728 14.789 11.469 14.627 11.276 L 5.403 0.284 Z"></path>
802
- </svg>
803
- `, isInline: true, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
804
- }
805
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: IconArrowRightDoubleComponent, decorators: [{
806
- type: Component,
807
- args: [{ selector: 'ngx-bsl-icon-arrow-right-double', imports: [], template: `
808
- <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
809
- <path fill="currentColor" d="M 12.523 0.284 C 12.448 0.194 12.358 0.123 12.257 0.074 C 12.158 0.025 12.051 0 11.943 0 C 11.835 0 11.728 0.025 11.628 0.074 C 11.528 0.123 11.438 0.194 11.362 0.284 C 11.208 0.469 11.121 0.716 11.121 0.974 C 11.121 1.232 11.208 1.479 11.362 1.664 L 20.037 11.998 L 11.362 22.334 C 11.284 22.427 11.223 22.537 11.181 22.657 C 11.139 22.778 11.119 22.907 11.12 23.037 C 11.121 23.166 11.145 23.295 11.189 23.414 C 11.233 23.533 11.297 23.641 11.376 23.732 C 11.453 23.818 11.543 23.887 11.641 23.933 C 11.741 23.979 11.846 24.001 11.953 24 C 12.059 23.998 12.164 23.972 12.262 23.924 C 12.361 23.875 12.449 23.804 12.523 23.715 L 21.747 12.72 C 21.909 12.526 22 12.268 22 11.998 C 22 11.728 21.909 11.469 21.747 11.276 L 12.523 0.284 Z M 5.403 0.284 C 5.327 0.194 5.237 0.123 5.138 0.074 C 5.037 0.025 4.93 0 4.822 0 C 4.714 0 4.607 0.025 4.508 0.074 C 4.408 0.123 4.317 0.194 4.243 0.284 C 4.087 0.469 4.001 0.716 4.001 0.974 C 4.001 1.232 4.087 1.479 4.243 1.664 L 12.917 11.998 L 4.243 22.334 C 4.164 22.427 4.102 22.537 4.061 22.657 C 4.02 22.778 3.999 22.907 4 23.037 C 4.001 23.166 4.025 23.295 4.069 23.414 C 4.113 23.533 4.176 23.641 4.257 23.732 C 4.333 23.818 4.423 23.887 4.522 23.933 C 4.621 23.979 4.726 24.001 4.833 24 C 4.939 23.998 5.044 23.972 5.143 23.924 C 5.24 23.875 5.328 23.804 5.403 23.715 L 14.627 12.72 C 14.789 12.526 14.88 12.268 14.88 11.998 C 14.88 11.728 14.789 11.469 14.627 11.276 L 5.403 0.284 Z"></path>
810
- </svg>
811
- `, host: { '[class.bsl-icon]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".bsl-icon{display:inline-flex;justify-content:center;align-items:center}.bsl-icon svg{width:1rem;height:1rem}\n"] }]
812
- }] });
813
-
814
741
  class PaginationComponent {
815
742
  page = model(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
816
743
  total = input(1, ...(ngDevMode ? [{ debugName: "total" }] : []));
@@ -871,7 +798,7 @@ class PaginationComponent {
871
798
  }
872
799
  }
873
800
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
874
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.0", type: PaginationComponent, isStandalone: true, selector: "ngx-bsl-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, nextPageAriaLabel: { classPropertyName: "nextPageAriaLabel", publicName: "nextPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, previousPageAriaLabel: { classPropertyName: "previousPageAriaLabel", publicName: "previousPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, firstPageAriaLabel: { classPropertyName: "firstPageAriaLabel", publicName: "firstPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, lastPageAriaLabel: { classPropertyName: "lastPageAriaLabel", publicName: "lastPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectPageAriaLabel: { classPropertyName: "selectPageAriaLabel", publicName: "selectPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectPageAriaLabelledBy: { classPropertyName: "selectPageAriaLabelledBy", publicName: "selectPageAriaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "pageChange", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"firstPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onFirstPage($any($event))\">\n <ngx-bsl-icon-arrow-left-double></ngx-bsl-icon-arrow-left-double>\n</button>\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"previousPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onPreviousPage($any($event))\">\n <ngx-bsl-icon-arrow-left></ngx-bsl-icon-arrow-left>\n</button>\n\n<input\n type=\"number\"\n [attr.aria-label]=\"selectPageAriaLabel()\"\n [attr.aria-labelledby]=\"selectPageAriaLabelledBy()\"\n [disabled]=\"disabled()\"\n [min]=\"1\"\n [max]=\"pages()\"\n [value]=\"page()\"\n (blur)=\"onInputBlur($any($event.target).valueAsNumber)\"\n (keydown.enter)=\"onInputEnter()\">\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"nextPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onNextPage($any($event))\">\n <ngx-bsl-icon-arrow-right></ngx-bsl-icon-arrow-right>\n</button>\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"lastPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onLastPage($any($event))\">\n <ngx-bsl-icon-arrow-right-double></ngx-bsl-icon-arrow-right-double>\n</button>\n", styles: ["ngx-bsl-pagination{display:flex;justify-content:center;align-items:center;gap:12px}ngx-bsl-pagination input{width:3.5rem;height:2.25rem;padding:.5rem;text-align:center}\n"], dependencies: [{ kind: "component", type: IconArrowLeftComponent, selector: "ngx-bsl-icon-arrow-left" }, { kind: "component", type: IconArrowRightComponent, selector: "ngx-bsl-icon-arrow-right" }, { kind: "component", type: IconArrowLeftDoubleComponent, selector: "ngx-bsl-icon-arrow-left-double" }, { kind: "component", type: IconArrowRightDoubleComponent, selector: "ngx-bsl-icon-arrow-right-double" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
801
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.0", type: PaginationComponent, isStandalone: true, selector: "ngx-bsl-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, nextPageAriaLabel: { classPropertyName: "nextPageAriaLabel", publicName: "nextPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, previousPageAriaLabel: { classPropertyName: "previousPageAriaLabel", publicName: "previousPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, firstPageAriaLabel: { classPropertyName: "firstPageAriaLabel", publicName: "firstPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, lastPageAriaLabel: { classPropertyName: "lastPageAriaLabel", publicName: "lastPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectPageAriaLabel: { classPropertyName: "selectPageAriaLabel", publicName: "selectPageAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, selectPageAriaLabelledBy: { classPropertyName: "selectPageAriaLabelledBy", publicName: "selectPageAriaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { page: "pageChange", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"firstPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onFirstPage($any($event))\">\n <ngx-bsl-icon-arrow-left-double></ngx-bsl-icon-arrow-left-double>\n</button>\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"previousPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onPreviousPage($any($event))\">\n <ngx-bsl-icon-arrow-left></ngx-bsl-icon-arrow-left>\n</button>\n\n<input\n type=\"number\"\n [attr.aria-label]=\"selectPageAriaLabel()\"\n [attr.aria-labelledby]=\"selectPageAriaLabelledBy()\"\n [disabled]=\"disabled()\"\n [min]=\"1\"\n [max]=\"pages()\"\n [value]=\"page()\"\n (blur)=\"onInputBlur($any($event.target).valueAsNumber)\"\n (keydown.enter)=\"onInputEnter()\">\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"nextPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onNextPage($any($event))\">\n <ngx-bsl-icon-arrow-right></ngx-bsl-icon-arrow-right>\n</button>\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"lastPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onLastPage($any($event))\">\n <ngx-bsl-icon-arrow-right-double></ngx-bsl-icon-arrow-right-double>\n</button>\n", styles: ["ngx-bsl-pagination{display:flex;align-items:center;gap:12px}ngx-bsl-pagination input[type=number]{width:3.5rem;height:2.25rem;padding:.5rem;text-align:center}\n"], dependencies: [{ kind: "component", type: IconArrowLeftComponent, selector: "ngx-bsl-icon-arrow-left" }, { kind: "component", type: IconArrowRightComponent, selector: "ngx-bsl-icon-arrow-right" }, { kind: "component", type: IconArrowLeftDoubleComponent, selector: "ngx-bsl-icon-arrow-left-double" }, { kind: "component", type: IconArrowRightDoubleComponent, selector: "ngx-bsl-icon-arrow-right-double" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
875
802
  }
876
803
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: PaginationComponent, decorators: [{
877
804
  type: Component,
@@ -880,7 +807,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
880
807
  IconArrowRightComponent,
881
808
  IconArrowLeftDoubleComponent,
882
809
  IconArrowRightDoubleComponent,
883
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"firstPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onFirstPage($any($event))\">\n <ngx-bsl-icon-arrow-left-double></ngx-bsl-icon-arrow-left-double>\n</button>\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"previousPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onPreviousPage($any($event))\">\n <ngx-bsl-icon-arrow-left></ngx-bsl-icon-arrow-left>\n</button>\n\n<input\n type=\"number\"\n [attr.aria-label]=\"selectPageAriaLabel()\"\n [attr.aria-labelledby]=\"selectPageAriaLabelledBy()\"\n [disabled]=\"disabled()\"\n [min]=\"1\"\n [max]=\"pages()\"\n [value]=\"page()\"\n (blur)=\"onInputBlur($any($event.target).valueAsNumber)\"\n (keydown.enter)=\"onInputEnter()\">\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"nextPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onNextPage($any($event))\">\n <ngx-bsl-icon-arrow-right></ngx-bsl-icon-arrow-right>\n</button>\n\n<button\n type=\"button\"\n class=\"button-icon\"\n [attr.aria-label]=\"lastPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onLastPage($any($event))\">\n <ngx-bsl-icon-arrow-right-double></ngx-bsl-icon-arrow-right-double>\n</button>\n", styles: ["ngx-bsl-pagination{display:flex;justify-content:center;align-items:center;gap:12px}ngx-bsl-pagination input{width:3.5rem;height:2.25rem;padding:.5rem;text-align:center}\n"] }]
810
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"firstPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onFirstPage($any($event))\">\n <ngx-bsl-icon-arrow-left-double></ngx-bsl-icon-arrow-left-double>\n</button>\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"previousPageAriaLabel()\"\n [disabled]=\"disabled() || page() === 1\"\n (click)=\"onPreviousPage($any($event))\">\n <ngx-bsl-icon-arrow-left></ngx-bsl-icon-arrow-left>\n</button>\n\n<input\n type=\"number\"\n [attr.aria-label]=\"selectPageAriaLabel()\"\n [attr.aria-labelledby]=\"selectPageAriaLabelledBy()\"\n [disabled]=\"disabled()\"\n [min]=\"1\"\n [max]=\"pages()\"\n [value]=\"page()\"\n (blur)=\"onInputBlur($any($event.target).valueAsNumber)\"\n (keydown.enter)=\"onInputEnter()\">\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"nextPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onNextPage($any($event))\">\n <ngx-bsl-icon-arrow-right></ngx-bsl-icon-arrow-right>\n</button>\n\n<button\n type=\"button\"\n class=\"bsl-button-icon\"\n [attr.aria-label]=\"lastPageAriaLabel()\"\n [disabled]=\"disabled() || page() === pages()\"\n (click)=\"onLastPage($any($event))\">\n <ngx-bsl-icon-arrow-right-double></ngx-bsl-icon-arrow-right-double>\n</button>\n", styles: ["ngx-bsl-pagination{display:flex;align-items:center;gap:12px}ngx-bsl-pagination input[type=number]{width:3.5rem;height:2.25rem;padding:.5rem;text-align:center}\n"] }]
884
811
  }], propDecorators: { page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], nextPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextPageAriaLabel", required: false }] }], previousPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "previousPageAriaLabel", required: false }] }], firstPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstPageAriaLabel", required: false }] }], lastPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastPageAriaLabel", required: false }] }], selectPageAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectPageAriaLabel", required: false }] }], selectPageAriaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectPageAriaLabelledBy", required: false }] }], pageChanged: [{ type: i0.Output, args: ["pageChanged"] }], inputRef: [{ type: i0.ViewChild, args: ['inputRef', { isSignal: true }] }] } });
885
812
 
886
813
  var RangeMoveDirection;
@@ -939,21 +866,21 @@ class RangeThumbComponent {
939
866
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: RangeThumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
940
867
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: RangeThumbComponent, isStandalone: true, selector: "ngx-bsl-range-thumb", inputs: { ratio: { classPropertyName: "ratio", publicName: "ratio", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { positionChanged: "positionChanged" }, host: { listeners: { "keydown.arrowLeft": "positionChanged.emit(RangeMoveDirection.BACKWARD)", "keydown.arrowRight": "positionChanged.emit(RangeMoveDirection.FORWARD)", "pointerdown": "onPointerDown($event)" } }, ngImport: i0, template: `
941
868
  @if (showLabel()) {
942
- <span class="thumb-label">{{value()}}</span>
869
+ <span class="bsl-range-thumb-label">{{value()}}</span>
943
870
  }
944
- `, isInline: true, styles: [":host{position:absolute;width:.75rem;height:.75rem;border-radius:.375rem;background-color:var(--bsl-range-thumb-backgroundColor);cursor:pointer;touch-action:none}:host .thumb-label{position:absolute;bottom:100%;left:50%;transform:translate(-50%);font:var(--bsl-font-sm)}:host.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"] });
871
+ `, isInline: true, styles: ["ngx-bsl-range-thumb{position:absolute;width:.75rem;height:.75rem;border-radius:.375rem;background-color:var(--bsl-range-thumb-backgroundColor);cursor:pointer;touch-action:none}ngx-bsl-range-thumb.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-thumb-label{position:absolute;bottom:100%;left:50%;transform:translate(-50%);font:var(--bsl-font-sm)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
945
872
  }
946
873
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: RangeThumbComponent, decorators: [{
947
874
  type: Component,
948
875
  args: [{ selector: 'ngx-bsl-range-thumb', imports: [], template: `
949
876
  @if (showLabel()) {
950
- <span class="thumb-label">{{value()}}</span>
877
+ <span class="bsl-range-thumb-label">{{value()}}</span>
951
878
  }
952
- `, host: {
879
+ `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
953
880
  '(keydown.arrowLeft)': 'positionChanged.emit(RangeMoveDirection.BACKWARD)',
954
881
  '(keydown.arrowRight)': 'positionChanged.emit(RangeMoveDirection.FORWARD)',
955
882
  '(pointerdown)': 'onPointerDown($event)',
956
- }, styles: [":host{position:absolute;width:.75rem;height:.75rem;border-radius:.375rem;background-color:var(--bsl-range-thumb-backgroundColor);cursor:pointer;touch-action:none}:host .thumb-label{position:absolute;bottom:100%;left:50%;transform:translate(-50%);font:var(--bsl-font-sm)}:host.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}\n"] }]
883
+ }, styles: ["ngx-bsl-range-thumb{position:absolute;width:.75rem;height:.75rem;border-radius:.375rem;background-color:var(--bsl-range-thumb-backgroundColor);cursor:pointer;touch-action:none}ngx-bsl-range-thumb.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-thumb-label{position:absolute;bottom:100%;left:50%;transform:translate(-50%);font:var(--bsl-font-sm)}\n"] }]
957
884
  }], propDecorators: { ratio: [{ type: i0.Input, args: [{ isSignal: true, alias: "ratio", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], positionChanged: [{ type: i0.Output, args: ["positionChanged"] }] } });
958
885
 
959
886
  function round(value, digits = 0) {
@@ -1169,7 +1096,7 @@ class RangeComponent {
1169
1096
  multi: true,
1170
1097
  useExisting: RangeComponent,
1171
1098
  },
1172
- ], viewQueries: [{ propertyName: "thumbFromRef", first: true, predicate: ["thumbFrom"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "thumbToRef", first: true, predicate: ["thumbTo"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"range\">\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus, @angular-eslint/template/click-events-have-key-events -->\n <div class=\"rail\"\n [class.disabled]=\"disabled()\"\n (click)=\"onRailClick($event)\">\n </div>\n\n <div class=\"tracker\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"trackerLeft()\"\n [style.right]=\"trackerRight()\">\n </div>\n\n <ngx-bsl-range-thumb\n #thumbFrom\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"value().to\"\n [attr.aria-valuenow]=\"value().from\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbFromPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'from' ? 1 : 0\"\n [value]=\"value().from\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.FROM)\"\n (positionChanged)=\"onPositionChangedThumbFrom($event)\">\n </ngx-bsl-range-thumb>\n\n <ngx-bsl-range-thumb\n #thumbTo\n role=\"slider\"\n [attr.aria-valuemin]=\"value().from\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value().to\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbToPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'to' ? 1 : 0\"\n [value]=\"value().to\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.TO)\"\n (positionChanged)=\"onPositionChangedThumbTo($event)\">\n </ngx-bsl-range-thumb>\n</div>\n\n<div class=\"limits\">\n <span>{{ min() }}</span>\n <span>{{ max() }}</span>\n</div>\n", styles: [":host{display:flex;align-items:center;flex-direction:column}:host .range{position:relative;height:.75rem;width:100%;display:flex;align-items:center}:host .range .rail{height:.25rem;width:100%;border-radius:.125rem;background-color:var(--bsl-range-rail-backgroundColor);cursor:pointer}:host .range .rail.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}:host .range .tracker{position:absolute;height:.25rem;background-color:var(--bsl-range-tracker-backgroundColor);pointer-events:none}:host .range .tracker.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}:host .limits{width:100%;display:flex;justify-content:space-between;font:var(--bsl-font-sm)}\n"], dependencies: [{ kind: "component", type: RangeThumbComponent, selector: "ngx-bsl-range-thumb", inputs: ["ratio", "value", "showLabel"], outputs: ["positionChanged"] }] });
1099
+ ], viewQueries: [{ propertyName: "thumbFromRef", first: true, predicate: ["thumbFrom"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "thumbToRef", first: true, predicate: ["thumbTo"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"bsl-range-container\">\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus, @angular-eslint/template/click-events-have-key-events -->\n <div class=\"bsl-range-rail\"\n [class.disabled]=\"disabled()\"\n (click)=\"onRailClick($event)\">\n </div>\n\n <div class=\"bsl-range-tracker\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"trackerLeft()\"\n [style.right]=\"trackerRight()\">\n </div>\n\n <ngx-bsl-range-thumb\n #thumbFrom\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"value().to\"\n [attr.aria-valuenow]=\"value().from\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbFromPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'from' ? 1 : 0\"\n [value]=\"value().from\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.FROM)\"\n (positionChanged)=\"onPositionChangedThumbFrom($event)\">\n </ngx-bsl-range-thumb>\n\n <ngx-bsl-range-thumb\n #thumbTo\n role=\"slider\"\n [attr.aria-valuemin]=\"value().from\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value().to\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbToPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'to' ? 1 : 0\"\n [value]=\"value().to\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.TO)\"\n (positionChanged)=\"onPositionChangedThumbTo($event)\">\n </ngx-bsl-range-thumb>\n</div>\n\n<div class=\"bsl-range-limits\">\n <span>{{ min() }}</span>\n <span>{{ max() }}</span>\n</div>\n", styles: ["ngx-bsl-range{display:flex;align-items:center;flex-direction:column}.bsl-range-container{position:relative;height:.75rem;width:100%;display:flex;align-items:center}.bsl-range-rail{height:.25rem;width:100%;border-radius:.125rem;background-color:var(--bsl-range-rail-backgroundColor);cursor:pointer}.bsl-range-rail.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-tracker{position:absolute;height:.25rem;background-color:var(--bsl-range-tracker-backgroundColor);pointer-events:none}.bsl-range-tracker.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-limits{width:100%;display:flex;justify-content:space-between;font:var(--bsl-font-sm)}\n"], dependencies: [{ kind: "component", type: RangeThumbComponent, selector: "ngx-bsl-range-thumb", inputs: ["ratio", "value", "showLabel"], outputs: ["positionChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1173
1100
  }
1174
1101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: RangeComponent, decorators: [{
1175
1102
  type: Component,
@@ -1181,35 +1108,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
1181
1108
  multi: true,
1182
1109
  useExisting: RangeComponent,
1183
1110
  },
1184
- ], host: {
1111
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
1185
1112
  '[attr.aria-label]': 'null',
1186
1113
  '[attr.aria-labelledby]': 'null',
1187
- }, template: "<div class=\"range\">\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus, @angular-eslint/template/click-events-have-key-events -->\n <div class=\"rail\"\n [class.disabled]=\"disabled()\"\n (click)=\"onRailClick($event)\">\n </div>\n\n <div class=\"tracker\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"trackerLeft()\"\n [style.right]=\"trackerRight()\">\n </div>\n\n <ngx-bsl-range-thumb\n #thumbFrom\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"value().to\"\n [attr.aria-valuenow]=\"value().from\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbFromPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'from' ? 1 : 0\"\n [value]=\"value().from\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.FROM)\"\n (positionChanged)=\"onPositionChangedThumbFrom($event)\">\n </ngx-bsl-range-thumb>\n\n <ngx-bsl-range-thumb\n #thumbTo\n role=\"slider\"\n [attr.aria-valuemin]=\"value().from\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value().to\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbToPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'to' ? 1 : 0\"\n [value]=\"value().to\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.TO)\"\n (positionChanged)=\"onPositionChangedThumbTo($event)\">\n </ngx-bsl-range-thumb>\n</div>\n\n<div class=\"limits\">\n <span>{{ min() }}</span>\n <span>{{ max() }}</span>\n</div>\n", styles: [":host{display:flex;align-items:center;flex-direction:column}:host .range{position:relative;height:.75rem;width:100%;display:flex;align-items:center}:host .range .rail{height:.25rem;width:100%;border-radius:.125rem;background-color:var(--bsl-range-rail-backgroundColor);cursor:pointer}:host .range .rail.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}:host .range .tracker{position:absolute;height:.25rem;background-color:var(--bsl-range-tracker-backgroundColor);pointer-events:none}:host .range .tracker.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}:host .limits{width:100%;display:flex;justify-content:space-between;font:var(--bsl-font-sm)}\n"] }]
1114
+ }, template: "<div class=\"bsl-range-container\">\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus, @angular-eslint/template/click-events-have-key-events -->\n <div class=\"bsl-range-rail\"\n [class.disabled]=\"disabled()\"\n (click)=\"onRailClick($event)\">\n </div>\n\n <div class=\"bsl-range-tracker\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"trackerLeft()\"\n [style.right]=\"trackerRight()\">\n </div>\n\n <ngx-bsl-range-thumb\n #thumbFrom\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"value().to\"\n [attr.aria-valuenow]=\"value().from\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbFromPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'from' ? 1 : 0\"\n [value]=\"value().from\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.FROM)\"\n (positionChanged)=\"onPositionChangedThumbFrom($event)\">\n </ngx-bsl-range-thumb>\n\n <ngx-bsl-range-thumb\n #thumbTo\n role=\"slider\"\n [attr.aria-valuemin]=\"value().from\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value().to\"\n [attr.aria-valuetext]=\"value().from + ' - ' + value().to\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [tabindex]=\"disabled() ? -1 : 0\"\n [class.disabled]=\"disabled()\"\n [style.left]=\"thumbToPosition() + 'px'\"\n [style.z-index]=\"overlappingThumb() === 'to' ? 1 : 0\"\n [value]=\"value().to\"\n [ratio]=\"this.ratio()\"\n [showLabel]=\"showThumbLabels()\"\n (focus)=\"overlappingThumb.set(Thumb.TO)\"\n (positionChanged)=\"onPositionChangedThumbTo($event)\">\n </ngx-bsl-range-thumb>\n</div>\n\n<div class=\"bsl-range-limits\">\n <span>{{ min() }}</span>\n <span>{{ max() }}</span>\n</div>\n", styles: ["ngx-bsl-range{display:flex;align-items:center;flex-direction:column}.bsl-range-container{position:relative;height:.75rem;width:100%;display:flex;align-items:center}.bsl-range-rail{height:.25rem;width:100%;border-radius:.125rem;background-color:var(--bsl-range-rail-backgroundColor);cursor:pointer}.bsl-range-rail.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-tracker{position:absolute;height:.25rem;background-color:var(--bsl-range-tracker-backgroundColor);pointer-events:none}.bsl-range-tracker.disabled{opacity:.65;cursor:not-allowed;pointer-events:none}.bsl-range-limits{width:100%;display:flex;justify-content:space-between;font:var(--bsl-font-sm)}\n"] }]
1188
1115
  }], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], showThumbLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showThumbLabels", required: false }] }], thumbFromRef: [{ type: i0.ViewChild, args: ['thumbFrom', { ...{ read: (ElementRef) }, isSignal: true }] }], thumbToRef: [{ type: i0.ViewChild, args: ['thumbTo', { ...{ read: (ElementRef) }, isSignal: true }] }] } });
1189
1116
 
1190
1117
  class SelectComponent {
1118
+ listBox = inject((ListBoxDirective));
1119
+ destroyRef = inject(DestroyRef);
1191
1120
  id = input.required(...(ngDevMode ? [{ debugName: "id" }] : []));
1192
- options = input.required(...(ngDevMode ? [{ debugName: "options" }] : []));
1193
- bindLabel = input(...(ngDevMode ? [undefined, { debugName: "bindLabel" }] : []));
1194
1121
  placeholder = input('', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
1195
1122
  ariaLabel = input(...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : []));
1196
1123
  ariaLabelledBy = input(...(ngDevMode ? [undefined, { debugName: "ariaLabelledBy" }] : []));
1197
- comparisonField = input(...(ngDevMode ? [undefined, { debugName: "comparisonField" }] : []));
1198
1124
  iconMode = input(false, ...(ngDevMode ? [{ debugName: "iconMode" }] : []));
1199
1125
  customIcon = input(false, ...(ngDevMode ? [{ debugName: "customIcon" }] : []));
1200
1126
  dropdownWidth = input(...(ngDevMode ? [undefined, { debugName: "dropdownWidth" }] : []));
1201
- listBox = viewChild(ListBoxComponent, ...(ngDevMode ? [{ debugName: "listBox" }] : []));
1127
+ optionValueParse = input((option) => option, ...(ngDevMode ? [{ debugName: "optionValueParse" }] : []));
1128
+ displayLabel = input(...(ngDevMode ? [undefined, { debugName: "displayLabel" }] : []));
1202
1129
  onChange = (_value) => { };
1203
1130
  onTouch = () => { };
1204
1131
  value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
1205
1132
  open = signal(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
1206
- ariaActiveDescendant = computed(() => this.listBox()?.ariaActiveDescendant() ?? null, ...(ngDevMode ? [{ debugName: "ariaActiveDescendant" }] : []));
1207
- initialFocusedOptionIndex = signal(null, ...(ngDevMode ? [{ debugName: "initialFocusedOptionIndex" }] : []));
1133
+ ariaActiveDescendant = computed(() => this.listBox.ariaActiveDescendant() ?? null, ...(ngDevMode ? [{ debugName: "ariaActiveDescendant" }] : []));
1134
+ displayValue = computed(() => {
1135
+ const displayLabel = this.displayLabel();
1136
+ const value = this.value();
1137
+ if (displayLabel && value && typeof value === 'object' && displayLabel in value) {
1138
+ return value[displayLabel];
1139
+ }
1140
+ else {
1141
+ return value;
1142
+ }
1143
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
1144
+ ngOnInit() {
1145
+ this.listBox.hasAriaSelected = true;
1146
+ this.subscribeSelectOption();
1147
+ }
1148
+ subscribeSelectOption() {
1149
+ this.listBox.selectOption.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(option => {
1150
+ if (option) {
1151
+ this.value.set(this.optionValueParse()(option));
1152
+ this.onChange(this.value());
1153
+ this.hideListBox();
1154
+ }
1155
+ });
1156
+ }
1208
1157
  showListBox() {
1158
+ if (this.open())
1159
+ return;
1209
1160
  this.open.set(true);
1210
1161
  }
1211
1162
  hideListBox() {
1212
- this.initialFocusedOptionIndex.set(null);
1163
+ if (!this.open())
1164
+ return;
1213
1165
  this.open.set(false);
1214
1166
  }
1215
1167
  onClick() {
@@ -1217,27 +1169,26 @@ class SelectComponent {
1217
1169
  this.hideListBox();
1218
1170
  }
1219
1171
  else {
1220
- this.showListBox();
1172
+ if (this.listBox.listBoxOptions().length) {
1173
+ this.showListBox();
1174
+ this.listBox.setVisualMarkups(this.value());
1175
+ }
1221
1176
  }
1222
1177
  }
1223
- onSelectOption(value) {
1224
- this.value.set(value);
1225
- this.onChange(value);
1226
- this.hideListBox();
1178
+ onListBoxClick(event) {
1179
+ this.listBox.onClick(event);
1227
1180
  }
1228
1181
  onKeydown(event) {
1229
1182
  event.preventDefault();
1230
- if (!this.open()) {
1231
- this.showListBox();
1232
- if (event.code === 'ArrowUp') {
1233
- this.initialFocusedOptionIndex.set(this.options().length - 1);
1234
- }
1235
- else if (event.code === 'ArrowDown') {
1236
- this.initialFocusedOptionIndex.set(0);
1237
- }
1183
+ if (this.open()) {
1184
+ this.listBox.onKeydown(event);
1238
1185
  }
1239
1186
  else {
1240
- this.listBox()?.onKeydown(event);
1187
+ this.showListBox();
1188
+ const markupsSet = this.listBox.setVisualMarkups(this.value());
1189
+ if (!markupsSet) {
1190
+ this.listBox.onKeydown(event);
1191
+ }
1241
1192
  }
1242
1193
  }
1243
1194
  registerOnChange(onChange) {
@@ -1250,13 +1201,13 @@ class SelectComponent {
1250
1201
  this.value.set(value);
1251
1202
  }
1252
1203
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1253
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: SelectComponent, isStandalone: true, selector: "ngx-bsl-select", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, bindLabel: { classPropertyName: "bindLabel", publicName: "bindLabel", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null }, comparisonField: { classPropertyName: "comparisonField", publicName: "comparisonField", isSignal: true, isRequired: false, transformFunction: null }, iconMode: { classPropertyName: "iconMode", publicName: "iconMode", isSignal: true, isRequired: false, transformFunction: null }, customIcon: { classPropertyName: "customIcon", publicName: "customIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownWidth: { classPropertyName: "dropdownWidth", publicName: "dropdownWidth", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, providers: [
1204
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: SelectComponent, isStandalone: true, selector: "ngx-bsl-select", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null }, iconMode: { classPropertyName: "iconMode", publicName: "iconMode", isSignal: true, isRequired: false, transformFunction: null }, customIcon: { classPropertyName: "customIcon", publicName: "customIcon", isSignal: true, isRequired: false, transformFunction: null }, dropdownWidth: { classPropertyName: "dropdownWidth", publicName: "dropdownWidth", isSignal: true, isRequired: false, transformFunction: null }, optionValueParse: { classPropertyName: "optionValueParse", publicName: "optionValueParse", isSignal: true, isRequired: false, transformFunction: null }, displayLabel: { classPropertyName: "displayLabel", publicName: "displayLabel", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, providers: [
1254
1205
  {
1255
1206
  provide: NG_VALUE_ACCESSOR,
1256
1207
  useExisting: forwardRef(() => SelectComponent),
1257
1208
  multi: true,
1258
1209
  },
1259
- ], viewQueries: [{ propertyName: "listBox", first: true, predicate: ListBoxComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<button\n type=\"button\"\n role=\"combobox\"\n #selectButton\n class=\"bsl-select-button\"\n cdkOverlayOrigin\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"'list-box-' + id()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [class.button-icon]=\"iconMode()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.space)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\">\n @if (iconMode()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <span>{{ value() ? (value() | listBoxOptionValueConverter : bindLabel()) : placeholder() }}</span>\n\n @if (customIcon()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <ngx-bsl-icon-chevron-down></ngx-bsl-icon-chevron-down>\n }\n }\n</button>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectButton\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"dropdownWidth() || selectButton.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <ngx-bsl-list-box\n [initialValue]=\"value()\"\n [initialFocusedOptionIndex]=\"initialFocusedOptionIndex()\"\n [comparisonField]=\"comparisonField()\"\n [id]=\"'list-box-' + id()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaLabelledby]=\"ariaLabelledBy()\"\n [exposeAriaActiveDescendant]=\"true\"\n (selectOption)=\"onSelectOption($event)\">\n @for (option of options(); track option) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n </ngx-bsl-list-box>\n</ng-template>\n", styles: ["ngx-bsl-select{display:block}.bsl-select-button{width:100%;min-height:2.25rem;justify-content:space-between;gap:.5rem}.bsl-select-button span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: IconChevronDownComponent, selector: "ngx-bsl-icon-chevron-down" }, { kind: "component", type: ListBoxComponent, selector: "ngx-bsl-list-box", inputs: ["id", "ariaLabel", "ariaLabelledby", "exposeAriaActiveDescendant", "comparisonField", "initialValue", "initialFocusedOptionIndex"], outputs: ["selectOption"] }, { kind: "component", type: ListBoxOptionComponent, selector: "ngx-bsl-list-box-option", inputs: ["value", "id"] }, { kind: "pipe", type: ListBoxOptionValueConverterPipe, name: "listBoxOptionValueConverter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1210
+ ], hostDirectives: [{ directive: ListBoxDirective, inputs: ["listBoxId", "listBoxId", "listBoxAriaLabel", "listBoxAriaLabel", "listBoxAriaLabelledby", "listBoxAriaLabelledby", "optionValueEquality", "optionValueEquality"] }], ngImport: i0, template: "<button\n type=\"button\"\n role=\"combobox\"\n #selectButton\n class=\"ngx-bsl-select-button\"\n cdkOverlayOrigin\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [class.button-icon]=\"iconMode()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.space)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\">\n @if (iconMode()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <span>{{ displayValue() }}</span>\n\n @if (customIcon()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <ngx-bsl-icon-chevron-down></ngx-bsl-icon-chevron-down>\n }\n }\n</button>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectButton\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"dropdownWidth() || selectButton.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <!-- eslint-disable-next-line\n @angular-eslint/template/interactive-supports-focus,\n @angular-eslint/template/click-events-have-key-events -->\n <div\n role=\"listbox\"\n class=\"ngx-bsl-list-box\"\n [id]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"listBox.listBoxAriaLabel()\"\n [attr.aria-labelledby]=\"listBox.listBoxAriaLabelledby()\"\n [attr.aria-activedescendant]=\"listBox.ariaActiveDescendant()\"\n (click)=\"onListBoxClick($event)\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n", styles: ["ngx-bsl-select{display:block}.ngx-bsl-select-button{width:100%;justify-content:space-between;gap:.5rem}.ngx-bsl-select-button span{min-height:var(--bsl-line-height-sm);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: IconChevronDownComponent, selector: "ngx-bsl-icon-chevron-down" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1260
1211
  }
1261
1212
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SelectComponent, decorators: [{
1262
1213
  type: Component,
@@ -1264,48 +1215,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
1264
1215
  CdkOverlayOrigin,
1265
1216
  CdkConnectedOverlay,
1266
1217
  IconChevronDownComponent,
1267
- ListBoxComponent,
1268
- ListBoxOptionComponent,
1269
- ListBoxOptionValueConverterPipe,
1270
1218
  ], providers: [
1271
1219
  {
1272
1220
  provide: NG_VALUE_ACCESSOR,
1273
1221
  useExisting: forwardRef(() => SelectComponent),
1274
1222
  multi: true,
1275
1223
  },
1276
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<button\n type=\"button\"\n role=\"combobox\"\n #selectButton\n class=\"bsl-select-button\"\n cdkOverlayOrigin\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"'list-box-' + id()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [class.button-icon]=\"iconMode()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.space)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\">\n @if (iconMode()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <span>{{ value() ? (value() | listBoxOptionValueConverter : bindLabel()) : placeholder() }}</span>\n\n @if (customIcon()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <ngx-bsl-icon-chevron-down></ngx-bsl-icon-chevron-down>\n }\n }\n</button>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectButton\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"dropdownWidth() || selectButton.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <ngx-bsl-list-box\n [initialValue]=\"value()\"\n [initialFocusedOptionIndex]=\"initialFocusedOptionIndex()\"\n [comparisonField]=\"comparisonField()\"\n [id]=\"'list-box-' + id()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaLabelledby]=\"ariaLabelledBy()\"\n [exposeAriaActiveDescendant]=\"true\"\n (selectOption)=\"onSelectOption($event)\">\n @for (option of options(); track option) {\n <ngx-bsl-list-box-option\n [id]=\"'list-box-option-' + id()\"\n [value]=\"option\">\n <ng-container>{{ option | listBoxOptionValueConverter : bindLabel() }}</ng-container>\n </ngx-bsl-list-box-option>\n }\n </ngx-bsl-list-box>\n</ng-template>\n", styles: ["ngx-bsl-select{display:block}.bsl-select-button{width:100%;min-height:2.25rem;justify-content:space-between;gap:.5rem}.bsl-select-button span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }]
1277
- }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], bindLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "bindLabel", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], comparisonField: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparisonField", required: false }] }], iconMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconMode", required: false }] }], customIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "customIcon", required: false }] }], dropdownWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownWidth", required: false }] }], listBox: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ListBoxComponent), { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
1224
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, hostDirectives: [
1225
+ {
1226
+ directive: ListBoxDirective,
1227
+ inputs: ['listBoxId', 'listBoxAriaLabel', 'listBoxAriaLabelledby', 'optionValueEquality'],
1228
+ },
1229
+ ], template: "<button\n type=\"button\"\n role=\"combobox\"\n #selectButton\n class=\"ngx-bsl-select-button\"\n cdkOverlayOrigin\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [class.button-icon]=\"iconMode()\"\n (click)=\"onClick()\"\n (keydown.enter)=\"onKeydown($any($event))\"\n (keydown.space)=\"onKeydown($any($event))\"\n (keydown.arrowUp)=\"onKeydown($any($event))\"\n (keydown.arrowDown)=\"onKeydown($any($event))\"\n (keydown.escape)=\"hideListBox()\">\n @if (iconMode()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <span>{{ displayValue() }}</span>\n\n @if (customIcon()) {\n <ng-content select=\"[data-custom-icon]\"></ng-content>\n } @else {\n <ngx-bsl-icon-chevron-down></ngx-bsl-icon-chevron-down>\n }\n }\n</button>\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"selectButton\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayWidth]=\"dropdownWidth() || selectButton.offsetWidth\"\n (overlayOutsideClick)=\"hideListBox()\">\n <!-- eslint-disable-next-line\n @angular-eslint/template/interactive-supports-focus,\n @angular-eslint/template/click-events-have-key-events -->\n <div\n role=\"listbox\"\n class=\"ngx-bsl-list-box\"\n [id]=\"listBox.listBoxId() || id() + '-list-box'\"\n [attr.aria-label]=\"listBox.listBoxAriaLabel()\"\n [attr.aria-labelledby]=\"listBox.listBoxAriaLabelledby()\"\n [attr.aria-activedescendant]=\"listBox.ariaActiveDescendant()\"\n (click)=\"onListBoxClick($event)\"\n >\n <ng-content></ng-content>\n </div>\n</ng-template>\n", styles: ["ngx-bsl-select{display:block}.ngx-bsl-select-button{width:100%;justify-content:space-between;gap:.5rem}.ngx-bsl-select-button span{min-height:var(--bsl-line-height-sm);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n"] }]
1230
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaLabelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabelledBy", required: false }] }], iconMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconMode", required: false }] }], customIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "customIcon", required: false }] }], dropdownWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownWidth", required: false }] }], optionValueParse: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValueParse", required: false }] }], displayLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayLabel", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
1278
1231
 
1279
1232
  class TooltipComponent {
1280
- message = '';
1233
+ message = signal('', ...(ngDevMode ? [{ debugName: "message" }] : []));
1281
1234
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1282
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: TooltipComponent, isStandalone: true, selector: "ngx-bsl-tooltip", host: { attributes: { "role": "tooltip" } }, ngImport: i0, template: '{{message}}', isInline: true, styles: [":host{padding:4px 8px;border-radius:4px;background-color:var(--bsl-tooltip-backgroundColor);font:var(--bsl-font-xs);color:var(--bsl-tooltip-textColor)}\n"] });
1235
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.0", type: TooltipComponent, isStandalone: true, selector: "ngx-bsl-tooltip", host: { attributes: { "role": "tooltip" } }, ngImport: i0, template: '{{message()}}', isInline: true, styles: ["ngx-bsl-tooltip{padding:4px 8px;border-radius:4px;background-color:var(--bsl-tooltip-backgroundColor);font:var(--bsl-font-xs);color:var(--bsl-tooltip-textColor)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1283
1236
  }
1284
1237
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: TooltipComponent, decorators: [{
1285
1238
  type: Component,
1286
- args: [{ selector: 'ngx-bsl-tooltip', imports: [], template: '{{message}}', host: { 'role': 'tooltip' }, styles: [":host{padding:4px 8px;border-radius:4px;background-color:var(--bsl-tooltip-backgroundColor);font:var(--bsl-font-xs);color:var(--bsl-tooltip-textColor)}\n"] }]
1239
+ args: [{ selector: 'ngx-bsl-tooltip', imports: [], template: '{{message()}}', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { 'role': 'tooltip' }, styles: ["ngx-bsl-tooltip{padding:4px 8px;border-radius:4px;background-color:var(--bsl-tooltip-backgroundColor);font:var(--bsl-font-xs);color:var(--bsl-tooltip-textColor)}\n"] }]
1287
1240
  }] });
1288
1241
 
1289
1242
  const TOOLTIP_OVERLAY_POSITION = {
1290
- TOP: {
1243
+ top: {
1291
1244
  originX: 'center',
1292
1245
  originY: 'top',
1293
1246
  overlayX: 'center',
1294
1247
  overlayY: 'bottom',
1295
1248
  },
1296
- BOTTOM: {
1249
+ bottom: {
1297
1250
  originX: 'center',
1298
1251
  originY: 'bottom',
1299
1252
  overlayX: 'center',
1300
1253
  overlayY: 'top',
1301
1254
  },
1302
- LEFT: {
1255
+ left: {
1303
1256
  originX: 'start',
1304
1257
  originY: 'center',
1305
1258
  overlayX: 'end',
1306
1259
  overlayY: 'center',
1307
1260
  },
1308
- RIGHT: {
1261
+ right: {
1309
1262
  originX: 'end',
1310
1263
  originY: 'center',
1311
1264
  overlayX: 'start',
@@ -1313,17 +1266,9 @@ const TOOLTIP_OVERLAY_POSITION = {
1313
1266
  },
1314
1267
  };
1315
1268
 
1316
- var TooltipPosition;
1317
- (function (TooltipPosition) {
1318
- TooltipPosition["TOP"] = "TOP";
1319
- TooltipPosition["BOTTOM"] = "BOTTOM";
1320
- TooltipPosition["LEFT"] = "LEFT";
1321
- TooltipPosition["RIGHT"] = "RIGHT";
1322
- })(TooltipPosition || (TooltipPosition = {}));
1323
-
1324
1269
  class TooltipDirective {
1325
1270
  message = input.required(...(ngDevMode ? [{ debugName: "message", alias: 'ngxBslTooltip' }] : [{ alias: 'ngxBslTooltip' }]));
1326
- position = input(TooltipPosition.TOP, ...(ngDevMode ? [{ debugName: "position" }] : []));
1271
+ position = input('top', ...(ngDevMode ? [{ debugName: "position" }] : []));
1327
1272
  overlay = inject(Overlay);
1328
1273
  elementRef = inject(ElementRef);
1329
1274
  overlayRef = null;
@@ -1334,7 +1279,7 @@ class TooltipDirective {
1334
1279
  this.overlayRef = this.overlay.create({ positionStrategy });
1335
1280
  const componentPortal = new ComponentPortal(TooltipComponent);
1336
1281
  const componentInstance = this.overlayRef.attach(componentPortal);
1337
- componentInstance.instance.message = this.message();
1282
+ componentInstance.instance.message.set(this.message());
1338
1283
  }
1339
1284
  }
1340
1285
  hide() {
@@ -1350,16 +1295,16 @@ class TooltipDirective {
1350
1295
  .withPositions([TOOLTIP_OVERLAY_POSITION[this.position()]]);
1351
1296
  const tooltipOffset = 8;
1352
1297
  switch (this.position()) {
1353
- case TooltipPosition.TOP:
1298
+ case 'top':
1354
1299
  positionStrategy.withDefaultOffsetY(-tooltipOffset);
1355
1300
  break;
1356
- case TooltipPosition.BOTTOM:
1301
+ case 'bottom':
1357
1302
  positionStrategy.withDefaultOffsetY(tooltipOffset);
1358
1303
  break;
1359
- case TooltipPosition.LEFT:
1304
+ case 'left':
1360
1305
  positionStrategy.withDefaultOffsetX(-tooltipOffset);
1361
1306
  break;
1362
- case TooltipPosition.RIGHT:
1307
+ case 'right':
1363
1308
  positionStrategy.withDefaultOffsetX(tooltipOffset);
1364
1309
  break;
1365
1310
  default:
@@ -1387,5 +1332,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
1387
1332
  * Generated bundle index. Do not edit.
1388
1333
  */
1389
1334
 
1390
- export { CheckboxComponent, ComboboxComponent, DrawerComponent, IconCheckComponent, IconChevronDownComponent, IconCompanyComponent, IconLanguageComponent, IconLocationComponent, IconMoonComponent, IconSunComponent, IconXMarkComponent, ListBoxComponent, ListBoxGroupComponent, ListBoxOptionComponent, ListBoxOptionValueConverterPipe, ListBoxSeparatorComponent, PaginationComponent, RangeComponent, SelectComponent, TooltipDirective };
1335
+ export { CheckboxComponent, ComboboxComponent, DrawerComponent, IconArrowLeftComponent, IconArrowLeftDoubleComponent, IconArrowRightComponent, IconArrowRightDoubleComponent, IconBurgerComponent, IconCheckComponent, IconChevronDownComponent, IconCompanyComponent, IconLanguageComponent, IconLocationComponent, IconMoonComponent, IconSunComponent, IconXMarkComponent, ListBoxDirective, ListBoxGroupComponent, ListBoxOptionComponent, ListBoxSeparatorComponent, PaginationComponent, RangeComponent, SelectComponent, TooltipDirective };
1391
1336
  //# sourceMappingURL=ngx-bsl.mjs.map