mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
fix(live): inject inline pre-restore script so scrollY wins vs browser
external live.js is fetched, so by the time it runs the browser has already queued its reload-scroll animation and history.scrollRestoration ='manual' has no effect. Inject a tiny inline synchronous <script> into the same block live-inject writes, BEFORE the external live.js tag. It sets scrollRestoration='manual' and does window.scrollTo(0, savedY) during HTML parse — before the browser can animate anywhere. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
5e04a9f25a
commit
fb78ec4553
@@ -137,8 +137,18 @@ function commentClose(syntax) { return syntax === 'jsx' ? '*/}' : '-->'; }
|
||||
function buildTagBlock(syntax, port) {
|
||||
const open = commentOpen(syntax);
|
||||
const close = commentClose(syntax);
|
||||
// Inline pre-restore: runs before the external live.js is fetched. Sets
|
||||
// scrollRestoration='manual' and jumps to the saved scrollY *synchronously*
|
||||
// during HTML parse, beating the browser's animated reload-restore.
|
||||
// Hardcoded key matches live-browser.js: PREFIX ('impeccable-live') +
|
||||
// LS_KEY suffix ('-session') + SCROLL_KEY_SUFFIX ('-scroll').
|
||||
const preRestore =
|
||||
'<script>(function(){try{history.scrollRestoration="manual";' +
|
||||
'var y=parseFloat(localStorage.getItem("impeccable-live-session-scroll"));' +
|
||||
'if(isFinite(y))window.scrollTo(0,y);}catch(e){}})();</script>';
|
||||
return (
|
||||
open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' +
|
||||
preRestore + '\n' +
|
||||
'<script src="http://localhost:' + port + '/live.js"></script>\n' +
|
||||
open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n'
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user