@neural-ui/core 1.6.1 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/accordion/package.json +4 -0
  2. package/alert/package.json +4 -0
  3. package/autocomplete/package.json +4 -0
  4. package/avatar/package.json +4 -0
  5. package/badge/package.json +4 -0
  6. package/block-ui/package.json +4 -0
  7. package/breadcrumb/package.json +4 -0
  8. package/button/package.json +4 -0
  9. package/calendar/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +7 -11
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-alert.mjs +14 -25
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-avatar.mjs +13 -23
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-badge.mjs +9 -15
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-button.mjs +16 -29
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-calendar.mjs +20 -37
  40. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-card.mjs +8 -13
  42. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-chart.mjs +24 -45
  44. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
  46. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-chip.mjs +13 -23
  48. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-code-block.mjs +17 -31
  50. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
  52. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
  54. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  56. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-context-menu.mjs +9 -12
  58. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  59. package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
  60. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  61. package/fesm2022/neural-ui-core-date-input.mjs +57 -111
  62. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-divider.mjs +5 -7
  64. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
  66. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  67. package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
  68. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  69. package/fesm2022/neural-ui-core-icon.mjs +7 -11
  70. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  71. package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
  72. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
  74. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
  76. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  77. package/fesm2022/neural-ui-core-input.mjs +35 -67
  78. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  79. package/fesm2022/neural-ui-core-kanban.mjs +9 -15
  80. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  81. package/fesm2022/neural-ui-core-knob.mjs +22 -41
  82. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  83. package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
  84. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  85. package/fesm2022/neural-ui-core-modal.mjs +11 -16
  86. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  87. package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
  88. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  89. package/fesm2022/neural-ui-core-nav.mjs +13 -22
  90. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  91. package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
  92. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  93. package/fesm2022/neural-ui-core-number-input.mjs +19 -35
  94. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  95. package/fesm2022/neural-ui-core-pagination.mjs +9 -15
  96. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  97. package/fesm2022/neural-ui-core-popover.mjs +14 -22
  98. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  99. package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
  100. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  101. package/fesm2022/neural-ui-core-radio.mjs +15 -24
  102. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  103. package/fesm2022/neural-ui-core-rating.mjs +8 -13
  104. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  105. package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
  106. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
  107. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
  108. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  109. package/fesm2022/neural-ui-core-select.mjs +43 -77
  110. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  111. package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
  112. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  113. package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
  114. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  115. package/fesm2022/neural-ui-core-slider.mjs +13 -23
  116. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  117. package/fesm2022/neural-ui-core-spinner.mjs +10 -17
  118. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  119. package/fesm2022/neural-ui-core-split-button.mjs +15 -27
  120. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  121. package/fesm2022/neural-ui-core-splitter.mjs +6 -9
  122. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  123. package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
  124. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  125. package/fesm2022/neural-ui-core-stepper.mjs +8 -13
  126. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  127. package/fesm2022/neural-ui-core-switch.mjs +9 -15
  128. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  129. package/fesm2022/neural-ui-core-table.mjs +124 -242
  130. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  131. package/fesm2022/neural-ui-core-tabs.mjs +18 -30
  132. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  133. package/fesm2022/neural-ui-core-textarea.mjs +23 -43
  134. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  135. package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
  136. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  137. package/fesm2022/neural-ui-core-timeline.mjs +4 -5
  138. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  139. package/fesm2022/neural-ui-core-toast.mjs +8 -10
  140. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  141. package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
  142. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  143. package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
  144. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  145. package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
  146. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  147. package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
  148. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  149. package/fesm2022/neural-ui-core-tree.mjs +17 -31
  150. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  151. package/fesm2022/neural-ui-core-uploader.mjs +47 -91
  152. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  153. package/fesm2022/neural-ui-core-url-state.mjs +5 -7
  154. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  155. package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
  156. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  157. package/filter-bar/package.json +4 -0
  158. package/icon/package.json +4 -0
  159. package/image-gallery/package.json +4 -0
  160. package/image-viewer/package.json +4 -0
  161. package/input/package.json +4 -0
  162. package/input-otp/package.json +4 -0
  163. package/kanban/package.json +4 -0
  164. package/knob/package.json +4 -0
  165. package/meter-group/package.json +4 -0
  166. package/modal/package.json +4 -0
  167. package/multiselect/package.json +4 -0
  168. package/nav/package.json +4 -0
  169. package/notification-center/package.json +4 -0
  170. package/number-input/package.json +4 -0
  171. package/package.json +6 -6
  172. package/pagination/package.json +4 -0
  173. package/popover/package.json +4 -0
  174. package/progress-bar/package.json +4 -0
  175. package/radio/package.json +4 -0
  176. package/rating/package.json +4 -0
  177. package/rich-text-editor/package.json +4 -0
  178. package/scheduler-gantt/package.json +4 -0
  179. package/select/package.json +4 -0
  180. package/sidebar/package.json +4 -0
  181. package/skeleton/package.json +4 -0
  182. package/slider/package.json +4 -0
  183. package/spinner/package.json +4 -0
  184. package/split-button/package.json +4 -0
  185. package/splitter/package.json +4 -0
  186. package/stats-card/package.json +4 -0
  187. package/stepper/package.json +4 -0
  188. package/switch/package.json +4 -0
  189. package/table/package.json +4 -0
  190. package/tabs/package.json +4 -0
  191. package/textarea/package.json +4 -0
  192. package/timeline/package.json +4 -0
  193. package/timeline-grid/package.json +4 -0
  194. package/toast/package.json +4 -0
  195. package/toggle-button-group/package.json +4 -0
  196. package/toolbar/package.json +4 -0
  197. package/tooltip/package.json +4 -0
  198. package/tree/package.json +4 -0
  199. package/tree-table/package.json +4 -0
  200. package/uploader/package.json +4 -0
  201. package/url-state/package.json +4 -0
  202. package/virtual-list/package.json +4 -0
