@neural-ui/core 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -6
- package/fesm2022/neural-ui-core-accordion.mjs +8 -6
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
- package/fesm2022/neural-ui-core-autocomplete.mjs +121 -29
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
- package/fesm2022/neural-ui-core-badge.mjs +2 -2
- package/fesm2022/neural-ui-core-badge.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-chip.mjs +2 -2
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
- package/fesm2022/neural-ui-core-color-picker.mjs +3 -9
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/neural-ui-core-filter-bar.mjs +2 -2
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-modal.mjs +81 -31
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
- package/fesm2022/neural-ui-core-multiselect.mjs +258 -99
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-nav.mjs +4 -6
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +247 -94
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/fesm2022/neural-ui-core-sidebar.mjs +3 -2
- 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-split-button.mjs +2 -2
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
- package/fesm2022/neural-ui-core-table.mjs +168 -21
- package/fesm2022/neural-ui-core-table.mjs.map +1 -1
- package/fesm2022/neural-ui-core-tabs.mjs +13 -4
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
- package/fesm2022/neural-ui-core-toolbar.mjs +2 -2
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
- package/fesm2022/neural-ui-core-url-state.mjs +90 -10
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
- package/fesm2022/neural-ui-core-virtual-list.mjs +52 -22
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/_tokens.scss +8 -8
- package/types/neural-ui-core-autocomplete.d.ts +10 -1
- package/types/neural-ui-core-color-picker.d.ts +0 -1
- package/types/neural-ui-core-modal.d.ts +22 -16
- package/types/neural-ui-core-multiselect.d.ts +12 -1
- package/types/neural-ui-core-select.d.ts +12 -1
- package/types/neural-ui-core-sidebar.d.ts +1 -0
- package/types/neural-ui-core-table.d.ts +23 -3
- package/types/neural-ui-core-tabs.d.ts +1 -0
- package/types/neural-ui-core-url-state.d.ts +9 -0
- package/types/neural-ui-core-virtual-list.d.ts +17 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, TemplateRef, Directive, ElementRef, effect, untracked, contentChild, input, output, signal, computed, forwardRef, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
2
|
+
import { inject, TemplateRef, Directive, ElementRef, 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
4
|
import { NgTemplateOutlet } from '@angular/common';
|
|
5
|
+
import * as i1 from '@angular/cdk/scrolling';
|
|
6
|
+
import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
|
|
5
7
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
6
8
|
|
|
7
9
|
/**
|
|
@@ -46,7 +48,9 @@ class NeuMultiselectComponent {
|
|
|
46
48
|
_urlState = inject(NeuUrlStateService);
|
|
47
49
|
_mobileViewportMax = 768;
|
|
48
50
|
_viewportMargin = 16;
|
|
51
|
+
_panelMaxHeight = 280;
|
|
49
52
|
_urlParamSignals = new Map();
|
|
53
|
+
_viewport = viewChild(CdkVirtualScrollViewport, ...(ngDevMode ? [{ debugName: "_viewport" }] : /* istanbul ignore next */ []));
|
|
50
54
|
_getUrlParamSignal(key) {
|
|
51
55
|
let paramSignal = this._urlParamSignals.get(key);
|
|
52
56
|
if (!paramSignal) {
|
|
@@ -64,8 +68,10 @@ class NeuMultiselectComponent {
|
|
|
64
68
|
const urlVals = urlRaw ? urlRaw.split(',').filter(Boolean) : [];
|
|
65
69
|
const current = untracked(() => this._values());
|
|
66
70
|
if (!arraysEqual(urlVals, current)) {
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
untracked(() => {
|
|
72
|
+
this._values.set(urlVals);
|
|
73
|
+
this._onChange(urlVals);
|
|
74
|
+
});
|
|
69
75
|
}
|
|
70
76
|
});
|
|
71
77
|
}
|
|
@@ -100,6 +106,10 @@ class NeuMultiselectComponent {
|
|
|
100
106
|
clearAllLabel = input('Limpiar todo', ...(ngDevMode ? [{ debugName: "clearAllLabel" }] : /* istanbul ignore next */ []));
|
|
101
107
|
/** Muestra un botón × en el trigger para limpiar la selección de una vez / Shows a × button in the trigger to clear the selection at once */
|
|
102
108
|
clearable = input(false, ...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
|
|
109
|
+
/** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */
|
|
110
|
+
virtualScroll = input(false, ...(ngDevMode ? [{ debugName: "virtualScroll" }] : /* istanbul ignore next */ []));
|
|
111
|
+
/** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */
|
|
112
|
+
virtualScrollVisibleItems = input(8, ...(ngDevMode ? [{ debugName: "virtualScrollVisibleItems" }] : /* istanbul ignore next */ []));
|
|
103
113
|
/** Aria-label del botón clear que aparece en el trigger / Aria-label for the clear button shown in the trigger */
|
|
104
114
|
clearAriaLabel = input('Limpiar selección', ...(ngDevMode ? [{ debugName: "clearAriaLabel" }] : /* istanbul ignore next */ []));
|
|
105
115
|
/**
|
|
@@ -153,6 +163,32 @@ class NeuMultiselectComponent {
|
|
|
153
163
|
}
|
|
154
164
|
return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;
|
|
155
165
|
}, ...(ngDevMode ? [{ debugName: "resultsAnnouncement" }] : /* istanbul ignore next */ []));
|
|
166
|
+
virtualScrollItemSize = computed(() => {
|
|
167
|
+
switch (this.size()) {
|
|
168
|
+
case 'sm':
|
|
169
|
+
return 36;
|
|
170
|
+
case 'lg':
|
|
171
|
+
return 52;
|
|
172
|
+
default:
|
|
173
|
+
return 44;
|
|
174
|
+
}
|
|
175
|
+
}, ...(ngDevMode ? [{ debugName: "virtualScrollItemSize" }] : /* istanbul ignore next */ []));
|
|
176
|
+
virtualViewportHeight = computed(() => {
|
|
177
|
+
const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();
|
|
178
|
+
const panelMaxHeight = this.panelPosition().maxHeight;
|
|
179
|
+
const searchOffset = this.searchable() ? 52 : 0;
|
|
180
|
+
const footerOffset = this._values().length > 0 ? 52 : 0;
|
|
181
|
+
const parsedMaxHeight = panelMaxHeight
|
|
182
|
+
? Number.parseFloat(panelMaxHeight)
|
|
183
|
+
: this._panelMaxHeight;
|
|
184
|
+
if (Number.isNaN(parsedMaxHeight)) {
|
|
185
|
+
return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset - footerOffset)}px`;
|
|
186
|
+
}
|
|
187
|
+
const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);
|
|
188
|
+
const availableHeight = Math.max(this.virtualScrollItemSize(), effectivePanelMaxHeight - searchOffset - footerOffset);
|
|
189
|
+
return `${Math.min(desiredHeight, availableHeight)}px`;
|
|
190
|
+
}, ...(ngDevMode ? [{ debugName: "virtualViewportHeight" }] : /* istanbul ignore next */ []));
|
|
191
|
+
trackByOptionValue = (_index, option) => option.value;
|
|
156
192
|
// --- CVA ---
|
|
157
193
|
_onChange = () => { };
|
|
158
194
|
_onTouched = () => { };
|
|
@@ -188,10 +224,7 @@ class NeuMultiselectComponent {
|
|
|
188
224
|
}
|
|
189
225
|
else {
|
|
190
226
|
this.syncPanelPosition();
|
|
191
|
-
|
|
192
|
-
const first = this.elementRef.nativeElement.querySelector('.neu-multiselect__option:not([aria-disabled="true"])');
|
|
193
|
-
first?.focus();
|
|
194
|
-
});
|
|
227
|
+
this.focusFirstOption();
|
|
195
228
|
}
|
|
196
229
|
}
|
|
197
230
|
/** Abre el panel y mueve el foco al primer item / Opens the panel and moves focus to the first item */
|
|
@@ -203,10 +236,7 @@ class NeuMultiselectComponent {
|
|
|
203
236
|
if (!this.isOpen()) {
|
|
204
237
|
this.isOpen.set(true);
|
|
205
238
|
this.syncPanelPosition();
|
|
206
|
-
|
|
207
|
-
const first = this.elementRef.nativeElement.querySelector('.neu-multiselect__option:not([aria-disabled="true"])');
|
|
208
|
-
first?.focus();
|
|
209
|
-
});
|
|
239
|
+
this.focusFirstOption();
|
|
210
240
|
}
|
|
211
241
|
}
|
|
212
242
|
onTriggerActionKey(event) {
|
|
@@ -226,8 +256,7 @@ class NeuMultiselectComponent {
|
|
|
226
256
|
const idx = opts.findIndex((o) => o.value === current.value);
|
|
227
257
|
const next = opts[(idx + dir + opts.length) % opts.length];
|
|
228
258
|
if (next) {
|
|
229
|
-
|
|
230
|
-
el?.focus();
|
|
259
|
+
this.focusOption(next.value);
|
|
231
260
|
}
|
|
232
261
|
}
|
|
233
262
|
close() {
|
|
@@ -313,8 +342,34 @@ class NeuMultiselectComponent {
|
|
|
313
342
|
width: `${width}px`,
|
|
314
343
|
maxHeight: `${maxHeight}px`,
|
|
315
344
|
});
|
|
345
|
+
if (this.virtualScroll()) {
|
|
346
|
+
this._viewport()?.checkViewportSize();
|
|
347
|
+
}
|
|
316
348
|
});
|
|
317
349
|
}
|
|
350
|
+
focusFirstOption() {
|
|
351
|
+
const firstEnabled = this.filteredOptions().find((option) => !option.disabled);
|
|
352
|
+
if (!firstEnabled) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
this.focusOption(firstEnabled.value);
|
|
356
|
+
}
|
|
357
|
+
focusOption(value) {
|
|
358
|
+
if (this.virtualScroll()) {
|
|
359
|
+
const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);
|
|
360
|
+
if (optionIndex >= 0) {
|
|
361
|
+
this._viewport()?.scrollToIndex(optionIndex, 'auto');
|
|
362
|
+
this._viewport()?.checkViewportSize();
|
|
363
|
+
}
|
|
364
|
+
requestAnimationFrame(() => {
|
|
365
|
+
const optionElement = this.elementRef.nativeElement.querySelector(`#neu-ms-opt-${value}`);
|
|
366
|
+
optionElement?.focus();
|
|
367
|
+
});
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const optionElement = this.elementRef.nativeElement.querySelector(`#neu-ms-opt-${value}`);
|
|
371
|
+
optionElement?.focus();
|
|
372
|
+
}
|
|
318
373
|
resetPanelPosition() {
|
|
319
374
|
this.panelPosition.set({
|
|
320
375
|
position: null,
|
|
@@ -325,13 +380,13 @@ class NeuMultiselectComponent {
|
|
|
325
380
|
});
|
|
326
381
|
}
|
|
327
382
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuMultiselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
328
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuMultiselectComponent, isStandalone: true, selector: "neu-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", 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 }, 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 }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAllLabel: { classPropertyName: "clearAllLabel", publicName: "clearAllLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", 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: { "document:click": "onDocumentClick($event)", "keydown.escape": "close()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, providers: [
|
|
383
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuMultiselectComponent, isStandalone: true, selector: "neu-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", 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 }, 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 }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAllLabel: { classPropertyName: "clearAllLabel", publicName: "clearAllLabel", 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 }, 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: { "document:click": "onDocumentClick($event)", "keydown.escape": "close()", "window:resize": "onWindowResize()", "window:scroll": "onWindowScroll()" } }, providers: [
|
|
329
384
|
{
|
|
330
385
|
provide: NG_VALUE_ACCESSOR,
|
|
331
386
|
useExisting: forwardRef(() => NeuMultiselectComponent),
|
|
332
387
|
multi: true,
|
|
333
388
|
},
|
|
334
|
-
], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuMultiselectItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
389
|
+
], queries: [{ propertyName: "itemTpl", first: true, predicate: NeuMultiselectItemDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
335
390
|
@if (!floatingLabel() && label()) {
|
|
336
391
|
<label class="neu-multiselect__static-label" [for]="_triggerId" (click)="focusTrigger()">{{
|
|
337
392
|
label()
|
|
@@ -346,6 +401,7 @@ class NeuMultiselectComponent {
|
|
|
346
401
|
[class.neu-multiselect--no-float]="!floatingLabel()"
|
|
347
402
|
[class.neu-multiselect--sm]="size() === 'sm'"
|
|
348
403
|
[class.neu-multiselect--lg]="size() === 'lg'"
|
|
404
|
+
[style.--neu-multiselect-option-height]="virtualScrollItemSize() + 'px'"
|
|
349
405
|
>
|
|
350
406
|
<!-- Trigger -->
|
|
351
407
|
<div
|
|
@@ -448,6 +504,7 @@ class NeuMultiselectComponent {
|
|
|
448
504
|
@if (isOpen()) {
|
|
449
505
|
<div
|
|
450
506
|
class="neu-multiselect__panel"
|
|
507
|
+
[class.neu-multiselect__panel--virtual]="virtualScroll()"
|
|
451
508
|
role="listbox"
|
|
452
509
|
[id]="_panelId"
|
|
453
510
|
[attr.aria-multiselectable]="true"
|
|
@@ -475,49 +532,99 @@ class NeuMultiselectComponent {
|
|
|
475
532
|
|
|
476
533
|
<!-- Opciones -->
|
|
477
534
|
<div class="neu-multiselect__options">
|
|
478
|
-
@
|
|
479
|
-
<
|
|
480
|
-
class="neu-
|
|
481
|
-
[
|
|
482
|
-
[
|
|
483
|
-
role="option"
|
|
484
|
-
[id]="'neu-ms-opt-' + option.value"
|
|
485
|
-
[attr.aria-selected]="isSelected(option.value)"
|
|
486
|
-
[attr.aria-disabled]="option.disabled"
|
|
487
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
488
|
-
(click)="toggleOption(option)"
|
|
489
|
-
(keydown.enter)="toggleOption(option)"
|
|
490
|
-
(keydown.space)="toggleOption(option)"
|
|
491
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
492
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
535
|
+
@if (virtualScroll()) {
|
|
536
|
+
<cdk-virtual-scroll-viewport
|
|
537
|
+
class="neu-multiselect__viewport"
|
|
538
|
+
[itemSize]="virtualScrollItemSize()"
|
|
539
|
+
[style.height]="virtualViewportHeight()"
|
|
493
540
|
>
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
class="neu-
|
|
497
|
-
[class.neu-
|
|
541
|
+
<div
|
|
542
|
+
*cdkVirtualFor="let option of filteredOptions(); trackBy: trackByOptionValue"
|
|
543
|
+
class="neu-multiselect__option"
|
|
544
|
+
[class.neu-multiselect__option--selected]="isSelected(option.value)"
|
|
545
|
+
[class.neu-multiselect__option--disabled]="option.disabled"
|
|
546
|
+
role="option"
|
|
547
|
+
[id]="'neu-ms-opt-' + option.value"
|
|
548
|
+
[attr.aria-selected]="isSelected(option.value)"
|
|
549
|
+
[attr.aria-disabled]="option.disabled"
|
|
550
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
551
|
+
(click)="toggleOption(option)"
|
|
552
|
+
(keydown.enter)="toggleOption(option)"
|
|
553
|
+
(keydown.space)="toggleOption(option)"
|
|
554
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
555
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
498
556
|
>
|
|
499
|
-
<
|
|
500
|
-
class="neu-multiselect__checkbox
|
|
501
|
-
|
|
502
|
-
fill="none"
|
|
503
|
-
stroke="currentColor"
|
|
504
|
-
stroke-width="2"
|
|
505
|
-
stroke-linecap="round"
|
|
506
|
-
stroke-linejoin="round"
|
|
507
|
-
aria-hidden="true"
|
|
557
|
+
<span
|
|
558
|
+
class="neu-multiselect__checkbox"
|
|
559
|
+
[class.neu-multiselect__checkbox--checked]="isSelected(option.value)"
|
|
508
560
|
>
|
|
509
|
-
<
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
561
|
+
<svg
|
|
562
|
+
class="neu-multiselect__checkbox-check"
|
|
563
|
+
viewBox="0 0 12 10"
|
|
564
|
+
fill="none"
|
|
565
|
+
stroke="currentColor"
|
|
566
|
+
stroke-width="2"
|
|
567
|
+
stroke-linecap="round"
|
|
568
|
+
stroke-linejoin="round"
|
|
569
|
+
aria-hidden="true"
|
|
570
|
+
>
|
|
571
|
+
<polyline points="1 5 4.5 9 11 1" />
|
|
572
|
+
</svg>
|
|
573
|
+
</span>
|
|
574
|
+
@if (itemTpl()) {
|
|
575
|
+
<ng-container
|
|
576
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
577
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
578
|
+
/>
|
|
579
|
+
} @else {
|
|
580
|
+
{{ option.label }}
|
|
581
|
+
}
|
|
582
|
+
</div>
|
|
583
|
+
</cdk-virtual-scroll-viewport>
|
|
584
|
+
} @else {
|
|
585
|
+
@for (option of filteredOptions(); track option.value) {
|
|
586
|
+
<div
|
|
587
|
+
class="neu-multiselect__option"
|
|
588
|
+
[class.neu-multiselect__option--selected]="isSelected(option.value)"
|
|
589
|
+
[class.neu-multiselect__option--disabled]="option.disabled"
|
|
590
|
+
role="option"
|
|
591
|
+
[id]="'neu-ms-opt-' + option.value"
|
|
592
|
+
[attr.aria-selected]="isSelected(option.value)"
|
|
593
|
+
[attr.aria-disabled]="option.disabled"
|
|
594
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
595
|
+
(click)="toggleOption(option)"
|
|
596
|
+
(keydown.enter)="toggleOption(option)"
|
|
597
|
+
(keydown.space)="toggleOption(option)"
|
|
598
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
599
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
600
|
+
>
|
|
601
|
+
<span
|
|
602
|
+
class="neu-multiselect__checkbox"
|
|
603
|
+
[class.neu-multiselect__checkbox--checked]="isSelected(option.value)"
|
|
604
|
+
>
|
|
605
|
+
<svg
|
|
606
|
+
class="neu-multiselect__checkbox-check"
|
|
607
|
+
viewBox="0 0 12 10"
|
|
608
|
+
fill="none"
|
|
609
|
+
stroke="currentColor"
|
|
610
|
+
stroke-width="2"
|
|
611
|
+
stroke-linecap="round"
|
|
612
|
+
stroke-linejoin="round"
|
|
613
|
+
aria-hidden="true"
|
|
614
|
+
>
|
|
615
|
+
<polyline points="1 5 4.5 9 11 1" />
|
|
616
|
+
</svg>
|
|
617
|
+
</span>
|
|
618
|
+
@if (itemTpl()) {
|
|
619
|
+
<ng-container
|
|
620
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
621
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
622
|
+
/>
|
|
623
|
+
} @else {
|
|
624
|
+
{{ option.label }}
|
|
625
|
+
}
|
|
626
|
+
</div>
|
|
627
|
+
}
|
|
521
628
|
}
|
|
522
629
|
|
|
523
630
|
@if (filteredOptions().length === 0) {
|
|
@@ -565,11 +672,11 @@ class NeuMultiselectComponent {
|
|
|
565
672
|
} @else if (hint()) {
|
|
566
673
|
<p class="neu-multiselect__hint" [id]="_triggerId + '-hint'">{{ hint() }}</p>
|
|
567
674
|
}
|
|
568
|
-
`, isInline: true, styles: [".neu-multiselect__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-multiselect__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-8));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-multiselect--open .neu-multiselect__label,.neu-multiselect--has-value .neu-multiselect__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-multiselect--open .neu-multiselect__label{color:var(--neu-primary)}.neu-multiselect--error .neu-multiselect__label{color:var(--neu-error)}.neu-multiselect--disabled .neu-multiselect__label{background:var(--neu-surface-2)}.neu-multiselect{position:relative;font-family:var(--neu-font-sans)}.neu-multiselect__trigger{display:flex;align-items:center;width:100%;min-height:48px;padding:var(--neu-space-2) var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);cursor:pointer;text-align:left;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-multiselect__trigger:focus-visible{outline:none;border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect__trigger[aria-disabled=true]{opacity:.6;cursor:not-allowed;background:var(--neu-surface-2)}.neu-multiselect--open .neu-multiselect__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect--error .neu-multiselect__trigger{border-color:var(--neu-error)}.neu-multiselect--error .neu-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-multiselect__chips{display:flex;flex-wrap:wrap;gap:var(--neu-space-1);flex:1;min-width:0}.neu-multiselect__placeholder{color:var(--neu-text-disabled);font-size:var(--neu-text-base);line-height:1.5}.neu-multiselect:not(.neu-multiselect--no-float):not(.neu-multiselect--open) .neu-multiselect__placeholder{visibility:hidden}.neu-multiselect__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;background:var(--neu-primary-soft, rgba(0, 122, 255, .1));color:var(--neu-primary);border-radius:var(--neu-radius-sm);font-size:var(--neu-text-xs);font-weight:500;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-multiselect__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;opacity:.7;border-radius:2px;transition:opacity var(--neu-transition);flex-shrink:0}.neu-multiselect__chip-remove:hover{opacity:1}.neu-multiselect__chip-remove:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chip-remove svg{width:10px;height:10px}.neu-multiselect__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-multiselect__clear svg{width:14px;height:14px}.neu-multiselect__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-multiselect__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--neu-text-muted);pointer-events:none;transition:transform var(--neu-transition);flex-shrink:0}.neu-multiselect--open .neu-multiselect__chevron{transform:translateY(-50%) rotate(180deg)}.neu-multiselect__panel{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:200;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);overflow:hidden;max-height:280px;display:flex;flex-direction:column;animation:neu-multiselect-fade-in .12s ease}@media(max-width:600px){.neu-multiselect__panel{left:auto;right:0;width:min(max(100%,240px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-multiselect-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-multiselect__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-multiselect__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-multiselect__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-multiselect__search-input::placeholder{color:var(--neu-text-disabled)}.neu-multiselect__options{flex:1;overflow-y:auto;min-height:0}.neu-multiselect__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:10px var(--neu-space-3);cursor:pointer;font-size:var(--neu-text-sm);color:var(--neu-text);transition:background var(--neu-transition)}.neu-multiselect__option:hover:not(.neu-multiselect__option--disabled){background:var(--neu-surface-2)}.neu-multiselect__option--selected{background:var(--neu-primary-soft, rgba(0, 122, 255, .06));color:var(--neu-primary);font-weight:500}.neu-multiselect__option--disabled{opacity:.4;cursor:not-allowed}.neu-multiselect__checkbox{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;border:1.5px solid var(--neu-border);background:var(--neu-bg);flex-shrink:0;transition:border-color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__checkbox--checked{background:var(--neu-primary);border-color:var(--neu-primary);color:#fff}.neu-multiselect__checkbox-check{width:10px;height:8px;opacity:0;transform:scale(.6);transition:opacity .12s ease,transform .12s ease}.neu-multiselect__checkbox--checked .neu-multiselect__checkbox-check{opacity:1;transform:scale(1)}.neu-multiselect__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)}.neu-multiselect__footer{display:flex;align-items:center;justify-content:space-between;padding:var(--neu-space-2) var(--neu-space-3);border-top:1px solid var(--neu-border);background:var(--neu-surface);flex-shrink:0}.neu-multiselect__footer-count{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-multiselect__footer-actions{display:flex;align-items:center;gap:var(--neu-space-2)}.neu-multiselect__footer-mode{background:none;border:1px solid var(--neu-border);border-radius:var(--neu-radius-sm);padding:2px 6px;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-text-muted);cursor:pointer;line-height:1.4}.neu-multiselect__footer-mode:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-multiselect__footer-mode:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__footer-clear{background:none;border:none;padding:0;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-primary);cursor:pointer;font-weight:500}.neu-multiselect__footer-clear:hover{text-decoration:underline}.neu-multiselect__footer-clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px;border-radius:var(--neu-radius-sm)}.neu-multiselect__count-badge{display:inline-flex;align-items:center;padding:2px 10px;background:var(--neu-primary-100, rgba(14, 165, 233, .12));color:var(--neu-primary);border-radius:var(--neu-radius-full);font-size:var(--neu-text-sm);font-weight:500}.neu-multiselect__chip--overflow{background:var(--neu-surface-2);color:var(--neu-text-muted);border:1px dashed var(--neu-border);cursor:default;pointer-events:none}.neu-multiselect__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text, var(--neu-error));font-family:var(--neu-font-sans)}.neu-multiselect__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-multiselect__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-multiselect--sm .neu-multiselect__trigger{min-height:36px;font-size:var(--neu-text-sm);padding:var(--neu-space-1) var(--neu-space-2);padding-right:36px}.neu-multiselect--lg .neu-multiselect__trigger{min-height:56px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
675
|
+
`, isInline: true, styles: [".neu-multiselect__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-multiselect__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-8));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-multiselect--open .neu-multiselect__label,.neu-multiselect--has-value .neu-multiselect__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-multiselect--open .neu-multiselect__label{color:var(--neu-primary)}.neu-multiselect--error .neu-multiselect__label{color:var(--neu-error)}.neu-multiselect--disabled .neu-multiselect__label{background:var(--neu-surface-2)}.neu-multiselect{position:relative;font-family:var(--neu-font-sans)}.neu-multiselect__trigger{display:flex;align-items:center;width:100%;min-height:48px;padding:var(--neu-space-2) var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);cursor:pointer;text-align:left;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-multiselect__trigger:focus-visible{outline:none;border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect__trigger[aria-disabled=true]{opacity:.6;cursor:not-allowed;background:var(--neu-surface-2)}.neu-multiselect--open .neu-multiselect__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect--error .neu-multiselect__trigger{border-color:var(--neu-error)}.neu-multiselect--error .neu-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-multiselect__chips{display:flex;flex-wrap:wrap;gap:var(--neu-space-1);flex:1;min-width:0}.neu-multiselect__placeholder{color:var(--neu-text-disabled);font-size:var(--neu-text-base);line-height:1.5}.neu-multiselect:not(.neu-multiselect--no-float):not(.neu-multiselect--open) .neu-multiselect__placeholder{visibility:hidden}.neu-multiselect__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;background:var(--neu-primary-soft, rgba(0, 122, 255, .1));color:var(--neu-primary);border-radius:var(--neu-radius-sm);font-size:var(--neu-text-xs);font-weight:500;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-multiselect__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;opacity:.7;border-radius:2px;transition:opacity var(--neu-transition);flex-shrink:0}.neu-multiselect__chip-remove:hover{opacity:1}.neu-multiselect__chip-remove:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chip-remove svg{width:10px;height:10px}.neu-multiselect__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-multiselect__clear svg{width:14px;height:14px}.neu-multiselect__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-multiselect__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--neu-text-muted);pointer-events:none;transition:transform var(--neu-transition);flex-shrink:0}.neu-multiselect--open .neu-multiselect__chevron{transform:translateY(-50%) rotate(180deg)}.neu-multiselect__panel{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:200;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);overflow:hidden;max-height:280px;display:flex;flex-direction:column;animation:neu-multiselect-fade-in .12s ease}.neu-multiselect__panel--virtual{overflow:visible}@media(max-width:600px){.neu-multiselect__panel{left:auto;right:0;width:min(max(100%,240px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-multiselect-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-multiselect__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-multiselect__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-multiselect__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-multiselect__search-input::placeholder{color:var(--neu-text-disabled)}.neu-multiselect__options{flex:1;overflow-y:auto;min-height:0}.neu-multiselect__panel--virtual .neu-multiselect__options{overflow:hidden}.neu-multiselect__viewport{width:100%}.neu-multiselect__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:10px var(--neu-space-3);min-height:var(--neu-multiselect-option-height, 44px);box-sizing:border-box;cursor:pointer;font-size:var(--neu-text-sm);color:var(--neu-text);transition:background var(--neu-transition)}.neu-multiselect__option:hover:not(.neu-multiselect__option--disabled){background:var(--neu-surface-2)}.neu-multiselect__option--selected{background:var(--neu-primary-soft, rgba(0, 122, 255, .06));color:var(--neu-primary);font-weight:500}.neu-multiselect__option--disabled{opacity:.4;cursor:not-allowed}.neu-multiselect__checkbox{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;border:1.5px solid var(--neu-border);background:var(--neu-bg);flex-shrink:0;transition:border-color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__checkbox--checked{background:var(--neu-primary);border-color:var(--neu-primary);color:#fff}.neu-multiselect__checkbox-check{width:10px;height:8px;opacity:0;transform:scale(.6);transition:opacity .12s ease,transform .12s ease}.neu-multiselect__checkbox--checked .neu-multiselect__checkbox-check{opacity:1;transform:scale(1)}.neu-multiselect__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)}.neu-multiselect__footer{display:flex;align-items:center;justify-content:space-between;padding:var(--neu-space-2) var(--neu-space-3);border-top:1px solid var(--neu-border);background:var(--neu-surface);flex-shrink:0}.neu-multiselect__footer-count{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-multiselect__footer-actions{display:flex;align-items:center;gap:var(--neu-space-2)}.neu-multiselect__footer-mode{background:none;border:1px solid var(--neu-border);border-radius:var(--neu-radius-sm);padding:2px 6px;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-text-muted);cursor:pointer;line-height:1.4}.neu-multiselect__footer-mode:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-multiselect__footer-mode:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__footer-clear{background:none;border:none;padding:0;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-primary);cursor:pointer;font-weight:500}.neu-multiselect__footer-clear:hover{text-decoration:underline}.neu-multiselect__footer-clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px;border-radius:var(--neu-radius-sm)}.neu-multiselect__count-badge{display:inline-flex;align-items:center;padding:2px 10px;background:var(--neu-primary-100, rgba(14, 165, 233, .12));color:var(--neu-primary);border-radius:var(--neu-radius-full);font-size:var(--neu-text-sm);font-weight:500}.neu-multiselect__chip--overflow{background:var(--neu-surface-2);color:var(--neu-text-muted);border:1px dashed var(--neu-border);cursor:default;pointer-events:none}.neu-multiselect__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text, var(--neu-error));font-family:var(--neu-font-sans)}.neu-multiselect__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-multiselect__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-multiselect--sm .neu-multiselect__trigger{min-height:36px;font-size:var(--neu-text-sm);padding:var(--neu-space-1) var(--neu-space-2);padding-right:36px}.neu-multiselect--lg .neu-multiselect__trigger{min-height:56px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ScrollingModule }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
569
676
|
}
|
|
570
677
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuMultiselectComponent, decorators: [{
|
|
571
678
|
type: Component,
|
|
572
|
-
args: [{ selector: 'neu-multiselect', imports: [NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
679
|
+
args: [{ selector: 'neu-multiselect', imports: [NgTemplateOutlet, ScrollingModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
573
680
|
{
|
|
574
681
|
provide: NG_VALUE_ACCESSOR,
|
|
575
682
|
useExisting: forwardRef(() => NeuMultiselectComponent),
|
|
@@ -595,6 +702,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
595
702
|
[class.neu-multiselect--no-float]="!floatingLabel()"
|
|
596
703
|
[class.neu-multiselect--sm]="size() === 'sm'"
|
|
597
704
|
[class.neu-multiselect--lg]="size() === 'lg'"
|
|
705
|
+
[style.--neu-multiselect-option-height]="virtualScrollItemSize() + 'px'"
|
|
598
706
|
>
|
|
599
707
|
<!-- Trigger -->
|
|
600
708
|
<div
|
|
@@ -697,6 +805,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
697
805
|
@if (isOpen()) {
|
|
698
806
|
<div
|
|
699
807
|
class="neu-multiselect__panel"
|
|
808
|
+
[class.neu-multiselect__panel--virtual]="virtualScroll()"
|
|
700
809
|
role="listbox"
|
|
701
810
|
[id]="_panelId"
|
|
702
811
|
[attr.aria-multiselectable]="true"
|
|
@@ -724,49 +833,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
724
833
|
|
|
725
834
|
<!-- Opciones -->
|
|
726
835
|
<div class="neu-multiselect__options">
|
|
727
|
-
@
|
|
728
|
-
<
|
|
729
|
-
class="neu-
|
|
730
|
-
[
|
|
731
|
-
[
|
|
732
|
-
role="option"
|
|
733
|
-
[id]="'neu-ms-opt-' + option.value"
|
|
734
|
-
[attr.aria-selected]="isSelected(option.value)"
|
|
735
|
-
[attr.aria-disabled]="option.disabled"
|
|
736
|
-
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
737
|
-
(click)="toggleOption(option)"
|
|
738
|
-
(keydown.enter)="toggleOption(option)"
|
|
739
|
-
(keydown.space)="toggleOption(option)"
|
|
740
|
-
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
741
|
-
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
836
|
+
@if (virtualScroll()) {
|
|
837
|
+
<cdk-virtual-scroll-viewport
|
|
838
|
+
class="neu-multiselect__viewport"
|
|
839
|
+
[itemSize]="virtualScrollItemSize()"
|
|
840
|
+
[style.height]="virtualViewportHeight()"
|
|
742
841
|
>
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
class="neu-
|
|
746
|
-
[class.neu-
|
|
842
|
+
<div
|
|
843
|
+
*cdkVirtualFor="let option of filteredOptions(); trackBy: trackByOptionValue"
|
|
844
|
+
class="neu-multiselect__option"
|
|
845
|
+
[class.neu-multiselect__option--selected]="isSelected(option.value)"
|
|
846
|
+
[class.neu-multiselect__option--disabled]="option.disabled"
|
|
847
|
+
role="option"
|
|
848
|
+
[id]="'neu-ms-opt-' + option.value"
|
|
849
|
+
[attr.aria-selected]="isSelected(option.value)"
|
|
850
|
+
[attr.aria-disabled]="option.disabled"
|
|
851
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
852
|
+
(click)="toggleOption(option)"
|
|
853
|
+
(keydown.enter)="toggleOption(option)"
|
|
854
|
+
(keydown.space)="toggleOption(option)"
|
|
855
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
856
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
747
857
|
>
|
|
748
|
-
<
|
|
749
|
-
class="neu-multiselect__checkbox
|
|
750
|
-
|
|
751
|
-
fill="none"
|
|
752
|
-
stroke="currentColor"
|
|
753
|
-
stroke-width="2"
|
|
754
|
-
stroke-linecap="round"
|
|
755
|
-
stroke-linejoin="round"
|
|
756
|
-
aria-hidden="true"
|
|
858
|
+
<span
|
|
859
|
+
class="neu-multiselect__checkbox"
|
|
860
|
+
[class.neu-multiselect__checkbox--checked]="isSelected(option.value)"
|
|
757
861
|
>
|
|
758
|
-
<
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
862
|
+
<svg
|
|
863
|
+
class="neu-multiselect__checkbox-check"
|
|
864
|
+
viewBox="0 0 12 10"
|
|
865
|
+
fill="none"
|
|
866
|
+
stroke="currentColor"
|
|
867
|
+
stroke-width="2"
|
|
868
|
+
stroke-linecap="round"
|
|
869
|
+
stroke-linejoin="round"
|
|
870
|
+
aria-hidden="true"
|
|
871
|
+
>
|
|
872
|
+
<polyline points="1 5 4.5 9 11 1" />
|
|
873
|
+
</svg>
|
|
874
|
+
</span>
|
|
875
|
+
@if (itemTpl()) {
|
|
876
|
+
<ng-container
|
|
877
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
878
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
879
|
+
/>
|
|
880
|
+
} @else {
|
|
881
|
+
{{ option.label }}
|
|
882
|
+
}
|
|
883
|
+
</div>
|
|
884
|
+
</cdk-virtual-scroll-viewport>
|
|
885
|
+
} @else {
|
|
886
|
+
@for (option of filteredOptions(); track option.value) {
|
|
887
|
+
<div
|
|
888
|
+
class="neu-multiselect__option"
|
|
889
|
+
[class.neu-multiselect__option--selected]="isSelected(option.value)"
|
|
890
|
+
[class.neu-multiselect__option--disabled]="option.disabled"
|
|
891
|
+
role="option"
|
|
892
|
+
[id]="'neu-ms-opt-' + option.value"
|
|
893
|
+
[attr.aria-selected]="isSelected(option.value)"
|
|
894
|
+
[attr.aria-disabled]="option.disabled"
|
|
895
|
+
[attr.tabindex]="option.disabled ? null : '-1'"
|
|
896
|
+
(click)="toggleOption(option)"
|
|
897
|
+
(keydown.enter)="toggleOption(option)"
|
|
898
|
+
(keydown.space)="toggleOption(option)"
|
|
899
|
+
(keydown.arrowDown)="focusOptionByIndex($any($event), option, 1)"
|
|
900
|
+
(keydown.arrowUp)="focusOptionByIndex($any($event), option, -1)"
|
|
901
|
+
>
|
|
902
|
+
<span
|
|
903
|
+
class="neu-multiselect__checkbox"
|
|
904
|
+
[class.neu-multiselect__checkbox--checked]="isSelected(option.value)"
|
|
905
|
+
>
|
|
906
|
+
<svg
|
|
907
|
+
class="neu-multiselect__checkbox-check"
|
|
908
|
+
viewBox="0 0 12 10"
|
|
909
|
+
fill="none"
|
|
910
|
+
stroke="currentColor"
|
|
911
|
+
stroke-width="2"
|
|
912
|
+
stroke-linecap="round"
|
|
913
|
+
stroke-linejoin="round"
|
|
914
|
+
aria-hidden="true"
|
|
915
|
+
>
|
|
916
|
+
<polyline points="1 5 4.5 9 11 1" />
|
|
917
|
+
</svg>
|
|
918
|
+
</span>
|
|
919
|
+
@if (itemTpl()) {
|
|
920
|
+
<ng-container
|
|
921
|
+
[ngTemplateOutlet]="itemTpl()!.templateRef"
|
|
922
|
+
[ngTemplateOutletContext]="{ $implicit: option }"
|
|
923
|
+
/>
|
|
924
|
+
} @else {
|
|
925
|
+
{{ option.label }}
|
|
926
|
+
}
|
|
927
|
+
</div>
|
|
928
|
+
}
|
|
770
929
|
}
|
|
771
930
|
|
|
772
931
|
@if (filteredOptions().length === 0) {
|
|
@@ -814,8 +973,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
814
973
|
} @else if (hint()) {
|
|
815
974
|
<p class="neu-multiselect__hint" [id]="_triggerId + '-hint'">{{ hint() }}</p>
|
|
816
975
|
}
|
|
817
|
-
`, styles: [".neu-multiselect__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-multiselect__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-8));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-multiselect--open .neu-multiselect__label,.neu-multiselect--has-value .neu-multiselect__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-multiselect--open .neu-multiselect__label{color:var(--neu-primary)}.neu-multiselect--error .neu-multiselect__label{color:var(--neu-error)}.neu-multiselect--disabled .neu-multiselect__label{background:var(--neu-surface-2)}.neu-multiselect{position:relative;font-family:var(--neu-font-sans)}.neu-multiselect__trigger{display:flex;align-items:center;width:100%;min-height:48px;padding:var(--neu-space-2) var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);cursor:pointer;text-align:left;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-multiselect__trigger:focus-visible{outline:none;border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect__trigger[aria-disabled=true]{opacity:.6;cursor:not-allowed;background:var(--neu-surface-2)}.neu-multiselect--open .neu-multiselect__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect--error .neu-multiselect__trigger{border-color:var(--neu-error)}.neu-multiselect--error .neu-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-multiselect__chips{display:flex;flex-wrap:wrap;gap:var(--neu-space-1);flex:1;min-width:0}.neu-multiselect__placeholder{color:var(--neu-text-disabled);font-size:var(--neu-text-base);line-height:1.5}.neu-multiselect:not(.neu-multiselect--no-float):not(.neu-multiselect--open) .neu-multiselect__placeholder{visibility:hidden}.neu-multiselect__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;background:var(--neu-primary-soft, rgba(0, 122, 255, .1));color:var(--neu-primary);border-radius:var(--neu-radius-sm);font-size:var(--neu-text-xs);font-weight:500;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-multiselect__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;opacity:.7;border-radius:2px;transition:opacity var(--neu-transition);flex-shrink:0}.neu-multiselect__chip-remove:hover{opacity:1}.neu-multiselect__chip-remove:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chip-remove svg{width:10px;height:10px}.neu-multiselect__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-multiselect__clear svg{width:14px;height:14px}.neu-multiselect__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-multiselect__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--neu-text-muted);pointer-events:none;transition:transform var(--neu-transition);flex-shrink:0}.neu-multiselect--open .neu-multiselect__chevron{transform:translateY(-50%) rotate(180deg)}.neu-multiselect__panel{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:200;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);overflow:hidden;max-height:280px;display:flex;flex-direction:column;animation:neu-multiselect-fade-in .12s ease}@media(max-width:600px){.neu-multiselect__panel{left:auto;right:0;width:min(max(100%,240px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-multiselect-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-multiselect__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-multiselect__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-multiselect__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-multiselect__search-input::placeholder{color:var(--neu-text-disabled)}.neu-multiselect__options{flex:1;overflow-y:auto;min-height:0}.neu-multiselect__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:10px var(--neu-space-3);cursor:pointer;font-size:var(--neu-text-sm);color:var(--neu-text);transition:background var(--neu-transition)}.neu-multiselect__option:hover:not(.neu-multiselect__option--disabled){background:var(--neu-surface-2)}.neu-multiselect__option--selected{background:var(--neu-primary-soft, rgba(0, 122, 255, .06));color:var(--neu-primary);font-weight:500}.neu-multiselect__option--disabled{opacity:.4;cursor:not-allowed}.neu-multiselect__checkbox{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;border:1.5px solid var(--neu-border);background:var(--neu-bg);flex-shrink:0;transition:border-color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__checkbox--checked{background:var(--neu-primary);border-color:var(--neu-primary);color:#fff}.neu-multiselect__checkbox-check{width:10px;height:8px;opacity:0;transform:scale(.6);transition:opacity .12s ease,transform .12s ease}.neu-multiselect__checkbox--checked .neu-multiselect__checkbox-check{opacity:1;transform:scale(1)}.neu-multiselect__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)}.neu-multiselect__footer{display:flex;align-items:center;justify-content:space-between;padding:var(--neu-space-2) var(--neu-space-3);border-top:1px solid var(--neu-border);background:var(--neu-surface);flex-shrink:0}.neu-multiselect__footer-count{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-multiselect__footer-actions{display:flex;align-items:center;gap:var(--neu-space-2)}.neu-multiselect__footer-mode{background:none;border:1px solid var(--neu-border);border-radius:var(--neu-radius-sm);padding:2px 6px;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-text-muted);cursor:pointer;line-height:1.4}.neu-multiselect__footer-mode:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-multiselect__footer-mode:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__footer-clear{background:none;border:none;padding:0;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-primary);cursor:pointer;font-weight:500}.neu-multiselect__footer-clear:hover{text-decoration:underline}.neu-multiselect__footer-clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px;border-radius:var(--neu-radius-sm)}.neu-multiselect__count-badge{display:inline-flex;align-items:center;padding:2px 10px;background:var(--neu-primary-100, rgba(14, 165, 233, .12));color:var(--neu-primary);border-radius:var(--neu-radius-full);font-size:var(--neu-text-sm);font-weight:500}.neu-multiselect__chip--overflow{background:var(--neu-surface-2);color:var(--neu-text-muted);border:1px dashed var(--neu-border);cursor:default;pointer-events:none}.neu-multiselect__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text, var(--neu-error));font-family:var(--neu-font-sans)}.neu-multiselect__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-multiselect__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-multiselect--sm .neu-multiselect__trigger{min-height:36px;font-size:var(--neu-text-sm);padding:var(--neu-space-1) var(--neu-space-2);padding-right:36px}.neu-multiselect--lg .neu-multiselect__trigger{min-height:56px}\n"] }]
|
|
818
|
-
}], ctorParameters: () => [], propDecorators: { itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuMultiselectItemDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", 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 }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAllLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", 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"] }] } });
|
|
976
|
+
`, styles: [".neu-multiselect__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-multiselect__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-8));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-multiselect--open .neu-multiselect__label,.neu-multiselect--has-value .neu-multiselect__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-multiselect--open .neu-multiselect__label{color:var(--neu-primary)}.neu-multiselect--error .neu-multiselect__label{color:var(--neu-error)}.neu-multiselect--disabled .neu-multiselect__label{background:var(--neu-surface-2)}.neu-multiselect{position:relative;font-family:var(--neu-font-sans)}.neu-multiselect__trigger{display:flex;align-items:center;width:100%;min-height:48px;padding:var(--neu-space-2) var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);cursor:pointer;text-align:left;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-multiselect__trigger:focus-visible{outline:none;border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect__trigger[aria-disabled=true]{opacity:.6;cursor:not-allowed;background:var(--neu-surface-2)}.neu-multiselect--open .neu-multiselect__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect--error .neu-multiselect__trigger{border-color:var(--neu-error)}.neu-multiselect--error .neu-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-multiselect__chips{display:flex;flex-wrap:wrap;gap:var(--neu-space-1);flex:1;min-width:0}.neu-multiselect__placeholder{color:var(--neu-text-disabled);font-size:var(--neu-text-base);line-height:1.5}.neu-multiselect:not(.neu-multiselect--no-float):not(.neu-multiselect--open) .neu-multiselect__placeholder{visibility:hidden}.neu-multiselect__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;background:var(--neu-primary-soft, rgba(0, 122, 255, .1));color:var(--neu-primary);border-radius:var(--neu-radius-sm);font-size:var(--neu-text-xs);font-weight:500;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-multiselect__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;opacity:.7;border-radius:2px;transition:opacity var(--neu-transition);flex-shrink:0}.neu-multiselect__chip-remove:hover{opacity:1}.neu-multiselect__chip-remove:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chip-remove svg{width:10px;height:10px}.neu-multiselect__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-multiselect__clear svg{width:14px;height:14px}.neu-multiselect__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-multiselect__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--neu-text-muted);pointer-events:none;transition:transform var(--neu-transition);flex-shrink:0}.neu-multiselect--open .neu-multiselect__chevron{transform:translateY(-50%) rotate(180deg)}.neu-multiselect__panel{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:200;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);overflow:hidden;max-height:280px;display:flex;flex-direction:column;animation:neu-multiselect-fade-in .12s ease}.neu-multiselect__panel--virtual{overflow:visible}@media(max-width:600px){.neu-multiselect__panel{left:auto;right:0;width:min(max(100%,240px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-multiselect-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-multiselect__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-multiselect__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-multiselect__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-multiselect__search-input::placeholder{color:var(--neu-text-disabled)}.neu-multiselect__options{flex:1;overflow-y:auto;min-height:0}.neu-multiselect__panel--virtual .neu-multiselect__options{overflow:hidden}.neu-multiselect__viewport{width:100%}.neu-multiselect__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:10px var(--neu-space-3);min-height:var(--neu-multiselect-option-height, 44px);box-sizing:border-box;cursor:pointer;font-size:var(--neu-text-sm);color:var(--neu-text);transition:background var(--neu-transition)}.neu-multiselect__option:hover:not(.neu-multiselect__option--disabled){background:var(--neu-surface-2)}.neu-multiselect__option--selected{background:var(--neu-primary-soft, rgba(0, 122, 255, .06));color:var(--neu-primary);font-weight:500}.neu-multiselect__option--disabled{opacity:.4;cursor:not-allowed}.neu-multiselect__checkbox{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;border:1.5px solid var(--neu-border);background:var(--neu-bg);flex-shrink:0;transition:border-color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__checkbox--checked{background:var(--neu-primary);border-color:var(--neu-primary);color:#fff}.neu-multiselect__checkbox-check{width:10px;height:8px;opacity:0;transform:scale(.6);transition:opacity .12s ease,transform .12s ease}.neu-multiselect__checkbox--checked .neu-multiselect__checkbox-check{opacity:1;transform:scale(1)}.neu-multiselect__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)}.neu-multiselect__footer{display:flex;align-items:center;justify-content:space-between;padding:var(--neu-space-2) var(--neu-space-3);border-top:1px solid var(--neu-border);background:var(--neu-surface);flex-shrink:0}.neu-multiselect__footer-count{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-multiselect__footer-actions{display:flex;align-items:center;gap:var(--neu-space-2)}.neu-multiselect__footer-mode{background:none;border:1px solid var(--neu-border);border-radius:var(--neu-radius-sm);padding:2px 6px;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-text-muted);cursor:pointer;line-height:1.4}.neu-multiselect__footer-mode:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-multiselect__footer-mode:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__footer-clear{background:none;border:none;padding:0;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-primary);cursor:pointer;font-weight:500}.neu-multiselect__footer-clear:hover{text-decoration:underline}.neu-multiselect__footer-clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px;border-radius:var(--neu-radius-sm)}.neu-multiselect__count-badge{display:inline-flex;align-items:center;padding:2px 10px;background:var(--neu-primary-100, rgba(14, 165, 233, .12));color:var(--neu-primary);border-radius:var(--neu-radius-full);font-size:var(--neu-text-sm);font-weight:500}.neu-multiselect__chip--overflow{background:var(--neu-surface-2);color:var(--neu-text-muted);border:1px dashed var(--neu-border);cursor:default;pointer-events:none}.neu-multiselect__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text, var(--neu-error));font-family:var(--neu-font-sans)}.neu-multiselect__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-multiselect__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-multiselect--sm .neu-multiselect__trigger{min-height:36px;font-size:var(--neu-text-sm);padding:var(--neu-space-1) var(--neu-space-2);padding-right:36px}.neu-multiselect--lg .neu-multiselect__trigger{min-height:56px}\n"] }]
|
|
977
|
+
}], ctorParameters: () => [], propDecorators: { _viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NeuMultiselectItemDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", 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 }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], noResultsMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsMessage", required: false }] }], clearAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAllLabel", 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 }] }], 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"] }] } });
|
|
819
978
|
|
|
820
979
|
/**
|
|
821
980
|
* Generated bundle index. Do not edit.
|