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:
		
							parent
							
								
									d61fb266c7
								
							
						
					
					
						commit
						bb24cd13c7
					
				| @ -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) | ||||
|     }) | ||||
|   } | ||||
| }) | ||||
|  | ||||
| @ -12,6 +12,8 @@ | ||||
|     list-style: none; | ||||
|     padding: 0; | ||||
|     margin: 0.5rem 0; | ||||
|     height: 6rem; | ||||
|     overscroll-behavior: contain; | ||||
| 
 | ||||
|     & > li { | ||||
|       & > a { | ||||
|  | ||||
| @ -118,6 +118,7 @@ button.desktop-explorer { | ||||
|     list-style: none; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
|     overscroll-behavior: contain; | ||||
| 
 | ||||
|     & li > a { | ||||
|       color: var(--dark); | ||||
|  | ||||
| @ -16,9 +16,12 @@ | ||||
| 
 | ||||
| .popover { | ||||
|   z-index: 999; | ||||
|   position: absolute; | ||||
|   position: fixed; | ||||
|   overflow: visible; | ||||
|   padding: 1rem; | ||||
|   left: 0; | ||||
|   top: 0; | ||||
|   will-change: transform; | ||||
| 
 | ||||
|   & > .popover-inner { | ||||
|     position: relative; | ||||
| @ -35,6 +38,7 @@ | ||||
|     border-radius: 5px; | ||||
|     box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); | ||||
|     overflow: auto; | ||||
|     overscroll-behavior: contain; | ||||
|     white-space: normal; | ||||
|     user-select: none; | ||||
|     cursor: default; | ||||
| @ -77,7 +81,7 @@ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| a:hover .popover, | ||||
| .active-popover, | ||||
| .popover:hover { | ||||
|   animation: dropin 0.3s ease; | ||||
|   animation-fill-mode: forwards; | ||||
|  | ||||
| @ -50,6 +50,8 @@ ul.toc-content { | ||||
|   position: relative; | ||||
|   margin: 0.5rem 0; | ||||
|   padding: 0; | ||||
|   height: 5rem; | ||||
|   overscroll-behavior: contain; | ||||
| 
 | ||||
|   list-style: none; | ||||
|   & > li > a { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user