import type { JSX } from "@solidjs/web";
/**
* Context exposed by `
` to `` / ``.
* Mirrors `packages/react/src/menu/positioner/MenuPositionerContext.ts`.
*/
import { type Accessor, createContext, useContext } from "solid-js";
import type { MutableRef } from "../../internals/floating-ui/types";
export type MenuSide =
| "top"
| "right"
| "bottom"
| "left"
| "inline-start"
| "inline-end"
| "none";
export type MenuAlign = "start" | "center" | "end";
export interface MenuPositionerContextValue {
side: Accessor;
align: Accessor;
anchorHidden: Accessor;
arrowRef: MutableRef;
arrowStyles: Accessor;
arrowUncentered: Accessor;
/** Floating-tree node id assigned to this positioner. */
nodeId: Accessor;
}
export const MenuPositionerContext =
createContext(null);
export function useMenuPositionerContext(): MenuPositionerContextValue;
export function useMenuPositionerContext(
optional: true,
): MenuPositionerContextValue | null;
export function useMenuPositionerContext(
optional?: boolean,
): MenuPositionerContextValue | null {
const ctx = useContext(MenuPositionerContext);
if (ctx == null && !optional) {
throw new Error(
"Base UI: MenuPositionerContext is missing. Positioner children must be placed within .",
);
}
return ctx;
}