Static pages in Astro.
React only where things move.
Everything you are reading is fully static HTML. Only the two spots below load as islands, so the first paint never waits for JavaScript. Both sides share the same theme tokens, so the Astro half and the React half cannot drift apart visually.
Works
Instead of a function, this passes { url, method }. Props from .astro are serialized to JSON, so this is the form that survives.
Contact
It has validation of its own, so it is loaded through a .tsx wrapper.
This sample has no endpoint configured. Pressing Send does not send anything.