import { createContext, createMemo, useContext } from "solid-js";
import { createPopupCore } from "../internals/create-popup-core.jsx";
import { readOption } from "../internals/maybe-accessor.jsx";
import { SNAPSHOT_KEYS, snapshotKeys } from "../internals/observability/snapshot.jsx";

/**
 * Why the tooltip's open state changed.
 *
 * - `"trigger-hover"` — pointer entered / left the trigger.
 * - `"trigger-focus"` — keyboard focus moved to / from the trigger.
 * - `"trigger-press"` — trigger was pressed (click / Enter / Space).
 * - `"escape-key"` — Escape dismissed the tooltip.
 * - `"outside-press"` — pointer pressed outside.
 * - `"imperative"` — `t.setOpen()` called programmatically.
 */

/**
 * Options for {@link createTooltip}.
 */

/**
 * Public API returned by {@link createTooltip}.
 */

const TooltipContext = createContext(null);

/**
 * Read the nearest {@link TooltipApi} provided by `t.Provider`. Throws if
 * used outside a Provider unless `optional` is true.
 */

export function useTooltip(optional) {
  const ctx = useContext(TooltipContext);
  if (ctx == null && !optional) {
    throw new Error("Base UI: useTooltip() must be called inside a <t.Provider>.");
  }
  return ctx;
}

/**
 * Headless primitive for a tooltip compound. Owns logical state — open,
 * disabled, cursor-tracking knobs, hover delays. DOM machinery (floating-ui
 * positioning, portal, animation) lives in `<Tooltip.Root>` which composes
 * this primitive.
 */
export function createTooltip(options) {
  const core = createPopupCore({
    open: options.open,
    disabled: options.disabled,
    onOpenChange: options.onOpenChange
  });
  const trackCursorAxis = createMemo(() => readOption(options.trackCursorAxis) ?? "none", {
    name: "tooltip.trackCursorAxis"
  });
  const disableHoverablePopup = createMemo(() => Boolean(readOption(options.disableHoverablePopup)), {
    name: "tooltip.disableHoverablePopup"
  });
  const delay = createMemo(() => readOption(options.delay) ?? 600, {
    name: "tooltip.delay"
  });
  const closeDelay = createMemo(() => readOption(options.closeDelay) ?? 300, {
    name: "tooltip.closeDelay"
  });
  const api = {
    open: core.open,
    disabled: core.disabled,
    trackCursorAxis,
    disableHoverablePopup,
    delay,
    closeDelay,
    setOpen: core.setOpen,
    toggle: core.toggle,
    Provider: props => <TooltipContext value={api}>{props.children}</TooltipContext>
  };
  api[SNAPSHOT_KEYS] = TOOLTIP_SNAPSHOT_KEYS;
  return api;
}
const TOOLTIP_SNAPSHOT_KEYS = snapshotKeys("open", "disabled", "trackCursorAxis", "disableHoverablePopup", "delay", "closeDelay");
//# sourceMappingURL=create-tooltip.jsx.map
