@neural-ui/core 1.5.3 → 1.5.4
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/accordion/package.json +4 -0
- package/alert/package.json +4 -0
- package/autocomplete/package.json +4 -0
- package/avatar/package.json +4 -0
- package/badge/package.json +4 -0
- package/block-ui/package.json +4 -0
- package/breadcrumb/package.json +4 -0
- package/button/package.json +4 -0
- package/calendar/package.json +4 -0
- package/card/package.json +4 -0
- package/chart/package.json +4 -0
- package/checkbox/package.json +4 -0
- package/chip/package.json +4 -0
- package/code-block/package.json +4 -0
- package/color-picker/package.json +4 -0
- package/command-palette/package.json +4 -0
- package/confirm-dialog/package.json +4 -0
- package/context-menu/package.json +4 -0
- package/dashboard-grid/package.json +4 -0
- package/date-input/package.json +4 -0
- package/divider/package.json +4 -0
- package/empty-state/package.json +4 -0
- package/fesm2022/neural-ui-core-multiselect.mjs +30 -31
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
- package/fesm2022/neural-ui-core-select.mjs +41 -41
- package/fesm2022/neural-ui-core-select.mjs.map +1 -1
- package/filter-bar/package.json +4 -0
- package/icon/package.json +4 -0
- package/image-gallery/package.json +4 -0
- package/image-viewer/package.json +4 -0
- package/input/package.json +4 -0
- package/input-otp/package.json +4 -0
- package/kanban/package.json +4 -0
- package/knob/package.json +4 -0
- package/meter-group/package.json +4 -0
- package/modal/package.json +4 -0
- package/multiselect/package.json +4 -0
- package/nav/package.json +4 -0
- package/notification-center/package.json +4 -0
- package/number-input/package.json +4 -0
- package/package.json +1 -1
- package/pagination/package.json +4 -0
- package/popover/package.json +4 -0
- package/progress-bar/package.json +4 -0
- package/radio/package.json +4 -0
- package/rating/package.json +4 -0
- package/scheduler-gantt/package.json +4 -0
- package/select/package.json +4 -0
- package/sidebar/package.json +4 -0
- package/skeleton/package.json +4 -0
- package/slider/package.json +4 -0
- package/spinner/package.json +4 -0
- package/split-button/package.json +4 -0
- package/splitter/package.json +4 -0
- package/stats-card/package.json +4 -0
- package/stepper/package.json +4 -0
- package/switch/package.json +4 -0
- package/table/package.json +4 -0
- package/tabs/package.json +4 -0
- package/textarea/package.json +4 -0
- package/timeline/package.json +4 -0
- package/timeline-grid/package.json +4 -0
- package/toast/package.json +4 -0
- package/toggle-button-group/package.json +4 -0
- package/toolbar/package.json +4 -0
- package/tooltip/package.json +4 -0
- package/tree/package.json +4 -0
- package/tree-table/package.json +4 -0
- package/uploader/package.json +4 -0
- package/url-state/package.json +4 -0
- package/virtual-list/package.json +4 -0
|
@@ -216,16 +216,17 @@ class NeuMultiselectComponent {
|
|
|
216
216
|
toggle() {
|
|
217
217
|
if (this.isDisabledFinal())
|
|
218
218
|
return;
|
|
219
|
-
this.isOpen.update((v) => !v);
|
|
220
219
|
if (!this.isOpen()) {
|
|
220
|
+
this.syncPanelPosition();
|
|
221
|
+
this.isOpen.set(true);
|
|
222
|
+
this.focusFirstOption();
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
this.isOpen.set(false);
|
|
221
226
|
this.searchQuery.set('');
|
|
222
227
|
this.resetPanelPosition();
|
|
223
228
|
this._onTouched();
|
|
224
229
|
}
|
|
225
|
-
else {
|
|
226
|
-
this.syncPanelPosition();
|
|
227
|
-
this.focusFirstOption();
|
|
228
|
-
}
|
|
229
230
|
}
|
|
230
231
|
/** Abre el panel y mueve el foco al primer item / Opens the panel and moves focus to the first item */
|
|
231
232
|
onTriggerKey(event) {
|
|
@@ -234,8 +235,8 @@ class NeuMultiselectComponent {
|
|
|
234
235
|
}
|
|
235
236
|
event.preventDefault();
|
|
236
237
|
if (!this.isOpen()) {
|
|
237
|
-
this.isOpen.set(true);
|
|
238
238
|
this.syncPanelPosition();
|
|
239
|
+
this.isOpen.set(true);
|
|
239
240
|
this.focusFirstOption();
|
|
240
241
|
}
|
|
241
242
|
}
|
|
@@ -323,32 +324,30 @@ class NeuMultiselectComponent {
|
|
|
323
324
|
}
|
|
324
325
|
}
|
|
325
326
|
syncPanelPosition() {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
maxHeight: `${maxHeight}px`,
|
|
347
|
-
});
|
|
348
|
-
if (this.virtualScroll()) {
|
|
349
|
-
this._viewport()?.checkViewportSize();
|
|
350
|
-
}
|
|
327
|
+
const trigger = this.elementRef.nativeElement.querySelector('.neu-multiselect__trigger');
|
|
328
|
+
if (!trigger)
|
|
329
|
+
return;
|
|
330
|
+
if (window.innerWidth > this._mobileViewportMax) {
|
|
331
|
+
this.resetPanelPosition();
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const triggerRect = trigger.getBoundingClientRect();
|
|
335
|
+
const viewportWidth = window.innerWidth;
|
|
336
|
+
const viewportHeight = window.innerHeight;
|
|
337
|
+
const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);
|
|
338
|
+
const left = Math.min(Math.max(triggerRect.left, this._viewportMargin), viewportWidth - this._viewportMargin - width);
|
|
339
|
+
const top = triggerRect.bottom + 6;
|
|
340
|
+
const maxHeight = Math.max(180, viewportHeight - top - this._viewportMargin);
|
|
341
|
+
this.panelPosition.set({
|
|
342
|
+
position: 'fixed',
|
|
343
|
+
top: `${top}px`,
|
|
344
|
+
left: `${left}px`,
|
|
345
|
+
width: `${width}px`,
|
|
346
|
+
maxHeight: `${maxHeight}px`,
|
|
351
347
|
});
|
|
348
|
+
if (this.virtualScroll()) {
|
|
349
|
+
requestAnimationFrame(() => this._viewport()?.checkViewportSize());
|
|
350
|
+
}
|
|
352
351
|
}
|
|
353
352
|
focusFirstOption() {
|
|
354
353
|
const firstEnabled = this.filteredOptions().find((option) => !option.disabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-multiselect.mjs","sources":["../../../../projects/ui-core/multiselect/neu-multiselect.directives.ts","../../../../projects/ui-core/multiselect/neu-multiselect.component.ts","../../../../projects/ui-core/multiselect/neural-ui-core-multiselect.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from '@neural-ui/core/select';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown de Multiselect. / Directive to customize the template of each Multiselect dropdown item.\n *\n * Uso:\n * ```html\n * <neu-multiselect [options]=\"opts\" [formControl]=\"valuesCtrl\">\n * <ng-template neuMultiselectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-multiselect>\n * ```\n */\n@Directive({ selector: '[neuMultiselectItem]', standalone: true })\nexport class NeuMultiselectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from '@neural-ui/core/select';\nimport { NeuMultiselectItemDirective } from './neu-multiselect.directives';\n\nexport type { NeuSelectOption } from '@neural-ui/core/select';\n\nlet _neuMultiselectIdSeq = 0;\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\n/**\n * NeuralUI Multiselect Component\n *\n * Dropdown de selección múltiple con chips, búsqueda integrada y soporte / Multiple selection dropdown with chips, integrated search and support\n * para ControlValueAccessor y Reactive Forms. Puede usarse dentro de un FormGroup o con un FormControl standalone. / for ControlValueAccessor and Reactive Forms. It can be used inside a FormGroup or with a standalone FormControl.\n *\n * Uso:\n * readonly technologiesCtrl = new FormControl<string[]>([], { nonNullable: true });\n * <neu-multiselect label=\"Tecnologías\" [options]=\"opts\" [formControl]=\"technologiesCtrl\" />\n */\n@Component({\n selector: 'neu-multiselect',\n imports: [NgTemplateOutlet, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuMultiselectComponent),\n multi: true,\n },\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n '(window:scroll)': 'onWindowScroll()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-multiselect__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-multiselect\"\n [class.neu-multiselect--open]=\"isOpen()\"\n [class.neu-multiselect--disabled]=\"isDisabledFinal()\"\n [class.neu-multiselect--error]=\"hasError()\"\n [class.neu-multiselect--has-value]=\"_values().length > 0\"\n [class.neu-multiselect--no-float]=\"!floatingLabel()\"\n [class.neu-multiselect--sm]=\"size() === 'sm'\"\n [class.neu-multiselect--lg]=\"size() === 'lg'\"\n [style.--neu-multiselect-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger -->\n <div\n class=\"neu-multiselect__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"label() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-multiselect__label\">{{ label() }}</span>\n }\n <span class=\"neu-multiselect__chips\">\n @if (_values().length === 0) {\n <span class=\"neu-multiselect__placeholder\">{{ placeholder() }}</span>\n } @else if (_chipMode() === 'count') {\n <span class=\"neu-multiselect__count-badge\">{{ _values().length }} seleccionados</span>\n } @else {\n @for (val of _visibleChips(); track val) {\n <span class=\"neu-multiselect__chip\">\n {{ labelFor(val) }}\n <button\n class=\"neu-multiselect__chip-remove\"\n type=\"button\"\n [attr.aria-label]=\"'Eliminar ' + labelFor(val)\"\n (click)=\"removeValue(val, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </span>\n }\n @if (_values().length > 3) {\n <span class=\"neu-multiselect__chip neu-multiselect__chip--overflow\"\n >+{{ _values().length - 3 }}</span\n >\n }\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && _values().length > 0 && !isDisabledFinal()) {\n <button\n class=\"neu-multiselect__clear\"\n type=\"button\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearAll($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-multiselect__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel -->\n @if (isOpen()) {\n <div\n class=\"neu-multiselect__panel\"\n [class.neu-multiselect__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"label() || null\"\n [style.position]=\"panelPosition().position\"\n [style.top]=\"panelPosition().top\"\n [style.left]=\"panelPosition().left\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n <!-- Search -->\n @if (searchable()) {\n <div class=\"neu-multiselect__search\">\n <input\n class=\"neu-multiselect__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n\n <!-- Opciones -->\n <div class=\"neu-multiselect__options\">\n @if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-multiselect__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <div\n *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\"\n class=\"neu-multiselect__option\"\n [class.neu-multiselect__option--selected]=\"isSelected(option.value)\"\n [class.neu-multiselect__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-ms-opt-' + option.value\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"toggleOption(option)\"\n (keydown.enter)=\"toggleOption(option)\"\n (keydown.space)=\"toggleOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <span\n class=\"neu-multiselect__checkbox\"\n [class.neu-multiselect__checkbox--checked]=\"isSelected(option.value)\"\n >\n <svg\n class=\"neu-multiselect__checkbox-check\"\n viewBox=\"0 0 12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"1 5 4.5 9 11 1\" />\n </svg>\n </span>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n <div\n class=\"neu-multiselect__option\"\n [class.neu-multiselect__option--selected]=\"isSelected(option.value)\"\n [class.neu-multiselect__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-ms-opt-' + option.value\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"toggleOption(option)\"\n (keydown.enter)=\"toggleOption(option)\"\n (keydown.space)=\"toggleOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <span\n class=\"neu-multiselect__checkbox\"\n [class.neu-multiselect__checkbox--checked]=\"isSelected(option.value)\"\n >\n <svg\n class=\"neu-multiselect__checkbox-check\"\n viewBox=\"0 0 12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"1 5 4.5 9 11 1\" />\n </svg>\n </span>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n }\n }\n\n @if (filteredOptions().length === 0) {\n <div class=\"neu-multiselect__empty\">{{ noResultsMessage() }}</div>\n }\n </div>\n\n <!-- Footer: resumen + limpiar + toggle modo -->\n @if (_values().length > 0) {\n <div class=\"neu-multiselect__footer\">\n <span class=\"neu-multiselect__footer-count\"\n >{{ _values().length }} seleccionados</span\n >\n <div class=\"neu-multiselect__footer-actions\">\n <button\n class=\"neu-multiselect__footer-mode\"\n type=\"button\"\n [attr.aria-label]=\"_chipMode() === 'chips' ? 'Mostrar contador' : 'Mostrar chips'\"\n (click)=\"toggleChipMode($event)\"\n >\n {{ _chipMode() === 'chips' ? '#' : '☰' }}\n </button>\n <button\n class=\"neu-multiselect__footer-clear\"\n type=\"button\"\n (click)=\"clearAll($event)\"\n >\n {{ clearAllLabel() }}\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"neu-multiselect__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n @if (hasError()) {\n <p class=\"neu-multiselect__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-multiselect__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-multiselect.component.scss',\n})\nexport class NeuMultiselectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _urlState = inject(NeuUrlStateService);\n private readonly _mobileViewportMax = 768;\n private readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 280;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlRaw = this._getUrlParamSignal(param)();\n const urlVals = urlRaw ? urlRaw.split(',').filter(Boolean) : [];\n const current = untracked(() => this._values());\n if (!arraysEqual(urlVals, current)) {\n untracked(() => {\n this._values.set(urlVals);\n this._onChange(urlVals);\n });\n }\n });\n }\n\n /** @internal */\n readonly _triggerId = `neu-multiselect-trigger-${_neuMultiselectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuMultiselectItemDirective);\n\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Etiqueta del componente / Component label */\n label = input<string>('');\n\n /** Muestra el label como flotante dentro del campo (true) o estático encima (false) / Shows the label as floating inside the field (true) or static above (false) */\n floatingLabel = input<boolean>(false);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el componente / Disables the component */\n disabled = input<boolean>(false);\n\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Texto del botón de limpiar todas las selecciones / Button text to clear all selections */\n clearAllLabel = input<string>('Limpiar todo');\n\n /** 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 */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Aria-label del botón clear que aparece en el trigger / Aria-label for the clear button shown in the trigger */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza los valores seleccionados con este query param de la URL.\n * Los valores se codifican como lista separada por comas: `?{urlParam}=a,b,c`.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el array de NeuSelectOption completo (incluyendo data) al cambiar la selección.\n * Emite [] al limpiar toda la selección.\n * Los valores del formControl siguen siendo string[].\n */\n readonly selectionChange = output<NeuSelectOption[]>();\n\n // --- Estado interno ---\n protected readonly _values = signal<string[]>([]);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly _chipMode = signal<'chips' | 'count'>('count');\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n\n readonly _visibleChips = computed(() => this._values().slice(0, 3));\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n const footerOffset = this._values().length > 0 ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset - footerOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset - footerOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // --- CVA ---\n private _onChange: (v: string[]) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(value: string[] | null): void {\n this._values.set(Array.isArray(value) ? value : []);\n }\n\n registerOnChange(fn: (v: string[]) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n // --- Helpers ---\n protected labelFor(value: string): string {\n return this.options().find((o) => o.value === value)?.label ?? value;\n }\n\n protected isSelected(value: string): boolean {\n return this._values().includes(value);\n }\n\n protected toggle(): void {\n if (this.isDisabledFinal()) return;\n this.isOpen.update((v) => !v);\n if (!this.isOpen()) {\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n } else {\n this.syncPanelPosition();\n this.focusFirstOption();\n }\n }\n\n /** Abre el panel y mueve el foco al primer item / Opens the panel and moves focus to the first item */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.isOpen.set(true);\n this.syncPanelPosition();\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-multiselect__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n protected toggleOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n const current = this._values();\n const next = current.includes(option.value)\n ? current.filter((v) => v !== option.value)\n : [...current, option.value];\n this._values.set(next);\n this._onChange(next);\n this.selectionChange.emit(this.options().filter((o) => next.includes(o.value)));\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, next.length ? next.join(',') : null);\n this.refreshVirtualViewport();\n }\n\n protected removeValue(value: string, event: MouseEvent): void {\n event.stopPropagation();\n const next = this._values().filter((v) => v !== value);\n this._values.set(next);\n this._onChange(next);\n this._onTouched();\n this.selectionChange.emit(this.options().filter((o) => next.includes(o.value)));\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, next.length ? next.join(',') : null);\n this.refreshVirtualViewport();\n }\n\n protected clearAll(event: MouseEvent): void {\n event.stopPropagation();\n this._values.set([]);\n this._onChange([]);\n this._onTouched();\n this.selectionChange.emit([]);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this.refreshVirtualViewport();\n }\n\n protected toggleChipMode(event: MouseEvent): void {\n event.stopPropagation();\n this._chipMode.set(this._chipMode() === 'chips' ? 'count' : 'chips');\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n requestAnimationFrame(() => {\n const trigger = this.elementRef.nativeElement.querySelector<HTMLElement>(\n '.neu-multiselect__trigger',\n );\n if (!trigger) return;\n if (window.innerWidth > this._mobileViewportMax) {\n this.resetPanelPosition();\n return;\n }\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const left = Math.min(\n Math.max(triggerRect.left, this._viewportMargin),\n viewportWidth - this._viewportMargin - width,\n );\n const top = triggerRect.bottom + 6;\n const maxHeight = Math.max(180, viewportHeight - top - this._viewportMargin);\n\n this.panelPosition.set({\n position: 'fixed',\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n\n if (this.virtualScroll()) {\n this._viewport()?.checkViewportSize();\n }\n });\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n requestAnimationFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-ms-opt-${value}`,\n );\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-ms-opt-${value}`,\n );\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n }\n\n private refreshVirtualViewport(): void {\n if (!this.isOpen() || !this.virtualScroll()) {\n return;\n }\n\n requestAnimationFrame(() => {\n this._viewport()?.checkViewportSize();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-multiselect.mjs","sources":["../../../../projects/ui-core/multiselect/neu-multiselect.directives.ts","../../../../projects/ui-core/multiselect/neu-multiselect.component.ts","../../../../projects/ui-core/multiselect/neural-ui-core-multiselect.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from '@neural-ui/core/select';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown de Multiselect. / Directive to customize the template of each Multiselect dropdown item.\n *\n * Uso:\n * ```html\n * <neu-multiselect [options]=\"opts\" [formControl]=\"valuesCtrl\">\n * <ng-template neuMultiselectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-multiselect>\n * ```\n */\n@Directive({ selector: '[neuMultiselectItem]', standalone: true })\nexport class NeuMultiselectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from '@neural-ui/core/select';\nimport { NeuMultiselectItemDirective } from './neu-multiselect.directives';\n\nexport type { NeuSelectOption } from '@neural-ui/core/select';\n\nlet _neuMultiselectIdSeq = 0;\n\nfunction arraysEqual(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\n/**\n * NeuralUI Multiselect Component\n *\n * Dropdown de selección múltiple con chips, búsqueda integrada y soporte / Multiple selection dropdown with chips, integrated search and support\n * para ControlValueAccessor y Reactive Forms. Puede usarse dentro de un FormGroup o con un FormControl standalone. / for ControlValueAccessor and Reactive Forms. It can be used inside a FormGroup or with a standalone FormControl.\n *\n * Uso:\n * readonly technologiesCtrl = new FormControl<string[]>([], { nonNullable: true });\n * <neu-multiselect label=\"Tecnologías\" [options]=\"opts\" [formControl]=\"technologiesCtrl\" />\n */\n@Component({\n selector: 'neu-multiselect',\n imports: [NgTemplateOutlet, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuMultiselectComponent),\n multi: true,\n },\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n '(window:scroll)': 'onWindowScroll()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-multiselect__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-multiselect\"\n [class.neu-multiselect--open]=\"isOpen()\"\n [class.neu-multiselect--disabled]=\"isDisabledFinal()\"\n [class.neu-multiselect--error]=\"hasError()\"\n [class.neu-multiselect--has-value]=\"_values().length > 0\"\n [class.neu-multiselect--no-float]=\"!floatingLabel()\"\n [class.neu-multiselect--sm]=\"size() === 'sm'\"\n [class.neu-multiselect--lg]=\"size() === 'lg'\"\n [style.--neu-multiselect-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger -->\n <div\n class=\"neu-multiselect__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"label() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-multiselect__label\">{{ label() }}</span>\n }\n <span class=\"neu-multiselect__chips\">\n @if (_values().length === 0) {\n <span class=\"neu-multiselect__placeholder\">{{ placeholder() }}</span>\n } @else if (_chipMode() === 'count') {\n <span class=\"neu-multiselect__count-badge\">{{ _values().length }} seleccionados</span>\n } @else {\n @for (val of _visibleChips(); track val) {\n <span class=\"neu-multiselect__chip\">\n {{ labelFor(val) }}\n <button\n class=\"neu-multiselect__chip-remove\"\n type=\"button\"\n [attr.aria-label]=\"'Eliminar ' + labelFor(val)\"\n (click)=\"removeValue(val, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </span>\n }\n @if (_values().length > 3) {\n <span class=\"neu-multiselect__chip neu-multiselect__chip--overflow\"\n >+{{ _values().length - 3 }}</span\n >\n }\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && _values().length > 0 && !isDisabledFinal()) {\n <button\n class=\"neu-multiselect__clear\"\n type=\"button\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearAll($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-multiselect__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel -->\n @if (isOpen()) {\n <div\n class=\"neu-multiselect__panel\"\n [class.neu-multiselect__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"label() || null\"\n [style.position]=\"panelPosition().position\"\n [style.top]=\"panelPosition().top\"\n [style.left]=\"panelPosition().left\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n <!-- Search -->\n @if (searchable()) {\n <div class=\"neu-multiselect__search\">\n <input\n class=\"neu-multiselect__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n\n <!-- Opciones -->\n <div class=\"neu-multiselect__options\">\n @if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-multiselect__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <div\n *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\"\n class=\"neu-multiselect__option\"\n [class.neu-multiselect__option--selected]=\"isSelected(option.value)\"\n [class.neu-multiselect__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-ms-opt-' + option.value\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"toggleOption(option)\"\n (keydown.enter)=\"toggleOption(option)\"\n (keydown.space)=\"toggleOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <span\n class=\"neu-multiselect__checkbox\"\n [class.neu-multiselect__checkbox--checked]=\"isSelected(option.value)\"\n >\n <svg\n class=\"neu-multiselect__checkbox-check\"\n viewBox=\"0 0 12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"1 5 4.5 9 11 1\" />\n </svg>\n </span>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n <div\n class=\"neu-multiselect__option\"\n [class.neu-multiselect__option--selected]=\"isSelected(option.value)\"\n [class.neu-multiselect__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-ms-opt-' + option.value\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"toggleOption(option)\"\n (keydown.enter)=\"toggleOption(option)\"\n (keydown.space)=\"toggleOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <span\n class=\"neu-multiselect__checkbox\"\n [class.neu-multiselect__checkbox--checked]=\"isSelected(option.value)\"\n >\n <svg\n class=\"neu-multiselect__checkbox-check\"\n viewBox=\"0 0 12 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"1 5 4.5 9 11 1\" />\n </svg>\n </span>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n }\n }\n\n @if (filteredOptions().length === 0) {\n <div class=\"neu-multiselect__empty\">{{ noResultsMessage() }}</div>\n }\n </div>\n\n <!-- Footer: resumen + limpiar + toggle modo -->\n @if (_values().length > 0) {\n <div class=\"neu-multiselect__footer\">\n <span class=\"neu-multiselect__footer-count\"\n >{{ _values().length }} seleccionados</span\n >\n <div class=\"neu-multiselect__footer-actions\">\n <button\n class=\"neu-multiselect__footer-mode\"\n type=\"button\"\n [attr.aria-label]=\"_chipMode() === 'chips' ? 'Mostrar contador' : 'Mostrar chips'\"\n (click)=\"toggleChipMode($event)\"\n >\n {{ _chipMode() === 'chips' ? '#' : '☰' }}\n </button>\n <button\n class=\"neu-multiselect__footer-clear\"\n type=\"button\"\n (click)=\"clearAll($event)\"\n >\n {{ clearAllLabel() }}\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"neu-multiselect__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n @if (hasError()) {\n <p class=\"neu-multiselect__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-multiselect__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-multiselect.component.scss',\n})\nexport class NeuMultiselectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _urlState = inject(NeuUrlStateService);\n private readonly _mobileViewportMax = 768;\n private readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 280;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlRaw = this._getUrlParamSignal(param)();\n const urlVals = urlRaw ? urlRaw.split(',').filter(Boolean) : [];\n const current = untracked(() => this._values());\n if (!arraysEqual(urlVals, current)) {\n untracked(() => {\n this._values.set(urlVals);\n this._onChange(urlVals);\n });\n }\n });\n }\n\n /** @internal */\n readonly _triggerId = `neu-multiselect-trigger-${_neuMultiselectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuMultiselectItemDirective);\n\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Etiqueta del componente / Component label */\n label = input<string>('');\n\n /** Muestra el label como flotante dentro del campo (true) o estático encima (false) / Shows the label as floating inside the field (true) or static above (false) */\n floatingLabel = input<boolean>(false);\n\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el componente / Disables the component */\n disabled = input<boolean>(false);\n\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Texto del botón de limpiar todas las selecciones / Button text to clear all selections */\n clearAllLabel = input<string>('Limpiar todo');\n\n /** 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 */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Aria-label del botón clear que aparece en el trigger / Aria-label for the clear button shown in the trigger */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza los valores seleccionados con este query param de la URL.\n * Los valores se codifican como lista separada por comas: `?{urlParam}=a,b,c`.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el array de NeuSelectOption completo (incluyendo data) al cambiar la selección.\n * Emite [] al limpiar toda la selección.\n * Los valores del formControl siguen siendo string[].\n */\n readonly selectionChange = output<NeuSelectOption[]>();\n\n // --- Estado interno ---\n protected readonly _values = signal<string[]>([]);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly _chipMode = signal<'chips' | 'count'>('count');\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n\n readonly _visibleChips = computed(() => this._values().slice(0, 3));\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n const footerOffset = this._values().length > 0 ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset - footerOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset - footerOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // --- CVA ---\n private _onChange: (v: string[]) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(value: string[] | null): void {\n this._values.set(Array.isArray(value) ? value : []);\n }\n\n registerOnChange(fn: (v: string[]) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n // --- Helpers ---\n protected labelFor(value: string): string {\n return this.options().find((o) => o.value === value)?.label ?? value;\n }\n\n protected isSelected(value: string): boolean {\n return this._values().includes(value);\n }\n\n protected toggle(): void {\n if (this.isDisabledFinal()) return;\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n } else {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n }\n\n /** Abre el panel y mueve el foco al primer item / Opens the panel and moves focus to the first item */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-multiselect__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n protected toggleOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n const current = this._values();\n const next = current.includes(option.value)\n ? current.filter((v) => v !== option.value)\n : [...current, option.value];\n this._values.set(next);\n this._onChange(next);\n this.selectionChange.emit(this.options().filter((o) => next.includes(o.value)));\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, next.length ? next.join(',') : null);\n this.refreshVirtualViewport();\n }\n\n protected removeValue(value: string, event: MouseEvent): void {\n event.stopPropagation();\n const next = this._values().filter((v) => v !== value);\n this._values.set(next);\n this._onChange(next);\n this._onTouched();\n this.selectionChange.emit(this.options().filter((o) => next.includes(o.value)));\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, next.length ? next.join(',') : null);\n this.refreshVirtualViewport();\n }\n\n protected clearAll(event: MouseEvent): void {\n event.stopPropagation();\n this._values.set([]);\n this._onChange([]);\n this._onTouched();\n this.selectionChange.emit([]);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this.refreshVirtualViewport();\n }\n\n protected toggleChipMode(event: MouseEvent): void {\n event.stopPropagation();\n this._chipMode.set(this._chipMode() === 'chips' ? 'count' : 'chips');\n }\n\n protected onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n const trigger = this.elementRef.nativeElement.querySelector<HTMLElement>(\n '.neu-multiselect__trigger',\n );\n if (!trigger) return;\n if (window.innerWidth > this._mobileViewportMax) {\n this.resetPanelPosition();\n return;\n }\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const left = Math.min(\n Math.max(triggerRect.left, this._viewportMargin),\n viewportWidth - this._viewportMargin - width,\n );\n const top = triggerRect.bottom + 6;\n const maxHeight = Math.max(180, viewportHeight - top - this._viewportMargin);\n\n this.panelPosition.set({\n position: 'fixed',\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n\n if (this.virtualScroll()) {\n requestAnimationFrame(() => this._viewport()?.checkViewportSize());\n }\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n requestAnimationFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-ms-opt-${value}`,\n );\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-ms-opt-${value}`,\n );\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n }\n\n private refreshVirtualViewport(): void {\n if (!this.isOpen() || !this.virtualScroll()) {\n return;\n }\n\n requestAnimationFrame(() => {\n this._viewport()?.checkViewportSize();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -229,13 +229,15 @@ class NeuSelectComponent {
|
|
|
229
229
|
}
|
|
230
230
|
isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
|
|
231
231
|
toggle() {
|
|
232
|
-
if (
|
|
233
|
-
|
|
234
|
-
if (this.isOpen()) {
|
|
232
|
+
if (this.isDisabledFinal())
|
|
233
|
+
return;
|
|
234
|
+
if (!this.isOpen()) {
|
|
235
235
|
this.syncPanelPosition();
|
|
236
|
+
this.isOpen.set(true);
|
|
236
237
|
this.focusFirstOption();
|
|
237
238
|
}
|
|
238
239
|
else {
|
|
240
|
+
this.isOpen.set(false);
|
|
239
241
|
this.resetPanelPosition();
|
|
240
242
|
}
|
|
241
243
|
}
|
|
@@ -252,8 +254,8 @@ class NeuSelectComponent {
|
|
|
252
254
|
}
|
|
253
255
|
event.preventDefault();
|
|
254
256
|
if (!this.isOpen()) {
|
|
255
|
-
this.isOpen.set(true);
|
|
256
257
|
this.syncPanelPosition();
|
|
258
|
+
this.isOpen.set(true);
|
|
257
259
|
this.focusFirstOption();
|
|
258
260
|
}
|
|
259
261
|
}
|
|
@@ -315,44 +317,42 @@ class NeuSelectComponent {
|
|
|
315
317
|
}
|
|
316
318
|
}
|
|
317
319
|
syncPanelPosition() {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
maxHeight: `${maxHeight}px`,
|
|
350
|
-
});
|
|
351
|
-
this.isPanelAbove.set(openAbove);
|
|
352
|
-
if (this.virtualScroll()) {
|
|
353
|
-
this._viewport()?.checkViewportSize();
|
|
354
|
-
}
|
|
320
|
+
const trigger = this.elementRef.nativeElement.querySelector('.neu-select__trigger');
|
|
321
|
+
if (!trigger)
|
|
322
|
+
return;
|
|
323
|
+
const triggerRect = trigger.getBoundingClientRect();
|
|
324
|
+
const viewportWidth = window.innerWidth;
|
|
325
|
+
const viewportHeight = window.innerHeight;
|
|
326
|
+
const gap = 6;
|
|
327
|
+
const configuratorControls = trigger.closest('.demo-configurator__controls');
|
|
328
|
+
const controlsDisplay = configuratorControls
|
|
329
|
+
? window.getComputedStyle(configuratorControls).display
|
|
330
|
+
: null;
|
|
331
|
+
const boundaryRect = controlsDisplay === 'grid' ? null : configuratorControls?.getBoundingClientRect();
|
|
332
|
+
const boundaryTop = boundaryRect
|
|
333
|
+
? Math.max(boundaryRect.top, this._viewportMargin)
|
|
334
|
+
: this._viewportMargin;
|
|
335
|
+
const boundaryBottom = boundaryRect
|
|
336
|
+
? Math.min(boundaryRect.bottom, viewportHeight - this._viewportMargin)
|
|
337
|
+
: viewportHeight - this._viewportMargin;
|
|
338
|
+
const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);
|
|
339
|
+
const left = Math.min(Math.max(triggerRect.left, this._viewportMargin), viewportWidth - this._viewportMargin - width);
|
|
340
|
+
const availableBelow = Math.max(0, boundaryBottom - triggerRect.bottom - gap);
|
|
341
|
+
const availableAbove = Math.max(0, triggerRect.top - boundaryTop - gap);
|
|
342
|
+
const openAbove = availableAbove > availableBelow && availableAbove >= 140;
|
|
343
|
+
const maxHeight = Math.max(140, openAbove ? availableAbove : availableBelow);
|
|
344
|
+
this.panelPosition.set({
|
|
345
|
+
position: 'fixed',
|
|
346
|
+
top: openAbove ? 'auto' : `${triggerRect.bottom + gap}px`,
|
|
347
|
+
bottom: openAbove ? `${viewportHeight - triggerRect.top + gap}px` : 'auto',
|
|
348
|
+
left: `${left}px`,
|
|
349
|
+
width: `${width}px`,
|
|
350
|
+
maxHeight: `${maxHeight}px`,
|
|
355
351
|
});
|
|
352
|
+
this.isPanelAbove.set(openAbove);
|
|
353
|
+
if (this.virtualScroll()) {
|
|
354
|
+
requestAnimationFrame(() => this._viewport()?.checkViewportSize());
|
|
355
|
+
}
|
|
356
356
|
}
|
|
357
357
|
focusFirstOption() {
|
|
358
358
|
const firstEnabled = this.filteredOptions().find((option) => !option.disabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"neural-ui-core-select.mjs","sources":["../../../../projects/ui-core/select/neu-select.directives.ts","../../../../projects/ui-core/select/neu-select.component.ts","../../../../projects/ui-core/select/neural-ui-core-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from './neu-select.types';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown.\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectItem]', standalone: true })\nexport class NeuSelectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n\n/**\n * Directiva para personalizar el template del ítem seleccionado (trigger).\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectSelected let-item>\n * <strong>{{ item?.label }}</strong>\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectSelected]', standalone: true })\nexport class NeuSelectSelectedDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption | null }>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from './neu-select.types';\nimport { NeuSelectItemDirective, NeuSelectSelectedDirective } from './neu-select.directives';\n\nexport type { NeuSelectOption } from './neu-select.types';\n\nlet _neuSelectIdSeq = 0;\n\n/**\n * NeuralUI Select Component\n *\n * Dropdown personalizado con soporte para ControlValueAccessor y Reactive Forms.\n * Puede usarse dentro de un FormGroup o con un FormControl standalone.\n * Cierra automáticamente al hacer clic fuera del componente.\n *\n * Uso:\n * readonly countryCtrl = new FormControl<string | null>(null);\n * <neu-select label=\"País\" [options]=\"paises\" [formControl]=\"countryCtrl\" />\n *\n * Uso standalone fuera de un formulario completo:\n * readonly sortCtrl = new FormControl<string | null>('name');\n * <neu-select label=\"Orden\" [options]=\"sortOptions\" [formControl]=\"sortCtrl\" />\n */\n@Component({\n selector: 'neu-select',\n imports: [NgTemplateOutlet, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuSelectComponent),\n multi: true,\n },\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n '(window:scroll)': 'onWindowScroll()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-select__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-select\"\n [class.neu-select--open]=\"isOpen()\"\n [class.neu-select--open-above]=\"isPanelAbove()\"\n [class.neu-select--disabled]=\"isDisabledFinal()\"\n [class.neu-select--error]=\"hasError()\"\n [class.neu-select--has-value]=\"!!_value()\"\n [class.neu-select--has-placeholder]=\"!!placeholder() && !_value()\"\n [class.neu-select--no-float]=\"!floatingLabel()\"\n [class.neu-select--sm]=\"size() === 'sm'\"\n [class.neu-select--lg]=\"size() === 'lg'\"\n [style.--neu-select-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger ------>\n <div\n class=\"neu-select__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-activedescendant]=\"isOpen() && _value() ? 'neu-select-opt-' + _value() : null\"\n [attr.aria-label]=\"label() || placeholder() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-select__label\">{{ label() }}</span>\n }\n\n <span class=\"neu-select__value\">\n @if (selectedLabel()) {\n @if (selectedItemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"selectedItemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: _selectedOption() }\"\n />\n } @else {\n {{ selectedLabel() }}\n }\n } @else {\n <span class=\"neu-select__placeholder\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && !!_value() && !isDisabledFinal()) {\n <button\n class=\"neu-select__clear\"\n type=\"button\"\n aria-label=\"Limpiar selección\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearValue($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-select__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel ------>\n @if (isOpen()) {\n <div\n class=\"neu-select__panel\"\n [class.neu-select__panel--above]=\"isPanelAbove()\"\n [class.neu-select__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-label]=\"label()\"\n [style.position]=\"panelPosition().position\"\n [style.top]=\"panelPosition().top\"\n [style.bottom]=\"panelPosition().bottom\"\n [style.left]=\"panelPosition().left\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n @if (searchable()) {\n <div class=\"neu-select__search\">\n <input\n class=\"neu-select__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-select__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <div\n *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\"\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n <div\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n }\n }\n @if (filteredOptions().length === 0) {\n <div class=\"neu-select__empty\">{{ noResultsMessage() }}</div>\n }\n </div>\n }\n <div class=\"neu-select__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n <!-- Error / hint -->\n @if (hasError()) {\n <p class=\"neu-select__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-select__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-select.component.scss',\n})\nexport class NeuSelectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _urlState = inject(NeuUrlStateService);\n private readonly _mobileViewportMax = 768;\n private readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 240;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlVal = this._getUrlParamSignal(param)();\n if (urlVal !== untracked(() => this._value())) {\n untracked(() => {\n this._value.set(urlVal);\n this._onChange(urlVal);\n });\n }\n });\n }\n /** @internal — ID \\u00fanico para asociar label con trigger */\n readonly _triggerId = `neu-select-trigger-${_neuSelectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuSelectItemDirective);\n\n /** Template personalizado para el valor seleccionado en el trigger / Custom template for the selected value in the trigger */\n readonly selectedItemTpl = contentChild(NeuSelectSelectedDirective);\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el select / Disables the select */\n disabled = input<boolean>(false);\n\n /** Muestra el label como flotante (true) o como label estático encima (false, por defecto) / Shows the label as floating (true) or static above (false, default) */\n floatingLabel = input<boolean>(false);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Muestra un botón para limpiar la selección / Shows a button to clear the selection */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Aria-label del botón de limpiar / Aria-label for the clear button */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza el valor seleccionado con este query param de la URL.\n * Al seleccionar una opción se añade `?{urlParam}=value` a la URL.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el objeto NeuSelectOption completo (incluyendo data) al seleccionar una opción.\n * Emite null al limpiar la selección.\n * El valor del formControl sigue siendo string.\n */\n readonly selectionChange = output<NeuSelectOption | null>();\n\n // Estado interno\n protected readonly _value = signal<string | null>(null);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n bottom: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n readonly isPanelAbove = signal(false);\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this._value())?.label ?? null,\n );\n\n readonly _selectedOption = computed(\n () => this.options().find((o) => o.value === this._value()) ?? null,\n );\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // CVA\n private _onChange: (v: string | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: string | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n toggle(): void {\n if (!this.isDisabledFinal()) this.isOpen.update((v) => !v);\n if (this.isOpen()) {\n this.syncPanelPosition();\n this.focusFirstOption();\n } else {\n this.resetPanelPosition();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n /** Abre el panel y navega con flechas desde el trigger / Opens the panel and navigates with arrows from the trigger */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.isOpen.set(true);\n this.syncPanelPosition();\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n clearValue(event: MouseEvent): void {\n event.stopPropagation();\n this._value.set(null);\n this._onChange(null);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this._onTouched();\n this.selectionChange.emit(null);\n this.close();\n }\n\n selectOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n this._value.set(option.value);\n this._onChange(option.value);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, option.value);\n this.selectionChange.emit(option);\n this.close();\n }\n\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n requestAnimationFrame(() => {\n const trigger =\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger');\n if (!trigger) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const configuratorControls = trigger.closest<HTMLElement>('.demo-configurator__controls');\n const controlsDisplay = configuratorControls\n ? window.getComputedStyle(configuratorControls).display\n : null;\n const boundaryRect =\n controlsDisplay === 'grid' ? null : configuratorControls?.getBoundingClientRect();\n const boundaryTop = boundaryRect\n ? Math.max(boundaryRect.top, this._viewportMargin)\n : this._viewportMargin;\n const boundaryBottom = boundaryRect\n ? Math.min(boundaryRect.bottom, viewportHeight - this._viewportMargin)\n : viewportHeight - this._viewportMargin;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const left = Math.min(\n Math.max(triggerRect.left, this._viewportMargin),\n viewportWidth - this._viewportMargin - width,\n );\n const availableBelow = Math.max(0, boundaryBottom - triggerRect.bottom - gap);\n const availableAbove = Math.max(0, triggerRect.top - boundaryTop - gap);\n const openAbove = availableAbove > availableBelow && availableAbove >= 140;\n const maxHeight = Math.max(140, openAbove ? availableAbove : availableBelow);\n\n this.panelPosition.set({\n position: 'fixed',\n top: openAbove ? 'auto' : `${triggerRect.bottom + gap}px`,\n bottom: openAbove ? `${viewportHeight - triggerRect.top + gap}px` : 'auto',\n left: `${left}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n this.isPanelAbove.set(openAbove);\n\n if (this.virtualScroll()) {\n this._viewport()?.checkViewportSize();\n }\n });\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n requestAnimationFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n );\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n );\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n this.isPanelAbove.set(false);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"neural-ui-core-select.mjs","sources":["../../../../projects/ui-core/select/neu-select.directives.ts","../../../../projects/ui-core/select/neu-select.component.ts","../../../../projects/ui-core/select/neural-ui-core-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { NeuSelectOption } from './neu-select.types';\n\n/**\n * Directiva para personalizar el template de cada ítem del dropdown.\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectItem let-item>\n * <span class=\"flag flag-{{ item.value }}\"></span>\n * {{ item.label }}\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectItem]', standalone: true })\nexport class NeuSelectItemDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption }>>(TemplateRef);\n}\n\n/**\n * Directiva para personalizar el template del ítem seleccionado (trigger).\n *\n * Uso:\n * ```html\n * <neu-select [options]=\"opts\" [formControl]=\"valueCtrl\">\n * <ng-template neuSelectSelected let-item>\n * <strong>{{ item?.label }}</strong>\n * </ng-template>\n * </neu-select>\n * ```\n */\n@Directive({ selector: '[neuSelectSelected]', standalone: true })\nexport class NeuSelectSelectedDirective {\n readonly templateRef = inject<TemplateRef<{ $implicit: NeuSelectOption | null }>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Signal,\n ViewEncapsulation,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NeuUrlStateService } from '@neural-ui/core/url-state';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NeuSelectOption } from './neu-select.types';\nimport { NeuSelectItemDirective, NeuSelectSelectedDirective } from './neu-select.directives';\n\nexport type { NeuSelectOption } from './neu-select.types';\n\nlet _neuSelectIdSeq = 0;\n\n/**\n * NeuralUI Select Component\n *\n * Dropdown personalizado con soporte para ControlValueAccessor y Reactive Forms.\n * Puede usarse dentro de un FormGroup o con un FormControl standalone.\n * Cierra automáticamente al hacer clic fuera del componente.\n *\n * Uso:\n * readonly countryCtrl = new FormControl<string | null>(null);\n * <neu-select label=\"País\" [options]=\"paises\" [formControl]=\"countryCtrl\" />\n *\n * Uso standalone fuera de un formulario completo:\n * readonly sortCtrl = new FormControl<string | null>('name');\n * <neu-select label=\"Orden\" [options]=\"sortOptions\" [formControl]=\"sortCtrl\" />\n */\n@Component({\n selector: 'neu-select',\n imports: [NgTemplateOutlet, ScrollingModule],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuSelectComponent),\n multi: true,\n },\n ],\n host: {\n '(document:click)': 'onDocumentClick($event)',\n '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\n '(window:scroll)': 'onWindowScroll()',\n },\n template: `\n @if (!floatingLabel() && label()) {\n <label class=\"neu-select__static-label\" [for]=\"_triggerId\" (click)=\"focusTrigger()\">{{\n label()\n }}</label>\n }\n <div\n class=\"neu-select\"\n [class.neu-select--open]=\"isOpen()\"\n [class.neu-select--open-above]=\"isPanelAbove()\"\n [class.neu-select--disabled]=\"isDisabledFinal()\"\n [class.neu-select--error]=\"hasError()\"\n [class.neu-select--has-value]=\"!!_value()\"\n [class.neu-select--has-placeholder]=\"!!placeholder() && !_value()\"\n [class.neu-select--no-float]=\"!floatingLabel()\"\n [class.neu-select--sm]=\"size() === 'sm'\"\n [class.neu-select--lg]=\"size() === 'lg'\"\n [style.--neu-select-option-height]=\"virtualScrollItemSize() + 'px'\"\n >\n <!-- Trigger ------>\n <div\n class=\"neu-select__trigger\"\n [id]=\"_triggerId\"\n [attr.tabindex]=\"isDisabledFinal() ? '-1' : '0'\"\n [attr.role]=\"'combobox'\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen() ? 'true' : 'false'\"\n [attr.aria-controls]=\"_panelId\"\n [attr.aria-disabled]=\"isDisabledFinal() ? 'true' : null\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-activedescendant]=\"isOpen() && _value() ? 'neu-select-opt-' + _value() : null\"\n [attr.aria-label]=\"label() || placeholder() || null\"\n (click)=\"toggle()\"\n (keydown.arrowDown)=\"onTriggerKey($any($event))\"\n (keydown.arrowUp)=\"onTriggerKey($any($event))\"\n (keydown.enter)=\"onTriggerActionKey($any($event))\"\n (keydown.space)=\"onTriggerActionKey($any($event))\"\n >\n <!-- Floating label -->\n @if (floatingLabel() && label()) {\n <span class=\"neu-select__label\">{{ label() }}</span>\n }\n\n <span class=\"neu-select__value\">\n @if (selectedLabel()) {\n @if (selectedItemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"selectedItemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: _selectedOption() }\"\n />\n } @else {\n {{ selectedLabel() }}\n }\n } @else {\n <span class=\"neu-select__placeholder\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Clear button -->\n @if (clearable() && !!_value() && !isDisabledFinal()) {\n <button\n class=\"neu-select__clear\"\n type=\"button\"\n aria-label=\"Limpiar selección\"\n [attr.aria-label]=\"clearAriaLabel()\"\n (click)=\"clearValue($event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n }\n\n <!-- Chevron -->\n <svg\n class=\"neu-select__chevron\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </div>\n\n <!-- Panel ------>\n @if (isOpen()) {\n <div\n class=\"neu-select__panel\"\n [class.neu-select__panel--above]=\"isPanelAbove()\"\n [class.neu-select__panel--virtual]=\"virtualScroll()\"\n role=\"listbox\"\n [id]=\"_panelId\"\n [attr.aria-label]=\"label()\"\n [style.position]=\"panelPosition().position\"\n [style.top]=\"panelPosition().top\"\n [style.bottom]=\"panelPosition().bottom\"\n [style.left]=\"panelPosition().left\"\n [style.width]=\"panelPosition().width\"\n [style.max-height]=\"panelPosition().maxHeight\"\n >\n @if (searchable()) {\n <div class=\"neu-select__search\">\n <input\n class=\"neu-select__search-input\"\n type=\"text\"\n [attr.aria-label]=\"'Search ' + label()\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"searchQuery.set($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @if (virtualScroll()) {\n <cdk-virtual-scroll-viewport\n class=\"neu-select__viewport\"\n [itemSize]=\"virtualScrollItemSize()\"\n [style.height]=\"virtualViewportHeight()\"\n >\n <div\n *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackByOptionValue\"\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (option of filteredOptions(); track option.value) {\n <div\n class=\"neu-select__option\"\n [class.neu-select__option--selected]=\"option.value === _value()\"\n [class.neu-select__option--disabled]=\"option.disabled\"\n role=\"option\"\n [id]=\"'neu-select-opt-' + option.value\"\n [attr.aria-selected]=\"option.value === _value()\"\n [attr.aria-disabled]=\"option.disabled\"\n [attr.tabindex]=\"option.disabled ? null : '-1'\"\n (click)=\"selectOption(option)\"\n (keydown.enter)=\"selectOption(option)\"\n (keydown.space)=\"selectOption(option)\"\n (keydown.arrowDown)=\"focusOptionByIndex($any($event), option, 1)\"\n (keydown.arrowUp)=\"focusOptionByIndex($any($event), option, -1)\"\n >\n <!-- Checkmark en la seleccionada (siempre reserva el espacio) -->\n <svg\n class=\"neu-select__check\"\n [style.visibility]=\"option.value === _value() ? 'visible' : 'hidden'\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n @if (itemTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"itemTpl()!.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option }\"\n />\n } @else {\n {{ option.label }}\n }\n </div>\n }\n }\n @if (filteredOptions().length === 0) {\n <div class=\"neu-select__empty\">{{ noResultsMessage() }}</div>\n }\n </div>\n }\n <div class=\"neu-select__sr-status\" aria-live=\"polite\" aria-atomic=\"true\">\n {{ resultsAnnouncement() }}\n </div>\n </div>\n\n <!-- Error / hint -->\n @if (hasError()) {\n <p class=\"neu-select__error\" [id]=\"_triggerId + '-error'\" role=\"alert\">\n {{ errorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-select__hint\" [id]=\"_triggerId + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-select.component.scss',\n})\nexport class NeuSelectComponent implements ControlValueAccessor {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _urlState = inject(NeuUrlStateService);\n private readonly _mobileViewportMax = 768;\n private readonly _viewportMargin = 16;\n private readonly _panelMaxHeight = 240;\n private readonly _urlParamSignals = new Map<string, Signal<string | null>>();\n private readonly _viewport = viewChild(CdkVirtualScrollViewport);\n\n private _getUrlParamSignal(key: string): Signal<string | null> {\n let paramSignal = this._urlParamSignals.get(key);\n if (!paramSignal) {\n paramSignal = this._urlState.getParam(key);\n this._urlParamSignals.set(key, paramSignal);\n }\n return paramSignal;\n }\n\n constructor() {\n effect(() => {\n const param = this.urlParam();\n if (!param) return;\n const urlVal = this._getUrlParamSignal(param)();\n if (urlVal !== untracked(() => this._value())) {\n untracked(() => {\n this._value.set(urlVal);\n this._onChange(urlVal);\n });\n }\n });\n }\n /** @internal — ID \\u00fanico para asociar label con trigger */\n readonly _triggerId = `neu-select-trigger-${_neuSelectIdSeq++}`;\n readonly _panelId = `${this._triggerId}-panel`;\n /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */\n readonly itemTpl = contentChild(NeuSelectItemDirective);\n\n /** Template personalizado para el valor seleccionado en el trigger / Custom template for the selected value in the trigger */\n readonly selectedItemTpl = contentChild(NeuSelectSelectedDirective);\n /** Opciones del dropdown / Dropdown options */\n options = input<NeuSelectOption[]>([]);\n\n /** Texto del floating label / Floating label text */\n label = input<string>('');\n\n /** Placeholder cuando no hay selección / Placeholder when there is no selection */\n placeholder = input<string>('Seleccionar...');\n\n /** Mensaje de error / Error message */\n errorMessage = input<string>('');\n\n /** Texto de ayuda bajo el campo / Helper text below the field */\n hint = input<string>('');\n\n /** Deshabilita el select / Disables the select */\n disabled = input<boolean>(false);\n\n /** Muestra el label como flotante (true) o como label estático encima (false, por defecto) / Shows the label as floating (true) or static above (false, default) */\n floatingLabel = input<boolean>(false);\n /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */\n size = input<'sm' | 'md' | 'lg'>('md');\n /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */\n searchable = input<boolean>(false);\n\n /** Placeholder del input de búsqueda / Search input placeholder */\n searchPlaceholder = input<string>('Buscar...');\n\n /** Muestra un botón para limpiar la selección / Shows a button to clear the selection */\n clearable = input<boolean>(false);\n\n /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */\n virtualScroll = input<boolean>(false);\n\n /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */\n virtualScrollVisibleItems = input<number>(8);\n\n /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */\n noResultsMessage = input<string>('Sin resultados');\n\n /** Aria-label del botón de limpiar / Aria-label for the clear button */\n clearAriaLabel = input<string>('Limpiar selección');\n\n /**\n * Sincroniza el valor seleccionado con este query param de la URL.\n * Al seleccionar una opción se añade `?{urlParam}=value` a la URL.\n * Pasar `null` (default) deshabilita la sincronización.\n */\n urlParam = input<string | null>(null);\n\n /**\n * Emite el objeto NeuSelectOption completo (incluyendo data) al seleccionar una opción.\n * Emite null al limpiar la selección.\n * El valor del formControl sigue siendo string.\n */\n readonly selectionChange = output<NeuSelectOption | null>();\n\n // Estado interno\n protected readonly _value = signal<string | null>(null);\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly panelPosition = signal<{\n position: string | null;\n top: string | null;\n bottom: string | null;\n left: string | null;\n width: string | null;\n maxHeight: string | null;\n }>({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n readonly isPanelAbove = signal(false);\n\n readonly hasError = computed(() => !!this.errorMessage());\n\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this._triggerId}-error`;\n }\n if (this.hint()) {\n return `${this._triggerId}-hint`;\n }\n return null;\n });\n\n readonly filteredOptions = computed(() => {\n const q = this.searchQuery().toLowerCase().trim();\n if (!q) return this.options();\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\n });\n\n readonly selectedLabel = computed(\n () => this.options().find((o) => o.value === this._value())?.label ?? null,\n );\n\n readonly _selectedOption = computed(\n () => this.options().find((o) => o.value === this._value()) ?? null,\n );\n\n readonly resultsAnnouncement = computed(() => {\n if (!this.isOpen()) {\n return '';\n }\n\n const total = this.filteredOptions().length;\n if (!total) {\n return this.noResultsMessage();\n }\n\n return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;\n });\n\n readonly virtualScrollItemSize = computed(() => {\n switch (this.size()) {\n case 'sm':\n return 36;\n case 'lg':\n return 52;\n default:\n return 44;\n }\n });\n\n readonly virtualViewportHeight = computed(() => {\n const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();\n const panelMaxHeight = this.panelPosition().maxHeight;\n const searchOffset = this.searchable() ? 52 : 0;\n\n const parsedMaxHeight = panelMaxHeight\n ? Number.parseFloat(panelMaxHeight)\n : this._panelMaxHeight;\n if (Number.isNaN(parsedMaxHeight)) {\n return `${Math.min(desiredHeight, this._panelMaxHeight - searchOffset)}px`;\n }\n\n const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);\n const availableHeight = Math.max(\n this.virtualScrollItemSize(),\n effectivePanelMaxHeight - searchOffset,\n );\n return `${Math.min(desiredHeight, availableHeight)}px`;\n });\n\n readonly trackByOptionValue = (_index: number, option: NeuSelectOption) => option.value;\n\n // CVA\n private _onChange: (v: string | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(val: string | null): void {\n this._value.set(val ?? null);\n }\n\n registerOnChange(fn: (v: string | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n private readonly _cvaDisabled = signal(false);\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n readonly isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled());\n\n toggle(): void {\n if (this.isDisabledFinal()) return;\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n } else {\n this.isOpen.set(false);\n this.resetPanelPosition();\n }\n }\n\n close(): void {\n this.isOpen.set(false);\n this.searchQuery.set('');\n this.resetPanelPosition();\n this._onTouched();\n }\n\n /** Abre el panel y navega con flechas desde el trigger / Opens the panel and navigates with arrows from the trigger */\n onTriggerKey(event: Event): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n if (!this.isOpen()) {\n this.syncPanelPosition();\n this.isOpen.set(true);\n this.focusFirstOption();\n }\n }\n\n onTriggerActionKey(event: KeyboardEvent): void {\n if (event.target !== event.currentTarget) {\n return;\n }\n event.preventDefault();\n this.toggle();\n }\n\n focusTrigger(): void {\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger')?.focus();\n }\n\n /** Navega entre opciones con flechas / Navigates between options with arrows */\n focusOptionByIndex(event: Event, current: NeuSelectOption, dir: 1 | -1): void {\n event.preventDefault();\n const opts = this.filteredOptions().filter((o) => !o.disabled);\n const idx = opts.findIndex((o) => o.value === current.value);\n const next = opts[(idx + dir + opts.length) % opts.length];\n if (next) {\n this.focusOption(next.value);\n }\n }\n\n clearValue(event: MouseEvent): void {\n event.stopPropagation();\n this._value.set(null);\n this._onChange(null);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, null);\n this._onTouched();\n this.selectionChange.emit(null);\n this.close();\n }\n\n selectOption(option: NeuSelectOption): void {\n if (option.disabled) return;\n this._value.set(option.value);\n this._onChange(option.value);\n const param = this.urlParam();\n if (param) this._urlState.setParam(param, option.value);\n this.selectionChange.emit(option);\n this.close();\n }\n\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n onWindowResize(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n onWindowScroll(): void {\n if (this.isOpen()) {\n this.syncPanelPosition();\n }\n }\n\n private syncPanelPosition(): void {\n const trigger =\n this.elementRef.nativeElement.querySelector<HTMLElement>('.neu-select__trigger');\n if (!trigger) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const configuratorControls = trigger.closest<HTMLElement>('.demo-configurator__controls');\n const controlsDisplay = configuratorControls\n ? window.getComputedStyle(configuratorControls).display\n : null;\n const boundaryRect =\n controlsDisplay === 'grid' ? null : configuratorControls?.getBoundingClientRect();\n const boundaryTop = boundaryRect\n ? Math.max(boundaryRect.top, this._viewportMargin)\n : this._viewportMargin;\n const boundaryBottom = boundaryRect\n ? Math.min(boundaryRect.bottom, viewportHeight - this._viewportMargin)\n : viewportHeight - this._viewportMargin;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const left = Math.min(\n Math.max(triggerRect.left, this._viewportMargin),\n viewportWidth - this._viewportMargin - width,\n );\n const availableBelow = Math.max(0, boundaryBottom - triggerRect.bottom - gap);\n const availableAbove = Math.max(0, triggerRect.top - boundaryTop - gap);\n const openAbove = availableAbove > availableBelow && availableAbove >= 140;\n const maxHeight = Math.max(140, openAbove ? availableAbove : availableBelow);\n\n this.panelPosition.set({\n position: 'fixed',\n top: openAbove ? 'auto' : `${triggerRect.bottom + gap}px`,\n bottom: openAbove ? `${viewportHeight - triggerRect.top + gap}px` : 'auto',\n left: `${left}px`,\n width: `${width}px`,\n maxHeight: `${maxHeight}px`,\n });\n this.isPanelAbove.set(openAbove);\n\n if (this.virtualScroll()) {\n requestAnimationFrame(() => this._viewport()?.checkViewportSize());\n }\n }\n\n private focusFirstOption(): void {\n const firstEnabled = this.filteredOptions().find((option) => !option.disabled);\n if (!firstEnabled) {\n return;\n }\n\n this.focusOption(firstEnabled.value);\n }\n\n private focusOption(value: string): void {\n if (this.virtualScroll()) {\n const optionIndex = this.filteredOptions().findIndex((option) => option.value === value);\n if (optionIndex >= 0) {\n this._viewport()?.scrollToIndex(optionIndex, 'auto');\n this._viewport()?.checkViewportSize();\n }\n requestAnimationFrame(() => {\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n );\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement = this.elementRef.nativeElement.querySelector<HTMLElement>(\n `#neu-select-opt-${value}`,\n );\n optionElement?.focus();\n }\n\n private resetPanelPosition(): void {\n this.panelPosition.set({\n position: null,\n top: null,\n bottom: null,\n left: null,\n width: null,\n maxHeight: null,\n });\n this.isPanelAbove.set(false);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
package/nav/package.json
ADDED
package/package.json
CHANGED