import type { CheckedState } from './types'; import type { ComputedRef, Ref, ShallowRef } from 'vue'; import type { Direction } from '../config-provider'; import { useContextFactory } from '@robonen/vue'; export interface MenuContext { open: Ref; onOpenChange: (open: boolean) => void; content: Ref; onContentChange: (el: HTMLElement | null) => void; } export const { inject: useMenuContext, provide: provideMenuContext } = useContextFactory('MenuContext'); export interface MenuRootContext { onClose: () => void; dir: Ref; isUsingKeyboardRef: Ref; modal: Ref; } export const { inject: useMenuRootContext, provide: provideMenuRootContext } = useContextFactory('MenuRootContext'); export interface MenuContentContext { onItemEnter: (event: PointerEvent) => boolean; onItemLeave: (event: PointerEvent) => void; onTriggerLeave: (event: PointerEvent) => boolean; searchRef: Ref; pointerGraceTimerRef: Ref; onPointerGraceIntentChange: (intent: { area: Array<{ x: number; y: number }>; side: 'left' | 'right' } | null) => void; } export const { inject: useMenuContentContext, provide: provideMenuContentContext } = useContextFactory('MenuContentContext'); export interface MenuSubContext { contentId: ComputedRef; triggerId: ComputedRef; trigger: ShallowRef; onTriggerChange: (el: HTMLElement | null) => void; } export const { inject: useMenuSubContext, provide: provideMenuSubContext } = useContextFactory('MenuSubContext'); export interface MenuRadioGroupContext { modelValue: Ref; onValueChange: (value: string) => void; } export const { inject: useMenuRadioGroupContext, provide: provideMenuRadioGroupContext } = useContextFactory('MenuRadioGroupContext'); export interface MenuItemIndicatorContext { checkedState: Ref; } export const { inject: useMenuItemIndicatorContext, provide: provideMenuItemIndicatorContext } = useContextFactory('MenuItemIndicatorContext'); export interface MenuGroupContext { id: string; } export const { inject: useMenuGroupContext, provide: provideMenuGroupContext } = useContextFactory('MenuGroupContext');