Async Action Demo
Clicking the button below calls core/demo_async.php, which runs
xcrud_demo_generate_report() (see functions.php) -
a deliberately slow (10 second sleep()) stand-in for
something like a real report export, a batch update, or an external
API call. The button shows the same spinner every Save/Delete button
already uses for the whole 10 seconds, stays disabled so it can't be
clicked twice, then shows a toast once the request resolves.