import { type Placement } from '@floating-ui/dom'; import { HoverCardRoot, HoverCardTrigger, HoverCardContent, type HoverCardController } from '../ui/hover-card'; import { defineWebComponent } from './define'; import { wireDisclosure } from './disclosure'; interface Props extends Record { /** Delay (ms) before the card opens on hover. Defaults to 0 (focus opens it * immediately too). */ openDelay?: number; /** Delay (ms) before it closes after the pointer leaves. Defaults to 300. */ closeDelay?: number; /** Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional * `-start`/`-end`). Defaults to `'bottom'`; flips to stay in view. */ placement?: string; /** Drive/observe open state (Shoelace-style: settable + reflected to the `open` * attribute, the element still self-manages on hover). Set `el.open = true`, * or ``; listen for `kai-open-change`. */ open?: boolean; /** Initial open state on mount (uncontrolled seed). */ defaultOpen?: boolean; /** Suppress the hover behavior entirely without unmounting. */ disabled?: boolean; } /** Events fired by ``. */ interface Events { /** The card opened or closed (by hover/focus, outside-click, or a method). */ 'kai-open-change': { open: boolean }; } /** * `` — reveals RICH content on hover/focus of a trigger (the * markup-carrying sibling of the text-only ``). Put the trigger as * default light-DOM content and the card body in `slot="card"`. The card is * portaled + positioned inside the shadow root, with a transparent hover bridge * so the pointer can travel into it. * * ```html * * @acme *
* Acme Corp *

Workspace · 24 members

*
*
* ``` */ defineWebComponent('kai-hover-card', { openDelay: undefined, closeDelay: undefined, placement: undefined, open: undefined, defaultOpen: undefined, disabled: undefined, }, (props, ctx) => { const { flag } = ctx; let api: HoverCardController | undefined; // The standard overlay surface: settable+reflecting `open`, kai-open-change, // show/hide/toggle, disabled-gating. See ./disclosure. wireDisclosure(ctx, () => api, () => props.open); return ( <> (api = a)} > ); });