{% comment %} The row menu every settings list needs, defined once for the page. **The "…" menu's anchoring.** position: fixed and anchored on open, the way templates/components/ui_select.html does it and for the same reason: these rows sit inside .app-content, which is overflow-y-auto, and an absolutely positioned panel is clipped by it. The scroll and Escape listeners are registered ONCE here rather than per row. Two reasons. A list of 200 rows was installing 400 window listeners for a menu of which at most one can be open. And `@scroll.window` never fired at all: .app-content is the scrolling element (templates/base.html), scroll events do not bubble, so a listener on window never saw them and the fixed panel simply drifted away from its row. A capture-phase listener on the document does see them, whatever scrolls. `bbChanged`, which used to be the second behaviour here, is global now — see partials/_modal_behaviours.html, which base.html includes on every page. A plain window function rather than Alpine.data(), because every call site also needs flags of its own and spreads this into them: x-data="{ ...bbRowMenu(), renaming: false }" Included from {% templatetag openblock %} block alpine_components {% templatetag closeblock %}, which templates/base.html places after htmx and before the deferred Alpine — so the definitions exist by the time Alpine boots. {% endcomment %}