@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,11 +1,23 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, output, signal, viewChild, inject, computed, ElementRef, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
3
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Directive, input, output, contentChild, signal, viewChild, inject, PLATFORM_ID, computed, ElementRef, forwardRef, HostListener, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
3
|
+
import { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';
|
|
4
4
|
import * as i1 from '@angular/cdk/overlay';
|
|
5
5
|
import { Overlay, OverlayModule } from '@angular/cdk/overlay';
|
|
6
6
|
import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
|
|
7
7
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
8
8
|
|
|
9
|
+
class NeuAutocompleteItemDirective {
|
|
10
|
+
templateRef;
|
|
11
|
+
constructor(templateRef) {
|
|
12
|
+
this.templateRef = templateRef;
|
|
13
|
+
}
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuAutocompleteItemDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
15
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuAutocompleteItemDirective, isStandalone: true, selector: "ng-template[neuAutocompleteItem]", ngImport: i0 });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuAutocompleteItemDirective, decorators: [{
|
|
18
|
+
type: Directive,
|
|
19
|
+
args: [{ selector: 'ng-template[neuAutocompleteItem]' }]
|
|
20
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
9
21
|
let _seq = 0;
|
|
10
22
|
/**
|
|
11
23
|
* NeuralUI Autocomplete
|
|
@@ -30,6 +42,11 @@ class NeuAutocompleteComponent {
|
|
|
30
42
|
errorMessage = input('', ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
|
|
31
43
|
emptyLabel = input('Sin resultados', ...(ngDevMode ? [{ debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
|
|
32
44
|
minLength = input(0, ...(ngDevMode ? [{ debugName: "minLength" }] : /* istanbul ignore next */ []));
|
|
45
|
+
loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
46
|
+
loadingLabel = input('Loading...', ...(ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []));
|
|
47
|
+
dropdown = input(false, ...(ngDevMode ? [{ debugName: "dropdown" }] : /* istanbul ignore next */ []));
|
|
48
|
+
dropdownAriaLabel = input('Show suggestions', ...(ngDevMode ? [{ debugName: "dropdownAriaLabel" }] : /* istanbul ignore next */ []));
|
|
49
|
+
forceSelection = input(false, ...(ngDevMode ? [{ debugName: "forceSelection" }] : /* istanbul ignore next */ []));
|
|
33
50
|
/** Muestra el label como flotante (true) o estático encima del campo (false) / Shows the label as floating (true) or static above the field (false) */
|
|
34
51
|
floatingLabel = input(false, ...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
|
|
35
52
|
/** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */
|
|
@@ -42,6 +59,7 @@ class NeuAutocompleteComponent {
|
|
|
42
59
|
optionSelected = output();
|
|
43
60
|
/** Emitido al cambiar el texto del input / Emitted on query change */
|
|
44
61
|
queryChange = output();
|
|
62
|
+
itemTpl = contentChild(NeuAutocompleteItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
|
|
45
63
|
// ── Internal state ───────────────────────────────────────────────
|
|
46
64
|
_id = `neu-autocomplete-${++_seq}`;
|
|
47
65
|
_listId = `${this._id}-list`;
|
|
@@ -84,6 +102,7 @@ class NeuAutocompleteComponent {
|
|
|
84
102
|
},
|
|
85
103
|
];
|
|
86
104
|
_document = inject(DOCUMENT);
|
|
105
|
+
_platformId = inject(PLATFORM_ID);
|
|
87
106
|
_overlay = inject(Overlay);
|
|
88
107
|
overlayScrollStrategy = this._overlay.scrollStrategies.reposition();
|
|
89
108
|
_onChange = () => { };
|
|
@@ -91,9 +110,7 @@ class NeuAutocompleteComponent {
|
|
|
91
110
|
// ── Computed ─────────────────────────────────────────────────────
|
|
92
111
|
_filtered = computed(() => {
|
|
93
112
|
const q = this._query().toLowerCase().trim();
|
|
94
|
-
|
|
95
|
-
// Empty query → never show options (autocomplete ≠ select).
|
|
96
|
-
if (!q)
|
|
113
|
+
if (!q && !this.dropdown())
|
|
97
114
|
return [];
|
|
98
115
|
if (q.length < this.minLength())
|
|
99
116
|
return [];
|
|
@@ -182,9 +199,20 @@ class NeuAutocompleteComponent {
|
|
|
182
199
|
_onBlur() {
|
|
183
200
|
this._focused.set(false);
|
|
184
201
|
this._onTouched();
|
|
202
|
+
if (this.forceSelection() && this._query()) {
|
|
203
|
+
const match = this.options().find((option) => option.label === this._query());
|
|
204
|
+
if (!match) {
|
|
205
|
+
this.clear();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
185
208
|
// Small delay to allow mousedown on option to fire first
|
|
186
209
|
setTimeout(() => this._closePanel(), 150);
|
|
187
210
|
}
|
|
211
|
+
openAll() {
|
|
212
|
+
this._syncOverlayWidth();
|
|
213
|
+
this._isOpen.set(true);
|
|
214
|
+
this._activeIndex.set(this._filtered().findIndex((option) => !option.disabled));
|
|
215
|
+
}
|
|
188
216
|
onKeyDown(e) {
|
|
189
217
|
const total = this._filtered().length;
|
|
190
218
|
if (!total && e.key !== 'Escape')
|
|
@@ -264,13 +292,13 @@ class NeuAutocompleteComponent {
|
|
|
264
292
|
return;
|
|
265
293
|
}
|
|
266
294
|
if (this.virtualScroll()) {
|
|
267
|
-
|
|
295
|
+
this._requestFrame(() => {
|
|
268
296
|
this._viewport()?.scrollToIndex(activeIndex, 'auto');
|
|
269
297
|
this._viewport()?.checkViewportSize();
|
|
270
298
|
});
|
|
271
299
|
return;
|
|
272
300
|
}
|
|
273
|
-
|
|
301
|
+
this._requestFrame(() => {
|
|
274
302
|
const activeOption = this._el.nativeElement.querySelector(`#${this._optionId(activeIndex)}`);
|
|
275
303
|
const overlayOption = activeOption ?? this._document.getElementById(this._optionId(activeIndex));
|
|
276
304
|
if (typeof overlayOption?.scrollIntoView === 'function') {
|
|
@@ -279,6 +307,9 @@ class NeuAutocompleteComponent {
|
|
|
279
307
|
});
|
|
280
308
|
}
|
|
281
309
|
_syncOverlayWidth() {
|
|
310
|
+
if (!isPlatformBrowser(this._platformId)) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
282
313
|
const trigger = this._el.nativeElement.querySelector('.neu-autocomplete__input-wrap');
|
|
283
314
|
if (!trigger) {
|
|
284
315
|
return;
|
|
@@ -288,7 +319,12 @@ class NeuAutocompleteComponent {
|
|
|
288
319
|
: 0;
|
|
289
320
|
this.overlayWidth.set(Math.min(width, window.innerWidth - 32));
|
|
290
321
|
if (this.virtualScroll()) {
|
|
291
|
-
|
|
322
|
+
this._requestFrame(() => this._viewport()?.checkViewportSize());
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
_requestFrame(callback) {
|
|
326
|
+
if (isPlatformBrowser(this._platformId)) {
|
|
327
|
+
requestAnimationFrame(callback);
|
|
292
328
|
}
|
|
293
329
|
}
|
|
294
330
|
// ── CVA ──────────────────────────────────────────────────────────
|
|
@@ -310,13 +346,13 @@ class NeuAutocompleteComponent {
|
|
|
310
346
|
this._cvaDisabled.set(d);
|
|
311
347
|
}
|
|
312
348
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
313
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuAutocompleteComponent, isStandalone: true, selector: "neu-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", 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 }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { optionSelected: "optionSelected", queryChange: "queryChange" }, host: { listeners: { "document:mousedown": "onDocClick($event)", "window:resize": "onWindowResize()" }, properties: { "class.neu-autocomplete--open": "_isOpen()", "class.neu-autocomplete--disabled": "_cvaDisabled()", "class.neu-autocomplete--floating": "floatingLabel()", "class.neu-autocomplete--focused": "_focused()", "class.neu-autocomplete--has-value": "!!_query()", "class.neu-autocomplete--sm": "size() === \"sm\"", "class.neu-autocomplete--lg": "size() === \"lg\"", "style.--neu-autocomplete-option-height": "virtualScrollItemSize() + \"px\"" }, classAttribute: "neu-autocomplete" }, providers: [
|
|
349
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuAutocompleteComponent, isStandalone: true, selector: "neu-autocomplete", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", 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 }, dropdown: { classPropertyName: "dropdown", publicName: "dropdown", isSignal: true, isRequired: false, transformFunction: null }, dropdownAriaLabel: { classPropertyName: "dropdownAriaLabel", publicName: "dropdownAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, forceSelection: { classPropertyName: "forceSelection", publicName: "forceSelection", 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 }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { optionSelected: "optionSelected", queryChange: "queryChange" }, host: { listeners: { "document:mousedown": "onDocClick($event)", "window:resize": "onWindowResize()" }, properties: { "class.neu-autocomplete--open": "_isOpen()", "class.neu-autocomplete--disabled": "_cvaDisabled()", "class.neu-autocomplete--floating": "floatingLabel()", "class.neu-autocomplete--focused": "_focused()", "class.neu-autocomplete--has-value": "!!_query()", "class.neu-autocomplete--sm": "size() === \"sm\"", "class.neu-autocomplete--lg": "size() === \"lg\"", "style.--neu-autocomplete-option-height": "virtualScrollItemSize() + \"px\"" }, classAttribute: "neu-autocomplete" }, providers: [
|
|
314
350
|
{
|
|
315
351
|
provide: NG_VALUE_ACCESSOR,
|
|
316
352
|
useExisting: forwardRef(() => NeuAutocompleteComponent),
|
|
317
353
|
multi: true,
|
|
318
354
|
},
|
|
319
|
-
], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
355
|
+
], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuAutocompleteItemDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
320
356
|
@if (!floatingLabel() && label()) {
|
|
321
357
|
<label class="neu-autocomplete__label" [for]="_id">{{ label() }}</label>
|
|
322
358
|
}
|
|
@@ -364,6 +400,18 @@ class NeuAutocompleteComponent {
|
|
|
364
400
|
×
|
|
365
401
|
</button>
|
|
366
402
|
}
|
|
403
|
+
@if (dropdown()) {
|
|
404
|
+
<button
|
|
405
|
+
type="button"
|
|
406
|
+
class="neu-autocomplete__dropdown"
|
|
407
|
+
[attr.aria-label]="dropdownAriaLabel()"
|
|
408
|
+
tabindex="-1"
|
|
409
|
+
[disabled]="_cvaDisabled()"
|
|
410
|
+
(click)="openAll()"
|
|
411
|
+
>
|
|
412
|
+
▾
|
|
413
|
+
</button>
|
|
414
|
+
}
|
|
367
415
|
</div>
|
|
368
416
|
<div class="neu-autocomplete__sr-status" aria-live="polite" aria-atomic="true">
|
|
369
417
|
{{ resultsAnnouncement() }}
|
|
@@ -378,7 +426,33 @@ class NeuAutocompleteComponent {
|
|
|
378
426
|
[cdkConnectedOverlayViewportMargin]="_viewportMargin"
|
|
379
427
|
(detach)="_closePanel()"
|
|
380
428
|
>
|
|
381
|
-
@if (
|
|
429
|
+
@if (loading()) {
|
|
430
|
+
<div class="neu-autocomplete__empty" role="status" [style.width.px]="overlayWidth()">
|
|
431
|
+
{{ loadingLabel() }}
|
|
432
|
+
</div>
|
|
433
|
+
} @else if (_filtered().length) {
|
|
434
|
+
<ng-template #autocompleteOptionTpl let-opt let-i="index">
|
|
435
|
+
<div
|
|
436
|
+
class="neu-autocomplete__option"
|
|
437
|
+
role="option"
|
|
438
|
+
[id]="_optionId(i)"
|
|
439
|
+
[class.neu-autocomplete__option--active]="_activeIndex() === i"
|
|
440
|
+
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
441
|
+
[attr.aria-selected]="_activeIndex() === i"
|
|
442
|
+
[attr.aria-disabled]="opt.disabled ?? false"
|
|
443
|
+
(mousedown)="selectOption(opt)"
|
|
444
|
+
>
|
|
445
|
+
@if (itemTpl()) {
|
|
446
|
+
<ng-container
|
|
447
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
448
|
+
[ngTemplateOutletContext]="{ $implicit: opt }"
|
|
449
|
+
/>
|
|
450
|
+
} @else {
|
|
451
|
+
{{ opt.label }}
|
|
452
|
+
}
|
|
453
|
+
</div>
|
|
454
|
+
</ng-template>
|
|
455
|
+
|
|
382
456
|
@if (virtualScroll()) {
|
|
383
457
|
<cdk-virtual-scroll-viewport
|
|
384
458
|
class="neu-autocomplete__list neu-autocomplete__list--virtual"
|
|
@@ -389,22 +463,15 @@ class NeuAutocompleteComponent {
|
|
|
389
463
|
[style.height]="virtualViewportHeight()"
|
|
390
464
|
[style.width.px]="overlayWidth()"
|
|
391
465
|
>
|
|
392
|
-
<
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
399
|
-
[attr.aria-selected]="_activeIndex() === i"
|
|
400
|
-
[attr.aria-disabled]="opt.disabled ?? false"
|
|
401
|
-
(mousedown)="selectOption(opt)"
|
|
402
|
-
>
|
|
403
|
-
{{ opt.label }}
|
|
404
|
-
</div>
|
|
466
|
+
<ng-container *cdkVirtualFor="let opt of _filtered(); trackBy: trackByOption; let i = index">
|
|
467
|
+
<ng-container
|
|
468
|
+
[ngTemplateOutlet]="autocompleteOptionTpl"
|
|
469
|
+
[ngTemplateOutletContext]="{ $implicit: opt, index: i }"
|
|
470
|
+
/>
|
|
471
|
+
</ng-container>
|
|
405
472
|
</cdk-virtual-scroll-viewport>
|
|
406
473
|
} @else {
|
|
407
|
-
<
|
|
474
|
+
<div
|
|
408
475
|
class="neu-autocomplete__list"
|
|
409
476
|
role="listbox"
|
|
410
477
|
[id]="_listId"
|
|
@@ -412,20 +479,12 @@ class NeuAutocompleteComponent {
|
|
|
412
479
|
[style.width.px]="overlayWidth()"
|
|
413
480
|
>
|
|
414
481
|
@for (opt of _filtered(); track opt.label; let i = $index) {
|
|
415
|
-
<
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
[class.neu-autocomplete__option--active]="_activeIndex() === i"
|
|
420
|
-
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
421
|
-
[attr.aria-selected]="_activeIndex() === i"
|
|
422
|
-
[attr.aria-disabled]="opt.disabled ?? false"
|
|
423
|
-
(mousedown)="selectOption(opt)"
|
|
424
|
-
>
|
|
425
|
-
{{ opt.label }}
|
|
426
|
-
</li>
|
|
482
|
+
<ng-container
|
|
483
|
+
[ngTemplateOutlet]="autocompleteOptionTpl"
|
|
484
|
+
[ngTemplateOutletContext]="{ $implicit: opt, index: i }"
|
|
485
|
+
/>
|
|
427
486
|
}
|
|
428
|
-
</
|
|
487
|
+
</div>
|
|
429
488
|
}
|
|
430
489
|
} @else {
|
|
431
490
|
<div class="neu-autocomplete__empty" role="status" [style.width.px]="overlayWidth()">
|
|
@@ -440,11 +499,11 @@ class NeuAutocompleteComponent {
|
|
|
440
499
|
} @else if (hint()) {
|
|
441
500
|
<p class="neu-autocomplete__hint" [id]="_id + '-hint'">{{ hint() }}</p>
|
|
442
501
|
}
|
|
443
|
-
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-autocomplete{position:relative;display:block}.neu-autocomplete--disabled{opacity:.55;pointer-events:none}.neu-autocomplete--sm .neu-autocomplete__input{height:36px;font-size:var(--neu-text-sm, .875rem)}.neu-autocomplete--lg .neu-autocomplete__input{height:56px}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input::placeholder{color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__label{display:block;margin-bottom:6px;font-size:var(--neu-text-sm, .875rem);font-weight:500;color:var(--neu-text, #0f172a);line-height:1.4}.neu-autocomplete__input-wrap{position:relative;display:flex;align-items:center}.neu-autocomplete__input{width:100%;height:48px;padding:0 36px 0 12px;border:1.5px solid var(--neu-border, #d1d5db);border-radius:var(--neu-radius, 8px);background:var(--neu-surface, #ffffff);color:var(--neu-text, #111);font-size:.875rem;line-height:1.4;outline:none;transition:border-color var(--neu-transition, .12s),box-shadow var(--neu-transition, .12s),background-color var(--neu-transition, .12s)}.neu-autocomplete__input:hover{border-color:var(--neu-border-hover, var(--neu-border, #d1d5db))}.neu-autocomplete__input:focus,.neu-autocomplete__input:focus-visible{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__input[disabled]{background:var(--neu-surface-2, #f3f4f6);color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating .neu-autocomplete__input::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-autocomplete__floating-label{position:absolute;left:var(--neu-space-3, 12px);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base, .875rem);color:var(--neu-text-muted, #6b7280);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6, 24px));transition:top var(--neu-transition, .12s),font-size var(--neu-transition, .12s),color var(--neu-transition, .12s),transform var(--neu-transition, .12s),padding var(--neu-transition, .12s),background var(--neu-transition, .12s)}.neu-autocomplete--focused .neu-autocomplete__floating-label,.neu-autocomplete--has-value .neu-autocomplete__floating-label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface, #fff);padding:0 4px;left:calc(var(--neu-space-3, 12px) - 4px)}.neu-autocomplete--focused .neu-autocomplete__floating-label{color:var(--neu-primary, #0ea5e9)}.neu-autocomplete__clear{all:unset;position:absolute;right:10px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.875rem;color:var(--neu-text-muted, #6b7280);cursor:pointer}.neu-autocomplete__clear:hover{color:var(--neu-text, #111);background:var(--neu-surface-3, #e5e7eb)}.neu-autocomplete__clear:focus-visible{outline:2px solid var(--neu-primary, #0ea5e9);outline-offset:2px}.neu-autocomplete__list{all:unset;display:block;position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);box-shadow:var(--neu-shadow-lg, 0 8px 20px -4px rgba(0, 0, 0, .1));max-height:240px;overflow-y:auto;padding:6px;z-index:1000;animation:neu-ac-in 80ms ease}.neu-autocomplete__list--virtual{padding:0;overflow:hidden}@keyframes neu-ac-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-autocomplete__option{display:flex;align-items:center;padding:7px 10px;min-height:var(--neu-autocomplete-option-height, 40px);box-sizing:border-box;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-text, #111);cursor:pointer}.neu-autocomplete__option:hover:not(.neu-autocomplete__option--disabled){background:var(--neu-surface-2, #f3f4f6)}.neu-autocomplete__option--active{background:var(--neu-primary-50, rgba(14, 165, 233, .12));color:var(--neu-primary, #0ea5e9);font-weight:500}.neu-autocomplete__option--disabled{opacity:.4;cursor:not-allowed}.neu-autocomplete__empty{position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);padding:12px 16px;font-size:.875rem;color:var(--neu-text-muted, #6b7280);text-align:center}.neu-autocomplete__hint,.neu-autocomplete__error{margin:6px 0 0;font-size:var(--neu-text-sm, .875rem);line-height:1.4}.neu-autocomplete__hint{color:var(--neu-text-muted, #6b7280)}.neu-autocomplete__error{color:var(--neu-danger, #dc2626)}.neu-autocomplete__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}\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: "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 });
|
|
502
|
+
`, isInline: true, styles: ["@charset \"UTF-8\";.neu-autocomplete{position:relative;display:block}.neu-autocomplete--disabled{opacity:.55;pointer-events:none}.neu-autocomplete--sm .neu-autocomplete__input{height:36px;font-size:var(--neu-text-sm, .875rem)}.neu-autocomplete--lg .neu-autocomplete__input{height:56px}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input::placeholder{color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__label{display:block;margin-bottom:6px;font-size:var(--neu-text-sm, .875rem);font-weight:500;color:var(--neu-text, #0f172a);line-height:1.4}.neu-autocomplete__input-wrap{position:relative;display:flex;align-items:center}.neu-autocomplete__input{width:100%;height:48px;padding:0 36px 0 12px;border:1.5px solid var(--neu-border, #d1d5db);border-radius:var(--neu-radius, 8px);background:var(--neu-surface, #ffffff);color:var(--neu-text, #111);font-size:.875rem;line-height:1.4;outline:none;transition:border-color var(--neu-transition, .12s),box-shadow var(--neu-transition, .12s),background-color var(--neu-transition, .12s)}.neu-autocomplete__input:hover{border-color:var(--neu-border-hover, var(--neu-border, #d1d5db))}.neu-autocomplete__input:focus,.neu-autocomplete__input:focus-visible{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__input[disabled]{background:var(--neu-surface-2, #f3f4f6);color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating .neu-autocomplete__input::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-autocomplete__floating-label{position:absolute;left:var(--neu-space-3, 12px);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base, .875rem);color:var(--neu-text-muted, #6b7280);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6, 24px));transition:top var(--neu-transition, .12s),font-size var(--neu-transition, .12s),color var(--neu-transition, .12s),transform var(--neu-transition, .12s),padding var(--neu-transition, .12s),background var(--neu-transition, .12s)}.neu-autocomplete--focused .neu-autocomplete__floating-label,.neu-autocomplete--has-value .neu-autocomplete__floating-label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface, #fff);padding:0 4px;left:calc(var(--neu-space-3, 12px) - 4px)}.neu-autocomplete--focused .neu-autocomplete__floating-label{color:var(--neu-primary, #0ea5e9)}.neu-autocomplete__clear{all:unset;position:absolute;right:10px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.875rem;color:var(--neu-text-muted, #6b7280);cursor:pointer}.neu-autocomplete__clear:hover{color:var(--neu-text, #111);background:var(--neu-surface-3, #e5e7eb)}.neu-autocomplete__clear:focus-visible{outline:2px solid var(--neu-primary, #0ea5e9);outline-offset:2px}.neu-autocomplete__list{all:unset;display:block;position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);box-shadow:var(--neu-shadow-lg, 0 8px 20px -4px rgba(0, 0, 0, .1));max-height:240px;overflow-y:auto;padding:6px;z-index:1000;animation:neu-ac-in 80ms ease}.neu-autocomplete__list--virtual{padding:0;overflow:hidden}@keyframes neu-ac-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-autocomplete__option{display:flex;align-items:center;padding:7px 10px;min-height:var(--neu-autocomplete-option-height, 40px);box-sizing:border-box;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-text, #111);cursor:pointer}.neu-autocomplete__option:hover:not(.neu-autocomplete__option--disabled){background:var(--neu-surface-2, #f3f4f6)}.neu-autocomplete__option--active{background:var(--neu-primary-50, rgba(14, 165, 233, .12));color:var(--neu-primary, #0ea5e9);font-weight:500}.neu-autocomplete__option--disabled{opacity:.4;cursor:not-allowed}.neu-autocomplete__empty{position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);padding:12px 16px;font-size:.875rem;color:var(--neu-text-muted, #6b7280);text-align:center}.neu-autocomplete__hint,.neu-autocomplete__error{margin:6px 0 0;font-size:var(--neu-text-sm, .875rem);line-height:1.4}.neu-autocomplete__hint{color:var(--neu-text-muted, #6b7280)}.neu-autocomplete__error{color:var(--neu-danger, #dc2626)}.neu-autocomplete__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-autocomplete__dropdown{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;border-radius:var(--neu-radius-md, 8px);background:transparent;color:var(--neu-text-muted, #6b7280);cursor:pointer;padding:4px 6px}\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 });
|
|
444
503
|
}
|
|
445
504
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuAutocompleteComponent, decorators: [{
|
|
446
505
|
type: Component,
|
|
447
|
-
args: [{ selector: 'neu-autocomplete', imports: [OverlayModule, ScrollingModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
506
|
+
args: [{ selector: 'neu-autocomplete', imports: [NgTemplateOutlet, OverlayModule, ScrollingModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
448
507
|
{
|
|
449
508
|
provide: NG_VALUE_ACCESSOR,
|
|
450
509
|
useExisting: forwardRef(() => NeuAutocompleteComponent),
|
|
@@ -508,6 +567,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
508
567
|
×
|
|
509
568
|
</button>
|
|
510
569
|
}
|
|
570
|
+
@if (dropdown()) {
|
|
571
|
+
<button
|
|
572
|
+
type="button"
|
|
573
|
+
class="neu-autocomplete__dropdown"
|
|
574
|
+
[attr.aria-label]="dropdownAriaLabel()"
|
|
575
|
+
tabindex="-1"
|
|
576
|
+
[disabled]="_cvaDisabled()"
|
|
577
|
+
(click)="openAll()"
|
|
578
|
+
>
|
|
579
|
+
▾
|
|
580
|
+
</button>
|
|
581
|
+
}
|
|
511
582
|
</div>
|
|
512
583
|
<div class="neu-autocomplete__sr-status" aria-live="polite" aria-atomic="true">
|
|
513
584
|
{{ resultsAnnouncement() }}
|
|
@@ -522,7 +593,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
522
593
|
[cdkConnectedOverlayViewportMargin]="_viewportMargin"
|
|
523
594
|
(detach)="_closePanel()"
|
|
524
595
|
>
|
|
525
|
-
@if (
|
|
596
|
+
@if (loading()) {
|
|
597
|
+
<div class="neu-autocomplete__empty" role="status" [style.width.px]="overlayWidth()">
|
|
598
|
+
{{ loadingLabel() }}
|
|
599
|
+
</div>
|
|
600
|
+
} @else if (_filtered().length) {
|
|
601
|
+
<ng-template #autocompleteOptionTpl let-opt let-i="index">
|
|
602
|
+
<div
|
|
603
|
+
class="neu-autocomplete__option"
|
|
604
|
+
role="option"
|
|
605
|
+
[id]="_optionId(i)"
|
|
606
|
+
[class.neu-autocomplete__option--active]="_activeIndex() === i"
|
|
607
|
+
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
608
|
+
[attr.aria-selected]="_activeIndex() === i"
|
|
609
|
+
[attr.aria-disabled]="opt.disabled ?? false"
|
|
610
|
+
(mousedown)="selectOption(opt)"
|
|
611
|
+
>
|
|
612
|
+
@if (itemTpl()) {
|
|
613
|
+
<ng-container
|
|
614
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
615
|
+
[ngTemplateOutletContext]="{ $implicit: opt }"
|
|
616
|
+
/>
|
|
617
|
+
} @else {
|
|
618
|
+
{{ opt.label }}
|
|
619
|
+
}
|
|
620
|
+
</div>
|
|
621
|
+
</ng-template>
|
|
622
|
+
|
|
526
623
|
@if (virtualScroll()) {
|
|
527
624
|
<cdk-virtual-scroll-viewport
|
|
528
625
|
class="neu-autocomplete__list neu-autocomplete__list--virtual"
|
|
@@ -533,22 +630,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
533
630
|
[style.height]="virtualViewportHeight()"
|
|
534
631
|
[style.width.px]="overlayWidth()"
|
|
535
632
|
>
|
|
536
|
-
<
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
543
|
-
[attr.aria-selected]="_activeIndex() === i"
|
|
544
|
-
[attr.aria-disabled]="opt.disabled ?? false"
|
|
545
|
-
(mousedown)="selectOption(opt)"
|
|
546
|
-
>
|
|
547
|
-
{{ opt.label }}
|
|
548
|
-
</div>
|
|
633
|
+
<ng-container *cdkVirtualFor="let opt of _filtered(); trackBy: trackByOption; let i = index">
|
|
634
|
+
<ng-container
|
|
635
|
+
[ngTemplateOutlet]="autocompleteOptionTpl"
|
|
636
|
+
[ngTemplateOutletContext]="{ $implicit: opt, index: i }"
|
|
637
|
+
/>
|
|
638
|
+
</ng-container>
|
|
549
639
|
</cdk-virtual-scroll-viewport>
|
|
550
640
|
} @else {
|
|
551
|
-
<
|
|
641
|
+
<div
|
|
552
642
|
class="neu-autocomplete__list"
|
|
553
643
|
role="listbox"
|
|
554
644
|
[id]="_listId"
|
|
@@ -556,20 +646,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
556
646
|
[style.width.px]="overlayWidth()"
|
|
557
647
|
>
|
|
558
648
|
@for (opt of _filtered(); track opt.label; let i = $index) {
|
|
559
|
-
<
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
[class.neu-autocomplete__option--active]="_activeIndex() === i"
|
|
564
|
-
[class.neu-autocomplete__option--disabled]="opt.disabled"
|
|
565
|
-
[attr.aria-selected]="_activeIndex() === i"
|
|
566
|
-
[attr.aria-disabled]="opt.disabled ?? false"
|
|
567
|
-
(mousedown)="selectOption(opt)"
|
|
568
|
-
>
|
|
569
|
-
{{ opt.label }}
|
|
570
|
-
</li>
|
|
649
|
+
<ng-container
|
|
650
|
+
[ngTemplateOutlet]="autocompleteOptionTpl"
|
|
651
|
+
[ngTemplateOutletContext]="{ $implicit: opt, index: i }"
|
|
652
|
+
/>
|
|
571
653
|
}
|
|
572
|
-
</
|
|
654
|
+
</div>
|
|
573
655
|
}
|
|
574
656
|
} @else {
|
|
575
657
|
<div class="neu-autocomplete__empty" role="status" [style.width.px]="overlayWidth()">
|
|
@@ -584,8 +666,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
584
666
|
} @else if (hint()) {
|
|
585
667
|
<p class="neu-autocomplete__hint" [id]="_id + '-hint'">{{ hint() }}</p>
|
|
586
668
|
}
|
|
587
|
-
`, styles: ["@charset \"UTF-8\";.neu-autocomplete{position:relative;display:block}.neu-autocomplete--disabled{opacity:.55;pointer-events:none}.neu-autocomplete--sm .neu-autocomplete__input{height:36px;font-size:var(--neu-text-sm, .875rem)}.neu-autocomplete--lg .neu-autocomplete__input{height:56px}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input::placeholder{color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__label{display:block;margin-bottom:6px;font-size:var(--neu-text-sm, .875rem);font-weight:500;color:var(--neu-text, #0f172a);line-height:1.4}.neu-autocomplete__input-wrap{position:relative;display:flex;align-items:center}.neu-autocomplete__input{width:100%;height:48px;padding:0 36px 0 12px;border:1.5px solid var(--neu-border, #d1d5db);border-radius:var(--neu-radius, 8px);background:var(--neu-surface, #ffffff);color:var(--neu-text, #111);font-size:.875rem;line-height:1.4;outline:none;transition:border-color var(--neu-transition, .12s),box-shadow var(--neu-transition, .12s),background-color var(--neu-transition, .12s)}.neu-autocomplete__input:hover{border-color:var(--neu-border-hover, var(--neu-border, #d1d5db))}.neu-autocomplete__input:focus,.neu-autocomplete__input:focus-visible{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__input[disabled]{background:var(--neu-surface-2, #f3f4f6);color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating .neu-autocomplete__input::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-autocomplete__floating-label{position:absolute;left:var(--neu-space-3, 12px);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base, .875rem);color:var(--neu-text-muted, #6b7280);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6, 24px));transition:top var(--neu-transition, .12s),font-size var(--neu-transition, .12s),color var(--neu-transition, .12s),transform var(--neu-transition, .12s),padding var(--neu-transition, .12s),background var(--neu-transition, .12s)}.neu-autocomplete--focused .neu-autocomplete__floating-label,.neu-autocomplete--has-value .neu-autocomplete__floating-label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface, #fff);padding:0 4px;left:calc(var(--neu-space-3, 12px) - 4px)}.neu-autocomplete--focused .neu-autocomplete__floating-label{color:var(--neu-primary, #0ea5e9)}.neu-autocomplete__clear{all:unset;position:absolute;right:10px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.875rem;color:var(--neu-text-muted, #6b7280);cursor:pointer}.neu-autocomplete__clear:hover{color:var(--neu-text, #111);background:var(--neu-surface-3, #e5e7eb)}.neu-autocomplete__clear:focus-visible{outline:2px solid var(--neu-primary, #0ea5e9);outline-offset:2px}.neu-autocomplete__list{all:unset;display:block;position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);box-shadow:var(--neu-shadow-lg, 0 8px 20px -4px rgba(0, 0, 0, .1));max-height:240px;overflow-y:auto;padding:6px;z-index:1000;animation:neu-ac-in 80ms ease}.neu-autocomplete__list--virtual{padding:0;overflow:hidden}@keyframes neu-ac-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-autocomplete__option{display:flex;align-items:center;padding:7px 10px;min-height:var(--neu-autocomplete-option-height, 40px);box-sizing:border-box;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-text, #111);cursor:pointer}.neu-autocomplete__option:hover:not(.neu-autocomplete__option--disabled){background:var(--neu-surface-2, #f3f4f6)}.neu-autocomplete__option--active{background:var(--neu-primary-50, rgba(14, 165, 233, .12));color:var(--neu-primary, #0ea5e9);font-weight:500}.neu-autocomplete__option--disabled{opacity:.4;cursor:not-allowed}.neu-autocomplete__empty{position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);padding:12px 16px;font-size:.875rem;color:var(--neu-text-muted, #6b7280);text-align:center}.neu-autocomplete__hint,.neu-autocomplete__error{margin:6px 0 0;font-size:var(--neu-text-sm, .875rem);line-height:1.4}.neu-autocomplete__hint{color:var(--neu-text-muted, #6b7280)}.neu-autocomplete__error{color:var(--neu-danger, #dc2626)}.neu-autocomplete__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}\n"] }]
|
|
588
|
-
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], optionSelected: [{ type: i0.Output, args: ["optionSelected"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], onDocClick: [{
|
|
669
|
+
`, styles: ["@charset \"UTF-8\";.neu-autocomplete{position:relative;display:block}.neu-autocomplete--disabled{opacity:.55;pointer-events:none}.neu-autocomplete--sm .neu-autocomplete__input{height:36px;font-size:var(--neu-text-sm, .875rem)}.neu-autocomplete--lg .neu-autocomplete__input{height:56px}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input::placeholder{color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating.neu-autocomplete--focused .neu-autocomplete__input{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__label{display:block;margin-bottom:6px;font-size:var(--neu-text-sm, .875rem);font-weight:500;color:var(--neu-text, #0f172a);line-height:1.4}.neu-autocomplete__input-wrap{position:relative;display:flex;align-items:center}.neu-autocomplete__input{width:100%;height:48px;padding:0 36px 0 12px;border:1.5px solid var(--neu-border, #d1d5db);border-radius:var(--neu-radius, 8px);background:var(--neu-surface, #ffffff);color:var(--neu-text, #111);font-size:.875rem;line-height:1.4;outline:none;transition:border-color var(--neu-transition, .12s),box-shadow var(--neu-transition, .12s),background-color var(--neu-transition, .12s)}.neu-autocomplete__input:hover{border-color:var(--neu-border-hover, var(--neu-border, #d1d5db))}.neu-autocomplete__input:focus,.neu-autocomplete__input:focus-visible{border-color:var(--neu-primary, #0ea5e9);box-shadow:var(--neu-focus-ring, 0 0 0 3px rgba(14, 165, 233, .2))}.neu-autocomplete__input[disabled]{background:var(--neu-surface-2, #f3f4f6);color:var(--neu-text-disabled, #9ca3af)}.neu-autocomplete--floating .neu-autocomplete__input::placeholder{color:transparent;transition:color var(--neu-transition)}.neu-autocomplete__floating-label{position:absolute;left:var(--neu-space-3, 12px);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base, .875rem);color:var(--neu-text-muted, #6b7280);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-6, 24px));transition:top var(--neu-transition, .12s),font-size var(--neu-transition, .12s),color var(--neu-transition, .12s),transform var(--neu-transition, .12s),padding var(--neu-transition, .12s),background var(--neu-transition, .12s)}.neu-autocomplete--focused .neu-autocomplete__floating-label,.neu-autocomplete--has-value .neu-autocomplete__floating-label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface, #fff);padding:0 4px;left:calc(var(--neu-space-3, 12px) - 4px)}.neu-autocomplete--focused .neu-autocomplete__floating-label{color:var(--neu-primary, #0ea5e9)}.neu-autocomplete__clear{all:unset;position:absolute;right:10px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;font-size:.875rem;color:var(--neu-text-muted, #6b7280);cursor:pointer}.neu-autocomplete__clear:hover{color:var(--neu-text, #111);background:var(--neu-surface-3, #e5e7eb)}.neu-autocomplete__clear:focus-visible{outline:2px solid var(--neu-primary, #0ea5e9);outline-offset:2px}.neu-autocomplete__list{all:unset;display:block;position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);box-shadow:var(--neu-shadow-lg, 0 8px 20px -4px rgba(0, 0, 0, .1));max-height:240px;overflow-y:auto;padding:6px;z-index:1000;animation:neu-ac-in 80ms ease}.neu-autocomplete__list--virtual{padding:0;overflow:hidden}@keyframes neu-ac-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-autocomplete__option{display:flex;align-items:center;padding:7px 10px;min-height:var(--neu-autocomplete-option-height, 40px);box-sizing:border-box;border-radius:var(--neu-radius-md, 8px);font-size:.875rem;color:var(--neu-text, #111);cursor:pointer}.neu-autocomplete__option:hover:not(.neu-autocomplete__option--disabled){background:var(--neu-surface-2, #f3f4f6)}.neu-autocomplete__option--active{background:var(--neu-primary-50, rgba(14, 165, 233, .12));color:var(--neu-primary, #0ea5e9);font-weight:500}.neu-autocomplete__option--disabled{opacity:.4;cursor:not-allowed}.neu-autocomplete__empty{position:relative;background:var(--neu-surface, #ffffff);border:1.5px solid var(--neu-border, #e5e7eb);border-radius:var(--neu-radius-lg, 12px);padding:12px 16px;font-size:.875rem;color:var(--neu-text-muted, #6b7280);text-align:center}.neu-autocomplete__hint,.neu-autocomplete__error{margin:6px 0 0;font-size:var(--neu-text-sm, .875rem);line-height:1.4}.neu-autocomplete__hint{color:var(--neu-text-muted, #6b7280)}.neu-autocomplete__error{color:var(--neu-danger, #dc2626)}.neu-autocomplete__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-autocomplete__dropdown{position:absolute;right:6px;top:50%;transform:translateY(-50%);border:0;border-radius:var(--neu-radius-md, 8px);background:transparent;color:var(--neu-text-muted, #6b7280);cursor:pointer;padding:4px 6px}\n"] }]
|
|
670
|
+
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessage", required: false }] }], emptyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyLabel", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdown", required: false }] }], dropdownAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdownAriaLabel", required: false }] }], forceSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceSelection", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], virtualScrollVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScrollVisibleItems", required: false }] }], optionSelected: [{ type: i0.Output, args: ["optionSelected"] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuAutocompleteItemDirective), { isSignal: true }] }], _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], onDocClick: [{
|
|
589
671
|
type: HostListener,
|
|
590
672
|
args: ['document:mousedown', ['$event']]
|
|
591
673
|
}], onWindowResize: [{
|
|
@@ -597,5 +679,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
597
679
|
* Generated bundle index. Do not edit.
|
|
598
680
|
*/
|
|
599
681
|
|
|
600
|
-
export { NeuAutocompleteComponent };
|
|
682
|
+
export { NeuAutocompleteComponent, NeuAutocompleteItemDirective };
|
|
601
683
|
//# sourceMappingURL=neural-ui-core-autocomplete.mjs.map
|