Context
Sidebar ์ปดํฌ๋ํธ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๋ ์ค Sidebar ๋ด๋ถ์์ Tooltip์ ํ์ฉํ๋ ๋ถ๋ถ์ ๋ฐ๊ฒฌํ์๋ค. ์ด์ฒ๋ผ shadcn/ui๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌํ์ฉํ๋ ๋ฉ์ง ๋ชจ์ต์ ํ์ธํ ์ ์๋ค. ์ฌํ์ฉ์ ์ด๋ป๊ฒ ํ๋์ง, ๋ด๋ถ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ์์ฑ ๋์ด์๋์ง ๋ถ์ํ ํ์์ฑ์ด ์๋ค๊ณ ํ๋จํ์๋ค.
Agenda
โข
Tooltip ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ ์ดํดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํจ
Contents
TooltipProvider
SidebarProvider์ ๋ง์ง๋ง์ return์์ ์๋์ ๊ฐ์ด TooltipProvider๋ฅผ ํธ์ถํ๋ค.
return (
<SidebarContext.Provider value={contextValue}>
<TooltipProvider delayDuration={0}>
...
</TooltipProvider>
</SidebarContext.Provider>
);
JavaScript
๋ณต์ฌ
Tooltip์ ์์๋ ๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์์ผ๋ฉฐ, Sidebar ๋ด๋ถ์์ ์ด๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํด์ ์ฌ์ฉํ๋ค.
...
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
...
const TooltipProvider = ({
delayDuration = 0,
...props
}: React.ComponentProps<typeof TooltipPrimitive.Provider>) => {
return (
<TooltipPrimitive.Provider
data-slot='tooltip-provider'
delayDuration={delayDuration}
{...props}
/>
);
};
JavaScript
๋ณต์ฌ
TooltipProvider๋ ์์ ๊ฐ์ด ๊ตฌ์ฑ ๋์ด์๋ค. TooltipPrimitive.Provider๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋๋ฐ, ์ด ๊ฒ์ radix-ui์ ์๋ ์ปดํฌ๋ํธ์ด๋ค. radix-ui์์ ์ ๊ณตํ๋ Tooltip์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Sidebar์ฒ๋ผ Provider๋ฅผ ๋ง๋ค๊ณ , Context๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ํํ์ง ์์๋ ๋๋ค.
radix-ui์ react-tooltip์ default export๊ฐ ์๊ณ ์๋์ ๊ฐ์ด export { } ํํ๋ก ๋ชจ๋์ export ํ๋ค.
export { Arrow, Content, Portal, Provider, Root, Tooltip, TooltipArrow, type TooltipArrowProps, TooltipContent, type TooltipContentProps, TooltipPortal, type TooltipPortalProps, type TooltipProps, TooltipProvider, type TooltipProviderProps, TooltipTrigger, type TooltipTriggerProps, Trigger, createTooltipScope };
JavaScript
๋ณต์ฌ
๋ง์ฝ *๋ฅผ ์ง์ฐ๊ณ Provider๋ง importํ๊ณ ์ถ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
import { Provider as TooltipPrimitiveProvider } from '@radix-ui/react-tooltip';
JavaScript
๋ณต์ฌ
delayDuration ํ๋ผ๋ฏธํฐ๋ number ํ์
์ผ๋ก Tooltip์ด ๋ํ๋๋ ๋๋ ์ด๋ฅผ ๊ฒฐ์ ํ๋ค. ์ฌ๊ธฐ์๋ 0์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ฌ ๋ฐ๋ก ํ๋ฉด์ ๋ํ๋๋ค.
Tooltip
function Tooltip({
...props
}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
return (
<TooltipProvider>
<TooltipPrimitive.Root data-slot='tooltip' {...props} />
</TooltipProvider>
);
}
JavaScript
๋ณต์ฌ
์๋ shadcn/ui์ Tooltip ์ปดํฌ๋ํธ ๊ตฌํ๋ถ์ด๋ค. TooltipProvider์ ๋ง์ฐฌ๊ฐ์ง๋ก Radix Tooltip์ shadcn/ui ์คํ์ผ๋ก ํฌ์ฅํ wrapper์ด๋ค. ์ด Tooltip์ React.ComponentProps<typeof TooltipPrimitive.Root>๋ฅผ ํตํด radix-ui์ Tooltip - Root ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
์ ๊ธฐํ ๊ฒ์ ์์ TooltipProvider๋ฅผ ์ด Tooltip ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค. radix-ui์์ Tooltip์ Provider ์์์๋ง ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๊ฐ ๋์ด์๋๋ฐ, ๋ง์ฝ ์ฌ์ฉ์๊ฐ Provider๋ฅผ ์์ด๋ Tooltip์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๊ฐ ๋์ด์๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ์ ์ฌ์ฉ์๊ฐ ์ ์์ ์ผ๋ก Provider๋ฅผ ๋ฐฐ์นํ๊ณ ๊ทธ ์์์ Tooltip์ ์ฌ์ฉํ๋ค๋ฉด Provider๊ฐ ๋ ๊ฐ ์๊ธฐ๋ ๊ฒ์ธ๋ฐ, ๋ถํ์ํ์ง ์์๊น ์๊ฐ ๋๋ค.
TooltipTrigger
const TooltipTrigger = ({
...props
}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) => {
return <TooltipPrimitive.Trigger data-slot='tooltip-trigger' {...props} />;
};
JavaScript
๋ณต์ฌ
TooltipTrigger๋ Tooltip์ ์ผ๊ณ ๋๋ ๋ฒํผ์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก radix-ui์ Trigger๋ฅผ ๊ฐ์ธ๋ wrapper ํํ์ด๋ฉฐ radix-ui์ Trigger์์ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ ์๊ณ ๋๊ฒจ์ค๋ค.
TooltipContent
const TooltipContent = ({
className,
sideOffset = 0,
children,
...props
}: React.ComponentProps<typeof TooltipPrimitive.Content>) => {
return (
<TooltipPrimitive.Portal>
<TooltipPrimitive.Content
data-slot='tooltip-content'
sideOffset={sideOffset}
className={cn(
'bg-foreground 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',
'z-50 w-fit origin-(--radix-tooltip-content-transform-origin)',
'rounded-md px-3 py-1.5 text-xs text-balance',
className,
)}
{...props}
>
{children}
<TooltipPrimitive.Arrow className='bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]' />
</TooltipPrimitive.Content>
</TooltipPrimitive.Portal>
);
};
JavaScript
๋ณต์ฌ
Tooltip์ ์ปจํ
์ธ ๋ฅผ ๋ด๋ ์ปดํฌ๋ํธ์ด๋ค. ๊ตฌํ๋ถ์ ์์๋ถํฐ ํน์ดํ ๋ถ๋ถ์ด ์กด์ฌํ๋ค. ๋ฐ๋ก Portal์ด๋ค. Portal์ ์ฌ์ฉํ๊ฒ๋๋ฉด body ํ๊ทธ ์์ ๋ ๋๋ง ํ๋ ์ค์ ๋ค๋ฅธ ๊ณณ์ ๋ ๋๋ง ํ๋ค. ๋
ผ๋ฆฌ์ ์ผ๋ก๋ ๋ฐฐ์นํ ์์น์ ์ํ์ง๋ง ์ค์ DOM ์์น๋ ๋ค๋ฅธ ๊ณณ์ ๋ ๋๋ง ํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํ๋ ์ด์ ๋ UI ์ปดํฌ๋ํธ ํน์ฑ ๋๋ฌธ์ธ๋ฐ, ํดํ์ด๋ ๋ชจ๋ฌ, ๋๋กญ๋ค์ด, ํ์ค๋ฒ ๊ฐ์ ์ปดํฌ๋ํธ๋ z-index๋ ๋ ์ด์์ ๊ตฌ์กฐ์ ์ํฅ์ ์ฝ๊ฒ ๋ฐ์ ์ ์๋ค. ๋ฐ๋ผ์ Portal์ ์ฌ์ฉํด ํญ์ ํ๋ฉด ์์ ๋ฐ ์ ์๋๋ก ํ๋ค.