Add SSOT Facades for scrolling and URL management
Debugging scroll and URL changes can be quite a pain sometimes, especially if you don't know what caused the change. For URLs you should: 1. Use `popstate`, `hashchange` events when URL is changing 2. There's no way to debug `history.replaceState` (`Object.assign` doesn't work on `window.location`) For scrolling you can: 1. Replace every single method in `window` that does scrolling 2. Patch `Element.prototype.scrollIntoView()` 3. Patch `Element.prototype.focus()` (yes `.focus()` also causes scrolling) All of these actions hamper debugging experience. To solve that we could create our own proxy API for these methods, so there's a single entry point where you should put a `debugger` statement. ## Example API Below are examples of a proxy API, details might be changed later. ### Scrolling ```js scroll({ element, to, by, intoView, behaviour, duration, }) ``` Our scrolling functions already handle sticky elements, we should incorporate that into this new API. This later can be used for ad-hoc functions: `scrollToElement`, `scrollBy`, `scrollIntoView`, `focus` (just bypass), etc. ### URLs update ```js updateLocation({ path, hash, title, state, replace, reload, assign, }) // support providing an URL object // use second argument to determine the replace mode: replace or push updateLocation(new URL(window.location), true) ``` ---- After these functions are provided we can enforce the SSOT with ESlint rules.
issue