From now on we never serialize the splits to a string and instead
directly slice the WebAssembly memory and directly export, upload, and
save the splits from there.
Additionally this does another optimization where livesplit-core now
provides a way to directly query the length of the returned buffer
instead of having to manually search of the nul-terminator.
This implements gamepad support for the hotkeys. This allows controlling
LiveSplit One without having to focus the browser tab. There seem to be
some unfortunate limitations though. Chrome for example acquires
exclusive access to the gamepads (at least on Windows with DirectInput).
Firefox however doesn't, so you likely would want to use Firefox if
Chrome is causing problems with your controller.
We show `Untitled` now for untitled runs, so we don't need to set
anything anymore for it to look decent. And those default values would
need to be deleted by the user in the run editor anyway, so it's better
not to set anything.
Instead of always using the ResizeObserver of the library, we instead
polyfill the browser's one if it doesn't exist and use that then. On an
up to date browser this removes the unnecessary polling that happens in
the library's implementation.
This implements abbreviations. For the longest time we thought it's not
possible to implement them in the web, but it turns out that it can
work.
This implements support for the key value pair components so far.
Abbreviations are still missing for the Title component. This will need
some additional support from livesplit-core.
`requestAnimationFrame` is preferred over `setInterval` for drawing
frames as it allows the browser itself to make decisions on when to draw
the layout. Unfortunately, we are no longer capped at 30fps which will
result in higher CPU usage, but I feel the tradeoff is acceptable here
as the browser will throttle itself if needed.
On the plus side however, input latency will be lower overall and
frametimes will be more consistent.