import { createContext, JSXElement, useContext } from "solid-js"; import { FloatingRoot, FloatingTrigger, FloatingContent, useFloatingHover, Placement } from "./Floating.tsx"; const POPOVER_CLS = "bg-surface rounded-default shadow-lg border border-line"; interface PopoverProps { open?: boolean; onOpenChange?: (open: boolean) => void; placement?: Placement; offset?: number; // Nested floating that shouldn't close (or be closed by) an ancestor popover. standalone?: boolean; children?: JSXElement; } interface HoverPopoverProps extends PopoverProps { hoverDelay?: number; hoverCloseDelay?: number; } export function Popover(props: PopoverProps) { return ( props.onOpenChange?.(v)} placement={props.placement ?? "bottom-start"} offset={props.offset ?? 8} flip={true} shift={true} standalone={props.standalone}> {props.children} ); } interface PopoverTriggerProps { class?: string; title?: string; children?: JSXElement; } export function PopoverTrigger(props: PopoverTriggerProps) { return ( {props.children} ); } interface PopoverContentProps { class?: string; style?: Record; children?: JSXElement; } export function PopoverContent(props: PopoverContentProps) { return ( {props.children} ); } export function HoverPopover(props: HoverPopoverProps) { return ( props.onOpenChange?.(v)} placement={props.placement ?? "bottom-start"} offset={props.offset ?? 8} flip={true} shift={true} standalone={props.standalone}> {props.children} ); } interface HoverPopoverContextValue { hoverDelay: number; hoverCloseDelay: number; } const HoverPopoverContext = createContext(null); interface HoverPopoverInnerProps { hoverDelay: number; hoverCloseDelay: number; children?: JSXElement; } function HoverPopoverInner(props: HoverPopoverInnerProps) { return ( {props.children} ); } interface HoverPopoverTriggerProps { asChild?: boolean; class?: string; children?: JSXElement; } export function HoverPopoverTrigger(props: HoverPopoverTriggerProps) { const ctx = useContext(HoverPopoverContext); return ( {props.children} ); } export function HoverPopoverContent(props: PopoverContentProps) { const ctx = useContext(HoverPopoverContext); const hoverProps = useFloatingHover(true, ctx?.hoverCloseDelay ?? 150); return ( {props.children} ); }