Fixed
- Tick auto-refresh causes VDOM version mismatch, silently drops user events —
_run_tickalways calledrender_with_diff()even whenhandle_tick()made no state changes, incrementing the VDOM version on every tick. When a user event interleaved with a tick, the client and server versions diverged, causing all subsequent patches to be silently discarded. Tick now uses_snapshot_assignsto skip render when no public assigns changed. (#560) - WS VDOM cache key collision across tabs — All WebSocket LiveViews shared a single RustLiveView cache slot keyed by
/ws/live/, causing multi-tab sessions to overwrite each other's compiled templates. Cache key now usesrequest.path(the actual page URL) so each view gets its own VDOM baseline. (#561) - Canvas
width/heightcleared duringhtml_updatemorph —morphElementremoved attributes absent from server HTML, resetting canvas 2D contexts and blanking Chart.js charts. Canvaswidthandheightare now preserved during attribute sync. (#561) _force_full_htmlnot checked inhandle_url_change— Views that set_force_full_html = Trueinhandle_params(e.g., when{% for %}loop lengths change) still received VDOM patches instead of full HTML. The flag is now checked afterrender_with_diff()in bothhandle_eventandhandle_url_change. (#559, #561)
Added
dj-patchon selects/inputs uses WSurl_change— Select and input elements withdj-patchnow update via pushState + WebSocketurl_changeinstead of full page reload. A delegateddocumentchange listener survives DOM replacement by morphdom.dj-patch-reloadattribute remains as an opt-in escape hatch for full page navigation. (#561)