ConceptPortal-public/rsconcept/frontend/src/components/container/tooltip.tsx

62 lines
1.5 KiB
TypeScript
Raw Normal View History

'use client';
import { type ReactNode } from 'react';
2023-12-07 01:33:34 +03:00
import { createPortal } from 'react-dom';
import { type ITooltip, Tooltip as TooltipImpl } from 'react-tooltip';
2025-02-12 21:36:25 +03:00
import clsx from 'clsx';
2023-07-30 16:48:25 +03:00
import { usePreferencesStore } from '@/stores/preferences';
2023-07-30 16:48:25 +03:00
export type { PlacesType } from 'react-tooltip';
interface TooltipProps extends Omit<ITooltip, 'variant'> {
/** Text to display in the tooltip. */
2023-12-28 14:04:44 +03:00
text?: string;
/** Classname for z-index */
layer?: string;
2023-07-30 16:48:25 +03:00
}
/**
* Displays content in a tooltip container.
*/
2025-02-07 10:54:47 +03:00
export function Tooltip({
2023-12-28 14:04:44 +03:00
text,
children,
layer = 'z-tooltip',
place = 'bottom',
className,
2023-11-24 18:03:10 +03:00
style,
...restProps
}: TooltipProps) {
const darkMode = usePreferencesStore(state => state.darkMode);
if (typeof window === 'undefined') {
return null;
}
2023-12-07 01:33:34 +03:00
return createPortal(
<TooltipImpl
delayShow={750}
2023-12-28 14:04:44 +03:00
delayHide={100}
2024-08-19 22:03:39 +03:00
opacity={1}
2024-05-20 17:45:37 +03:00
className={clsx(
2025-03-07 20:38:40 +03:00
'relative',
2024-06-09 20:41:33 +03:00
'max-h-[calc(100svh-6rem)]',
'overflow-y-auto overflow-x-hidden sm:overflow-hidden overscroll-contain',
2024-05-20 17:45:37 +03:00
'border shadow-md',
2024-09-12 11:17:01 +03:00
'text-pretty',
2024-05-20 17:45:37 +03:00
layer,
className
)}
2023-12-28 14:04:44 +03:00
classNameArrow={layer}
2024-09-12 11:17:01 +03:00
style={{ ...{ paddingTop: '2px', paddingBottom: '2px', paddingLeft: '8px', paddingRight: '8px' }, ...style }}
2023-12-28 14:04:44 +03:00
variant={darkMode ? 'dark' : 'light'}
place={place}
{...restProps}
>
{text ? text : null}
{children as ReactNode}
</TooltipImpl>,
2023-12-28 14:04:44 +03:00
document.body
);
2023-07-30 16:48:25 +03:00
}