{% load i18n brickwork_icons %} {% comment %} Combobox (04-interfaces section 4b, 0.9.0). PRIVATE render target of the {% bw_combobox %} tag (templatetags/brickwork_interactions.py): never {% include %} this file directly; the tag carries the render-time enforcement (filter_mode="server" without options_url raises, CBH-019; field-or-trio shape; id-safe tokens for the stable ids, BR-BW-HTMX-005) and ships options here already shaped as RenderedComboboxOption values. Progressive enhancement, ONE markup (BR-BW-HTMX-001/006, chosen by the option set's shape, never by filter_mode, BR-BW-HTMX-008): the base control below IS a native ) built from the choices, and it STAYS the submitted form control at all times. The enhanced chrome next to it ships inside a wrapper carrying the hidden attribute, so the no-JS floor is simply the fully working native select. At init bwCombobox (semver-public, BR-BW-JS-004; props { filterMode, multiple, allowCreate }, state { open, query, activeIndex, selected }, methods open()/close()/select(value)/clear()) removes hidden from the field wrapper, sets hidden on the floor select, and mirrors selection BOTH ways: the floor select carries form state, so a failed submit's 422 re-render (hx-target="this" hx-swap="outerHTML", BR-BW-HTMX-003) rehydrates the component from the re-rendered DOM. Selections survive validation errors through POST data, never through Alpine state. Field chrome: given a bound field the tag renders this control inside the forms/_field.html chrome below (same classes, same help/error ids, same aria-describedby wiring, BR-BW-A11Y-002). The