import type { Accessor, JSX } from "solid-js"; import { createContext, useContext } from "solid-js"; /** Internal context shared between all HoverCard sub-components. */ export interface InternalHoverCardContextValue { isOpen: Accessor; open: () => void; close: () => void; triggerRef: Accessor; setTriggerRef: (el: HTMLElement | null) => void; contentRef: Accessor; setContentRef: (el: HTMLElement | null) => void; contentId: string; triggerId: string; floatingStyle: Accessor; /** Open delay in ms. */ openDelay: number; /** Close delay in ms. */ closeDelay: number; /** Schedule open after openDelay. */ scheduleOpen: () => void; /** Schedule close after closeDelay. */ scheduleClose: () => void; /** Cancel any pending open/close timer. */ cancelTimers: () => void; } const InternalHoverCardContext = createContext(); /** * Returns the internal HoverCard context. Throws if used outside HoverCard. */ export function useInternalHoverCardContext(): InternalHoverCardContextValue { const ctx = useContext(InternalHoverCardContext); if (!ctx) { throw new Error( "[PettyUI] HoverCard parts must be used inside .\n" + " Fix: \n" + " ...\n" + " ...\n" + " ", ); } return ctx; } export const InternalHoverCardContextProvider = InternalHoverCardContext.Provider; /** Public context exposed via HoverCard.useContext(). */ export interface HoverCardContextValue { /** Whether the hover card is open. */ open: Accessor; } const HoverCardPublicContext = createContext(); /** * Returns the public HoverCard context. Throws if used outside HoverCard. */ export function useHoverCardContext(): HoverCardContextValue { const ctx = useContext(HoverCardPublicContext); if (!ctx) { throw new Error("[PettyUI] HoverCard.useContext() called outside of ."); } return ctx; } export const HoverCardPublicContextProvider = HoverCardPublicContext.Provider;