@neural-ui/core 1.7.1 → 1.7.3
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.
- package/bottom-sheet/package.json +4 -0
- package/confirm-popup/package.json +4 -0
- package/data-view/package.json +4 -0
- package/fesm2022/neural-ui-core-alert.mjs +48 -21
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +153 -71
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-block-ui.mjs +2 -2
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
- package/fesm2022/neural-ui-core-bottom-sheet.mjs +121 -0
- package/fesm2022/neural-ui-core-bottom-sheet.mjs.map +1 -0
- package/fesm2022/neural-ui-core-breadcrumb.mjs +2 -2
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/neural-ui-core-button.mjs +2 -2
- package/fesm2022/neural-ui-core-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-calendar.mjs +2 -2
- package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-checkbox.mjs +69 -39
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
- package/fesm2022/neural-ui-core-chip.mjs +2 -2
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-code-block.mjs +2 -2
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
- package/fesm2022/neural-ui-core-confirm-popup.mjs +105 -0
- package/fesm2022/neural-ui-core-confirm-popup.mjs.map +1 -0
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +9 -3
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
- package/fesm2022/neural-ui-core-data-view.mjs +386 -0
- package/fesm2022/neural-ui-core-data-view.mjs.map +1 -0
- package/fesm2022/neural-ui-core-date-input.mjs +185 -10
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-empty-state.mjs +19 -5
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-form-field.mjs +81 -0
- package/fesm2022/neural-ui-core-form-field.mjs.map +1 -0
- package/fesm2022/neural-ui-core-inline-editor.mjs +428 -0
- package/fesm2022/neural-ui-core-inline-editor.mjs.map +1 -0
- package/fesm2022/neural-ui-core-input-mask.mjs +110 -0
- package/fesm2022/neural-ui-core-input-mask.mjs.map +1 -0
- package/fesm2022/neural-ui-core-input.mjs +2 -2
- package/fesm2022/neural-ui-core-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-listbox.mjs +219 -0
- package/fesm2022/neural-ui-core-listbox.mjs.map +1 -0
- package/fesm2022/neural-ui-core-menu.mjs +229 -0
- package/fesm2022/neural-ui-core-menu.mjs.map +1 -0
- package/fesm2022/neural-ui-core-modal.mjs +34 -10
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +170 -179
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-number-input.mjs +2 -2
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
- package/fesm2022/neural-ui-core-panel.mjs +92 -0
- package/fesm2022/neural-ui-core-panel.mjs.map +1 -0
- package/fesm2022/neural-ui-core-password.mjs +106 -0
- package/fesm2022/neural-ui-core-password.mjs.map +1 -0
- package/fesm2022/neural-ui-core-pick-list.mjs +133 -0
- package/fesm2022/neural-ui-core-pick-list.mjs.map +1 -0
- package/fesm2022/neural-ui-core-select.mjs +128 -166
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +14 -3
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-slider.mjs +2 -2
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
- package/fesm2022/neural-ui-core-spinner.mjs +19 -9
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
- package/fesm2022/neural-ui-core-split-button.mjs +2 -2
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +503 -62
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +11 -4
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tags.mjs +134 -0
- package/fesm2022/neural-ui-core-tags.mjs.map +1 -0
- package/fesm2022/neural-ui-core-textarea.mjs +2 -2
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +2 -2
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +16 -4
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree-select.mjs +259 -0
- package/fesm2022/neural-ui-core-tree-select.mjs.map +1 -0
- package/fesm2022/neural-ui-core-tree-table.mjs +267 -8
- package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tree.mjs +15 -14
- package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
- package/fesm2022/neural-ui-core-uploader.mjs +103 -12
- package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
- package/form-field/package.json +4 -0
- package/inline-editor/package.json +4 -0
- package/input-mask/package.json +4 -0
- package/listbox/package.json +4 -0
- package/menu/package.json +4 -0
- package/package.json +53 -1
- package/panel/package.json +4 -0
- package/password/package.json +4 -0
- package/pick-list/package.json +4 -0
- package/styles/_tokens.scss +33 -17
- package/tags/package.json +4 -0
- package/tree-select/package.json +4 -0
- package/types/neural-ui-core-alert.d.ts +2 -1
- package/types/neural-ui-core-autocomplete.d.ts +22 -2
- package/types/neural-ui-core-bottom-sheet.d.ts +20 -0
- package/types/neural-ui-core-checkbox.d.ts +6 -1
- package/types/neural-ui-core-confirm-popup.d.ts +38 -0
- package/types/neural-ui-core-dashboard-grid.d.ts +1 -0
- package/types/neural-ui-core-data-view.d.ts +95 -0
- package/types/neural-ui-core-date-input.d.ts +35 -5
- package/types/neural-ui-core-empty-state.d.ts +11 -1
- package/types/neural-ui-core-form-field.d.ts +33 -0
- package/types/neural-ui-core-inline-editor.d.ts +66 -0
- package/types/neural-ui-core-input-mask.d.ts +26 -0
- package/types/neural-ui-core-listbox.d.ts +54 -0
- package/types/neural-ui-core-menu.d.ts +49 -0
- package/types/neural-ui-core-modal.d.ts +10 -2
- package/types/neural-ui-core-multiselect.d.ts +10 -1
- package/types/neural-ui-core-panel.d.ts +25 -0
- package/types/neural-ui-core-password.d.ts +29 -0
- package/types/neural-ui-core-pick-list.d.ts +40 -0
- package/types/neural-ui-core-select.d.ts +7 -1
- package/types/neural-ui-core-sidebar.d.ts +5 -1
- package/types/neural-ui-core-spinner.d.ts +4 -2
- package/types/neural-ui-core-table.d.ts +89 -5
- package/types/neural-ui-core-tabs.d.ts +2 -0
- package/types/neural-ui-core-tags.d.ts +32 -0
- package/types/neural-ui-core-toolbar.d.ts +8 -2
- package/types/neural-ui-core-tree-select.d.ts +57 -0
- package/types/neural-ui-core-tree-table.d.ts +111 -4
- package/types/neural-ui-core-tree.d.ts +1 -1
- package/types/neural-ui-core-uploader.d.ts +26 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, TemplateRef, Directive, ElementRef, viewChild, effect, untracked, contentChild, input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
2
|
+
import { inject, TemplateRef, Directive, ElementRef, PLATFORM_ID, viewChild, effect, untracked, contentChild, input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
3
3
|
import { NeuUrlStateService } from '@neural-ui/core/url-state';
|
|
4
|
-
import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/cdk/overlay';
|
|
6
6
|
import { Overlay, OverlayModule } from '@angular/cdk/overlay';
|
|
7
7
|
import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
|
|
@@ -70,6 +70,7 @@ let _neuSelectIdSeq = 0;
|
|
|
70
70
|
class NeuSelectComponent {
|
|
71
71
|
elementRef = inject(ElementRef);
|
|
72
72
|
_document = inject(DOCUMENT);
|
|
73
|
+
_platformId = inject(PLATFORM_ID);
|
|
73
74
|
_overlay = inject(Overlay);
|
|
74
75
|
_urlState = inject(NeuUrlStateService);
|
|
75
76
|
_viewportMargin = 16;
|
|
@@ -125,6 +126,10 @@ class NeuSelectComponent {
|
|
|
125
126
|
searchable = input(false, ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
|
|
126
127
|
/** Placeholder del input de búsqueda / Search input placeholder */
|
|
127
128
|
searchPlaceholder = input('Buscar...', ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
|
|
129
|
+
/** Muestra estado de carga dentro del panel / Shows a loading state inside the panel */
|
|
130
|
+
loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
131
|
+
/** Texto del estado de carga / Loading state text */
|
|
132
|
+
loadingLabel = input('Loading...', ...(ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []));
|
|
128
133
|
/** Muestra un botón para limpiar la selección / Shows a button to clear the selection */
|
|
129
134
|
clearable = input(false, ...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
|
|
130
135
|
/** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */
|
|
@@ -375,7 +380,7 @@ class NeuSelectComponent {
|
|
|
375
380
|
});
|
|
376
381
|
this.isPanelAbove.set(openAbove);
|
|
377
382
|
if (this.virtualScroll()) {
|
|
378
|
-
|
|
383
|
+
this._requestFrame(() => this._viewport()?.checkViewportSize());
|
|
379
384
|
}
|
|
380
385
|
}
|
|
381
386
|
onOverlayPositionChange(event) {
|
|
@@ -395,7 +400,7 @@ class NeuSelectComponent {
|
|
|
395
400
|
this._viewport()?.scrollToIndex(optionIndex, 'auto');
|
|
396
401
|
this._viewport()?.checkViewportSize();
|
|
397
402
|
}
|
|
398
|
-
|
|
403
|
+
this._requestFrame(() => {
|
|
399
404
|
const optionElement = this.elementRef.nativeElement.querySelector(`#neu-select-opt-${value}`) ?? this._document.getElementById(`neu-select-opt-${value}`);
|
|
400
405
|
optionElement?.focus();
|
|
401
406
|
});
|
|
@@ -416,8 +421,13 @@ class NeuSelectComponent {
|
|
|
416
421
|
});
|
|
417
422
|
this.isPanelAbove.set(false);
|
|
418
423
|
}
|
|
424
|
+
_requestFrame(callback) {
|
|
425
|
+
if (isPlatformBrowser(this._platformId)) {
|
|
426
|
+
requestAnimationFrame(callback);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
419
429
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
420
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuSelectComponent, isStandalone: true, selector: "neu-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, urlParam: { classPropertyName: "urlParam", publicName: "urlParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { listeners: { "keydown.escape": "close()", "window:resize": "onWindowResize()" } }, providers: [
|
|
430
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuSelectComponent, isStandalone: true, selector: "neu-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingLabel: { classPropertyName: "loadingLabel", publicName: "loadingLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, urlParam: { classPropertyName: "urlParam", publicName: "urlParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { listeners: { "keydown.escape": "close()", "window:resize": "onWindowResize()" } }, providers: [
|
|
421
431
|
{
|
|
422
432
|
provide: NG_VALUE_ACCESSOR,
|
|
423
433
|
useExisting: forwardRef(() => NeuSelectComponent),
|
|
@@ -548,6 +558,47 @@ class NeuSelectComponent {
|
|
|
548
558
|
[style.width]="panelPosition().width"
|
|
549
559
|
[style.max-height]="panelPosition().maxHeight"
|
|
550
560
|
>
|
|
561
|
+
<ng-template #selectOptionTpl let-option>
|
|
562
|
+
<div
|
|
563
|
+
class="neu-select__option"
|
|
564
|
+
[class.neu-select__option--selected]="option.value === _value()"
|
|
565
|
+
[class.neu-select__option--disabled]="option.disabled"
|
|
566
|
+
role="option"
|
|
567
|
+
[id]="'neu-select-opt-' + option.value"
|
|
568
|
+
[attr.aria-selected]="option.value === _value()"
|
|
569
|
+
[attr.aria-disabled]="option.disabled"
|
|
570
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
571
|
+
(click)="selectOption(option)"
|
|
572
|
+
(keydown.enter)="selectOption(option)"
|
|
573
|
+
(keydown.space)="selectOption(option)"
|
|
574
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
575
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
576
|
+
>
|
|
577
|
+
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
578
|
+
<svg
|
|
579
|
+
class="neu-select__check"
|
|
580
|
+
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
581
|
+
viewBox="0 0 24 24"
|
|
582
|
+
fill="none"
|
|
583
|
+
stroke="currentColor"
|
|
584
|
+
stroke-width="2.5"
|
|
585
|
+
stroke-linecap="round"
|
|
586
|
+
stroke-linejoin="round"
|
|
587
|
+
aria-hidden="true"
|
|
588
|
+
>
|
|
589
|
+
<polyline points="20 6 9 17 4 12" />
|
|
590
|
+
</svg>
|
|
591
|
+
@if (itemTpl()) {
|
|
592
|
+
<ng-container
|
|
593
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
594
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
595
|
+
/>
|
|
596
|
+
} @else {
|
|
597
|
+
{{ option.label }}
|
|
598
|
+
}
|
|
599
|
+
</div>
|
|
600
|
+
</ng-template>
|
|
601
|
+
|
|
551
602
|
@if (searchable()) {
|
|
552
603
|
<div class="neu-select__search">
|
|
553
604
|
<input
|
|
@@ -561,95 +612,30 @@ class NeuSelectComponent {
|
|
|
561
612
|
/>
|
|
562
613
|
</div>
|
|
563
614
|
}
|
|
564
|
-
@if (
|
|
615
|
+
@if (loading()) {
|
|
616
|
+
<div class="neu-select__empty" role="status">{{ loadingLabel() }}</div>
|
|
617
|
+
} @else if (virtualScroll()) {
|
|
565
618
|
<cdk-virtual-scroll-viewport
|
|
566
619
|
class="neu-select__viewport"
|
|
567
620
|
[itemSize]="virtualScrollItemSize()"
|
|
568
621
|
[style.height]="virtualViewportHeight()"
|
|
569
622
|
>
|
|
570
|
-
<
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
[id]="'neu-select-opt-' + option.value"
|
|
577
|
-
[attr.aria-selected]="option.value === _value()"
|
|
578
|
-
[attr.aria-disabled]="option.disabled"
|
|
579
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
580
|
-
(click)="selectOption(option)"
|
|
581
|
-
(keydown.enter)="selectOption(option)"
|
|
582
|
-
(keydown.space)="selectOption(option)"
|
|
583
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
584
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
585
|
-
>
|
|
586
|
-
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
587
|
-
<svg
|
|
588
|
-
class="neu-select__check"
|
|
589
|
-
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
590
|
-
viewBox="0 0 24 24"
|
|
591
|
-
fill="none"
|
|
592
|
-
stroke="currentColor"
|
|
593
|
-
stroke-width="2.5"
|
|
594
|
-
stroke-linecap="round"
|
|
595
|
-
stroke-linejoin="round"
|
|
596
|
-
aria-hidden="true"
|
|
597
|
-
>
|
|
598
|
-
<polyline points="20 6 9 17 4 12" />
|
|
599
|
-
</svg>
|
|
600
|
-
@if (itemTpl()) {
|
|
601
|
-
<ng-container
|
|
602
|
-
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
603
|
-
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
604
|
-
/>
|
|
605
|
-
} @else {
|
|
606
|
-
{{ option.label }}
|
|
607
|
-
}
|
|
608
|
-
</div>
|
|
623
|
+
<ng-container *cdkVirtualFor="let option of filteredOptions(); trackBy: trackByOptionValue">
|
|
624
|
+
<ng-container
|
|
625
|
+
[ngTemplateOutlet]="selectOptionTpl"
|
|
626
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
627
|
+
/>
|
|
628
|
+
</ng-container>
|
|
609
629
|
</cdk-virtual-scroll-viewport>
|
|
610
630
|
} @else {
|
|
611
631
|
@for (option of filteredOptions(); track option.value) {
|
|
612
|
-
<
|
|
613
|
-
|
|
614
|
-
[
|
|
615
|
-
|
|
616
|
-
role="option"
|
|
617
|
-
[id]="'neu-select-opt-' + option.value"
|
|
618
|
-
[attr.aria-selected]="option.value === _value()"
|
|
619
|
-
[attr.aria-disabled]="option.disabled"
|
|
620
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
621
|
-
(click)="selectOption(option)"
|
|
622
|
-
(keydown.enter)="selectOption(option)"
|
|
623
|
-
(keydown.space)="selectOption(option)"
|
|
624
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
625
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
626
|
-
>
|
|
627
|
-
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
628
|
-
<svg
|
|
629
|
-
class="neu-select__check"
|
|
630
|
-
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
631
|
-
viewBox="0 0 24 24"
|
|
632
|
-
fill="none"
|
|
633
|
-
stroke="currentColor"
|
|
634
|
-
stroke-width="2.5"
|
|
635
|
-
stroke-linecap="round"
|
|
636
|
-
stroke-linejoin="round"
|
|
637
|
-
aria-hidden="true"
|
|
638
|
-
>
|
|
639
|
-
<polyline points="20 6 9 17 4 12" />
|
|
640
|
-
</svg>
|
|
641
|
-
@if (itemTpl()) {
|
|
642
|
-
<ng-container
|
|
643
|
-
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
644
|
-
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
645
|
-
/>
|
|
646
|
-
} @else {
|
|
647
|
-
{{ option.label }}
|
|
648
|
-
}
|
|
649
|
-
</div>
|
|
632
|
+
<ng-container
|
|
633
|
+
[ngTemplateOutlet]="selectOptionTpl"
|
|
634
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
635
|
+
/>
|
|
650
636
|
}
|
|
651
637
|
}
|
|
652
|
-
@if (filteredOptions().length === 0) {
|
|
638
|
+
@if (!loading() && filteredOptions().length === 0) {
|
|
653
639
|
<div class="neu-select__empty">{{ noResultsMessage() }}</div>
|
|
654
640
|
}
|
|
655
641
|
</div>
|
|
@@ -667,7 +653,7 @@ class NeuSelectComponent {
|
|
|
667
653
|
} @else if (hint()) {
|
|
668
654
|
<p class="neu-select__hint" [id]="_triggerId + '-hint'">{{ hint() }}</p>
|
|
669
655
|
}
|
|
670
|
-
`, isInline: true, styles: [".neu-select{position:relative;display:block}.neu-select--disabled{
|
|
656
|
+
`, isInline: true, styles: [".neu-select{position:relative;display:block}.neu-select--disabled{pointer-events:none}.neu-select--sm .neu-select__trigger{height:36px;font-size:var(--neu-text-sm)}.neu-select--lg .neu-select__trigger{height:56px}.neu-select__trigger{display:flex;align-items:center;width:100%;height:48px;padding:0 var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);cursor:pointer;text-align:left;outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition);position:relative}.neu-select__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-select__trigger[aria-disabled=true]{cursor:not-allowed;background:var(--neu-surface-2)}.neu-select__trigger:focus-visible{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-select--open .neu-select__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f;border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select--open-above .neu-select__trigger{border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius)}.neu-select--error .neu-select__trigger{border-color:var(--neu-error)}.neu-select--error .neu-select__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-select__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:color-mix(in srgb,var(--neu-text) 68%,var(--neu-surface) 32%);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-select--open .neu-select__label,.neu-select--has-value .neu-select__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-select--open .neu-select__label{color:var(--neu-primary)}.neu-select--error .neu-select__label{color:var(--neu-error)}.neu-select--disabled .neu-select__label{background:var(--neu-surface-2)}.neu-select__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neu-select--no-float .neu-select__value{padding-top:0}.neu-select__placeholder{color:color-mix(in srgb,var(--neu-text) 62%,var(--neu-surface) 38%)}.neu-select:not(.neu-select--no-float):not(.neu-select--open) .neu-select__placeholder{visibility:hidden}.neu-select__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--neu-text-muted);flex-shrink:0;transition:transform var(--neu-transition)}.neu-select--open .neu-select__chevron{transform:translateY(-50%) rotate(180deg);color:var(--neu-primary)}.neu-select__clear{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:2px;padding:0;border:none;background:transparent;color:var(--neu-text-muted);cursor:pointer;border-radius:var(--neu-radius-sm);flex-shrink:0;transition:color var(--neu-transition),background var(--neu-transition)}.neu-select__clear svg{width:14px;height:14px}.neu-select__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-select__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-select__panel{position:relative;z-index:var(--neu-z-dropdown);box-sizing:border-box;width:100%;background:var(--neu-surface);border:1.5px solid var(--neu-primary);border-top:none;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);max-height:240px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--neu-surface-3) transparent;animation:neu-select-open .15s ease forwards}.neu-select__panel::-webkit-scrollbar{width:4px}.neu-select__panel::-webkit-scrollbar-thumb{background:var(--neu-surface-3);border-radius:99px}.neu-select__panel--above{border-top:1.5px solid var(--neu-primary);border-bottom:none;border-top-left-radius:var(--neu-radius);border-top-right-radius:var(--neu-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select__panel--virtual{overflow:visible}.neu-select__viewport{width:100%}@media(max-width:600px){.neu-select__panel{left:auto;right:0;width:min(max(100%,220px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-select-open{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-select__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:var(--neu-space-3) var(--neu-space-4);min-height:var(--neu-select-option-height, 44px);box-sizing:border-box;font-size:var(--neu-text-sm);color:var(--neu-text);cursor:pointer;transition:background-color var(--neu-transition)}.neu-select__option:hover:not(.neu-select__option--disabled){background:var(--neu-primary-50);color:var(--neu-primary)}.neu-select__option--selected{color:var(--neu-primary);font-weight:600;background:var(--neu-primary-50)}.neu-select__option--disabled{opacity:.4;cursor:not-allowed}.neu-select__check{width:14px;height:14px;flex-shrink:0}.neu-select__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans)}.neu-select__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-select__sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-select__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-select__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);position:sticky;top:0;background:var(--neu-surface);z-index:1}.neu-select__search-input{width:100%;height:34px;padding:0 var(--neu-space-3);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-sm);background:var(--neu-bg);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-select__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-select__search-input::placeholder{color:var(--neu-text-disabled)}.neu-select__empty{padding:var(--neu-space-4);text-align:center;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);font-family:var(--neu-font-sans)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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: "directive", type: i1.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
671
657
|
}
|
|
672
658
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuSelectComponent, decorators: [{
|
|
673
659
|
type: Component,
|
|
@@ -805,6 +791,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
805
791
|
[style.width]="panelPosition().width"
|
|
806
792
|
[style.max-height]="panelPosition().maxHeight"
|
|
807
793
|
>
|
|
794
|
+
<ng-template #selectOptionTpl let-option>
|
|
795
|
+
<div
|
|
796
|
+
class="neu-select__option"
|
|
797
|
+
[class.neu-select__option--selected]="option.value === _value()"
|
|
798
|
+
[class.neu-select__option--disabled]="option.disabled"
|
|
799
|
+
role="option"
|
|
800
|
+
[id]="'neu-select-opt-' + option.value"
|
|
801
|
+
[attr.aria-selected]="option.value === _value()"
|
|
802
|
+
[attr.aria-disabled]="option.disabled"
|
|
803
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
804
|
+
(click)="selectOption(option)"
|
|
805
|
+
(keydown.enter)="selectOption(option)"
|
|
806
|
+
(keydown.space)="selectOption(option)"
|
|
807
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
808
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
809
|
+
>
|
|
810
|
+
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
811
|
+
<svg
|
|
812
|
+
class="neu-select__check"
|
|
813
|
+
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
814
|
+
viewBox="0 0 24 24"
|
|
815
|
+
fill="none"
|
|
816
|
+
stroke="currentColor"
|
|
817
|
+
stroke-width="2.5"
|
|
818
|
+
stroke-linecap="round"
|
|
819
|
+
stroke-linejoin="round"
|
|
820
|
+
aria-hidden="true"
|
|
821
|
+
>
|
|
822
|
+
<polyline points="20 6 9 17 4 12" />
|
|
823
|
+
</svg>
|
|
824
|
+
@if (itemTpl()) {
|
|
825
|
+
<ng-container
|
|
826
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
827
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
828
|
+
/>
|
|
829
|
+
} @else {
|
|
830
|
+
{{ option.label }}
|
|
831
|
+
}
|
|
832
|
+
</div>
|
|
833
|
+
</ng-template>
|
|
834
|
+
|
|
808
835
|
@if (searchable()) {
|
|
809
836
|
<div class="neu-select__search">
|
|
810
837
|
<input
|
|
@@ -818,95 +845,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
818
845
|
/>
|
|
819
846
|
</div>
|
|
820
847
|
}
|
|
821
|
-
@if (
|
|
848
|
+
@if (loading()) {
|
|
849
|
+
<div class="neu-select__empty" role="status">{{ loadingLabel() }}</div>
|
|
850
|
+
} @else if (virtualScroll()) {
|
|
822
851
|
<cdk-virtual-scroll-viewport
|
|
823
852
|
class="neu-select__viewport"
|
|
824
853
|
[itemSize]="virtualScrollItemSize()"
|
|
825
854
|
[style.height]="virtualViewportHeight()"
|
|
826
855
|
>
|
|
827
|
-
<
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
[id]="'neu-select-opt-' + option.value"
|
|
834
|
-
[attr.aria-selected]="option.value === _value()"
|
|
835
|
-
[attr.aria-disabled]="option.disabled"
|
|
836
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
837
|
-
(click)="selectOption(option)"
|
|
838
|
-
(keydown.enter)="selectOption(option)"
|
|
839
|
-
(keydown.space)="selectOption(option)"
|
|
840
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
841
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
842
|
-
>
|
|
843
|
-
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
844
|
-
<svg
|
|
845
|
-
class="neu-select__check"
|
|
846
|
-
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
847
|
-
viewBox="0 0 24 24"
|
|
848
|
-
fill="none"
|
|
849
|
-
stroke="currentColor"
|
|
850
|
-
stroke-width="2.5"
|
|
851
|
-
stroke-linecap="round"
|
|
852
|
-
stroke-linejoin="round"
|
|
853
|
-
aria-hidden="true"
|
|
854
|
-
>
|
|
855
|
-
<polyline points="20 6 9 17 4 12" />
|
|
856
|
-
</svg>
|
|
857
|
-
@if (itemTpl()) {
|
|
858
|
-
<ng-container
|
|
859
|
-
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
860
|
-
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
861
|
-
/>
|
|
862
|
-
} @else {
|
|
863
|
-
{{ option.label }}
|
|
864
|
-
}
|
|
865
|
-
</div>
|
|
856
|
+
<ng-container *cdkVirtualFor="let option of filteredOptions(); trackBy: trackByOptionValue">
|
|
857
|
+
<ng-container
|
|
858
|
+
[ngTemplateOutlet]="selectOptionTpl"
|
|
859
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
860
|
+
/>
|
|
861
|
+
</ng-container>
|
|
866
862
|
</cdk-virtual-scroll-viewport>
|
|
867
863
|
} @else {
|
|
868
864
|
@for (option of filteredOptions(); track option.value) {
|
|
869
|
-
<
|
|
870
|
-
|
|
871
|
-
[
|
|
872
|
-
|
|
873
|
-
role="option"
|
|
874
|
-
[id]="'neu-select-opt-' + option.value"
|
|
875
|
-
[attr.aria-selected]="option.value === _value()"
|
|
876
|
-
[attr.aria-disabled]="option.disabled"
|
|
877
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
878
|
-
(click)="selectOption(option)"
|
|
879
|
-
(keydown.enter)="selectOption(option)"
|
|
880
|
-
(keydown.space)="selectOption(option)"
|
|
881
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
882
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
883
|
-
>
|
|
884
|
-
<!-- Checkmark en la seleccionada (siempre reserva el espacio) -->
|
|
885
|
-
<svg
|
|
886
|
-
class="neu-select__check"
|
|
887
|
-
[style.visibility]="option.value === _value() ? 'visible' : 'hidden'"
|
|
888
|
-
viewBox="0 0 24 24"
|
|
889
|
-
fill="none"
|
|
890
|
-
stroke="currentColor"
|
|
891
|
-
stroke-width="2.5"
|
|
892
|
-
stroke-linecap="round"
|
|
893
|
-
stroke-linejoin="round"
|
|
894
|
-
aria-hidden="true"
|
|
895
|
-
>
|
|
896
|
-
<polyline points="20 6 9 17 4 12" />
|
|
897
|
-
</svg>
|
|
898
|
-
@if (itemTpl()) {
|
|
899
|
-
<ng-container
|
|
900
|
-
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
901
|
-
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
902
|
-
/>
|
|
903
|
-
} @else {
|
|
904
|
-
{{ option.label }}
|
|
905
|
-
}
|
|
906
|
-
</div>
|
|
865
|
+
<ng-container
|
|
866
|
+
[ngTemplateOutlet]="selectOptionTpl"
|
|
867
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
868
|
+
/>
|
|
907
869
|
}
|
|
908
870
|
}
|
|
909
|
-
@if (filteredOptions().length === 0) {
|
|
871
|
+
@if (!loading() && filteredOptions().length === 0) {
|
|
910
872
|
<div class="neu-select__empty">{{ noResultsMessage() }}</div>
|
|
911
873
|
}
|
|
912
874
|
</div>
|
|
@@ -924,8 +886,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
924
886
|
} @else if (hint()) {
|
|
925
887
|
<p class="neu-select__hint" [id]="_triggerId + '-hint'">{{ hint() }}</p>
|
|
926
888
|
}
|
|
927
|
-
`, styles: [".neu-select{position:relative;display:block}.neu-select--disabled{
|
|
928
|
-
}], ctorParameters: () => [], propDecorators: { _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectItemDirective), { isSignal: true }] }], selectedItemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectSelectedDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], urlParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlParam", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
|
|
889
|
+
`, styles: [".neu-select{position:relative;display:block}.neu-select--disabled{pointer-events:none}.neu-select--sm .neu-select__trigger{height:36px;font-size:var(--neu-text-sm)}.neu-select--lg .neu-select__trigger{height:56px}.neu-select__trigger{display:flex;align-items:center;width:100%;height:48px;padding:0 var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);font-family:var(--neu-font-sans);font-size:var(--neu-text-base);color:var(--neu-text);cursor:pointer;text-align:left;outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition);position:relative}.neu-select__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-select__trigger[aria-disabled=true]{cursor:not-allowed;background:var(--neu-surface-2)}.neu-select__trigger:focus-visible{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-select--open .neu-select__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f;border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select--open-above .neu-select__trigger{border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius)}.neu-select--error .neu-select__trigger{border-color:var(--neu-error)}.neu-select--error .neu-select__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-select__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:color-mix(in srgb,var(--neu-text) 68%,var(--neu-surface) 32%);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-select--open .neu-select__label,.neu-select--has-value .neu-select__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-select--open .neu-select__label{color:var(--neu-primary)}.neu-select--error .neu-select__label{color:var(--neu-error)}.neu-select--disabled .neu-select__label{background:var(--neu-surface-2)}.neu-select__value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.neu-select--no-float .neu-select__value{padding-top:0}.neu-select__placeholder{color:color-mix(in srgb,var(--neu-text) 62%,var(--neu-surface) 38%)}.neu-select:not(.neu-select--no-float):not(.neu-select--open) .neu-select__placeholder{visibility:hidden}.neu-select__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--neu-text-muted);flex-shrink:0;transition:transform var(--neu-transition)}.neu-select--open .neu-select__chevron{transform:translateY(-50%) rotate(180deg);color:var(--neu-primary)}.neu-select__clear{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:2px;padding:0;border:none;background:transparent;color:var(--neu-text-muted);cursor:pointer;border-radius:var(--neu-radius-sm);flex-shrink:0;transition:color var(--neu-transition),background var(--neu-transition)}.neu-select__clear svg{width:14px;height:14px}.neu-select__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-select__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-select__panel{position:relative;z-index:var(--neu-z-dropdown);box-sizing:border-box;width:100%;background:var(--neu-surface);border:1.5px solid var(--neu-primary);border-top:none;border-bottom-left-radius:var(--neu-radius);border-bottom-right-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);max-height:240px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--neu-surface-3) transparent;animation:neu-select-open .15s ease forwards}.neu-select__panel::-webkit-scrollbar{width:4px}.neu-select__panel::-webkit-scrollbar-thumb{background:var(--neu-surface-3);border-radius:99px}.neu-select__panel--above{border-top:1.5px solid var(--neu-primary);border-bottom:none;border-top-left-radius:var(--neu-radius);border-top-right-radius:var(--neu-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.neu-select__panel--virtual{overflow:visible}.neu-select__viewport{width:100%}@media(max-width:600px){.neu-select__panel{left:auto;right:0;width:min(max(100%,220px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-select-open{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-select__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:var(--neu-space-3) var(--neu-space-4);min-height:var(--neu-select-option-height, 44px);box-sizing:border-box;font-size:var(--neu-text-sm);color:var(--neu-text);cursor:pointer;transition:background-color var(--neu-transition)}.neu-select__option:hover:not(.neu-select__option--disabled){background:var(--neu-primary-50);color:var(--neu-primary)}.neu-select__option--selected{color:var(--neu-primary);font-weight:600;background:var(--neu-primary-50)}.neu-select__option--disabled{opacity:.4;cursor:not-allowed}.neu-select__check{width:14px;height:14px;flex-shrink:0}.neu-select__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text);font-family:var(--neu-font-sans)}.neu-select__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-select__sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.neu-select__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-select__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);position:sticky;top:0;background:var(--neu-surface);z-index:1}.neu-select__search-input{width:100%;height:34px;padding:0 var(--neu-space-3);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-sm);background:var(--neu-bg);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-select__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-select__search-input::placeholder{color:var(--neu-text-disabled)}.neu-select__empty{padding:var(--neu-space-4);text-align:center;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);font-family:var(--neu-font-sans)}\n"] }]
|
|
890
|
+
}], ctorParameters: () => [], propDecorators: { _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectItemDirective), { isSignal: true }] }], selectedItemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuSelectSelectedDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], urlParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "urlParam", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
|
|
929
891
|
|
|
930
892
|
/**
|
|
931
893
|
* Generated bundle index. Do not edit.
|