@@ -70,7 +70,11 @@ export default class GleapTooltipManager {
7070 if ( node . nodeType === Node . ELEMENT_NODE && this . elementToFloatingUIMap . has ( node ) ) {
7171 const floatingUI = this . elementToFloatingUIMap . get ( node ) ;
7272 if ( floatingUI ) {
73- floatingUI ( ) ;
73+ if ( floatingUI . tooltip ) {
74+ floatingUI . tooltip . remove ( ) ;
75+ }
76+ floatingUI . cleanup ( ) ;
77+
7478 this . elementToFloatingUIMap . delete ( node ) ;
7579 }
7680 }
@@ -99,7 +103,7 @@ export default class GleapTooltipManager {
99103 } ) ;
100104 }
101105
102- createTooltip ( element , tooltipText ) {
106+ createTooltip ( element , tooltipText , tooltipData ) {
103107 // Create tooltip element
104108 const tooltip = document . createElement ( 'div' ) ;
105109 tooltip . className = 'gleap-tooltip' ;
@@ -118,7 +122,8 @@ export default class GleapTooltipManager {
118122 const arrowEl = tooltip . querySelector ( '.gleap-tooltip-arrow' ) ;
119123 const cleanup = autoUpdate ( element , tooltip , ( ) => {
120124 computePosition ( element , tooltip , {
121- middleware : [ autoPlacement ( ) , offset ( 10 ) , flip ( ) , shift ( ) , arrow ( { element : arrowEl } ) ] ,
125+ placement : tooltipData . posX === 'left' ? 'left' : 'right' ,
126+ middleware : [ offset ( 10 ) , flip ( ) , shift ( ) , arrow ( { element : arrowEl } ) ] ,
122127 } ) . then ( ( { x, y, middlewareData, placement } ) => {
123128 try {
124129 Object . assign ( tooltip . style , {
@@ -183,7 +188,10 @@ export default class GleapTooltipManager {
183188 tooltip . addEventListener ( 'mouseenter' , show ) ;
184189 tooltip . addEventListener ( 'mouseleave' , hide ) ;
185190
186- return cleanup ;
191+ return {
192+ cleanup,
193+ tooltip,
194+ } ;
187195 }
188196
189197 canEmbed ( element ) {
@@ -212,7 +220,11 @@ export default class GleapTooltipManager {
212220 element . setAttribute ( 'data-gleap-tooltip-mode' , 'hotspot' ) ;
213221
214222 if ( this . canEmbed ( element ) ) {
215- element . appendChild ( hotspotContainer ) ;
223+ if ( element . firstChild ) {
224+ element . insertBefore ( hotspotContainer , element . firstChild ) ;
225+ } else {
226+ element . appendChild ( hotspotContainer ) ;
227+ }
216228 } else {
217229 element . parentNode . insertBefore ( hotspotContainer , element . nextSibling ) ;
218230 }
@@ -234,7 +246,7 @@ export default class GleapTooltipManager {
234246 tooltipElem = element ;
235247 }
236248
237- const floatingUIInstance = this . createTooltip ( tooltipElem , tooltip . html ) ;
249+ const floatingUIInstance = this . createTooltip ( tooltipElem , tooltip . html , tooltip ) ;
238250
239251 this . elementToFloatingUIMap . set ( element , floatingUIInstance ) ;
240252 }
@@ -245,6 +257,16 @@ export default class GleapTooltipManager {
245257 return ;
246258 }
247259
260+ const tooltipId = element . getAttribute ( 'data-gleap-tooltip' ) ;
261+ if ( ! tooltipId ) {
262+ return ;
263+ }
264+
265+ const hotspot = document . querySelector ( `[data-gleap-tooltip-hotspot="${ tooltipId } "]` ) ;
266+ if ( ! hotspot ) {
267+ return ;
268+ }
269+
248270 if ( ! tooltip . posX ) {
249271 tooltip . posX = 'right' ;
250272 }
@@ -259,6 +281,12 @@ export default class GleapTooltipManager {
259281 }
260282
261283 const elementRect = element . getBoundingClientRect ( ) ;
284+ const anchorElement = document . querySelector ( `[data-gleap-tooltip-anchor="${ tooltipId } "]` ) ;
285+ const anchorRect = anchorElement . getBoundingClientRect ( ) ;
286+
287+ // Offset calculation for hotspot position.
288+ const offsetX = anchorRect . left - elementRect . left ;
289+ const offsetY = anchorRect . top - elementRect . top ;
262290
263291 let top = 0 ;
264292 let left = 0 ;
@@ -285,14 +313,10 @@ export default class GleapTooltipManager {
285313 break ;
286314 }
287315
288- const tooltipId = element . getAttribute ( 'data-gleap-tooltip' ) ;
289- if ( tooltipId ) {
290- const hotspot = document . querySelector ( `[data-gleap-tooltip-hotspot="${ tooltipId } "]` ) ;
291- if ( hotspot ) {
292- hotspot . style . position = 'absolute' ;
293- hotspot . style . top = top + 'px' ;
294- hotspot . style . left = left + 'px' ;
295- }
316+ if ( hotspot ) {
317+ hotspot . style . position = 'absolute' ;
318+ hotspot . style . top = ( top - offsetY ) + 'px' ;
319+ hotspot . style . left = ( left - offsetX ) + 'px' ;
296320 }
297321 }
298322
@@ -315,7 +339,7 @@ export default class GleapTooltipManager {
315339
316340 const filterType = tooltip . pageType ;
317341 const filterValue = tooltip . page ;
318-
342+
319343 switch ( filterType ) {
320344 case 'is' :
321345 return currentUrl === filterValue ;
0 commit comments