Getting StartedInstall and bootstrap headless foundations 4
LayoutHeadless structural primitives for expandable and container patterns 6
OverlayHeadless modal and floating layer behavior 3
FeedbackHeadless notification and status communication patterns 5
FormHeadless input and selection contracts 17
UtilityReusable action, identity, and clipboard behavior 6
NavigationHeadless trails, trees, menus, and command surfaces 7

tngChips

The root directive owns the list semantics and the removal bookkeeping. Headless usage means you keep the DOM around it while the primitive emits the next value array when removal succeeds.

Root attachment

html
<section
  tngChips
  [tngChipsValues]="selectedTopics()"
  (valuesChange)="onSelectedTopicsChange($event)"
  [tngChipsAriaLabel]="'Selected topics'"
>
  @for (topic of selectedTopics(); track topic) {
    <span tngChip [tngChipValue]="topic" [tngChipLabel]="topic">
      <span>{{ topic }}</span>
      <button tngChipRemove type="button">&times;</button>
    </span>
  }
</section>
EntryTypeDetails
tngChipsValuesreadonly unknown[] | undefinedControlled values array used when the root should emit a next array after a remove action.
tngChipsDefaultValuesreadonly unknown[]Seeds the primitive for uncontrolled setups when you want the root to track its own values.
tngChipsDisabledbooleanDisables the whole chip list and blocks projected remove actions.
tngChipsAriaLabelstring | nullSets the accessible label on the list root.
valuesChangeoutput<readonly unknown[]>Emits the next values array after a successful remove action.
chipRemoveoutput<unknown>Emits the removed chip value whenever a chip successfully removes itself.

tngChip

Each chip item stays yours. The primitive adds listitem semantics, removal behavior, and disabled state reflection to the markup you project.

InputTypeDetails
tngChipValueunknownIdentity for the chip item and the value emitted when it is removed.
tngChipLabelstring | nullAccessible label used for the auto-generated remove button copy.
tngChipDisabledbooleanMarks the chip disabled and blocks pointer or keyboard removal.
tngChipRemovablebooleanLets you keep the chip visible while opting it out of removal.

tngChipRemove

The remove control is intentionally small. It stays focusable in DOM order and reflects a focused state hook when you want to draw a custom ring.

CapabilityTypeDetails
tngChipRemoveAriaLabelstring | nullOverrides the default “Remove <label>” aria-label when you need custom copy.
Enter / SpaceKeyboard behaviorPress Enter or Space on the remove control to remove the owning chip when removal is allowed.
data-focusedState hookApplied while the remove control is focused so you can draw a ring without extra JavaScript.

Reflected state

The primitive reflects stable slots and state so you can style chip lists without brittle DOM assumptions.

Reflected slots and state

html
<section tngChips data-slot="chips" role="list">
  <span tngChip data-slot="chip" role="listitem" data-value="docs">Docs</span>
  <button tngChipRemove data-slot="chip-remove" data-focused></button>
</section>
AttributeScopePurpose
data-slot="chips"RootStable hook for the list container.
data-slot="chip"ItemStable hook for each projected chip body.
data-slot="chip-remove"Remove controlStable hook for the projected remove button.
data-disabledRoot / item / removeReflected on disabled roots and chips so you can style them consistently.