mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-01 11:42:06 +00:00
## Summary Popover components for graph mode are appendTo self so scale/translate works, however in the sidebar this causes them to be clipped by the parent overflow. This adds a provide/inject flag to change these to be appended to the body. ## Changes - **What**: - add append to injection for overriding where popovers are mounted - ensure dropdowns respect this flag - extract enterAppModeWithInputs helper - tests Before: <img width="225" height="140" alt="image" src="https://github.com/user-attachments/assets/bd83b0cd-49a9-45dd-8344-4c10221444fc" /> After: <img width="238" height="225" alt="image" src="https://github.com/user-attachments/assets/286e28e9-b37d-4ffc-91a9-7c340757d3fc" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10338-fix-App-mode-Widget-dropdowns-clipped-in-sidebar-3296d73d365081e2ba38e3e82006d65e) by [Unito](https://www.unito.io)
56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
import type { HintedString } from '@primevue/core'
|
|
import type { InjectionKey } from 'vue'
|
|
import { computed, inject } from 'vue'
|
|
|
|
/**
|
|
* 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
|
|
}
|
|
|
|
export const OverlayAppendToKey: InjectionKey<
|
|
HintedString<'body' | 'self'> | undefined | HTMLElement
|
|
> = Symbol('OverlayAppendTo')
|
|
|
|
/**
|
|
* 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. This composable provides
|
|
* the necessary props to keep overlays within their component elements.
|
|
*
|
|
* @param overrides - Optional overrides for specific use cases
|
|
* @returns Computed props object to spread on PrimeVue overlay components
|
|
*
|
|
* @example
|
|
* ```vue
|
|
* <template>
|
|
* <Select v-bind="overlayProps" />
|
|
* </template>
|
|
*
|
|
* <script setup>
|
|
* const overlayProps = useTransformCompatOverlayProps()
|
|
* </script>
|
|
* ```
|
|
*/
|
|
export function useTransformCompatOverlayProps(
|
|
overrides: TransformCompatOverlayOptions = {}
|
|
) {
|
|
const injectedAppendTo = inject(OverlayAppendToKey, undefined)
|
|
|
|
return computed(() => ({
|
|
appendTo: injectedAppendTo ?? ('self' as const),
|
|
...overrides
|
|
}))
|
|
}
|