430b25cea5
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 18s
The pre-update backup ran synchronously in onExtensionBeforeUpdate with no browser feedback — the page just hung until backup + update finished. Now the system plugin injects JavaScript on com_installer and com_joomlaupdate pages that intercepts the update button, shows a Bootstrap modal with a progress bar, and runs the backup via the stepped AJAX API (ajax.init + ajax.step). On completion it proceeds with the original update. On failure it shows Skip & Cancel buttons. The server-side handler remains as a fallback for CLI/API updates. A session flag prevents double-running when JS already handled it. Claude-Session: https://claude.ai/code/session_01MbEjBtsSjPuTWhqqrMS2wG