import * as React from "react" import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip" import { cn } from "@/lib/utils" export type TooltipProps = Omit & Omit, "content" | "children"> & { content: React.ReactNode children: React.ReactNode side?: TooltipPrimitive.Positioner.Props["side"] align?: TooltipPrimitive.Positioner.Props["align"] sideOffset?: TooltipPrimitive.Positioner.Props["sideOffset"] alignOffset?: TooltipPrimitive.Positioner.Props["alignOffset"] collisionPadding?: TooltipPrimitive.Positioner.Props["collisionPadding"] delay?: TooltipPrimitive.Trigger.Props["delay"] closeDelay?: TooltipPrimitive.Trigger.Props["closeDelay"] disabled?: boolean } function getPlainText(node: React.ReactNode): string { if (typeof node === "string" || typeof node === "number") return String(node) if (Array.isArray(node)) return node.map(getPlainText).join("") if (React.isValidElement<{ children?: React.ReactNode }>(node)) return getPlainText(node.props.children) return "" } function Tooltip({ content, side = "top", align = "center", sideOffset = 8, alignOffset = 0, collisionPadding = 8, delay = 200, closeDelay = 0, disabled = false, className, children, ...props }: TooltipProps) { const trigger = React.isValidElement(children) ? ( children ) : ( {children} ) const contentText = getPlainText(content) const shouldRenderFallbackLabel = !disabled && contentText.length > 0 && !getPlainText(children).includes(contentText) return ( } > {trigger} {shouldRenderFallbackLabel ? {content} : null} {content} ) } export { Tooltip }