From fb78ec4553c3ded04c3b01a7b69bd0ab8a5d3b74 Mon Sep 17 00:00:00 2001 From: Paul Bakaus Date: Wed, 22 Apr 2026 10:45:39 -0700 Subject: [PATCH] fix(live): inject inline pre-restore script so scrollY wins vs browser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 '; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.claude/skills/impeccable/scripts/live-inject.mjs b/.claude/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.claude/skills/impeccable/scripts/live-inject.mjs +++ b/.claude/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.cursor/skills/impeccable/scripts/live-inject.mjs b/.cursor/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.cursor/skills/impeccable/scripts/live-inject.mjs +++ b/.cursor/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.gemini/skills/impeccable/scripts/live-inject.mjs b/.gemini/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.gemini/skills/impeccable/scripts/live-inject.mjs +++ b/.gemini/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.github/skills/impeccable/scripts/live-inject.mjs b/.github/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.github/skills/impeccable/scripts/live-inject.mjs +++ b/.github/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.kiro/skills/impeccable/scripts/live-inject.mjs b/.kiro/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.kiro/skills/impeccable/scripts/live-inject.mjs +++ b/.kiro/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.opencode/skills/impeccable/scripts/live-inject.mjs b/.opencode/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.opencode/skills/impeccable/scripts/live-inject.mjs +++ b/.opencode/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.pi/skills/impeccable/scripts/live-inject.mjs b/.pi/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.pi/skills/impeccable/scripts/live-inject.mjs +++ b/.pi/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.rovodev/skills/impeccable/scripts/live-inject.mjs b/.rovodev/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.rovodev/skills/impeccable/scripts/live-inject.mjs +++ b/.rovodev/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.trae-cn/skills/impeccable/scripts/live-inject.mjs b/.trae-cn/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.trae-cn/skills/impeccable/scripts/live-inject.mjs +++ b/.trae-cn/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/.trae/skills/impeccable/scripts/live-inject.mjs b/.trae/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/.trae/skills/impeccable/scripts/live-inject.mjs +++ b/.trae/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' ); diff --git a/public/index.html b/public/index.html index e159aac80..6c638efcc 100644 --- a/public/index.html +++ b/public/index.html @@ -724,8 +724,9 @@ - -
+ + +
@@ -734,118 +735,27 @@
-
@@ -860,18 +770,19 @@

Work with me.

-

Impeccable is built by Renaissance Geek. I work with enterprise teams on rollouts, integrations, and training.

+

Impeccable is built by Renaissance Geek. Rollouts, integrations, training.

Work
with me.

-

Impeccable is built by Renaissance Geek. I work with enterprise teams on large-scale rollouts, custom integrations, and training for designers and developers.

+

Impeccable is built by Renaissance Geek. Large-scale rollouts, custom integrations, and training for teams raising the bar on AI-generated design.

- + + @@ -921,6 +832,7 @@ + diff --git a/public/privacy.html b/public/privacy.html index 4139e711e..2bb9a7e2b 100644 --- a/public/privacy.html +++ b/public/privacy.html @@ -78,6 +78,7 @@

Questions about this policy? Open an issue on GitHub or reach out to @pbakaus.

+ diff --git a/source/skills/impeccable/scripts/live-inject.mjs b/source/skills/impeccable/scripts/live-inject.mjs index 9bbc345ac..daf44cde8 100644 --- a/source/skills/impeccable/scripts/live-inject.mjs +++ b/source/skills/impeccable/scripts/live-inject.mjs @@ -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 = + ''; return ( open + ' ' + MARKER_OPEN_TEXT + ' ' + close + '\n' + + preRestore + '\n' + '\n' + open + ' ' + MARKER_CLOSE_TEXT + ' ' + close + '\n' );