@ngstarter-ui/components 21.0.49 → 21.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/ai/component-registry.json +53 -12
  2. package/fesm2022/ngstarter-ui-components-country-select.mjs +1 -1
  3. package/fesm2022/ngstarter-ui-components-country-select.mjs.map +1 -1
  4. package/fesm2022/ngstarter-ui-components-currency-select.mjs +1 -1
  5. package/fesm2022/ngstarter-ui-components-currency-select.mjs.map +1 -1
  6. package/fesm2022/ngstarter-ui-components-date-format-select.mjs +1 -1
  7. package/fesm2022/ngstarter-ui-components-date-format-select.mjs.map +1 -1
  8. package/fesm2022/ngstarter-ui-components-filter-builder.mjs +1 -1
  9. package/fesm2022/ngstarter-ui-components-filter-builder.mjs.map +1 -1
  10. package/fesm2022/ngstarter-ui-components-form-builder.mjs +196 -11
  11. package/fesm2022/ngstarter-ui-components-form-builder.mjs.map +1 -1
  12. package/fesm2022/ngstarter-ui-components-image-designer.mjs +1 -1
  13. package/fesm2022/ngstarter-ui-components-image-designer.mjs.map +1 -1
  14. package/fesm2022/ngstarter-ui-components-option.mjs +2 -2
  15. package/fesm2022/ngstarter-ui-components-option.mjs.map +1 -1
  16. package/fesm2022/ngstarter-ui-components-paginator.mjs +1 -1
  17. package/fesm2022/ngstarter-ui-components-paginator.mjs.map +1 -1
  18. package/fesm2022/ngstarter-ui-components-select.mjs +474 -27
  19. package/fesm2022/ngstarter-ui-components-select.mjs.map +1 -1
  20. package/fesm2022/ngstarter-ui-components-timezone-select.mjs +1 -1
  21. package/fesm2022/ngstarter-ui-components-timezone-select.mjs.map +1 -1
  22. package/package.json +1 -1
  23. package/styles/_tokens.scss +1 -1
  24. package/types/ngstarter-ui-components-form-builder.d.ts +42 -2
  25. package/types/ngstarter-ui-components-select.d.ts +112 -3
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, InjectionToken, inject, TemplateRef, input, numberAttribute, booleanAttribute, contentChild, computed, ChangeDetectionStrategy, Component, ElementRef, ChangeDetectorRef, signal, contentChildren, output, viewChild, model, DestroyRef, effect, untracked, forwardRef } from '@angular/core';
2
+ import { Directive, InjectionToken, inject, TemplateRef, input, numberAttribute, booleanAttribute, contentChild, computed, ChangeDetectionStrategy, Component, ElementRef, ChangeDetectorRef, signal, contentChildren, output, viewChildren, viewChild, model, DestroyRef, effect, untracked, forwardRef } from '@angular/core';
3
3
  import { outputToObservable } from '@angular/core/rxjs-interop';
4
4
  import { NgControl } from '@angular/forms';
5
5
  import { NgTemplateOutlet } from '@angular/common';
@@ -7,7 +7,7 @@ import { SelectionModel } from '@angular/cdk/collections';
7
7
  import * as i1 from '@angular/cdk/overlay';
8
8
  import { CdkConnectedOverlay, OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';
9
9
  import { Subject, takeUntil } from 'rxjs';
10
- import { OPTION, Optgroup, OPTION_PARENT } from '@ngstarter-ui/components/option';
10
+ import { OPTION, Optgroup, Option, OPTION_PARENT } from '@ngstarter-ui/components/option';
11
11
  export { Optgroup, Option } from '@ngstarter-ui/components/option';
12
12
  import { FORM_FIELD, FormFieldControl } from '@ngstarter-ui/components/form-field';
13
13
  import { AUTOFOCUSABLE } from '@ngstarter-ui/components/core';
@@ -104,6 +104,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
104
104
  }, styles: [":host{display:block;position:relative;flex:1;overflow:auto;min-height:0;max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px));padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));box-sizing:border-box}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
105
105
  }] });
106
106
 
