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

API reference

Headless input group is primitive-first. Use tngInputGroup to own the grouped shell structure, project exactly one control, and style the result through slot and state attributes.

tngInputGroup (primitive shell)

Wraps a single projected control with optional tngPrefix and tngSuffix content. The primitive renders the leading, control, and trailing regions for you and mirrors control state back to the host.

Grouped search field

html
<tng-input-group>
  <span tngPrefix aria-hidden="true">Search</span>
  <input tngInput type="search" placeholder="Search docs..." />
  <button tngSuffix type="button" aria-label="Clear search">Clear</button>
</tng-input-group>
InputTypeDetails
hasLeadingboolean-likeOverrides automatic prefix-slot detection.
hasTrailingboolean-likeOverrides automatic suffix-slot detection.
disabledboolean-likeOverrides the mirrored disabled state on the group host.
invalidboolean-likeOverrides the mirrored invalid state on the group host.
readonlyboolean-likeOverrides the mirrored readonly state on the group host.
controlCountnumber | nullDev-mode override for the single-control validation warning.

Projected control contract

The group is just the shell. You still project the real control yourself, and the expected control count is one.

Projected control contract

html
<tng-input-group>
  <input tngInput type="text" />
</tng-input-group>

<tng-input-group>
  <textarea tngTextarea rows="4"></textarea>
</tng-input-group>
FeatureTypeDetails
Projected controlinput[tngInput], textarea[tngInput], or textarea[tngTextarea]The projected control keeps native semantics, Angular forms integration, and label wiring.
Expected countSingle controlThe primitive warns in dev mode when the effective projected control count is not exactly one.
Generated structureLeading / control / trailing regionsThe host owns the flex layout for those regions so consumers can focus on visual styling only.

Reflected attributes

These stable hooks are the public styling surface for the grouped shell and its generated regions.

AttributeApplied toDetails
data-slot="input-group"Group hostPrimary styling hook for the shell surface.
data-focusedGroup hostPresent while any projected control or action inside the group has focus.
data-invalid, data-disabled, data-readonlyGroup hostMirrored from the projected control unless explicitly overridden.
data-has-leading, data-has-trailingGroup hostAdded when leading or trailing slot content exists or when the matching override input is set.
data-slot="input-group-leading", data-slot="input-group-control", data-slot="input-group-trailing"Generated wrappersStable structural hooks for the regions rendered by the primitive.
data-slot="input"Projected controlApplied by tngInput or tngTextarea on the real control.

State selector starter

css
.docs-search-shell[data-slot='input-group'][data-focused] {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.18);
}

.docs-search-shell[data-slot='input-group'][data-invalid] {
  border-color: #dc2626;
}

Slot directives

DirectiveApplies toAddsAliasDetails
tngPrefixProjected leading elementdata-slot="input-leading"tngInputLeadingMarks prefix/adornment content for the leading region.
tngSuffixProjected trailing elementdata-slot="input-trailing"tngInputTrailingMarks suffix text, fixed metadata, or trailing action content.