48 lines
1.2 KiB
TypeScript
48 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())
|
|
})
|
|
`,
|
|
}
|
|
}
|