@@ -18,13 +18,68 @@ export const getMinWidth = (element, maxWidth) => {
1818  return  Math . round ( Math . min ( maxWidth ,  contentWidth  ||  maxWidth ) ) ; 
1919} ; 
2020
21- export  const  isInViewport  =  ( element )  =>  { 
21+ export  const  isElementInViewport  =  ( element ,   container   =   null ,   position )  =>  { 
2222  const  rect  =  element . getBoundingClientRect ( ) ; 
23+   const  viewportWidth  =  window . innerWidth  ||  document . documentElement . clientWidth ; 
24+   const  viewportHeight  =  window . innerHeight  ||  document . documentElement . clientHeight ; 
2325
24-   return  ( 
25-     rect . top   >=  0  && 
26-     rect . left   >=   0  && 
27-     rect . bottom   <=   ( window . innerHeight   ||   document . documentElement . clientHeight )  && 
28-     rect . right   <=   ( window . innerWidth   ||   document . documentElement . clientWidth ) 
26+   let   isInsideViewport   =  ( 
27+     rect . bottom   >  0  && 
28+     rect . top   <   viewportHeight  && 
29+     rect . right   >   0  && 
30+     rect . left   <   viewportWidth 
2931  ) ; 
32+ 
33+   if  ( container )  { 
34+     const  containerRect  =  container . getBoundingClientRect ( ) ; 
35+ 
36+     if  ( position  ===  'top'  ||  position  ===  'bottom' )  { 
37+       isInsideViewport  =  ( 
38+         ( containerRect . bottom  +  containerRect . height )  <  viewportHeight  && 
39+         containerRect . top  <  viewportHeight 
40+       ) ; 
41+     }  else  { 
42+       isInsideViewport  =  ( 
43+         ( containerRect . right  +  containerRect . width )  <  viewportWidth  && 
44+         containerRect . left  <  viewportWidth 
45+       ) ; 
46+     } 
47+ 
48+     return  isInsideViewport ; 
49+   } 
50+ 
51+   return  isInsideViewport ; 
52+ } ; 
53+ 
54+ export  const  computeTooltipPosition  =  ( containerRef ,  tooltipRef ,  position ,  coords )  =>  { 
55+   if  ( ! containerRef  ||  ! tooltipRef )  { 
56+     return  coords ; 
57+   } 
58+ 
59+   const  containerRect  =  containerRef . getBoundingClientRect ( ) ; 
60+   const  tooltipRect  =  tooltipRef . getBoundingClientRect ( ) ; 
61+ 
62+   switch  ( position )  { 
63+     case  'top' :
64+       coords . top  =  containerRect . top ; 
65+       coords . left  =  containerRect . left  +  ( containerRect . width  /  2 ) ; 
66+       break ; 
67+     case  'bottom' :
68+       coords . top  =  containerRect . top  -  tooltipRect . height ; 
69+       coords . left  =  containerRect . left  +  ( containerRect . width  /  2 ) ; 
70+       break ; 
71+     case  'left' :
72+       coords . left  =  containerRect . left ; 
73+       coords . top  =  containerRect . top  +  ( containerRect . height  /  2 ) ; 
74+       break ; 
75+     case  'right' :
76+       coords . left  =  containerRect . right  -  tooltipRect . width ; 
77+       coords . top  =  containerRect . top  +  ( containerRect . height  /  2 ) ; 
78+       break ; 
79+   } 
80+ 
81+   coords . top  +=  window . scrollY ; 
82+   coords . left  +=  window . scrollX ; 
83+ 
84+   return  coords ; 
3085} ; 
0 commit comments