Initial commit with files
Still need to fix the imports
This commit is contained in:
57
src/lib/components/popover/PopoverGroup.svelte
Normal file
57
src/lib/components/popover/PopoverGroup.svelte
Normal file
@@ -0,0 +1,57 @@
|
||||
<script lang="ts" context="module">
|
||||
export interface PopoverGroupContext {
|
||||
registerPopover(registerbag: PopoverRegisterBag): void;
|
||||
unregisterPopover(registerbag: PopoverRegisterBag): void;
|
||||
isFocusWithinPopoverGroup(): boolean;
|
||||
closeOthers(buttonId: string): void;
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { PopoverRegisterBag } from "./Popover.svelte";
|
||||
import { setContext } from "svelte";
|
||||
let groupRef: HTMLDivElement | undefined;
|
||||
let popovers: PopoverRegisterBag[] = [];
|
||||
|
||||
function unregisterPopover(registerBag: PopoverRegisterBag) {
|
||||
popovers = popovers.filter((bag) => bag != registerBag);
|
||||
}
|
||||
|
||||
function registerPopover(registerBag: PopoverRegisterBag) {
|
||||
popovers = [...popovers, registerBag];
|
||||
return () => {
|
||||
unregisterPopover(registerBag);
|
||||
};
|
||||
}
|
||||
|
||||
function isFocusWithinPopoverGroup() {
|
||||
let element = document.activeElement as HTMLElement;
|
||||
|
||||
if (groupRef?.contains(element)) return true;
|
||||
|
||||
// Check if the focus is in one of the button or panel elements. This is important in case you are rendering inside a Portal.
|
||||
return popovers.some((bag) => {
|
||||
return (
|
||||
document.getElementById(bag.buttonId)?.contains(element) ||
|
||||
document.getElementById(bag.panelId)?.contains(element)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function closeOthers(buttonId: string) {
|
||||
for (let popover of popovers) {
|
||||
if (popover.buttonId !== buttonId) popover.close();
|
||||
}
|
||||
}
|
||||
|
||||
setContext("PopoverGroup", {
|
||||
unregisterPopover,
|
||||
registerPopover,
|
||||
isFocusWithinPopoverGroup,
|
||||
closeOthers,
|
||||
});
|
||||
</script>
|
||||
|
||||
<div {...$$restProps} bind:this={groupRef}>
|
||||
<slot />
|
||||
</div>
|
||||
Reference in New Issue
Block a user