import { useContainer } from '@tldraw/editor'
import classNames from 'classnames'
import { Popover as _Popover } from 'radix-ui'
import React from 'react'
import { useMenuIsOpen } from '../../hooks/useMenuIsOpen'
import { useDirection } from '../../hooks/useTranslation/useTranslation'
/** @public */
export interface TLUiPopoverProps {
id: string
open?: boolean
children: React.ReactNode
onOpenChange?(isOpen: boolean): void
className?: string
}
/** @public @react */
export function TldrawUiPopover({ id, children, onOpenChange, open, className }: TLUiPopoverProps) {
const [isOpen, handleOpenChange] = useMenuIsOpen(id, onOpenChange)
return (
<_Popover.Root onOpenChange={handleOpenChange} open={open || isOpen /* allow debugging */}>
{children}
)
}
/** @public */
export interface TLUiPopoverTriggerProps {
children?: React.ReactNode
}
/** @public @react */
export function TldrawUiPopoverTrigger({ children }: TLUiPopoverTriggerProps) {
const dir = useDirection()
return (
<_Popover.Trigger asChild dir={dir}>
{children}
)
}
/** @public */
export interface TLUiPopoverContentProps {
children: React.ReactNode
side: 'top' | 'bottom' | 'left' | 'right'
align?: 'start' | 'center' | 'end'
alignOffset?: number
sideOffset?: number
disableEscapeKeyDown?: boolean
autoFocusFirstButton?: boolean
}
/** @public @react */
export function TldrawUiPopoverContent({
side,
children,
align = 'center',
sideOffset = 8,
alignOffset = 0,
disableEscapeKeyDown = false,
autoFocusFirstButton = true,
}: TLUiPopoverContentProps) {
const container = useContainer()
const dir = useDirection()
const ref = React.useRef(null)
const handleOpenAutoFocus = React.useCallback(() => {
if (!autoFocusFirstButton) return
const buttons = (ref.current?.querySelectorAll('button:not([disabled])') ?? []) as HTMLElement[]
const visibleButtons = [...buttons].filter(
(button) => button.offsetWidth || button.offsetHeight
)
const firstButton = visibleButtons[0]
if (firstButton) firstButton.focus()
}, [autoFocusFirstButton])
return (
<_Popover.Portal container={container}>
<_Popover.Content
className="tlui-popover__content"
side={side}
sideOffset={sideOffset}
align={align}
alignOffset={alignOffset}
dir={dir}
ref={ref}
onOpenAutoFocus={handleOpenAutoFocus}
onEscapeKeyDown={(e) => disableEscapeKeyDown && e.preventDefault()}
>
{children}
{/* */}
)
}