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}
);
}