NEURALNG
FORMSBETA

MultiSelect

Immutable multiple selection with chips, grouping, filtering, typed templates, every Angular Forms adapter and an SSR-safe virtualized popup.

Multiple listbox semanticsTop-layer overlayHeadless ready

GET STARTED

Import

Use the canonical NeuralMultiSelect export from its granular entry point.

app.ts TypeScript
import { NeuralMultiSelect, NeuralMultiSelectOptionTemplate } from '@neural-ng/core/multi-select';

@Component({ imports: [NeuralMultiSelect, NeuralMultiSelectOptionTemplate] })

Grouped chips and filtering

Map nested data without mutation, group related results, keep unavailable options visible and customize each row through a typed template.

2 capabilities selected.
No semantic event yet.

Display modes and selection limits

comma mode collapses long values into a localized count while selectionLimit protects domain rules. Chip mode remains the default.

At most four values · 3 currently selected.

Angular Forms

Direct Signals, Signal Forms, Reactive Forms and template-driven Forms share one immutable readonly TValue[] model. Programmatic writes never masquerade as user events.

Signal Forms
Signals
Reactive Forms
TypeScript
NgModel
SSR

Remote filtering and request identity

Remote mode never filters the supplied rows. Each debounced query carries a monotonic request id so stale network responses can be ignored deterministically.

Latest request: none

Typed composition templates

Header, group, option, selected value, footer, empty and loading surfaces remain typed and independently replaceable.

States and localized feedback

Disabled, readonly, loading, empty and invalid states keep distinct semantics. Empty and loading templates can replace localized defaults.

Select at least one capability.

Virtual scrolling

Fixed-height lists render only the visible overscanned range while preserving full set position metadata. Grouped lists safely fall back to complete rendering.

Semantic events

valueChange owns model synchronization. Selection, removal, clear, select-all, filter and lifecycle events describe user intent with immutable snapshots and no on-prefixed aliases.

events.html HTML
<neural-multi-select
  [(value)]="selected"
  (selectionChange)="changed($event)" (selected)="selected($event)"
  (removed)="removed($event)" (cleared)="cleared($event)"
  (selectAllChange)="allChanged($event)" (filterChange)="filtered($event)"
  (opened)="opened()" (closed)="closed()" (touch)="touched()"
/>

Unstyled and typed class slots

Headless mode retains immutable state, Forms, keyboard behavior, ARIA and overlay positioning while Tailwind owns every visible surface.