fix(css): styles issues with popover, overflow, and scroll overflow (#1907)

* fix(style): fix toc overflow & scrolling overflow

* fix(style): fix explorer scrolling overflow

* fix(style): fix backlinks overflow & scrolling overflow

* fix(style): resolve popover overflow issue causing incomplete display

* chore: rename function to enhance readability

* fix(popover): make the backlink's id unique & use translate() instead of translateY()
This commit is contained in:
1 gal Rosemary
2025-04-06 01:39:28 +08:00
committed by GitHub
parent d61fb266c7
commit bb24cd13c7
5 changed files with 40 additions and 9 deletions

View File

@ -1,33 +1,40 @@
import { computePosition, flip, inline, shift } from "@floating-ui/dom"
import { normalizeRelativeURLs } from "../../util/path"
import { fetchCanonical } from "./util"
import { randomIdNonSecure } from "../../util/random"
const p = new DOMParser()
async function mouseEnterHandler(
this: HTMLAnchorElement,
{ clientX, clientY }: { clientX: number; clientY: number },
) {
clearActivePopover()
const link = this
link.id = `backlink-${randomIdNonSecure()}`
if (link.dataset.noPopover === "true") {
return
}
async function setPosition(popoverElement: HTMLElement) {
const { x, y } = await computePosition(link, popoverElement, {
strategy: "fixed",
middleware: [inline({ x: clientX, y: clientY }), shift(), flip()],
})
Object.assign(popoverElement.style, {
left: `${x}px`,
top: `${y}px`,
transform: `translate(${x}px, ${y}px)`,
})
}
const hasAlreadyBeenFetched = () =>
[...link.children].some((child) => child.classList.contains("popover"))
const prevPopoverElement = document.getElementById(`popover-${link.id.split("-")[1]}`)
const hasAlreadyBeenFetched = () => !!prevPopoverElement
// dont refetch if there's already a popover
if (hasAlreadyBeenFetched()) {
return setPosition(link.lastChild as HTMLElement)
setPosition(prevPopoverElement as HTMLElement)
prevPopoverElement?.classList.add("active-popover")
return
}
const thisUrl = new URL(document.location.href)
@ -94,7 +101,9 @@ async function mouseEnterHandler(
}
setPosition(popoverElement)
link.appendChild(popoverElement)
popoverElement.id = `popover-${link.id.split("-")[1]}`
popoverElement?.classList.add("active-popover")
document.body.appendChild(popoverElement)
if (hash !== "") {
const targetAnchor = hash.startsWith("#popover") ? hash : `#popover-${hash.slice(1)}`
@ -106,10 +115,23 @@ async function mouseEnterHandler(
}
}
function clearActivePopover() {
const allPopoverElements = document.querySelectorAll(".popover")
if (allPopoverElements) {
allPopoverElements.forEach((popoverElement) =>
popoverElement.classList.remove("active-popover"),
)
}
}
document.addEventListener("nav", () => {
const links = [...document.getElementsByClassName("internal")] as HTMLAnchorElement[]
for (const link of links) {
link.addEventListener("mouseleave", clearActivePopover)
link.addEventListener("mouseenter", mouseEnterHandler)
window.addCleanup(() => link.removeEventListener("mouseenter", mouseEnterHandler))
window.addCleanup(() => {
link.removeEventListener("mouseenter", mouseEnterHandler)
link.removeEventListener("mouseleave", clearActivePopover)
})
}
})