feat: add tooltip in TabBar (#515)

This commit is contained in:
Pratiyank Kumar
2025-08-04 14:16:25 +02:00
committed by GitHub
parent 0386624ff5
commit 2fcc5e0643
2 changed files with 75 additions and 24 deletions
@@ -2,6 +2,12 @@
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { Tab, tabs, useMediaPanelStore } from "./store"; import { Tab, tabs, useMediaPanelStore } from "./store";
import { Button } from "@/components/ui/button";
import { ChevronRight, ChevronLeft } from "lucide-react";
import { useRef, useState, useEffect } from "react";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
export function TabBar() { export function TabBar() {
const { activeTab, setActiveTab } = useMediaPanelStore(); const { activeTab, setActiveTab } = useMediaPanelStore();
@@ -14,15 +20,20 @@ export function TabBar() {
return ( return (
<div <div
className={cn( className={cn(
"flex flex-col gap-0.5 items-center cursor-pointer opacity-100 hover:opacity-75", "flex z-[100] flex-col gap-0.5 items-center cursor-pointer",
activeTab === tabKey activeTab === tabKey ? "text-primary !opacity-100" : "text-muted-foreground"
? "text-primary !opacity-100"
: "text-muted-foreground"
)} )}
onClick={() => setActiveTab(tabKey)} onClick={() => setActiveTab(tabKey)}
key={tabKey} key={tabKey}
> >
<tab.icon className="size-[1.1rem]!" /> <Tooltip delayDuration={10}>
<TooltipTrigger asChild>
<tab.icon className="size-[1.1rem]! opacity-100 hover:opacity-75" />
</TooltipTrigger>
<TooltipContent side="right" align="center" variant="sidebar" sideOffset={8}>
<div className="dark:text-base-gray-950 text-black text-sm font-medium leading-none dark:text-white">{tab.label}</div>
</TooltipContent>
</Tooltip>
</div> </div>
); );
})} })}
+59 -19
View File
@@ -1,9 +1,8 @@
"use client"; import { cva, type VariantProps } from 'class-variance-authority';
import { Tooltip as TooltipPrimitive } from 'radix-ui';
import * as React from 'react';
import * as React from "react"; import { cn } from '@/lib/utils';
import { Tooltip as TooltipPrimitive } from "radix-ui";
import { cn } from "../../lib/utils";
const TooltipProvider = TooltipPrimitive.Provider; const TooltipProvider = TooltipPrimitive.Provider;
@@ -11,22 +10,63 @@ const Tooltip = TooltipPrimitive.Root;
const TooltipTrigger = TooltipPrimitive.Trigger; const TooltipTrigger = TooltipPrimitive.Trigger;
const tooltipVariants = cva(
'z-50 overflow-visible rounded-sm text-sm shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
{
variants: {
variant: {
default: 'bg-popover text-popover-foreground border px-3 py-1.5',
destructive:
'bg-destructive/10 text-destructive dark:bg-destructive/20 border-destructive [border-width:0.5px]',
outline: 'border-border',
important:
'bg-amber-100/90 text-amber-900 dark:bg-amber-900/20 dark:text-amber-300 border-amber-900 [border-width:0.5px]',
promotions:
'bg-red-100/90 text-red-900 dark:bg-red-900/20 dark:text-red-300 border-red-900 [border-width:0.5px]',
personal:
'bg-green-100/90 text-green-900 dark:bg-green-900/20 dark:text-green-300 border-green-900 [border-width:0.5px]',
updates:
'bg-purple-100/90 text-purple-900 dark:bg-purple-900/20 dark:text-purple-300 border-purple-900 [border-width:0.5px]',
forums:
'bg-blue-100/90 text-blue-900 dark:bg-blue-900/20 dark:text-blue-300 border-blue-900 [border-width:0.5px]',
sidebar: 'bg-white dark:bg-[#413F3E] p-2.5 flex flex-col gap-2',
},
},
defaultVariants: {
variant: 'default',
},
},
);
interface TooltipContentProps
extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,
VariantProps<typeof tooltipVariants> {}
const TooltipContent = React.forwardRef< const TooltipContent = React.forwardRef<
React.ElementRef<typeof TooltipPrimitive.Content>, React.ElementRef<typeof TooltipPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> TooltipContentProps
>(({ className, sideOffset = 4, ...props }, ref) => ( >(({ className, sideOffset = 4, variant, ...props }, ref) => (
<TooltipPrimitive.Portal> <TooltipPrimitive.Content
<TooltipPrimitive.Content ref={ref}
ref={ref} sideOffset={sideOffset}
sideOffset={sideOffset} className={cn(tooltipVariants({ variant }), className)}
className={cn( {...props}
"z-50 overflow-hidden rounded-md bg-foreground px-3 py-1.5 text-xs text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", >
className {variant === 'sidebar' && (
)} <svg
{...props} width="6"
/> height="10"
</TooltipPrimitive.Portal> viewBox="0 0 6 10"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="absolute left-[-6px] top-1/2 -translate-y-1/2"
>
<path d="M6 0L0 5L6 10V0Z" className="fill-white/80 dark:fill-[#413F3E]" />
</svg>
)}
{props.children}
</TooltipPrimitive.Content>
)); ));
TooltipContent.displayName = TooltipPrimitive.Content.displayName; TooltipContent.displayName = TooltipPrimitive.Content.displayName;
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };