diff --git a/frontend/src/lib/components/DropdownV2.svelte b/frontend/src/lib/components/DropdownV2.svelte index fd3189d889..f5071f94ad 100644 --- a/frontend/src/lib/components/DropdownV2.svelte +++ b/frontend/src/lib/components/DropdownV2.svelte @@ -4,6 +4,28 @@ id: null, close: null }) + + /** + * Creates a debounced function that delays invoking func until after wait milliseconds + * have elapsed since the last time the debounced function was invoked. + */ + function debounce any>( + func: T, + wait: number + ): (...args: Parameters) => void { + let timeoutId: ReturnType | null = null + + return function (...args: Parameters): void { + if (timeoutId !== null) { + clearTimeout(timeoutId) + } + + timeoutId = setTimeout(() => { + func(...args) + timeoutId = null + }, wait) + } + } @@ -95,6 +149,14 @@ close() } }} + on:mouseenter={() => { + if (leaveTimer) clearTimeout(leaveTimer) + debouncedHoverStart() + }} + on:mouseleave={() => { + if (hoverTimer) clearTimeout(hoverTimer) + debouncedHoverEnd() + }} data-menu > {#if $$slots.buttonReplacement} @@ -111,7 +173,20 @@ {#if open} -
+ +
{ + if (leaveTimer) clearTimeout(leaveTimer) + debouncedHoverStart() + }} + on:mouseleave={() => { + if (hoverTimer) clearTimeout(hoverTimer) + debouncedHoverEnd() + }} + >
diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 88944a4741..e44475a1ad 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -1261,6 +1261,9 @@ let flowPreviewButtons: FlowPreviewButtons let isDropdownOpen = false + let tooltipOpen = false + $: tooltipOpen && msgInput && msgInput.focus() + $: console.log('dbg isDropdownOpen', isDropdownOpen) @@ -1469,22 +1472,29 @@ Draft - - - -
+
diff --git a/frontend/src/lib/components/common/button/Button.svelte b/frontend/src/lib/components/common/button/Button.svelte index cb62cd2957..227a3ad17e 100644 --- a/frontend/src/lib/components/common/button/Button.svelte +++ b/frontend/src/lib/components/common/button/Button.svelte @@ -5,6 +5,7 @@ import Dropdown from '$lib/components/DropdownV2.svelte' import { getModifierKey, type Item } from '$lib/utils' import { Loader2, ChevronDown } from 'lucide-svelte' + import { createTooltip, melt } from '@melt-ui/svelte' export let size: ButtonType.Size = 'md' export let spacingSize: ButtonType.Size = size @@ -34,6 +35,8 @@ export let shortCut: | { key?: string; hide?: boolean; Icon?: any; withoutModifier?: boolean } | undefined = undefined + export let dropdownOpen: boolean = false + export let dropdownOpenOnHover: boolean = false type MenuItem = { label: string @@ -117,6 +120,24 @@ } $: lucideIconSize = (iconMap[size] ?? 12) * 1 + + const { + elements: { trigger, content } + } = createTooltip({ + positioning: { + placement: 'bottom-end' + }, + openDelay: 0, + closeDelay: 0, + group: true, + portal: 'body', + onOpenChange: ({ curr, next }) => { + if (curr != next) { + dispatch('tooltip-open', next) + } + return next + } + })
{#if loading} @@ -232,8 +254,20 @@ {/if} +
+ +
+ {#if dropdownItems && dropdownItems.length > 0} - +