import type { HintedString } from '@primevue/core' import { computed } from 'vue' import { useSettingStore } from '@/platform/settings/settingStore' /** * Options for configuring transform-compatible overlay props */ interface TransformCompatOverlayOptions { /** * Where to append the overlay. 'self' keeps overlay within component * for proper transform inheritance, 'body' teleports to document body */ appendTo?: HintedString<'body' | 'self'> | undefined | HTMLElement // Future: other props needed for transform compatibility // scrollTarget?: string | HTMLElement // autoZIndex?: boolean } /** * Composable that provides props to make PrimeVue overlay components * compatible with CSS-transformed parent elements. * * Vue nodes use CSS transforms for positioning/scaling. PrimeVue overlay * components (Select, MultiSelect, TreeSelect, etc.) teleport to document * body by default, breaking transform inheritance. * * When LiteGraph.ContextMenu.Scaling is enabled, overlays are appended to * 'self' to inherit canvas transforms and scale with the canvas. When disabled, * overlays are appended to 'body' to maintain fixed size regardless of canvas zoom. * * @param overrides - Optional overrides for specific use cases * @returns Computed props object to spread on PrimeVue overlay components * * @example * ```vue * * * * ``` */ export function useTransformCompatOverlayProps( overrides: TransformCompatOverlayOptions = {} ) { const settingStore = useSettingStore() return computed(() => { const contextMenuScaling = settingStore.get('LiteGraph.ContextMenu.Scaling') const appendTo = contextMenuScaling ? ('self' as const) : ('body' as const) return { appendTo, ...overrides } }) }