Every Angular application I have worked on in the last few years had the same three kinds of state:

URL state — the page number, the active filter, the selected tab.

Client state — what the user typed, what is expanded, what is selected.

Server state — the thing you fetched, and everything that can go wrong while fetching it.

And every application handled them three completely different ways. ActivatedRoute and a Router.navigate call for the first. Signals or a store for the second. A service returning an Observable, plus a loading boolean, plus an error field, plus a subscribe somewhere, for the third.