Separate from viewer-config/apply-state.ts on purpose. That dispatcher
applies what the STORE says; kiosk mode is resolved from the store and the
URL, and the URL has to win. Folding it in would have meant handing the
dispatcher a second, differently-sourced input and hoping every future
reader noticed which fields came from where.
Ports-injected and returning separate input and watchdog teardowns, so the
app can keep input locked during a dataset load while releasing the old
scene's watchdog immediately.
Apply a resolved KioskMode to a running viewer.
Separate from
viewer-config/apply-state.tson purpose. That dispatcher applies what the STORE says; kiosk mode is resolved from the store and the URL, and the URL has to win. Folding it in would have meant handing the dispatcher a second, differently-sourced input and hoping every future reader noticed which fields came from where.Ports-injected and returning separate input and watchdog teardowns, so the app can keep input locked during a dataset load while releasing the old scene's watchdog immediately.