'use client' import React from 'react' import { cn } from '../../utils' import { Popover, PopoverContent, PopoverTrigger, PopoverArrow, } from '../Popover/Popover' import { TooltipContent as TooltipPrimitiveContent, TooltipProvider as TooltipPrimitiveProvider, Tooltip as TooltipPrimitive, TooltipTrigger as TooltipPrimitiveTrigger, TooltipArrow as TooltipPrimitiveArrow, } from './Tooltip' type ResponsiveMode = 'mobile' | 'desktop' const ResponsiveModeContext = React.createContext('mobile') export type ResponsiveTooltipProps = React.PropsWithChildren<{ /** Opens the tooltip/popover by default in uncontrolled usage. */ defaultOpen?: boolean /** Controls the open state. Pair with `onOpenChange` for controlled usage. */ open?: boolean /** Called when the tooltip/popover requests an open state change. */ onOpenChange?: (open: boolean) => void }> /** * Tooltip that adapts to the device: renders a hover Tooltip on desktop and a * tap Popover on mobile. Renders both simultaneously and uses CSS to show the * right one. Compose with ResponsiveTooltipTrigger and ResponsiveTooltipContent. */ function ResponsiveTooltip({ children, ...props }: ResponsiveTooltipProps) { return ( {children} {children} ) } export type ResponsiveTooltipTriggerProps = React.PropsWithChildren<{ asChild?: boolean className?: string }> /** Trigger element for ResponsiveTooltip. Renders as a Popover trigger on mobile and a Tooltip trigger on desktop. */ function ResponsiveTooltipTrigger({ children, className, ...props }: ResponsiveTooltipTriggerProps) { const mode = React.useContext(ResponsiveModeContext) if (mode === 'mobile') { return ( {children} ) } return ( {children} ) } function ResponsiveTooltipArrow({ ...props }) { const mode = React.useContext(ResponsiveModeContext) if (mode === 'mobile') { return } return } export type ResponsiveTooltipContentProps = { asChild?: boolean | undefined /** Which side of the trigger to display the content on. */ side?: 'top' | 'right' | 'bottom' | 'left' /** Alignment along the trigger's cross-axis. */ align?: 'start' | 'center' | 'end' /** When true, hides the directional arrow. Defaults to false. */ hideArrow?: boolean className?: string } /** * Content panel for ResponsiveTooltip. Renders as a Popover on mobile and a * Tooltip on desktop. Shows an arrow by default; set `hideArrow` to suppress it. */ function ResponsiveTooltipContent({ children, hideArrow = false, className, ...props }: React.PropsWithChildren) { const mode = React.useContext(ResponsiveModeContext) if (mode === 'mobile') { return ( {!hideArrow && } {children} ) } return ( {!hideArrow && } {children} ) } export { ResponsiveTooltip, ResponsiveTooltipTrigger, ResponsiveTooltipContent }