"use client";
import { cvx } from "xuxi";
import { Button } from "@/ui/button";
import { useOpenState } from "@/hooks/use-open-state";
type DataSide = "top" | "right" | "bottom" | "left";
type DataAlign = "start" | "center" | "end";
export function UseOpenStateTooltipDemo({ side }: { side?: DataSide; align?: DataAlign }) {
const state = useOpenState({
trigger: "hover",
sideOffset: 8,
side: side as DataSide,
observe: {
touch: true,
align: true,
side: true,
sideswipe: true,
offset: true,
contentRect: true
}
});
return (
<>
<Button
ref={state.triggerRef}
{...state.attr()}
onMouseEnter={state.handleOnMouseEnter}
onMouseLeave={state.handleOnMouseLeave}
onMouseMove={state.handleOnMouseMove}
onTouchStart={state.handleOnTouchStart}
>
Tooltip
</Button>
<state.Portal render={state.render}>
<p role="tooltip" ref={state.contentRef} className={tooltip({ side })} {...{ ...state.attr(), style: state.styleVars("content") }}>
allows use as a tooltip
</p>
</state.Portal>
</>
);
}
const tooltip = cvx({
assign:
"group absolute min-w-max z-20 text-[13px] rounded-md border bg-background text-popover-foreground shadow-md outline-none focus-visible:ring-0 flex items-center justify-center py-1 px-2 w-max max-w-max transition-opacity [transition-duration:200ms] data-[state=open]:animate-in data-[state=closed]:duration-200 data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0 data-[state=open]:zoom-in-100 data-[state=closed]:zoom-out-95 top-[--top] left-[--left]",
variants: {
side: {
top: "data-[side=top]:slide-in-from-bottom-0 data-[side=top]:data-[state=closed]:slide-out-to-bottom-0",
right: "data-[side=right]:slide-in-from-left-0 data-[side=right]:data-[state=closed]:slide-out-to-left-0",
bottom: "data-[side=bottom]:slide-in-from-top-0 data-[side=bottom]:data-[state=closed]:slide-out-to-top-0",
left: "data-[side=left]:slide-in-from-right-0 data-[side=left]:data-[state=closed]:slide-out-to-right-0"
}
}
});