Getting StartedInstallation and setup guides 5
LayoutWorkflow and structural layout components 7
OverlayModal and floating layer surfaces 3
FeedbackStatus, empty, progress, and loading placeholder patterns 5
FormInput and selection components 17
UtilityGeneral-purpose interface utilities 7
NavigationMenu surfaces and hierarchical actions 7

API reference

MultiSelect exposes composable primitives and a wrapper component for array-based value models.

tngMultiSelect + parts (primitive)

Primitive attachment

html
<section tngMultiSelect [value]="selectedValues" (valueChange)="selectedValues = toValueArray($event)">
  <button tngSelectTrigger type="button">
    <span tngSelectValue>{{ selectedSummary }}</span>
    <span tngSelectIcon aria-hidden="true">▾</span>
  </button>
  <div tngSelectContent>
    <div tngSelectOverlay>
      <ul tngMultiSelectListbox [multiple]="true">
        @for (option of options; track option.value) {
          <li tngMultiSelectOption [tngValue]="option.value">{{ option.label }}</li>
        }
      </ul>
    </div>
  </div>
</section>
Directive / modelTypeNotes
tngMultiSelectopen, openChangeControlled overlay visibility.
tngMultiSelectvalue, valueChangereadonly T[] selected values.
tngMultiSelectaddSelectedItem, removeSelectedItem, toggleSelectedItem, clearImperative selection helpers.
tngMultiSelectListboxorientation, direction, loopKeyboard traversal configuration.
tngMultiSelectOptiontngValue, disabledOption identity and disabled state.

tng-multiselect (styled component)

Wrapper usage

html
<tng-multiselect
  [options]="options"
  [value]="selectedValues"
  (valueChange)="selectedValues = toValueArray($event)"
  [getOptionValue]="getOptionValue"
  [getOptionLabel]="getOptionLabel"
  [isOptionDisabled]="isOptionDisabled"
  placeholder="Select items"
></tng-multiselect>
APITypeDetails
optionsreadonly O[]Option source used for rendering and label mapping.
getOptionValue(option: O) => VMaps options into selected value payloads.
getOptionLabel(option: O) => stringMaps options into trigger/option labels.
isOptionDisabled(option: O) => booleanDisables options at render time.
Forwarded primitive modelopen, value, openChange, valueChangeExposed through host directive wiring.

<tng-multiselect> can bind directly with [formField] for readonly array fields.

Signal forms wiring

ts
import { Component, signal } from '@angular/core';
import { FormField, form } from '@angular/forms/signals';
import { TngMultiSelectComponent } from '@tailng-ui/components';

type ReviewerOption = {
  readonly id: string;
  readonly label: string;
};

@Component({
  selector: 'app-reviewers-signal-form',
  standalone: true,
  imports: [FormField, TngMultiSelectComponent],
  template: \`
    <tng-multiselect
      [formField]="reviewForm.reviewers"
      [options]="reviewers"
      [getOptionValue]="getReviewerValue"
      [getOptionLabel]="getReviewerLabel"
      placeholder="Choose reviewers"
      aria-label="Reviewers"
    ></tng-multiselect>
  \`,
})
export class ReviewersSignalFormComponent {
  readonly reviewModel = signal({
    reviewers: ['alex'] as readonly string[],
  });
  readonly reviewForm = form(this.reviewModel);

  readonly reviewers: readonly ReviewerOption[] = [
    { id: 'alex', label: 'Alex' },
    { id: 'bri', label: 'Bri' },
    { id: 'chen', label: 'Chen' },
  ];

  readonly getReviewerValue = (reviewer: ReviewerOption) => reviewer.id;
  readonly getReviewerLabel = (reviewer: ReviewerOption) => reviewer.label;
}