Issue #3614348: A stepper click made while its request is in flight is rolled back by the answer
Answers a stepper click with offer state instead of the rebuilt form.
refreshForm() returned $form, so every quantity field on the page was replaced by an answer computed before the visitor's latest click existed. A click made while the request was out was overwritten by its own answer, and the value rolled back.
It now returns an AjaxResponse carrying one OfferStateCommand: per offer, the availability line, the ceiling, the sold-out flag, the quantity the server holds, and any refusal text. The browser applies those to the cards already on the page and touches nothing else, so the DOM survives, the open panel and the keyboard focus stay put, and there is nothing to roll back. The AJAX wrapper div and the refocus workaround are both gone with the full replace that needed them.
Reconciling rather than blocking: a click the request could not carry is sent by that request's answer, compared against what was actually POSTED so a refusal is applied instead of resent forever. A quantity typed into the field now commits on change, which it never did before, so a refusal of a typed number is no longer a silent reset on the next page.
Accessibility: each card renders an empty role="status" region from the first paint, never hidden with display: none (a live region that gains text in either state is announced by nothing), and the field points at it with aria-describedby. A corrected quantity is always explained, in the booker's own words where it sent any and otherwise naming both numbers. Notice colors measured at 5.95:1 and 7.62:1 on white.
Refusals no longer go to the messenger on the live path, where they rendered nowhere and then surfaced on the next page the visitor opened, out of context.
Four new browser tests: a click made provably in flight (hung off jQuery ajaxSend, not a sleep), the fields surviving as the same DOM elements, the availability line counting down, and a refused quantity explained and linked from the field. 24/24 calendar FunctionalJavascript tests pass, plus the two kernel classes that build this form. phpcs, eslint, stylelint, cspell and msgfmt -c clean. French strings and the venue-map guide updated in the same commit.