For AI agents: the complete documentation index is available at https://a3s-lab.github.io/UI/v0.4.1/en/llms.txt, the full documentation bundle is available at https://a3s-lab.github.io/UI/v0.4.1/en/llms-full.txt, and this page is available as Markdown at https://a3s-lab.github.io/UI/v0.4.1/en/components/input-group.md.
Input Group presents one editable value and the context needed to interpret or act on that value inside one continuous boundary. It does not replace Field, validation, suggestions, rich editing, or application state.
Use one direct primary control. Keep its persistent label, ordinary guidance, and current error in the surrounding Field. The root has no default widget role because the native control already owns the name, value, keyboard behavior, and form semantics.
Use a standalone Input or Textarea when no content needs the same boundary. Use Combobox for selectable suggestions, an editor for structured content, and Task Composer for mentions, attachments, tools, and submission state.
Empty and ready are ordinary value states. Invalid begins after a validation attempt. Loading preserves the current value and editability. Disabled and read-only use different native behavior and must never be reduced to the same dimmed appearance.
Input Group reflects validity but does not invent validation policy. Preserve the attempted value, focus the invalid control, name the exact correction outside the shell, and add the error ID to aria-describedby. Clear stale error semantics after a valid edit or reset. Do not validate while an IME composition is active.
An action belongs inside the boundary only when it directly inspects, reveals, copies, clears, chooses a unit for, or submits the same value. Interactive descendants retain their own focus and activation; the shell controller never redirects their click.
Repository URL
https://
Read-only values remain selectable and included in form submission.
Disabled removes focus, editing, validation, and form submission. Read-only preserves focus, selection, copying, and submission. Keep both legible and explain why the value cannot be changed.
A native Textarea may share the boundary with one compact count or directly related action. The editing viewport stays bounded, scrolls internally after large pastes, and supports vertical native resize. Use an editor or Task Composer when the task needs structure, syntax, mentions, attachments, or a toolbar.
Release handoff
0 / 6000 characters
Include the verification result and the exact recovery steps to use after failure.
<div class="field w-full">
<label for="input-group-handoff-en">Release handoff</label>
<div class="input-group" data-orientation="vertical">
<textarea
id="input-group-handoff-en"
name="releaseHandoff"
rows="5"
maxlength="6000"
aria-describedby="input-group-handoff-help-en"
placeholder="Describe verification evidence and the rollback path"
oninput="this.parentElement.querySelector('[data-input-group-status]').textContent = this.value.length + ' / 6000 characters'"
></textarea>
<span data-align="block-end" data-input-group-status>0 / 6000 characters</span>
</div>
<p id="input-group-handoff-help-en" data-field-description>
Include the verification result and the exact recovery steps to use after failure.
</p>
</div>
Logical alignment follows the surrounding writing direction. Technical values such as URLs or paths may set a local left-to-right direction. Inline addons truncate before they can widen the document; move meaningful long guidance outside the shell or to a block addon.
Keep one persistent visible label and associate ordinary guidance through aria-describedby. Placeholder text never provides the only name.
Leave the root without a widget role unless the composition has a real group relationship that the control and Field cannot express.
Preserve native input, selection, paste, undo, search clearing, password-manager, autocomplete, and IME behavior.
Use exact accessible names for icon-only actions. On coarse pointers, editable text stays at least 16px and actions provide at least a 44 by 44 CSS-pixel target.
Invalid state needs the native constraint, aria-invalid="true", a specific error, and a recovery path. Color alone is insufficient.
Loading keeps the value and focus stable, uses one bounded status message, and must not let a stale response overwrite newer input.
Forced-colors mode replaces inset focus styling with a system Highlight outline. Test real mobile keyboards, physical CJK input methods, 200% zoom, touch selection, Windows forced colors, and screen-reader/browser combinations before release.