blob: 3c8a5dfc0b186e1ff7672d470680f619f04d575d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
import { forwardRef, ForwardRefRenderFunction, ReactNode } from 'react';
import { List, type ListItem } from '../../atoms';
import styles from './tooltip.module.scss';
export type TooltipProps = {
/**
* Set additional classnames to the tooltip wrapper.
*/
className?: string;
/**
* Set more additional classnames to the tooltip wrapper. Required when using React.cloneElement.
*/
cloneClassName?: string;
/**
* The tooltip body.
*/
content: string | string[];
/**
* An icon to illustrate tooltip content.
*/
icon: ReactNode;
/**
* The tooltip title.
*/
title: string;
};
const TooltipWithRef: ForwardRefRenderFunction<HTMLDivElement, TooltipProps> = (
{ cloneClassName = '', className = '', content, icon, title },
ref
) => {
/**
* Format an array of strings to an array of object with id and value.
*
* @param {string[]} array - An array of strings.
* @returns {ListItem[]} The array formatted to be used as list items.
*/
const getListItems = (array: string[]): ListItem[] => {
return array.map((string, index) => {
return { id: `item-${index}`, value: string };
});
};
return (
<div
className={`${styles.wrapper} ${cloneClassName} ${className}`}
ref={ref}
>
<div className={styles.title}>
<span className={styles.icon}>{icon}</span>
{title}
</div>
{Array.isArray(content) ? (
<List items={getListItems(content)} />
) : (
content
)}
</div>
);
};
/**
* Tooltip component
*
* Render a tooltip modal.
*/
export const Tooltip = forwardRef(TooltipWithRef);
|