@@ -22,10 +22,10 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms';
22
22
  */
23
23
  class NeuMultiselectItemDirective {
24
24
  templateRef = inject(TemplateRef);
25
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuMultiselectItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
26
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: NeuMultiselectItemDirective, isStandalone: true, selector: "[neuMultiselectItem]", ngImport: i0 });
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMultiselectItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
26
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: NeuMultiselectItemDirective, isStandalone: true, selector: "[neuMultiselectItem]", ngImport: i0 });
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuMultiselectItemDirective, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMultiselectItemDirective, decorators: [{
29
29
  type: Directive,
30
30
  args: [{ selector: '[neuMultiselectItem]', standalone: true }]
31
31
  }] });
@@ -52,8 +52,7 @@ class NeuMultiselectComponent {
52
52
  _viewportMargin = 16;
53
53
  _panelMaxHeight = 280;
54
54
  _urlParamSignals = new Map();
55
- _viewport = viewChild(CdkVirtualScrollViewport, /* @ts-ignore */
56
- ...(ngDevMode ? [{ debugName: "_viewport" }] : /* istanbul ignore next */ []));
55
+ _viewport = viewChild(CdkVirtualScrollViewport, ...(ngDevMode ? [{ debugName: "_viewport" }] : /* istanbul ignore next */ []));
57
56
  _getUrlParamSignal(key) {
58
57
  let paramSignal = this._urlParamSignals.get(key);
59
58
  if (!paramSignal) {
@@ -82,63 +81,45 @@ class NeuMultiselectComponent {
82
81
  _triggerId = `neu-multiselect-trigger-${_neuMultiselectIdSeq++}`;
83
82
  _panelId = `${this._triggerId}-panel`;
84
83
  /** Template personalizado para cada opción del dropdown / Custom template for each dropdown option */
85
- itemTpl = contentChild(NeuMultiselectItemDirective, /* @ts-ignore */
86
- ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
84
+ itemTpl = contentChild(NeuMultiselectItemDirective, ...(ngDevMode ? [{ debugName: "itemTpl" }] : /* istanbul ignore next */ []));
87
85
  /** Opciones del dropdown / Dropdown options */
88
- options = input([], /* @ts-ignore */
89
- ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
86
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
90
87
  /** Etiqueta del componente / Component label */
91
- label = input('', /* @ts-ignore */
92
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
88
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
93
89
  /** 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) */
94
- floatingLabel = input(false, /* @ts-ignore */
95
- ...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
90
+ floatingLabel = input(false, ...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
96
91
  /** Tamaño del campo: 'sm' = 36px | 'md' = 48px | 'lg' = 56px / Field size */
97
- size = input('md', /* @ts-ignore */
98
- ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
92
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
99
93
  /** Placeholder cuando no hay selección / Placeholder when there is no selection */
100
- placeholder = input('Seleccionar...', /* @ts-ignore */
101
- ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
94
+ placeholder = input('Seleccionar...', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
102
95
  /** Mensaje de error / Error message */
103
- errorMessage = input('', /* @ts-ignore */
104
- ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
96
+ errorMessage = input('', ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
105
97
  /** Texto de ayuda bajo el campo / Helper text below the field */
106
- hint = input('', /* @ts-ignore */
107
- ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
98
+ hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
108
99
  /** Deshabilita el componente / Disables the component */
109
- disabled = input(false, /* @ts-ignore */
110
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
100
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
111
101
  /** Activa input de búsqueda/filtro en el panel / Activates the search/filter input in the panel */
112
- searchable = input(false, /* @ts-ignore */
113
- ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
102
+ searchable = input(false, ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
114
103
  /** Placeholder del input de búsqueda / Search input placeholder */
115
- searchPlaceholder = input('Buscar...', /* @ts-ignore */
116
- ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
104
+ searchPlaceholder = input('Buscar...', ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
117
105
  /** Texto cuando no hay opciones tras filtrar / Text when no options remain after filtering */
118
- noResultsMessage = input('Sin resultados', /* @ts-ignore */
119
- ...(ngDevMode ? [{ debugName: "noResultsMessage" }] : /* istanbul ignore next */ []));
106
+ noResultsMessage = input('Sin resultados', ...(ngDevMode ? [{ debugName: "noResultsMessage" }] : /* istanbul ignore next */ []));
120
107
  /** Texto del botón de limpiar todas las selecciones / Button text to clear all selections */
121
- clearAllLabel = input('Limpiar todo', /* @ts-ignore */
122
- ...(ngDevMode ? [{ debugName: "clearAllLabel" }] : /* istanbul ignore next */ []));
108
+ clearAllLabel = input('Limpiar todo', ...(ngDevMode ? [{ debugName: "clearAllLabel" }] : /* istanbul ignore next */ []));
123
109
  /** 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 */
124
- clearable = input(false, /* @ts-ignore */
125
- ...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
110
+ clearable = input(false, ...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
126
111
  /** Habilita scroll virtual para listas largas / Enables virtual scrolling for large option lists */
127
- virtualScroll = input(false, /* @ts-ignore */
128
- ...(ngDevMode ? [{ debugName: "virtualScroll" }] : /* istanbul ignore next */ []));
112
+ virtualScroll = input(false, ...(ngDevMode ? [{ debugName: "virtualScroll" }] : /* istanbul ignore next */ []));
129
113
  /** Número de opciones visibles en el viewport virtual / Number of visible options in the virtual viewport */
130
- virtualScrollVisibleItems = input(8, /* @ts-ignore */
131
- ...(ngDevMode ? [{ debugName: "virtualScrollVisibleItems" }] : /* istanbul ignore next */ []));
114
+ virtualScrollVisibleItems = input(8, ...(ngDevMode ? [{ debugName: "virtualScrollVisibleItems" }] : /* istanbul ignore next */ []));
132
115
  /** Aria-label del botón clear que aparece en el trigger / Aria-label for the clear button shown in the trigger */
133
- clearAriaLabel = input('Limpiar selección', /* @ts-ignore */
134
- ...(ngDevMode ? [{ debugName: "clearAriaLabel" }] : /* istanbul ignore next */ []));
116
+ clearAriaLabel = input('Limpiar selección', ...(ngDevMode ? [{ debugName: "clearAriaLabel" }] : /* istanbul ignore next */ []));
135
117
  /**
136
118
  * Sincroniza los valores seleccionados con este query param de la URL.
137
119
  * Los valores se codifican como lista separada por comas: `?{urlParam}=a,b,c`.
138
120
  * Pasar `null` (default) deshabilita la sincronización.
139
121
  */
140
- urlParam = input(null, /* @ts-ignore */
141
- ...(ngDevMode ? [{ debugName: "urlParam" }] : /* istanbul ignore next */ []));
122
+ urlParam = input(null, ...(ngDevMode ? [{ debugName: "urlParam" }] : /* istanbul ignore next */ []));
142
123
  /**
143
124
  * Emite el array de NeuSelectOption completo (incluyendo data) al cambiar la selección.
144
125
  * Emite [] al limpiar toda la selección.
@@ -146,14 +127,10 @@ class NeuMultiselectComponent {
146
127
  */
147
128
  selectionChange = output();
148
129
  // --- Estado interno ---
149
- _values = signal([], /* @ts-ignore */
150
- ...(ngDevMode ? [{ debugName: "_values" }] : /* istanbul ignore next */ []));
151
- isOpen = signal(false, /* @ts-ignore */
152
- ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
153
- searchQuery = signal('', /* @ts-ignore */
154
- ...(ngDevMode ? [{ debugName: "searchQuery" }] : /* istanbul ignore next */ []));
155
- _chipMode = signal('count', /* @ts-ignore */
156
- ...(ngDevMode ? [{ debugName: "_chipMode" }] : /* istanbul ignore next */ []));
130
+ _values = signal([], ...(ngDevMode ? [{ debugName: "_values" }] : /* istanbul ignore next */ []));
131
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
132
+ searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : /* istanbul ignore next */ []));
133
+ _chipMode = signal('count', ...(ngDevMode ? [{ debugName: "_chipMode" }] : /* istanbul ignore next */ []));
157
134
  overlayPositions = [
158
135
  {
159
136
  originX: 'start',
@@ -191,12 +168,9 @@ class NeuMultiselectComponent {
191
168
  left: null,
192
169
  width: null,
193
170
  maxHeight: null,
194
- }, /* @ts-ignore */
195
- ...(ngDevMode ? [{ debugName: "panelPosition" }] : /* istanbul ignore next */ []));
196
- _visibleChips = computed(() => this._values().slice(0, 3), /* @ts-ignore */
197
- ...(ngDevMode ? [{ debugName: "_visibleChips" }] : /* istanbul ignore next */ []));
198
- hasError = computed(() => !!this.errorMessage(), /* @ts-ignore */
199
- ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
171
+ }, ...(ngDevMode ? [{ debugName: "panelPosition" }] : /* istanbul ignore next */ []));
172
+ _visibleChips = computed(() => this._values().slice(0, 3), ...(ngDevMode ? [{ debugName: "_visibleChips" }] : /* istanbul ignore next */ []));
173
+ hasError = computed(() => !!this.errorMessage(), ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
200
174
  describedBy = computed(() => {
201
175
  if (this.hasError()) {
202
176
  return `${this._triggerId}-error`;
@@ -205,15 +179,13 @@ class NeuMultiselectComponent {
205
179
  return `${this._triggerId}-hint`;
206
180
  }
207
181
  return null;
208
- }, /* @ts-ignore */
209
- ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
182
+ }, ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
210
183
  filteredOptions = computed(() => {
211
184
  const q = this.searchQuery().toLowerCase().trim();
212
185
  if (!q)
213
186
  return this.options();
214
187
  return this.options().filter((o) => o.label.toLowerCase().includes(q));
215
- }, /* @ts-ignore */
216
- ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
188
+ }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
217
189
  resultsAnnouncement = computed(() => {
218
190
  if (!this.isOpen()) {
219
191
  return '';
@@ -223,8 +195,7 @@ class NeuMultiselectComponent {
223
195
  return this.noResultsMessage();
224
196
  }
225
197
  return total === 1 ? '1 opción disponible' : `${total} opciones disponibles`;
226
- }, /* @ts-ignore */
227
- ...(ngDevMode ? [{ debugName: "resultsAnnouncement" }] : /* istanbul ignore next */ []));
198
+ }, ...(ngDevMode ? [{ debugName: "resultsAnnouncement" }] : /* istanbul ignore next */ []));
228
199
  virtualScrollItemSize = computed(() => {
229
200
  switch (this.size()) {
230
201
  case 'sm':
@@ -234,8 +205,7 @@ class NeuMultiselectComponent {
234
205
  default:
235
206
  return 44;
236
207
  }
237
- }, /* @ts-ignore */
238
- ...(ngDevMode ? [{ debugName: "virtualScrollItemSize" }] : /* istanbul ignore next */ []));
208
+ }, ...(ngDevMode ? [{ debugName: "virtualScrollItemSize" }] : /* istanbul ignore next */ []));
239
209
  virtualViewportHeight = computed(() => {
240
210
  const desiredHeight = this.virtualScrollVisibleItems() * this.virtualScrollItemSize();
241
211
  const panelMaxHeight = this.panelPosition().maxHeight;
@@ -250,8 +220,7 @@ class NeuMultiselectComponent {
250
220
  const effectivePanelMaxHeight = Math.min(this._panelMaxHeight, parsedMaxHeight);
251
221
  const availableHeight = Math.max(this.virtualScrollItemSize(), effectivePanelMaxHeight - searchOffset - footerOffset);
252
222
  return `${Math.min(desiredHeight, availableHeight)}px`;
253
- }, /* @ts-ignore */
254
- ...(ngDevMode ? [{ debugName: "virtualViewportHeight" }] : /* istanbul ignore next */ []));
223
+ }, ...(ngDevMode ? [{ debugName: "virtualViewportHeight" }] : /* istanbul ignore next */ []));
255
224
  trackByOptionValue = (_index, option) => option.value;
256
225
  // --- CVA ---
257
226
  _onChange = () => { };
@@ -265,13 +234,11 @@ class NeuMultiselectComponent {
265
234
  registerOnTouched(fn) {
266
235
  this._onTouched = fn;
267
236
  }
268
- _cvaDisabled = signal(false, /* @ts-ignore */
269
- ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
237
+ _cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []));
270
238
  setDisabledState(isDisabled) {
271
239
  this._cvaDisabled.set(isDisabled);
272
240
  }
273
- isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled(), /* @ts-ignore */
274
- ...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
241
+ isDisabledFinal = computed(() => this.disabled() || this._cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabledFinal" }] : /* istanbul ignore next */ []));
275
242
  // --- Helpers ---
276
243
  labelFor(value) {
277
244
  return this.options().find((o) => o.value === value)?.label ?? value;
@@ -456,8 +423,8 @@ class NeuMultiselectComponent {
456
423
  this._viewport()?.checkViewportSize();
457
424
  });
458
425
  }
459
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuMultiselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
460
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuMultiselectComponent, isStandalone: true, selector: "neu-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAllLabel: { classPropertyName: "clearAllLabel", publicName: "clearAllLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, urlParam: { classPropertyName: "urlParam", publicName: "urlParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { listeners: { "keydown.escape": "close()", "window:resize": "onWindowResize()" } }, providers: [
426
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMultiselectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
427
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuMultiselectComponent, isStandalone: true, selector: "neu-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, noResultsMessage: { classPropertyName: "noResultsMessage", publicName: "noResultsMessage", isSignal: true, isRequired: false, transformFunction: null }, clearAllLabel: { classPropertyName: "clearAllLabel", publicName: "clearAllLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollVisibleItems: { classPropertyName: "virtualScrollVisibleItems", publicName: "virtualScrollVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, urlParam: { classPropertyName: "urlParam", publicName: "urlParam", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { listeners: { "keydown.escape": "close()", "window:resize": "onWindowResize()" } }, providers: [
461
428
  {
462
429
  provide: NG_VALUE_ACCESSOR,
463
430
  useExisting: forwardRef(() => NeuMultiselectComponent),
@@ -763,7 +730,7 @@ class NeuMultiselectComponent {
763
730
  }
764
731
  `, isInline: true, styles: [".neu-multiselect__static-label{display:block;font-size:var(--neu-text-sm);font-weight:500;color:var(--neu-text-muted);margin-bottom:var(--neu-space-2)}.neu-multiselect__label{position:absolute;left:var(--neu-space-3);top:50%;transform:translateY(-50%);font-size:var(--neu-text-base);color:var(--neu-text-muted);pointer-events:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - var(--neu-space-8));transition:top var(--neu-transition),font-size var(--neu-transition),color var(--neu-transition),transform var(--neu-transition),padding var(--neu-transition),background var(--neu-transition)}.neu-multiselect--open .neu-multiselect__label,.neu-multiselect--has-value .neu-multiselect__label{top:0;transform:translateY(-50%);font-size:12px;font-weight:600;letter-spacing:.01em;background:var(--neu-surface);padding:0 4px;left:calc(var(--neu-space-3) - 4px)}.neu-multiselect--open .neu-multiselect__label{color:var(--neu-primary)}.neu-multiselect--error .neu-multiselect__label{color:var(--neu-error)}.neu-multiselect--disabled .neu-multiselect__label{background:var(--neu-surface-2)}.neu-multiselect{position:relative;font-family:var(--neu-font-sans)}.neu-multiselect--sm .neu-multiselect__trigger{min-height:36px;font-size:var(--neu-text-sm);padding:var(--neu-space-1) var(--neu-space-2);padding-right:36px}.neu-multiselect--lg .neu-multiselect__trigger{min-height:56px}.neu-multiselect__trigger{display:flex;align-items:center;width:100%;min-height:48px;padding:var(--neu-space-2) var(--neu-space-3);padding-right:36px;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);cursor:pointer;text-align:left;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--neu-border-hover)}.neu-multiselect__trigger:focus-visible{outline:none;border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect__trigger[aria-disabled=true]{opacity:.6;cursor:not-allowed;background:var(--neu-surface-2)}.neu-multiselect--open .neu-multiselect__trigger{border-color:var(--neu-primary);box-shadow:0 0 0 3px #007aff1f}.neu-multiselect--error .neu-multiselect__trigger{border-color:var(--neu-error)}.neu-multiselect--error .neu-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px #ef44441f}.neu-multiselect__chips{display:flex;flex-wrap:wrap;gap:var(--neu-space-1);flex:1;min-width:0}.neu-multiselect__placeholder{color:var(--neu-text-disabled);font-size:var(--neu-text-base);line-height:1.5}.neu-multiselect:not(.neu-multiselect--no-float):not(.neu-multiselect--open) .neu-multiselect__placeholder{visibility:hidden}.neu-multiselect__chip{display:inline-flex;align-items:center;gap:4px;padding:2px 4px 2px 8px;background:var(--neu-primary-soft, rgba(0, 122, 255, .1));color:var(--neu-primary);border-radius:var(--neu-radius-sm);font-size:var(--neu-text-xs);font-weight:500;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.neu-multiselect__chip-remove{display:flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;background:transparent;cursor:pointer;color:inherit;opacity:.7;border-radius:2px;transition:opacity var(--neu-transition);flex-shrink:0}.neu-multiselect__chip-remove:hover{opacity:1}.neu-multiselect__chip-remove:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chip-remove svg{width:10px;height:10px}.neu-multiselect__clear{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:2px;padding:0;border:none;background:transparent;color:var(--neu-text-muted);cursor:pointer;border-radius:var(--neu-radius-sm);flex-shrink:0;transition:color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__clear svg{width:14px;height:14px}.neu-multiselect__clear:hover{color:var(--neu-text);background:var(--neu-surface-3)}.neu-multiselect__clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__chevron{position:absolute;right:var(--neu-space-3);top:50%;transform:translateY(-50%);width:16px;height:16px;color:var(--neu-text-muted);pointer-events:none;transition:transform var(--neu-transition);flex-shrink:0}.neu-multiselect--open .neu-multiselect__chevron{transform:translateY(-50%) rotate(180deg)}.neu-multiselect__panel{position:relative;z-index:200;box-sizing:border-box;width:100%;background:var(--neu-surface);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius);box-shadow:var(--neu-shadow-lg);overflow:hidden;max-height:280px;display:flex;flex-direction:column;animation:neu-multiselect-fade-in .12s ease}.neu-multiselect__panel--virtual{overflow:visible}@media(max-width:600px){.neu-multiselect__panel{left:auto;right:0;width:min(max(100%,240px),100vw - 2rem);max-width:calc(100vw - 2rem)}}@keyframes neu-multiselect-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.neu-multiselect__search{padding:var(--neu-space-2);border-bottom:1px solid var(--neu-border);flex-shrink:0}.neu-multiselect__search-input{width:100%;height:34px;padding:0 var(--neu-space-3);border:1.5px solid var(--neu-border);border-radius:var(--neu-radius-sm);background:var(--neu-bg);font-family:var(--neu-font-sans);font-size:var(--neu-text-sm);color:var(--neu-text);outline:none;transition:border-color var(--neu-transition),box-shadow var(--neu-transition)}.neu-multiselect__search-input:focus{border-color:var(--neu-primary);box-shadow:0 0 0 2px #007aff1f}.neu-multiselect__search-input::placeholder{color:var(--neu-text-disabled)}.neu-multiselect__options{flex:1;overflow-y:auto;min-height:0}.neu-multiselect__panel--virtual .neu-multiselect__options{overflow:hidden}.neu-multiselect__viewport{width:100%}.neu-multiselect__option{display:flex;align-items:center;gap:var(--neu-space-2);padding:10px var(--neu-space-3);min-height:var(--neu-multiselect-option-height, 44px);box-sizing:border-box;cursor:pointer;font-size:var(--neu-text-sm);color:var(--neu-text);transition:background var(--neu-transition)}.neu-multiselect__option:hover:not(.neu-multiselect__option--disabled){background:var(--neu-surface-2)}.neu-multiselect__option--selected{background:var(--neu-primary-soft, rgba(0, 122, 255, .06));color:var(--neu-primary);font-weight:500}.neu-multiselect__option--disabled{opacity:.4;cursor:not-allowed}.neu-multiselect__checkbox{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:3px;border:1.5px solid var(--neu-border);background:var(--neu-bg);flex-shrink:0;transition:border-color var(--neu-transition),background var(--neu-transition)}.neu-multiselect__checkbox--checked{background:var(--neu-primary);border-color:var(--neu-primary);color:#fff}.neu-multiselect__checkbox-check{width:10px;height:8px;opacity:0;transform:scale(.6);transition:opacity .12s ease,transform .12s ease}.neu-multiselect__checkbox--checked .neu-multiselect__checkbox-check{opacity:1;transform:scale(1)}.neu-multiselect__empty{padding:var(--neu-space-4);text-align:center;font-size:var(--neu-text-sm);color:var(--neu-text-disabled);font-family:var(--neu-font-sans)}.neu-multiselect__footer{display:flex;align-items:center;justify-content:space-between;padding:var(--neu-space-2) var(--neu-space-3);border-top:1px solid var(--neu-border);background:var(--neu-surface);flex-shrink:0}.neu-multiselect__footer-count{font-size:var(--neu-text-xs);color:var(--neu-text-muted)}.neu-multiselect__footer-actions{display:flex;align-items:center;gap:var(--neu-space-2)}.neu-multiselect__footer-mode{background:none;border:1px solid var(--neu-border);border-radius:var(--neu-radius-sm);padding:2px 6px;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-text-muted);cursor:pointer;line-height:1.4}.neu-multiselect__footer-mode:hover{background:var(--neu-surface-2);color:var(--neu-text)}.neu-multiselect__footer-mode:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-multiselect__footer-clear{background:none;border:none;padding:0;font-size:var(--neu-text-xs);font-family:var(--neu-font-sans);color:var(--neu-primary);cursor:pointer;font-weight:500}.neu-multiselect__footer-clear:hover{text-decoration:underline}.neu-multiselect__footer-clear:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px;border-radius:var(--neu-radius-sm)}.neu-multiselect__count-badge{display:inline-flex;align-items:center;padding:2px 10px;background:var(--neu-primary-100, rgba(14, 165, 233, .12));color:var(--neu-primary-dark, var(--neu-primary));border-radius:var(--neu-radius-full);font-size:var(--neu-text-sm);font-weight:500}.neu-multiselect__chip--overflow{background:var(--neu-surface-2);color:var(--neu-text-muted);border:1px dashed var(--neu-border);cursor:default;pointer-events:none}.neu-multiselect__error{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-error-text, var(--neu-error));font-family:var(--neu-font-sans)}.neu-multiselect__hint{margin-top:var(--neu-space-1);font-size:var(--neu-text-xs);color:var(--neu-text-muted);font-family:var(--neu-font-sans)}.neu-multiselect__sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i1.ɵɵCdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.ɵɵCdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.ɵɵCdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
765
732
  }
766
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuMultiselectComponent, decorators: [{
733
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuMultiselectComponent, decorators: [{
767
734
  type: Component,
768
735
  args: [{ selector: 'neu-multiselect', imports: [NgTemplateOutlet, OverlayModule, ScrollingModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
769
736
  {
@@ -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 { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\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, OverlayModule, 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 '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\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 cdkOverlayOrigin\n #multiselectOrigin=\"cdkOverlayOrigin\"\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 <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"multiselectOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayWidth]=\"panelPosition().width ?? ''\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\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.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 </ng-template>\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 _document = inject(DOCUMENT);\n private readonly _overlay = inject(Overlay);\n private readonly _urlState = inject(NeuUrlStateService);\n 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 overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\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 onDocumentClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n const isInsideHost = this.elementRef.nativeElement.contains(target);\n const isInsidePanel = !!target?.closest('.neu-multiselect__panel');\n if (!isInsideHost && !isInsidePanel) {\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\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const availableBelow = Math.max(\n 0,\n viewportHeight - this._viewportMargin - triggerRect.bottom - gap,\n );\n const availableAbove = Math.max(0, triggerRect.top - this._viewportMargin - gap);\n const maxHeight = Math.max(180, Math.max(availableBelow, availableAbove));\n\n this.panelPosition.set({\n position: null,\n top: null,\n left: null,\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 ) ?? this._document.getElementById(`neu-ms-opt-${value}`);\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement =\n this.elementRef.nativeElement.querySelector<HTMLElement>(`#neu-ms-opt-${value}`) ??\n this._document.getElementById(`neu-ms-opt-${value}`);\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 { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport { ConnectedPosition, Overlay, OverlayModule } from '@angular/cdk/overlay';\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, OverlayModule, 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 '(keydown.escape)': 'close()',\n '(window:resize)': 'onWindowResize()',\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 cdkOverlayOrigin\n #multiselectOrigin=\"cdkOverlayOrigin\"\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 <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"multiselectOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"overlayScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayWidth]=\"panelPosition().width ?? ''\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayViewportMargin]=\"_viewportMargin\"\n (backdropClick)=\"close()\"\n (detach)=\"close()\"\n >\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.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 </ng-template>\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 _document = inject(DOCUMENT);\n private readonly _overlay = inject(Overlay);\n private readonly _urlState = inject(NeuUrlStateService);\n 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 overlayPositions: ConnectedPosition[] = [\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n offsetY: -6,\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n offsetY: 6,\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n offsetY: -6,\n },\n ];\n readonly overlayScrollStrategy = this._overlay.scrollStrategies.reposition();\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 onDocumentClick(event: MouseEvent): void {\n const target = event.target as Element | null;\n const isInsideHost = this.elementRef.nativeElement.contains(target);\n const isInsidePanel = !!target?.closest('.neu-multiselect__panel');\n if (!isInsideHost && !isInsidePanel) {\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\n const triggerRect = trigger.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 6;\n const width = Math.min(triggerRect.width, viewportWidth - this._viewportMargin * 2);\n const availableBelow = Math.max(\n 0,\n viewportHeight - this._viewportMargin - triggerRect.bottom - gap,\n );\n const availableAbove = Math.max(0, triggerRect.top - this._viewportMargin - gap);\n const maxHeight = Math.max(180, Math.max(availableBelow, availableAbove));\n\n this.panelPosition.set({\n position: null,\n top: null,\n left: null,\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 ) ?? this._document.getElementById(`neu-ms-opt-${value}`);\n optionElement?.focus();\n });\n return;\n }\n\n const optionElement =\n this.elementRef.nativeElement.querySelector<HTMLElement>(`#neu-ms-opt-${value}`) ??\n this._document.getElementById(`neu-ms-opt-${value}`);\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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"}