Files
flotilla/src/lib/components/Popover.svelte
T
2025-02-03 17:21:46 -08:00

35 lines
762 B
Svelte

<script lang="ts">
import type {Snippet} from "svelte"
import {fly} from "@lib/transition"
interface Props {
onClose: any
hideOnClick?: boolean
children?: Snippet
}
const {onClose, hideOnClick = false, children}: Props = $props()
const onMouseUp = (e: any) => {
if (hideOnClick || !element?.contains(e.target)) {
setTimeout(onClose)
}
}
const onKeyDown = (e: any) => {
if (e.key === "Escape") {
setTimeout(onClose)
}
}
let element: HTMLElement | undefined = $state()
</script>
<svelte:window onmouseup={onMouseUp} onkeydown={onKeyDown} />
<div class="relative w-full" bind:this={element}>
<div transition:fly|local class="absolute z-popover w-full">
{@render children?.()}
</div>
</div>