11import React from 'react' ;
2+ import { createGlobalStyle } from 'styled-components' ;
3+
24import { OverlayArrow , Tooltip as AriaTooltip , TooltipTrigger , Focusable } from 'react-aria-components' ;
35
46import type { TooltipProps as AriaTooltipProps , TooltipTriggerComponentProps } from 'react-aria-components' ;
57
6- import './tooltip.css' ;
7-
88interface TooltipProps {
99 children : any ;
1010 content : string ;
@@ -14,6 +14,67 @@ interface TooltipProps {
1414 triggerProps ?: Omit < TooltipTriggerComponentProps , 'children' > ;
1515}
1616
17+ const TooltipStyles = createGlobalStyle `
18+ .react-aria-Tooltip {
19+ box-shadow: 0 8px 20px rgba(0 0 0 / 0.1);
20+ border-radius: 4px;
21+ background: var(--wave-exp-color-inverse-surface);
22+ color: var(--wave-exp-color-inverse-on-surface);
23+ forced-color-adjust: none;
24+ outline: none;
25+ padding: 2px 8px;
26+ max-width: 150px;
27+
28+ /* fixes FF gap */
29+ transform: translate3d(0, 0, 0);
30+ transition: transform 200ms, opacity 200ms;
31+
32+ & .react-aria-OverlayArrow svg {
33+ display: block;
34+ fill: var(--wave-exp-color-inverse-surface);
35+ }
36+
37+ &[data-entering],
38+ &[data-exiting] {
39+ transform: var(--origin);
40+ opacity: 0;
41+ }
42+
43+ &[data-placement='top'] {
44+ margin-bottom: 8px;
45+
46+ --origin: translateY(4px);
47+ }
48+
49+ &[data-placement='bottom'] {
50+ margin-top: 8px;
51+
52+ --origin: translateY(-4px);
53+ & .react-aria-OverlayArrow svg {
54+ transform: rotate(180deg);
55+ }
56+ }
57+
58+ &[data-placement='right'] {
59+ margin-left: 8px;
60+
61+ --origin: translateX(-4px);
62+ & .react-aria-OverlayArrow svg {
63+ transform: rotate(90deg);
64+ }
65+ }
66+
67+ &[data-placement='left'] {
68+ margin-right: 8px;
69+
70+ --origin: translateX(4px);
71+ & .react-aria-OverlayArrow svg {
72+ transform: rotate(-90deg);
73+ }
74+ }
75+ }
76+ ` ;
77+
1778const Tooltip = ( {
1879 children,
1980 content,
@@ -22,19 +83,22 @@ const Tooltip = ({
2283 hideArrow = false ,
2384 customTrigger = false
2485} : TooltipProps ) => (
25- < TooltipTrigger { ...triggerProps } >
26- { customTrigger ? < Focusable > { children } </ Focusable > : children }
27- < AriaTooltip { ...tooltipProps } >
28- { ! hideArrow && (
29- < OverlayArrow >
30- < svg width = { 8 } height = { 8 } viewBox = "0 0 8 8" >
31- < path d = "M0 0 L4 4 L8 0" />
32- </ svg >
33- </ OverlayArrow >
34- ) }
35- { content }
36- </ AriaTooltip >
37- </ TooltipTrigger >
86+ < >
87+ < TooltipStyles />
88+ < TooltipTrigger { ...triggerProps } >
89+ { customTrigger ? < Focusable > { children } </ Focusable > : children }
90+ < AriaTooltip { ...tooltipProps } >
91+ { ! hideArrow && (
92+ < OverlayArrow >
93+ < svg width = { 8 } height = { 8 } viewBox = "0 0 8 8" >
94+ < path d = "M0 0 L4 4 L8 0" />
95+ </ svg >
96+ </ OverlayArrow >
97+ ) }
98+ { content }
99+ </ AriaTooltip >
100+ </ TooltipTrigger >
101+ </ >
38102) ;
39103
40104export { Tooltip , TooltipProps } ;
0 commit comments