49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { JSX } from "preact"
 | 
						|
import { randomIdNonSecure } from "../util/random"
 | 
						|
 | 
						|
const OverflowList = ({
 | 
						|
  children,
 | 
						|
  ...props
 | 
						|
}: JSX.HTMLAttributes<HTMLUListElement> & { id: string }) => {
 | 
						|
  return (
 | 
						|
    <ul {...props} class={[props.class, "overflow"].filter(Boolean).join(" ")} id={props.id}>
 | 
						|
      {children}
 | 
						|
      <li class="overflow-end" />
 | 
						|
    </ul>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export default () => {
 | 
						|
  const id = randomIdNonSecure()
 | 
						|
 | 
						|
  return {
 | 
						|
    OverflowList: (props: JSX.HTMLAttributes<HTMLUListElement>) => (
 | 
						|
      <OverflowList {...props} id={id} />
 | 
						|
    ),
 | 
						|
    overflowListAfterDOMLoaded: `
 | 
						|
document.addEventListener("nav", (e) => {
 | 
						|
  const observer = new IntersectionObserver((entries) => {
 | 
						|
    for (const entry of entries) {
 | 
						|
      const parentUl = entry.target.parentElement
 | 
						|
      if (!parentUl) return
 | 
						|
      if (entry.isIntersecting) {
 | 
						|
        parentUl.classList.remove("gradient-active")
 | 
						|
      } else {
 | 
						|
        parentUl.classList.add("gradient-active")
 | 
						|
      }
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  const ul = document.getElementById("${id}")
 | 
						|
  if (!ul) return
 | 
						|
 | 
						|
  const end = ul.querySelector(".overflow-end")
 | 
						|
  if (!end) return
 | 
						|
 | 
						|
  observer.observe(end)
 | 
						|
  window.addCleanup(() => observer.disconnect())
 | 
						|
})
 | 
						|
`,
 | 
						|
  }
 | 
						|
}
 |