KPopover

fun KPopover(open: Boolean, onDismiss: () -> Unit, trigger: @Composable () -> Unit, modifier: Modifier = Modifier, side: KPopoverSide = KPopoverSide.Bottom, align: KPopoverAlign = KPopoverAlign.Center, sideOffset: Dp = 4.dp, overlayZone: KPopoverOverlayPosition? = null, dismissOnClickOutside: Boolean = true, content: @Composable ColumnScope.() -> Unit)(source)

Shadcn/ui-style Popover with two display modes:

Inline mode (default — overlayZone = null): The panel is positioned adjacent to trigger, clamped so it never escapes the measured root bounds. side and align control placement.

Overlay mode (overlayZone is not null): The panel fills a full-screen scrim and is placed at overlayZone inside it (center, bottom-sheet, drawer, …). Useful for modal-style popovers.

In both modes, dismissOnClickOutside = true (default) closes the panel when the user taps outside the panel area.

// Inline popover
var open by remember { mutableStateOf(false) }
KPopover(
open = open,
onDismiss = { open = false },
trigger = { KButton("Open", onClick = { open = !open }) }
) {
KPopoverTitle("Hello")
}

// Bottom-sheet style overlay
KPopover(
open = open,
onDismiss = { open = false },
overlayZone = KPopoverOverlayPosition.BottomSheet,
trigger = { KButton("Sheet", onClick = { open = !open }) }
) {
Text("Sheet content")
}