mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-17 16:46:31 +03:00
Sync generated provider output
This commit is contained in:
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
let scrollLockTargetY = null;
|
||||
let scrollLockRaf = null;
|
||||
let scrollLockAbort = null;
|
||||
const SCROLL_ANCHOR_LOCK_ID = 'impeccable-scroll-anchor-lock';
|
||||
|
||||
// Dedicated key for scroll position - SEPARATE from LS_KEY so that
|
||||
// saveSession's state updates don't clobber a carefully-captured scrollY.
|
||||
@@ -5815,10 +5816,22 @@
|
||||
|
||||
try { history.scrollRestoration = 'manual'; } catch {}
|
||||
|
||||
const prevHtmlAnchor = document.documentElement.style.overflowAnchor;
|
||||
const prevBodyAnchor = document.body.style.overflowAnchor;
|
||||
document.documentElement.style.overflowAnchor = 'none';
|
||||
document.body.style.overflowAnchor = 'none';
|
||||
// Suppress the browser's scroll-anchoring on the scroll root so it can't
|
||||
// fight our manual scroll correction. Apply this as a stylesheet rule, not
|
||||
// as inline `style` on <html>/<body>: those elements are server-rendered by
|
||||
// frameworks like Next.js App Router, and mutating their inline style makes
|
||||
// React 19 report a hydration mismatch on the next Fast-Refresh re-render.
|
||||
// A <style> rule has the same computed effect without touching any hydrated
|
||||
// element's attributes. Like the inline version, it is recreated on every
|
||||
// startScrollLock call, so reload survival (driven by the persisted scroll
|
||||
// key) is unaffected.
|
||||
let anchorLockStyle = document.getElementById(SCROLL_ANCHOR_LOCK_ID);
|
||||
if (!anchorLockStyle) {
|
||||
anchorLockStyle = document.createElement('style');
|
||||
anchorLockStyle.id = SCROLL_ANCHOR_LOCK_ID;
|
||||
anchorLockStyle.textContent = 'html,body{overflow-anchor:none !important;}';
|
||||
(document.head || document.documentElement).appendChild(anchorLockStyle);
|
||||
}
|
||||
|
||||
const correct = (why) => {
|
||||
scrollLockRaf = null;
|
||||
@@ -5853,8 +5866,7 @@
|
||||
|
||||
scrollLockAbort = new AbortController();
|
||||
scrollLockAbort.signal.addEventListener('abort', () => {
|
||||
document.documentElement.style.overflowAnchor = prevHtmlAnchor;
|
||||
document.body.style.overflowAnchor = prevBodyAnchor;
|
||||
document.getElementById(SCROLL_ANCHOR_LOCK_ID)?.remove();
|
||||
}, { once: true });
|
||||
const sig = { signal: scrollLockAbort.signal };
|
||||
// Track whether the most recent scroll came from a user gesture. We
|
||||
|
||||
Reference in New Issue
Block a user