Files
med-notes/.pnpm-store/v10/files/1a/1666f5d65f9da1712f5c566b20a27524ce1c2e4a32724508af500d601ffccd8bf7675e340c9ef9dbf9218525a5a12023d33f7cc243d40836d169144d2955ca
2025-05-09 05:30:08 +02:00

197 lines
6.4 KiB
Plaintext

"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const utils = require("./utils.cjs");
const storageKey = "tsr-scroll-restoration-v1_3";
let sessionsStorage = false;
try {
sessionsStorage = typeof window !== "undefined" && typeof window.sessionStorage === "object";
} catch {
}
const throttle = (fn, wait) => {
let timeout;
return (...args) => {
if (!timeout) {
timeout = setTimeout(() => {
fn(...args);
timeout = null;
}, wait);
}
};
};
const scrollRestorationCache = sessionsStorage ? (() => {
const state = JSON.parse(window.sessionStorage.getItem(storageKey) || "null") || {};
return {
state,
// This setter is simply to make sure that we set the sessionStorage right
// after the state is updated. It doesn't necessarily need to be a functional
// update.
set: (updater) => (scrollRestorationCache.state = utils.functionalUpdate(updater, scrollRestorationCache.state) || scrollRestorationCache.state, window.sessionStorage.setItem(
storageKey,
JSON.stringify(scrollRestorationCache.state)
))
};
})() : void 0;
const defaultGetScrollRestorationKey = (location) => {
return location.state.key || location.href;
};
function getCssSelector(el) {
const path = [];
let parent;
while (parent = el.parentNode) {
path.unshift(
`${el.tagName}:nth-child(${[].indexOf.call(parent.children, el) + 1})`
);
el = parent;
}
return `${path.join(" > ")}`.toLowerCase();
}
let ignoreScroll = false;
function restoreScroll(storageKey2, key, behavior, shouldScrollRestoration, scrollToTopSelectors) {
var _a;
let byKey;
try {
byKey = JSON.parse(sessionStorage.getItem(storageKey2) || "{}");
} catch (error) {
console.error(error);
return;
}
const resolvedKey = key || ((_a = window.history.state) == null ? void 0 : _a.key);
const elementEntries = byKey[resolvedKey];
ignoreScroll = true;
(() => {
if (shouldScrollRestoration && elementEntries) {
for (const elementSelector in elementEntries) {
const entry = elementEntries[elementSelector];
if (elementSelector === "window") {
window.scrollTo({
top: entry.scrollY,
left: entry.scrollX,
behavior
});
} else if (elementSelector) {
const element = document.querySelector(elementSelector);
if (element) {
element.scrollLeft = entry.scrollX;
element.scrollTop = entry.scrollY;
}
}
}
return;
}
const hash = window.location.hash.split("#")[1];
if (hash) {
const hashScrollIntoViewOptions = (window.history.state || {}).__hashScrollIntoViewOptions ?? true;
if (hashScrollIntoViewOptions) {
const el = document.getElementById(hash);
if (el) {
el.scrollIntoView(hashScrollIntoViewOptions);
}
}
return;
}
[
"window",
...(scrollToTopSelectors == null ? void 0 : scrollToTopSelectors.filter((d) => d !== "window")) ?? []
].forEach((selector) => {
const element = selector === "window" ? window : document.querySelector(selector);
if (element) {
element.scrollTo({
top: 0,
left: 0,
behavior
});
}
});
})();
ignoreScroll = false;
}
function setupScrollRestoration(router, force) {
const shouldScrollRestoration = force ?? router.options.scrollRestoration ?? false;
if (shouldScrollRestoration) {
router.isScrollRestoring = true;
}
if (typeof document === "undefined" || router.isScrollRestorationSetup) {
return;
}
router.isScrollRestorationSetup = true;
ignoreScroll = false;
const getKey = router.options.getScrollRestorationKey || defaultGetScrollRestorationKey;
window.history.scrollRestoration = "manual";
const onScroll = (event) => {
if (ignoreScroll || !router.isScrollRestoring) {
return;
}
let elementSelector = "";
if (event.target === document || event.target === window) {
elementSelector = "window";
} else {
const attrId = event.target.getAttribute(
"data-scroll-restoration-id"
);
if (attrId) {
elementSelector = `[data-scroll-restoration-id="${attrId}"]`;
} else {
elementSelector = getCssSelector(event.target);
}
}
const restoreKey = getKey(router.state.location);
scrollRestorationCache.set((state) => {
const keyEntry = state[restoreKey] = state[restoreKey] || {};
const elementEntry = keyEntry[elementSelector] = keyEntry[elementSelector] || {};
if (elementSelector === "window") {
elementEntry.scrollX = window.scrollX || 0;
elementEntry.scrollY = window.scrollY || 0;
} else if (elementSelector) {
const element = document.querySelector(elementSelector);
if (element) {
elementEntry.scrollX = element.scrollLeft || 0;
elementEntry.scrollY = element.scrollTop || 0;
}
}
return state;
});
};
if (typeof document !== "undefined") {
document.addEventListener("scroll", throttle(onScroll, 100), true);
}
router.subscribe("onRendered", (event) => {
const cacheKey = getKey(event.toLocation);
if (!router.resetNextScroll) {
router.resetNextScroll = true;
return;
}
restoreScroll(
storageKey,
cacheKey,
router.options.scrollRestorationBehavior || void 0,
router.isScrollRestoring || void 0,
router.options.scrollToTopSelectors || void 0
);
if (router.isScrollRestoring) {
scrollRestorationCache.set((state) => {
state[cacheKey] = state[cacheKey] || {};
return state;
});
}
});
}
function handleHashScroll(router) {
if (typeof document !== "undefined" && document.querySelector) {
const hashScrollIntoViewOptions = router.state.location.state.__hashScrollIntoViewOptions ?? true;
if (hashScrollIntoViewOptions && router.state.location.hash !== "") {
const el = document.getElementById(router.state.location.hash);
if (el) {
el.scrollIntoView(hashScrollIntoViewOptions);
}
}
}
}
exports.defaultGetScrollRestorationKey = defaultGetScrollRestorationKey;
exports.getCssSelector = getCssSelector;
exports.handleHashScroll = handleHashScroll;
exports.restoreScroll = restoreScroll;
exports.scrollRestorationCache = scrollRestorationCache;
exports.setupScrollRestoration = setupScrollRestoration;
exports.storageKey = storageKey;
//# sourceMappingURL=scroll-restoration.cjs.map