107
+ class SelectHeader {
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: SelectHeader, isStandalone: true, selector: "ngs-select-header", host: { classAttribute: "ngs-select-header" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
110
+ }
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, decorators: [{
112
+ type: Component,
113
+ args: [{ selector: 'ngs-select-header', standalone: true, imports: [], template: '<ng-content />', host: {
114
+ 'class': 'ngs-select-header'
115
+ }, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
116
+ }] });
117
+
118
+ class SelectOptionContentDef {
119
+ templateRef = inject(TemplateRef);
120
+ static ngTemplateContextGuard(_directive, _context) {
121
+ return true;
122
+ }
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectOptionContentDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
124
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.4", type: SelectOptionContentDef, isStandalone: true, selector: "ng-template[ngsOptionContentDef]", ngImport: i0 });
125
+ }
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectOptionContentDef, decorators: [{
127
+ type: Directive,
128
+ args: [{
129
+ selector: 'ng-template[ngsOptionContentDef]',
130
+ standalone: true
131
+ }]
132
+ }] });
133
+
134
+ class SelectValueDef {
135
+ templateRef = inject(TemplateRef);
136
+ static ngTemplateContextGuard(_directive, _context) {
137
+ return true;
138
+ }
139
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectValueDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
140
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.4", type: SelectValueDef, isStandalone: true, selector: "ng-template[ngsSelectValueDef]", ngImport: i0 });
141
+ }
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectValueDef, decorators: [{
143
+ type: Directive,
144
+ args: [{
145
+ selector: 'ng-template[ngsSelectValueDef]',
146
+ standalone: true
147
+ }]
148
+ }] });
149
+
107
150
  class SelectChange {
108
151
  source;
109
152
  value;
@@ -134,6 +177,12 @@ class Select {
134
177
  multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
135
178
  hideCheckIcon = input(false, { ...(ngDevMode ? { debugName: "hideCheckIcon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
136
179
  clearable = input(false, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
180
+ dataSource = input(null, ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
181
+ pageSize = input(25, { ...(ngDevMode ? { debugName: "pageSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
182
+ searchable = input(false, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
183
+ searchDebounce = input(250, { ...(ngDevMode ? { debugName: "searchDebounce" } : /* istanbul ignore next */ {}), transform: numberAttribute });
184
+ minSearchLength = input(0, { ...(ngDevMode ? { debugName: "minSearchLength" } : /* istanbul ignore next */ {}), transform: numberAttribute });
185
+ loadOnOpen = input(true, { ...(ngDevMode ? { debugName: "loadOnOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
137
186
  ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
138
187
  tabIndex = input(0, { ...(ngDevMode ? { debugName: "tabIndex" } : /* istanbul ignore next */ {}), transform: (value) => value == null ? 0 : parseInt(value + '', 10) });
139
188
  ariaDescribedby = input(null, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
@@ -142,10 +191,17 @@ class Select {
142
191
  selectionChange = output();
143
192
  opened = output();
144
193
  closed = output();
145
- options = contentChildren(OPTION, { ...(ngDevMode ? { debugName: "options" } : /* istanbul ignore next */ {}), descendants: true });
194
+ projectedOptions = contentChildren(OPTION, { ...(ngDevMode ? { debugName: "projectedOptions" } : /* istanbul ignore next */ {}), descendants: true });
195
+ dataSourceOptions = viewChildren(OPTION, ...(ngDevMode ? [{ debugName: "dataSourceOptions" }] : /* istanbul ignore next */ []));
196
+ options = computed(() => [
197
+ ...this.projectedOptions(),
198
+ ...this.dataSourceOptions()
199
+ ], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
146
200
  optionGroups = contentChildren(Optgroup, { ...(ngDevMode ? { debugName: "optionGroups" } : /* istanbul ignore next */ {}), descendants: true });
147
201
  customTrigger = contentChildren(SelectTrigger, { ...(ngDevMode ? { debugName: "customTrigger" } : /* istanbul ignore next */ {}), descendants: true });
148
202
  filterTrigger = contentChildren(FilterTrigger, { ...(ngDevMode ? { debugName: "filterTrigger" } : /* istanbul ignore next */ {}), descendants: true });
203
+ optionContentDef = contentChild(SelectOptionContentDef, { ...(ngDevMode ? { debugName: "optionContentDef" } : /* istanbul ignore next */ {}), descendants: true });
204
+ selectValueDef = contentChild(SelectValueDef, { ...(ngDevMode ? { debugName: "selectValueDef" } : /* istanbul ignore next */ {}), descendants: true });
149
205
  overlayDir = viewChild(CdkConnectedOverlay, ...(ngDevMode ? [{ debugName: "overlayDir" }] : /* istanbul ignore next */ []));
150
206
  panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
151
207
  origin = viewChild('origin', ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
@@ -172,10 +228,34 @@ class Select {
172
228
  _optionsContentChanges = signal(0, ...(ngDevMode ? [{ debugName: "_optionsContentChanges" }] : /* istanbul ignore next */ []));
173
229
  _errorState = signal(false, ...(ngDevMode ? [{ debugName: "_errorState" }] : /* istanbul ignore next */ []));
174
230
  get errorState() { return this._errorState(); }
231
+ asyncOptions = signal([], ...(ngDevMode ? [{ debugName: "asyncOptions" }] : /* istanbul ignore next */ []));
232
+ asyncSearch = signal('', ...(ngDevMode ? [{ debugName: "asyncSearch" }] : /* istanbul ignore next */ []));
233
+ asyncLoading = signal(false, ...(ngDevMode ? [{ debugName: "asyncLoading" }] : /* istanbul ignore next */ []));
234
+ asyncLoadingMore = signal(false, ...(ngDevMode ? [{ debugName: "asyncLoadingMore" }] : /* istanbul ignore next */ []));
235
+ asyncError = signal(null, ...(ngDevMode ? [{ debugName: "asyncError" }] : /* istanbul ignore next */ []));
236
+ asyncHasMore = signal(false, ...(ngDevMode ? [{ debugName: "asyncHasMore" }] : /* istanbul ignore next */ []));
237
+ asyncEnabled = computed(() => !!this.dataSource(), ...(ngDevMode ? [{ debugName: "asyncEnabled" }] : /* istanbul ignore next */ []));
238
+ _asyncSelectedCache = signal([], ...(ngDevMode ? [{ debugName: "_asyncSelectedCache" }] : /* istanbul ignore next */ []));
239
+ _asyncPage = 0;
240
+ _asyncCursor;
241
+ _asyncSearchTimer = null;
242
+ _asyncRequestId = 0;
243
+ _asyncAbortController = null;
244
+ _lastDataSource = undefined;
245
+ _lastInitialSelectedKey = '';
246
+ _destroyed = false;
175
247
  _empty = computed(() => {
176
248
  this._selectionChanges();
249
+ this._asyncSelectedCache();
250
+ this.asyncOptions();
177
251
  const value = this.value();
178
252
  const isValueEmpty = value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
253
+ if (isValueEmpty) {
254
+ return true;
255
+ }
256
+ if (this.asyncEnabled()) {
257
+ return this._selectedValues(value).every(selectedValue => !this._asyncOptionForValue(selectedValue));
258
+ }
179
259
  const isEmpty = (this._selectionModel?.isEmpty() ?? true) && isValueEmpty;
180
260
  return isEmpty;
181
261
  }, ...(ngDevMode ? [{ debugName: "_empty" }] : /* istanbul ignore next */ []));
@@ -228,6 +308,18 @@ class Select {
228
308
  }
229
309
  });
230
310
  });
311
+ effect(() => {
312
+ const dataSource = this.dataSource();
313
+ untracked(() => {
314
+ if (dataSource !== this._lastDataSource) {
315
+ this._lastDataSource = dataSource;
316
+ this._resetAsyncState();
317
+ }
318
+ if (!dataSource) {
319
+ return;
320
+ }
321
+ });
322
+ });
231
323
  effect(() => {
232
324
  this._optionsContentChanges();
233
325
  untracked(() => {
@@ -242,13 +334,19 @@ class Select {
242
334
  this._selectionChanges();
243
335
  this.options();
244
336
  this._optionsContentChanges();
337
+ this._asyncSelectedCache();
338
+ this.asyncOptions();
245
339
  if (this.empty) {
246
340
  return '';
247
341
  }
248
342
  if (this.multiple()) {
249
- return this._selectionModel.selected.map(option => option.viewValue).join(', ');
343
+ const values = this._selectedValues(this.value());
344
+ return values
345
+ .map(value => this._viewValueForValue(value))
346
+ .filter(value => value.length > 0)
347
+ .join(', ');
250
348
  }
251
- return this._selectionModel.selected[0]?.viewValue || '';
349
+ return this._selectionModel.selected[0]?.viewValue || this._viewValueForValue(this.value()) || '';
252
350
  }, ...(ngDevMode ? [{ debugName: "triggerValue" }] : /* istanbul ignore next */ []));
253
351
  selectedCount = computed(() => {
254
352
  this._selectionChanges();
@@ -264,12 +362,66 @@ class Select {
264
362
  }, ...(ngDevMode ? [{ debugName: "selectedCount" }] : /* istanbul ignore next */ []));
265
363
  selectedData = computed(() => {
266
364
  this._selectionChanges();
365
+ this._asyncSelectedCache();
366
+ this.asyncOptions();
367
+ if (this.asyncEnabled()) {
368
+ if (this.multiple()) {
369
+ return this._selectedValues(this.value()).map(value => this._dataForValue(value));
370
+ }
371
+ const value = this.value();
372
+ return value === null || value === undefined || value === '' ? null : this._dataForValue(value);
373
+ }
267
374
  if (this.multiple()) {
268
375
  return this._selectionModel.selected.map(option => this._getOptionData(option));
269
376
  }
270
377
  const selectedOption = this._selectionModel.selected[0];
271
378
  return selectedOption ? this._getOptionData(selectedOption) : null;
272
379
  }, ...(ngDevMode ? [{ debugName: "selectedData" }] : /* istanbul ignore next */ []));
380
+ selectValueContext = computed(() => {
381
+ this._selectionChanges();
382
+ this._asyncSelectedCache();
383
+ this.asyncOptions();
384
+ const values = this._selectedValues(this.value());
385
+ const labels = values.map(value => this._viewValueForValue(value)).filter(label => label.length > 0);
386
+ const options = values
387
+ .map(value => this._displayOptionForValue(value))
388
+ .filter((option) => !!option);
389
+ if (this.multiple()) {
390
+ const data = values.map(value => this._dataForValue(value));
391
+ return {
392
+ $implicit: data,
393
+ data,
394
+ option: options,
395
+ value: values,
396
+ label: labels.join(', '),
397
+ labels,
398
+ count: values.length,
399
+ multiple: true
400
+ };
401
+ }
402
+ const value = values[0] ?? null;
403
+ const data = value === null ? null : this._dataForValue(value);
404
+ return {
405
+ $implicit: data,
406
+ data,
407
+ option: options[0] ?? null,
408
+ value,
409
+ label: labels[0] ?? '',
410
+ labels,
411
+ count: values.length,
412
+ multiple: false
413
+ };
414
+ }, ...(ngDevMode ? [{ debugName: "selectValueContext" }] : /* istanbul ignore next */ []));
415
+ selectValueTemplateReady = computed(() => {
416
+ this._selectionChanges();
417
+ this._asyncSelectedCache();
418
+ this.asyncOptions();
419
+ if (!this.asyncEnabled()) {
420
+ return true;
421
+ }
422
+ const values = this._selectedValues(this.value());
423
+ return values.length > 0 && values.every(value => !!this._asyncOptionForValue(value));
424
+ }, ...(ngDevMode ? [{ debugName: "selectValueTemplateReady" }] : /* istanbul ignore next */ []));
273
425
  ngAfterContentInit() {
274
426
  }
275
427
  _resetOptions() {
@@ -285,6 +437,8 @@ class Select {
285
437
  });
286
438
  }
287
439
  ngOnDestroy() {
440
+ this._destroyed = true;
441
+ this._asyncAbortController?.abort();
288
442
  this._destroy.next();
289
443
  this._destroy.complete();
290
444
  this._optionsDestroy.next();
@@ -314,6 +468,22 @@ class Select {
314
468
  this._focused.set(true);
315
469
  this.stateChanges.set(undefined);
316
470
  this.opened.emit();
471
+ if (this.dataSource() && this.loadOnOpen() && !this.asyncLoading()) {
472
+ const selectedValues = this._selectedValues(this.value());
473
+ const selectedKey = this._selectedValuesKey(selectedValues);
474
+ const initialKey = `${this.pageSize()}:${selectedKey}`;
475
+ const missingSelectedOption = selectedValues.some(value => !this._asyncOptionForValue(value));
476
+ const shouldLoadOptions = this.asyncOptions().length === 0 || missingSelectedOption;
477
+ if (shouldLoadOptions) {
478
+ const reason = selectedValues.length > 0 && missingSelectedOption && initialKey !== this._lastInitialSelectedKey
479
+ ? 'initial'
480
+ : 'open';
481
+ if (reason === 'initial') {
482
+ this._lastInitialSelectedKey = initialKey;
483
+ }
484
+ void this._loadFirstPage(reason);
485
+ }
486
+ }
317
487
  setTimeout(() => {
318
488
  this._scrollToSelectedOption();
319
489
  }, 10);
@@ -393,7 +563,55 @@ class Select {
393
563
  this.close();
394
564
  }
395
565
  }
566
+ onAsyncSearchInput(value) {
567
+ this.asyncSearch.set(value);
568
+ if (this._asyncSearchTimer) {
569
+ clearTimeout(this._asyncSearchTimer);
570
+ }
571
+ this._asyncSearchTimer = setTimeout(() => {
572
+ this._asyncSearchTimer = null;
573
+ if (value.length > 0 && value.length < this.minSearchLength()) {
574
+ this.asyncOptions.set([]);
575
+ this.asyncHasMore.set(false);
576
+ this.asyncError.set(null);
577
+ return;
578
+ }
579
+ void this._loadFirstPage('search');
580
+ }, Math.max(0, this.searchDebounce()));
581
+ }
582
+ onAsyncContentScroll(event) {
583
+ const target = event.target;
584
+ if (!target || !this.asyncHasMore() || this.asyncLoading() || this.asyncLoadingMore()) {
585
+ return;
586
+ }
587
+ const threshold = 32;
588
+ const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;
589
+ if (remaining <= threshold) {
590
+ void this._loadNextPage();
591
+ }
592
+ }
593
+ retryAsyncLoad() {
594
+ void this._loadFirstPage(this.asyncSearch() ? 'search' : 'open');
595
+ }
596
+ asyncOptionContext(option) {
597
+ const selected = this._selectedValues(this.value())
598
+ .some(value => this._compareValues(value, option.value));
599
+ return {
600
+ $implicit: option.data === undefined ? option.value : option.data,
601
+ data: option.data === undefined ? option.value : option.data,
602
+ option,
603
+ value: option.value,
604
+ label: option.label,
605
+ selected,
606
+ disabled: option.disabled === true,
607
+ multiple: this.multiple()
608
+ };
609
+ }
396
610
  _selectOption(option) {
611
+ if (this.asyncEnabled() && this.multiple()) {
612
+ this._selectAsyncMultipleOption(option);
613
+ return;
614
+ }
397
615
  const wasSelected = this._selectionModel.isSelected(option);
398
616
  if (this.multiple()) {
399
617
  this._selectionModel.toggle(option);
@@ -405,6 +623,19 @@ class Select {
405
623
  this._propagateChanges();
406
624
  }
407
625
  }
626
+ _selectAsyncMultipleOption(option) {
627
+ const optionValue = option.value();
628
+ const selectedValues = this._selectedValues(this.value());
629
+ const selectedIndex = selectedValues.findIndex(value => this._compareValues(value, optionValue));
630
+ const nextValues = selectedIndex >= 0
631
+ ? selectedValues.filter((_, index) => index !== selectedIndex)
632
+ : [...selectedValues, optionValue];
633
+ this.value.set(nextValues);
634
+ this._setSelectionByValue(nextValues);
635
+ this._onChange(nextValues);
636
+ this.selectionChange.emit(new SelectChange(this, nextValues));
637
+ this._cdr.markForCheck();
638
+ }
408
639
  _propagateChanges() {
409
640
  let valueToEmit;
410
641
  if (this.multiple()) {
@@ -452,6 +683,25 @@ class Select {
452
683
  }
453
684
  }
454
685
  const option = selected.elementRef.nativeElement;
686
+ this._scrollOptionElementIntoContainer(option, scrollContainer);
687
+ }
688
+ _scrollToAsyncOptionValue(value) {
689
+ const panel = this.panel()?.nativeElement;
690
+ if (!panel) {
691
+ return;
692
+ }
693
+ const scrollContainer = panel.querySelector('.ngs-select-async-content');
694
+ if (!scrollContainer) {
695
+ return;
696
+ }
697
+ const option = this.dataSourceOptions()
698
+ .find(option => this._compareValues(option.value(), value));
699
+ if (!option) {
700
+ return;
701
+ }
702
+ this._scrollOptionElementIntoContainer(option.elementRef.nativeElement, scrollContainer);
703
+ }
704
+ _scrollOptionElementIntoContainer(option, scrollContainer) {
455
705
  let offsetTop = 0;
456
706
  let currentElement = option;
457
707
  while (currentElement && currentElement !== scrollContainer && scrollContainer.contains(currentElement)) {
@@ -462,10 +712,10 @@ class Select {
462
712
  const containerScrollTop = scrollContainer.scrollTop;
463
713
  const containerHeight = scrollContainer.clientHeight;
464
714
  if (offsetTop < containerScrollTop) {
465
- scrollContainer.scrollTop = offsetTop;
715
+ this._setScrollTop(scrollContainer, offsetTop);
466
716
  }
467
717
  else if (offsetTop + optionHeight > containerScrollTop + containerHeight) {
468
- scrollContainer.scrollTop = offsetTop - containerHeight + optionHeight;
718
+ this._setScrollTop(scrollContainer, offsetTop - containerHeight + optionHeight);
469
719
  }
470
720
  // Дополнительная проверка: если скролл все еще не там, попробуем через getBoundingClientRect
471
721
  // но только как fallback, так как offsetTop надежнее если offsetParent настроены верно.
@@ -474,13 +724,21 @@ class Select {
474
724
  if (optionRect.top < containerRect.top || optionRect.bottom > containerRect.bottom) {
475
725
  const relativeOffsetTop = optionRect.top - containerRect.top + scrollContainer.scrollTop;
476
726
  if (relativeOffsetTop < scrollContainer.scrollTop) {
477
- scrollContainer.scrollTop = relativeOffsetTop;
727
+ this._setScrollTop(scrollContainer, relativeOffsetTop);
478
728
  }
479
729
  else if (relativeOffsetTop + optionHeight > scrollContainer.scrollTop + containerHeight) {
480
- scrollContainer.scrollTop = relativeOffsetTop - containerHeight + optionHeight;
730
+ this._setScrollTop(scrollContainer, relativeOffsetTop - containerHeight + optionHeight);
481
731
  }
482
732
  }
483
733
  }
734
+ _setScrollTop(element, value) {
735
+ try {
736
+ element.scrollTop = value;
737
+ }
738
+ catch {
739
+ // Some test DOM mocks expose scrollTop as read-only.
740
+ }
741
+ }
484
742
  _getOptionIndex(option) {
485
743
  return this.options().indexOf(option);
486
744
  }
@@ -504,8 +762,205 @@ class Select {
504
762
  this._selectionModel.select(correspondingOption);
505
763
  }
506
764
  }
765
+ async _loadFirstPage(reason) {
766
+ await this._loadAsyncPage({ reason, append: false });
767
+ }
768
+ async _loadNextPage() {
769
+ await this._loadAsyncPage({ reason: 'page', append: true });
770
+ }
771
+ async _loadAsyncPage(config) {
772
+ const dataSource = this.dataSource();
773
+ if (!dataSource) {
774
+ return;
775
+ }
776
+ if (config.append && (!this.asyncHasMore() || this.asyncLoadingMore())) {
777
+ return;
778
+ }
779
+ this._asyncAbortController?.abort();
780
+ const abortController = new AbortController();
781
+ this._asyncAbortController = abortController;
782
+ const requestId = ++this._asyncRequestId;
783
+ const nextPage = config.append ? this._asyncPage + 1 : 1;
784
+ let firstLoadedOptionValue;
785
+ let hasLoadedOptionToScroll = false;
786
+ if (config.append) {
787
+ this.asyncLoadingMore.set(true);
788
+ }
789
+ else {
790
+ this.asyncLoading.set(true);
791
+ this.asyncError.set(null);
792
+ this._asyncPage = 0;
793
+ this._asyncCursor = undefined;
794
+ this.asyncHasMore.set(false);
795
+ }
796
+ try {
797
+ const result = await dataSource({
798
+ search: this.asyncSearch(),
799
+ page: nextPage,
800
+ pageSize: this.pageSize(),
801
+ cursor: config.append ? this._asyncCursor : undefined,
802
+ selectedValues: this._selectedValues(this.value()),
803
+ reason: config.reason,
804
+ signal: abortController.signal
805
+ });
806
+ if (requestId !== this._asyncRequestId || abortController.signal.aborted) {
807
+ return;
808
+ }
809
+ const normalized = this._normalizeAsyncResult(result);
810
+ const items = config.append
811
+ ? this._mergeAsyncOptions(this.asyncOptions(), normalized.items)
812
+ : this._mergeAsyncOptions([], normalized.items);
813
+ const firstLoadedOption = normalized.items[0];
814
+ if (firstLoadedOption) {
815
+ firstLoadedOptionValue = firstLoadedOption.value;
816
+ hasLoadedOptionToScroll = true;
817
+ }
818
+ this.asyncOptions.set(items);
819
+ this._cacheAsyncSelectedOptions(normalized.items);
820
+ this.asyncHasMore.set(!!normalized.hasMore);
821
+ this._asyncCursor = normalized.nextCursor;
822
+ this._asyncPage = nextPage;
823
+ this.asyncError.set(null);
824
+ this._optionsContentChanges.update(v => v + 1);
825
+ }
826
+ catch (error) {
827
+ if (requestId === this._asyncRequestId && !abortController.signal.aborted) {
828
+ this.asyncError.set(error);
829
+ }
830
+ }
831
+ finally {
832
+ if (requestId === this._asyncRequestId) {
833
+ this.asyncLoading.set(false);
834
+ this.asyncLoadingMore.set(false);
835
+ if (!this._destroyed) {
836
+ this._cdr.detectChanges();
837
+ if (hasLoadedOptionToScroll) {
838
+ this._scrollToAsyncOptionValue(firstLoadedOptionValue);
839
+ }
840
+ this._cdr.markForCheck();
841
+ }
842
+ }
843
+ }
844
+ }
845
+ _normalizeAsyncResult(result) {
846
+ if (Array.isArray(result)) {
847
+ return {
848
+ items: result,
849
+ hasMore: false
850
+ };
851
+ }
852
+ return {
853
+ ...result,
854
+ items: result.items ?? []
855
+ };
856
+ }
857
+ _mergeAsyncOptions(current, incoming) {
858
+ const merged = [...current];
859
+ incoming.forEach(option => {
860
+ const existingIndex = merged.findIndex(currentOption => this._compareValues(currentOption.value, option.value));
861
+ if (existingIndex >= 0) {
862
+ merged[existingIndex] = option;
863
+ }
864
+ else {
865
+ merged.push(option);
866
+ }
867
+ });
868
+ return merged;
869
+ }
870
+ _cacheAsyncSelectedOptions(options) {
871
+ const selectedValues = this._selectedValues(this.value());
872
+ if (selectedValues.length === 0) {
873
+ this._asyncSelectedCache.set([]);
874
+ return;
875
+ }
876
+ const cached = this._mergeAsyncOptions(this._asyncSelectedCache(), options)
877
+ .filter(option => selectedValues.some(value => this._compareValues(value, option.value)));
878
+ this._asyncSelectedCache.set(cached);
879
+ }
880
+ _resetAsyncState() {
881
+ this._asyncAbortController?.abort();
882
+ this._asyncRequestId++;
883
+ this.asyncOptions.set([]);
884
+ this.asyncSearch.set('');
885
+ this.asyncLoading.set(false);
886
+ this.asyncLoadingMore.set(false);
887
+ this.asyncError.set(null);
888
+ this.asyncHasMore.set(false);
889
+ this._asyncSelectedCache.set([]);
890
+ this._asyncPage = 0;
891
+ this._asyncCursor = undefined;
892
+ this._lastInitialSelectedKey = '';
893
+ }
894
+ _selectedValues(value) {
895
+ if (this.multiple()) {
896
+ return Array.isArray(value)
897
+ ? value.filter(item => item !== null && item !== undefined && item !== '')
898
+ : [];
899
+ }
900
+ return value === null || value === undefined || value === '' ? [] : [value];
901
+ }
902
+ _selectedValuesKey(values) {
903
+ return values.map(value => `${typeof value}:${String(value)}`).join('|');
904
+ }
905
+ _viewValueForValue(value) {
906
+ const asyncOption = this._asyncOptionForValue(value);
907
+ if (asyncOption) {
908
+ return asyncOption.label;
909
+ }
910
+ const option = this._optionForValue(value);
911
+ if (option) {
912
+ return option.viewValue;
913
+ }
914
+ return '';
915
+ }
916
+ _dataForValue(value) {
917
+ const option = this._optionForValue(value);
918
+ if (option) {
919
+ return this._getOptionData(option);
920
+ }
921
+ const asyncOption = this._asyncOptionForValue(value);
922
+ if (this.asyncEnabled()) {
923
+ return asyncOption?.data ?? null;
924
+ }
925
+ return value;
926
+ }
927
+ _displayOptionForValue(value) {
928
+ const asyncOption = this._asyncOptionForValue(value);
929
+ if (asyncOption) {
930
+ return asyncOption;
931
+ }
932
+ const option = this._optionForValue(value);
933
+ if (option) {
934
+ const data = this._getOptionData(option);
935
+ return {
936
+ label: option.viewValue,
937
+ value: option.value(),
938
+ data
939
+ };
940
+ }
941
+ return undefined;
942
+ }
943
+ _optionForValue(value) {
944
+ return this.options().find(option => {
945
+ try {
946
+ return option.value() != null && this._compareValues(option.value(), value);
947
+ }
948
+ catch {
949
+ return false;
950
+ }
951
+ });
952
+ }
953
+ _asyncOptionForValue(value) {
954
+ return [
955
+ ...this.asyncOptions(),
956
+ ...this._asyncSelectedCache()
957
+ ].find(option => this._compareValues(option.value, value));
958
+ }
959
+ _compareValues(first, second) {
960
+ return first === second || Object.is(first, second);
961
+ }
507
962
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Select, deps: [], target: i0.ɵɵFactoryTarget.Component });
508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: Select, isStandalone: true, selector: "ngs-select", inputs: { _id: { classPropertyName: "_id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledInput: { classPropertyName: "_disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, hideCheckIcon: { classPropertyName: "hideCheckIcon", publicName: "hideCheckIcon", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", opened: "opened", closed: "closed", value: "valueChange" }, host: { attributes: { "role": "combobox", "aria-autocomplete": "none", "aria-haspopup": "listbox" }, listeners: { "click": "toggle()", "keydown": "_handleKeydown($event)", "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex()", "attr.aria-controls": "panelOpen() ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen()", "attr.aria-label": "ariaLabel()", "attr.aria-required": "required", "attr.aria-disabled": "disabled", "attr.aria-invalid": "errorState", "class.ngs-select-disabled": "disabled", "class.ngs-select-invalid": "errorState", "class.ngs-select-required": "required", "class.ngs-select-empty": "empty", "class.ngs-select-panel-open": "panelOpen()", "class.ngs-select-has-filter-trigger": "filterTrigger().length > 0", "class.ngs-select-clearable": "clearable()", "class.ngs-select-has-clear": "showClearButton()" } }, providers: [
963
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: Select, isStandalone: true, selector: "ngs-select", inputs: { _id: { classPropertyName: "_id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledInput: { classPropertyName: "_disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, hideCheckIcon: { classPropertyName: "hideCheckIcon", publicName: "hideCheckIcon", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchDebounce: { classPropertyName: "searchDebounce", publicName: "searchDebounce", isSignal: true, isRequired: false, transformFunction: null }, minSearchLength: { classPropertyName: "minSearchLength", publicName: "minSearchLength", isSignal: true, isRequired: false, transformFunction: null }, loadOnOpen: { classPropertyName: "loadOnOpen", publicName: "loadOnOpen", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", opened: "opened", closed: "closed", value: "valueChange" }, host: { attributes: { "role": "combobox", "aria-autocomplete": "none", "aria-haspopup": "listbox" }, listeners: { "click": "toggle()", "keydown": "_handleKeydown($event)", "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex()", "attr.aria-controls": "panelOpen() ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen()", "attr.aria-label": "ariaLabel()", "attr.aria-required": "required", "attr.aria-disabled": "disabled", "attr.aria-invalid": "errorState", "class.ngs-select-disabled": "disabled", "class.ngs-select-invalid": "errorState", "class.ngs-select-required": "required", "class.ngs-select-empty": "empty", "class.ngs-select-panel-open": "panelOpen()", "class.ngs-select-has-filter-trigger": "filterTrigger().length > 0", "class.ngs-select-clearable": "clearable()", "class.ngs-select-has-clear": "showClearButton()" } }, providers: [
509
964
  {
510
965
  provide: FormFieldControl,
511
966
  useExisting: forwardRef(() => Select)
@@ -522,13 +977,16 @@ class Select {
522
977
  provide: AUTOFOCUSABLE,
523
978
  useExisting: forwardRef(() => Select)
524
979
  }
525
- ], queries: [{ propertyName: "selectBody", predicate: SelectBody, isSignal: true }, { propertyName: "options", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "optionGroups", predicate: Optgroup, descendants: true, isSignal: true }, { propertyName: "customTrigger", predicate: SelectTrigger, descendants: true, isSignal: true }, { propertyName: "filterTrigger", predicate: FilterTrigger, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "origin", first: true, predicate: ["origin"], descendants: true, isSignal: true }], exportAs: ["ngsSelect"], ngImport: i0, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.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: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
980
+ ], queries: [{ propertyName: "selectBody", predicate: SelectBody, isSignal: true }, { propertyName: "projectedOptions", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "optionGroups", predicate: Optgroup, descendants: true, isSignal: true }, { propertyName: "customTrigger", predicate: SelectTrigger, descendants: true, isSignal: true }, { propertyName: "filterTrigger", predicate: FilterTrigger, descendants: true, isSignal: true }, { propertyName: "optionContentDef", first: true, predicate: SelectOptionContentDef, descendants: true, isSignal: true }, { propertyName: "selectValueDef", first: true, predicate: SelectValueDef, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "dataSourceOptions", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "origin", first: true, predicate: ["origin"], descendants: true, isSignal: true }], exportAs: ["ngsSelect"], ngImport: i0, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else if (selectValueTemplateReady() && selectValueDef(); as valueTpl) {\n <span class=\"ngs-select-value-text\">\n <ng-container\n [ngTemplateOutlet]=\"valueTpl.templateRef\"\n [ngTemplateOutletContext]=\"selectValueContext()\"/>\n </span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else if (asyncEnabled()) {\n @if (searchable()) {\n <ngs-select-header>\n <div class=\"ngs-select-search sticky top-0 z-1 bg-surface-container-lowest\">\n <input\n class=\"ngs-select-search-input w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\"\n type=\"text\"\n [value]=\"asyncSearch()\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n autocomplete=\"off\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (input)=\"onAsyncSearchInput($any($event.target).value)\">\n </div>\n </ngs-select-header>\n }\n\n <div class=\"ngs-select-content ngs-select-async-content\" (scroll)=\"onAsyncContentScroll($event)\">\n @if (asyncLoading()) {\n <div class=\"ngs-select-state\">Loading...</div>\n } @else if (asyncError()) {\n <button type=\"button\" class=\"ngs-select-state ngs-select-retry\" (click)=\"retryAsyncLoad()\">\n Could not load options. Try again.\n </button>\n } @else {\n @for (option of asyncOptions(); track option.value) {\n <ngs-option [value]=\"option.value\" [data]=\"option.data\" [disabled]=\"option.disabled ?? false\">\n @if (optionContentDef(); as optionTpl) {\n <ng-container\n [ngTemplateOutlet]=\"optionTpl.templateRef\"\n [ngTemplateOutletContext]=\"asyncOptionContext(option)\"/>\n } @else {\n {{ option.label }}\n }\n </ngs-option>\n }\n\n @if (asyncOptions().length === 0) {\n <div class=\"ngs-select-state\">No options</div>\n } @else if (asyncLoadingMore()) {\n <div class=\"ngs-select-state\">Loading more...</div>\n }\n }\n </div>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}.ngs-select-panel .ngs-select-search{position:sticky;top:0;z-index:1;background:var(--ngs-select-search-bg, var(--ngs-color-surface-container-lowest, var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))))}.ngs-select-panel .ngs-select-search-input{width:100%;min-width:0;height:var(--ngs-select-search-height, calc(var(--spacing, .25rem) * 14));padding:0 var(--ngs-select-search-padding-inline, calc(var(--spacing, .25rem) * 3));border:0;border-bottom:var(--ngs-select-search-border, 1px solid var(--ngs-color-surface-container-high, var(--ngs-color-outline-variant)));outline:none;background:transparent;color:var(--ngs-select-search-color, var(--ngs-color-on-surface));font:inherit;font-size:var(--ngs-select-search-font-size, var(--ngs-font-size-sm, .875rem))}.ngs-select-panel .ngs-select-search-input:focus{border-bottom-color:var(--ngs-select-search-focus-border-color, var(--ngs-color-primary))}.ngs-select-panel .ngs-select-state{display:flex;align-items:center;width:100%;min-height:var(--ngs-select-state-min-height, 36px);padding:var(--ngs-select-state-padding, calc(var(--spacing, .25rem) * 2));border:0;background:transparent;color:var(--ngs-select-state-color, var(--ngs-color-on-surface-variant));font:inherit;font-size:var(--ngs-select-state-font-size, var(--ngs-field-font-size));text-align:left}.ngs-select-panel .ngs-select-retry{cursor:pointer}.ngs-select-panel .ngs-select-retry:hover,.ngs-select-panel .ngs-select-retry:focus-visible{color:var(--ngs-select-state-action-color, var(--ngs-color-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.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: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: Option, selector: "ngs-option", inputs: ["value", "data", "disabled", "selected"], outputs: ["onSelectionChange"], exportAs: ["ngsOption"] }, { kind: "component", type: SelectHeader, selector: "ngs-select-header" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
526
981
  }
527
982
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Select, decorators: [{
528
983
  type: Component,
529
- args: [{ selector: 'ngs-select', exportAs: 'ngsSelect', standalone: true, imports: [
984
+ args: [{ selector: 'ngs-select', exportAs: 'ngsSelect', imports: [
530
985
  OverlayModule,
531
- CdkOverlayOrigin
986
+ CdkOverlayOrigin,
987
+ Option,
988
+ SelectHeader,
989
+ NgTemplateOutlet
532
990
  ], providers: [
533
991
  {
534
992
  provide: FormFieldControl,
@@ -570,19 +1028,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
570
1028
  '(keydown)': '_handleKeydown($event)',
571
1029
  '(focus)': '_onFocus()',
572
1030
  '(blur)': '_onBlur()',
573
- }, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
574
- }], ctorParameters: () => [], propDecorators: { selectBody: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectBody), { isSignal: true }] }], _id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], _disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], hideCheckIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCheckIcon", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => OPTION), { ...{ descendants: true }, isSignal: true }] }], optionGroups: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => Optgroup), { ...{ descendants: true }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectTrigger), { ...{ descendants: true }, isSignal: true }] }], filterTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FilterTrigger), { ...{ descendants: true }, isSignal: true }] }], overlayDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], origin: [{ type: i0.ViewChild, args: ['origin', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
575
-
576
- class SelectHeader {
577
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
578
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: SelectHeader, isStandalone: true, selector: "ngs-select-header", host: { classAttribute: "ngs-select-header" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
579
- }
580
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, decorators: [{
581
- type: Component,
582
- args: [{ selector: 'ngs-select-header', standalone: true, imports: [], template: '<ng-content />', host: {
583
- 'class': 'ngs-select-header'
584
- }, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
585
- }] });
1031
+ }, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else if (selectValueTemplateReady() && selectValueDef(); as valueTpl) {\n <span class=\"ngs-select-value-text\">\n <ng-container\n [ngTemplateOutlet]=\"valueTpl.templateRef\"\n [ngTemplateOutletContext]=\"selectValueContext()\"/>\n </span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else if (asyncEnabled()) {\n @if (searchable()) {\n <ngs-select-header>\n <div class=\"ngs-select-search sticky top-0 z-1 bg-surface-container-lowest\">\n <input\n class=\"ngs-select-search-input w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\"\n type=\"text\"\n [value]=\"asyncSearch()\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n autocomplete=\"off\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (input)=\"onAsyncSearchInput($any($event.target).value)\">\n </div>\n </ngs-select-header>\n }\n\n <div class=\"ngs-select-content ngs-select-async-content\" (scroll)=\"onAsyncContentScroll($event)\">\n @if (asyncLoading()) {\n <div class=\"ngs-select-state\">Loading...</div>\n } @else if (asyncError()) {\n <button type=\"button\" class=\"ngs-select-state ngs-select-retry\" (click)=\"retryAsyncLoad()\">\n Could not load options. Try again.\n </button>\n } @else {\n @for (option of asyncOptions(); track option.value) {\n <ngs-option [value]=\"option.value\" [data]=\"option.data\" [disabled]=\"option.disabled ?? false\">\n @if (optionContentDef(); as optionTpl) {\n <ng-container\n [ngTemplateOutlet]=\"optionTpl.templateRef\"\n [ngTemplateOutletContext]=\"asyncOptionContext(option)\"/>\n } @else {\n {{ option.label }}\n }\n </ngs-option>\n }\n\n @if (asyncOptions().length === 0) {\n <div class=\"ngs-select-state\">No options</div>\n } @else if (asyncLoadingMore()) {\n <div class=\"ngs-select-state\">Loading more...</div>\n }\n }\n </div>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}.ngs-select-panel .ngs-select-search{position:sticky;top:0;z-index:1;background:var(--ngs-select-search-bg, var(--ngs-color-surface-container-lowest, var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))))}.ngs-select-panel .ngs-select-search-input{width:100%;min-width:0;height:var(--ngs-select-search-height, calc(var(--spacing, .25rem) * 14));padding:0 var(--ngs-select-search-padding-inline, calc(var(--spacing, .25rem) * 3));border:0;border-bottom:var(--ngs-select-search-border, 1px solid var(--ngs-color-surface-container-high, var(--ngs-color-outline-variant)));outline:none;background:transparent;color:var(--ngs-select-search-color, var(--ngs-color-on-surface));font:inherit;font-size:var(--ngs-select-search-font-size, var(--ngs-font-size-sm, .875rem))}.ngs-select-panel .ngs-select-search-input:focus{border-bottom-color:var(--ngs-select-search-focus-border-color, var(--ngs-color-primary))}.ngs-select-panel .ngs-select-state{display:flex;align-items:center;width:100%;min-height:var(--ngs-select-state-min-height, 36px);padding:var(--ngs-select-state-padding, calc(var(--spacing, .25rem) * 2));border:0;background:transparent;color:var(--ngs-select-state-color, var(--ngs-color-on-surface-variant));font:inherit;font-size:var(--ngs-select-state-font-size, var(--ngs-field-font-size));text-align:left}.ngs-select-panel .ngs-select-retry{cursor:pointer}.ngs-select-panel .ngs-select-retry:hover,.ngs-select-panel .ngs-select-retry:focus-visible{color:var(--ngs-select-state-action-color, var(--ngs-color-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
1032
+ }], ctorParameters: () => [], propDecorators: { selectBody: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectBody), { isSignal: true }] }], _id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], _disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], hideCheckIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCheckIcon", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchDebounce", required: false }] }], minSearchLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSearchLength", required: false }] }], loadOnOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadOnOpen", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], projectedOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => OPTION), { ...{ descendants: true }, isSignal: true }] }], dataSourceOptions: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => OPTION), { isSignal: true }] }], optionGroups: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => Optgroup), { ...{ descendants: true }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectTrigger), { ...{ descendants: true }, isSignal: true }] }], filterTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FilterTrigger), { ...{ descendants: true }, isSignal: true }] }], optionContentDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SelectOptionContentDef), { ...{ descendants: true }, isSignal: true }] }], selectValueDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SelectValueDef), { ...{ descendants: true }, isSignal: true }] }], overlayDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], origin: [{ type: i0.ViewChild, args: ['origin', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
586
1033
 
587
1034
  class SelectFooter {
588
1035
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -599,5 +1046,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
599
1046
  * Generated bundle index. Do not edit.
600
1047
  */
601
1048
 
602
- export { FilterTrigger, FilterTriggerValueDirective, SELECT, Select, SelectBody, SelectChange, SelectFooter, SelectHeader, SelectTrigger, _Select };
1049
+ export { FilterTrigger, FilterTriggerValueDirective, SELECT, Select, SelectBody, SelectChange, SelectFooter, SelectHeader, SelectOptionContentDef, SelectTrigger, SelectValueDef, _Select };
603
1050
  //# sourceMappingURL=ngstarter-ui-components-select.mjs.map