From cfe1aaa55edb1a397c6feaf65c74928c1a7a011e Mon Sep 17 00:00:00 2001 From: Ryan Gossiaux Date: Mon, 20 Dec 2021 22:28:46 -0800 Subject: [PATCH] Switch Popover to Also fix a bug where PopoverPanel was missing an id --- src/lib/components/popover/Popover.svelte | 27 +++++++++++--- .../components/popover/PopoverButton.svelte | 35 ++++++++++++++----- .../components/popover/PopoverGroup.svelte | 22 +++++++++--- .../components/popover/PopoverOverlay.svelte | 28 +++++++++++---- .../components/popover/PopoverPanel.svelte | 34 +++++++++++++----- 5 files changed, 114 insertions(+), 32 deletions(-) diff --git a/src/lib/components/popover/Popover.svelte b/src/lib/components/popover/Popover.svelte index 436c7ce..386acca 100644 --- a/src/lib/components/popover/Popover.svelte +++ b/src/lib/components/popover/Popover.svelte @@ -52,9 +52,15 @@ import { usePopoverGroupContext } from "./PopoverGroup.svelte"; import { getContext, setContext, onMount } from "svelte"; import { Readable, writable, Writable } from "svelte/store"; - import { ActionArray, useActions } from "$lib/hooks/use-actions"; + import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; + import { get_current_component } from "svelte/internal"; + import type { SupportedAs } from "$lib/internal/elements"; + import type { HTMLActionArray } from "$lib/hooks/use-actions"; + import Render from "$lib/utils/Render.svelte"; + const forwardEvents = forwardEventsBuilder(get_current_component()); - export let use: ActionArray = []; + export let as: SupportedAs = "div"; + export let use: HTMLActionArray = []; const buttonId = `headlessui-popover-button-${useId()}`; const panelId = `headlessui-popover-panel-${useId()}`; @@ -155,9 +161,20 @@ $button?.focus(); } } + + $: slotProps = { + open: popoverState === PopoverStates.Open, + close: $api.close, + }; -
- -
+ + + diff --git a/src/lib/components/popover/PopoverButton.svelte b/src/lib/components/popover/PopoverButton.svelte index d64ab5c..11348b1 100644 --- a/src/lib/components/popover/PopoverButton.svelte +++ b/src/lib/components/popover/PopoverButton.svelte @@ -9,8 +9,16 @@ import { PopoverStates, usePopoverContext } from "./Popover.svelte"; import { usePopoverGroupContext } from "./PopoverGroup.svelte"; import { usePopoverPanelContext } from "./PopoverPanel.svelte"; - import { ActionArray, useActions } from "$lib/hooks/use-actions"; - export let use: ActionArray = []; + import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; + import { get_current_component } from "svelte/internal"; + import type { SupportedAs } from "$lib/internal/elements"; + import type { HTMLActionArray } from "$lib/hooks/use-actions"; + import Render from "$lib/utils/Render.svelte"; + const forwardEvents = forwardEventsBuilder(get_current_component()); + + export let as: SupportedAs = "button"; + export let use: HTMLActionArray = []; + export let disabled: Boolean = false; let api = usePopoverContext("PopoverButton"); @@ -38,7 +46,8 @@ activeElementRef = document.activeElement; } - function handleKeyDown(event: KeyboardEvent) { + function handleKeyDown(e: CustomEvent) { + let event = e as any as KeyboardEvent; if (isWithinPanel) { if ($api.popoverState === PopoverStates.Closed) return; switch (event.key) { @@ -106,7 +115,8 @@ } } } - function handleKeyUp(event: KeyboardEvent) { + function handleKeyUp(e: CustomEvent) { + let event = e as any as KeyboardEvent; if (isWithinPanel) return; if (event.key === Keys.Space) { // Required for firefox, event.preventDefault() in handleKeyDown for @@ -163,18 +173,25 @@ "aria-controls": $api.panel ? $api.panelId : undefined, disabled: disabled ? true : undefined, }; + + $: slotProps = { + open: $api.popoverState === PopoverStates.Open, + }; - + +
diff --git a/src/lib/components/popover/PopoverGroup.svelte b/src/lib/components/popover/PopoverGroup.svelte index 642c677..93fd7f2 100644 --- a/src/lib/components/popover/PopoverGroup.svelte +++ b/src/lib/components/popover/PopoverGroup.svelte @@ -15,8 +15,16 @@ -
+ -
+ diff --git a/src/lib/components/popover/PopoverOverlay.svelte b/src/lib/components/popover/PopoverOverlay.svelte index ba2e145..d1eabfe 100644 --- a/src/lib/components/popover/PopoverOverlay.svelte +++ b/src/lib/components/popover/PopoverOverlay.svelte @@ -1,9 +1,15 @@ {#if visible} -
- -
+ + + {/if} diff --git a/src/lib/components/popover/PopoverPanel.svelte b/src/lib/components/popover/PopoverPanel.svelte index 8b48da2..89668f1 100644 --- a/src/lib/components/popover/PopoverPanel.svelte +++ b/src/lib/components/popover/PopoverPanel.svelte @@ -24,8 +24,16 @@ StateDefinition, usePopoverContext, } from "./Popover.svelte"; - import { ActionArray, useActions } from "$lib/hooks/use-actions"; - export let use: ActionArray = []; + import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; + import { get_current_component } from "svelte/internal"; + import type { SupportedAs } from "$lib/internal/elements"; + import type { HTMLActionArray } from "$lib/hooks/use-actions"; + import Render from "$lib/utils/Render.svelte"; + const forwardEvents = forwardEventsBuilder(get_current_component()); + + export let as: SupportedAs = "div"; + export let use: HTMLActionArray = []; + export let focus = false; let api = usePopoverContext("PopoverPanel"); @@ -102,7 +110,8 @@ $api.closePopover(); } - function handleKeydown(event: KeyboardEvent) { + function handleKeydown(e: CustomEvent) { + let event = e as any as KeyboardEvent; switch (event.key) { case Keys.Escape: if ($api.popoverState !== PopoverStates.Open) return; @@ -115,6 +124,11 @@ break; } } + + $: slotProps = { + open: $api.popoverState === PopoverStates.Open, + close: $api.close, + }; {#if visible} -
- -
+ + {/if}