diff --git a/web/src/lib/components/ui/Dropdown.stories.svelte b/web/src/lib/components/ui/Dropdown.stories.svelte index 69d3cabe..2f9ecdcb 100644 --- a/web/src/lib/components/ui/Dropdown.stories.svelte +++ b/web/src/lib/components/ui/Dropdown.stories.svelte @@ -54,6 +54,25 @@ + + + + + Edit + Settings + + + Edit + Settings + + + Edit + Settings + + + + diff --git a/web/src/lib/components/ui/Dropdown.svelte b/web/src/lib/components/ui/Dropdown.svelte index 2ddc8254..b2ba4f51 100644 --- a/web/src/lib/components/ui/Dropdown.svelte +++ b/web/src/lib/components/ui/Dropdown.svelte @@ -5,8 +5,7 @@ export const dropdown = tv({ slots: { root: "relative inline-block", - plainTrigger: - "flex cursor-pointer items-center gap-1 border-0 bg-transparent p-0 text-inherit", + plainTrigger: "min-h-0 gap-1 border-0 bg-transparent p-0 text-inherit hover:bg-transparent", menu: "dropdown-menu fixed z-50 m-0 max-h-[calc(100dvh-1rem)] w-56 max-w-[calc(100vw-1rem)] divide-y divide-border-default overflow-auto rounded-sm border border-border-default bg-background-default text-foreground-default shadow-regular" }, variants: { @@ -57,6 +56,8 @@ group?: string; variant?: "plain" | "button"; buttonVariant?: ButtonVariants["variant"]; + size?: ButtonVariants["size"]; + insetShadow?: ButtonVariants["insetShadow"]; align?: DropdownVariants["align"]; label?: string; menuClass?: string; @@ -69,6 +70,8 @@ group, variant = "plain", buttonVariant = "default", + insetShadow = false, + size = "md", align = "left", label, menuClass, @@ -78,19 +81,13 @@ let open = $state(false); const classes = $derived(dropdown({ align })); - let triggerWrapper = $state(); - let triggerButtonEl = $state(); + let triggerElement = $state(); let menuElement = $state(); const fallbackId = $props.id(); const menuId = $derived(id ?? fallbackId); - const triggerElement = () => - variant === "button" - ? triggerWrapper?.querySelector("button, a") - : triggerButtonEl; - const focusTrigger = () => { - triggerElement()?.focus(); + triggerElement?.focus(); }; // intentionally not $state: only used for imperative focus, and reactive // reads inside DropdownItem's register $effect would loop it forever @@ -117,7 +114,7 @@ const onTriggerKeydown = (event: KeyboardEvent) => { if (!open && (event.key === "ArrowDown" || event.key === "ArrowUp")) { event.preventDefault(); - triggerElement()?.click(); + triggerElement?.click(); } }; @@ -181,38 +178,22 @@ - {#if variant === "button"} - - - {@render trigger()} - - - {:else} - - {@render trigger()} - - {/if} + + {@render trigger()} +