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

tng-autocomplete

The wrapper covers the standard searchable single-select case. Pass options, accessors, and the committed value model; bind query text when the parent owns local filtering or server-side search.

Wrapper attachment

html
<tng-autocomplete
  [options]="filteredReleaseOwners()"
  [value]="selectedOwner()"
  (valueChange)="onSelectedOwnerChange($event)"
  [query]="ownerQuery()"
  (queryChange)="ownerQuery.set($event)"
  [getOptionValue]="getOwnerValue"
  [getOptionLabel]="getOwnerLabel"
  [isOptionDisabled]="isOwnerDisabled"
  placeholder="Search release owners"
  [ariaLabel]="'Release owner'"
></tng-autocomplete>
PropertyTypeDetails
optionsreadonly O[]Options rendered by the wrapper. Pass a pre-filtered list for local or server-side search.
valueV | nullCommitted selected value. Forwarded to the primitive host.
valueChangeEventEmitter<V | null>Emitted when the committed option changes.
querystringCurrent trigger text. Bind this to drive local filtering or server-side search.
queryChangeEventEmitter<string>Emitted when focus or input updates the current query text.
openbooleanOptional controlled open state for the overlay.
openChangeEventEmitter<boolean>Emitted when the overlay opens or closes.
placeholderstringPlaceholder text for the internal trigger input.
ariaLabelstringApplied to the internal trigger when you do not provide labelledby ids.
disabledbooleanDisables trigger focus, typing, and option selection.
loadingbooleanMarks the wrapper loading and reflects data-loading.
invalidbooleanMarks the wrapper invalid and reflects data-invalid.
labelIdstring | nullForwarded to primitive aria-labelledby wiring.
descriptionIdstring | nullForwarded to primitive aria-describedby wiring.
errorIdstring | nullAppended to aria-describedby when invalid.
iconTextstringText affordance rendered in the wrapper icon slot. Default is a chevron.

Query and filtering

<tng-autocomplete> exposes the current input text through query and queryChange. The wrapper renders the options array exactly as provided, so local filtering and remote API requests both live in the parent component.

Local filtering

ts
readonly ownerQuery = signal('');

readonly filteredReleaseOwners = computed(() => {
  const query = this.ownerQuery().toLowerCase().trim();

  if (!query) {
    return this.releaseOwners;
  }

  return this.releaseOwners.filter((owner) =>
    owner.name.toLowerCase().includes(query),
  );
});

Option accessors

The wrapper stays generic by delegating value, label, disabled, and identity mapping to small accessor functions.

Common accessors

ts
readonly getOwnerValue = (owner: ReleaseOwner) => owner.id;
readonly getOwnerLabel = (owner: ReleaseOwner) => owner.name;
readonly isOwnerDisabled = (owner: ReleaseOwner) => owner.disabled === true;
AccessorTypeDetails
getOptionValue(option: O) => VMaps each option object to the committed value model.
getOptionLabel(option: O) => stringMaps each option object to visible label text.
isOptionDisabled(option: O) => booleanDisables specific options without removing them from the list.
trackBy(index: number, option: O) => unknownStabilizes wrapper rendering when async option arrays refresh.

Angular Signal Forms

<tng-autocomplete> is not yet safe for direct [formField] binding. In local interop tests, a later external field update is pushed back to null. Use the controlled value and valueChange pattern below until that sync path is fixed.

Current fallback pattern

ts
readonly selectedOwner = signal<string | null>(null);
readonly ownerQuery = signal('');

<tng-autocomplete
  [options]="filteredReleaseOwners()"
  [value]="selectedOwner()"
  (valueChange)="selectedOwner.set($event)"
  [query]="ownerQuery()"
  (queryChange)="ownerQuery.set($event)"
  [getOptionValue]="getOwnerValue"
  [getOptionLabel]="getOwnerLabel"
  [isOptionDisabled]="isOwnerDisabled"
  placeholder="Search release owners"
  [ariaLabel]="'Release owner'"
></tng-autocomplete>

Primitive foundation

<tng-autocomplete> is built on the headless autocomplete primitive. For more advanced behavior, drop to headless so you can own the trigger, content, overlay, and option markup directly.

CapabilityAvailabilityGuidance
Query modelWrapper APIBind query/queryChange when a parent component needs local filtering, debounced requests, or server-driven results.
Free-form createHeadless onlyUse the primitive root when you need allowCreate, strict=false, and create events.
Custom option markupWrapper template or headlessUse wrapper templates for richer option/selected rows; drop to primitives for fully custom trigger or overlay structure.
Overlay compositionHeadless onlyUse the primitive parts when you need custom trigger shells, empty states, or portal-level markup.