## tag_group (`poetry_tag_group`)

A set of removable chips or tokens.

Class: Poetry::Ui::TagGroup::Component - BEM block `poetry-ui-tag_group`.
- `described_by:` (string) - Space-separated hint/error ids for the GRID (the labelled element) - a raw aria-describedby in html_attributes would land on the outer wrapper div, unassociated for AT.
- `label:` (string) - required - The grid's accessible name, rendered as a caption span. Required.
- `name:` (string) - Makes the group a form value: one hidden <name>[] input submits per tag.
Slots: tags (Declares one chip. value: is its identity (and form value); label: is the accessible name and the visible text when no block is given; removable: false drops the remove button.; many; with_tag yields NOTHING to the block - no |param|, write content directly).
- PART `tag-group` - The labelled wrapper - caption span + grid stack here
- PART `tag-group-label` - The caption span (label:), wired via aria-labelledby (a grid is not a labelable form control - never a <label>)
- PART `tag-group-grid` - The tag collection (role=grid; role=group + the tab stop when empty) - roving focus, removal keys, and the focus-scoped live region ride here | states: data-empty (no tags remain (controller-kept after removals))
- PART `tag-group-tag` - One chip (role=row > gridcell): content, the remove button, and - in form mode - the hidden name[] input | states: data-disabled (the tag is disabled (skipped by arrows and removal)); data-value (always - the tag's value (the remove event's detail and the hidden input's value))
- PART `tag-group-remove` - The per-tag remove button - tabbable (Tab steps from the row into it), removes exactly its own tag
- WIRING grid: `poetry--core--tag-group` registers; actions keydown on keydown | `poetry--core--roving-focus` registers; values orientation, loop; actions keydown on keydown
- WIRING remove: `poetry--core--tag-group` actions remove on click
- RULE: Removable chips are a TagGroup - never hand-rolled badges with x buttons; removal keyboard (Delete/Backspace), focus recovery, and the live region ride the controller.
- RULE: label: is REQUIRED (the grid's accessible name, rendered as a caption span).
- RULE: name: turns the group into a form value - one hidden <name>[] input per tag submits; removing a tag removes its input.
- RULE: Removal is cancelable: listen for poetry:tag-group:remove and preventDefault to own the removal server-side (Turbo re-render).
- RULE: Choosing from options is Combobox multiple; toggling fixed choices is ToggleGroup - a TagGroup holds items that exist until removed.
