@@ -126,7 +126,48 @@ exports.loneHover = function loneHover(hoverItems, opts) {
126126 hoverItems = [ hoverItems ] ;
127127 }
128128
129+ var gd = opts . gd ;
130+ var gTop = getTopOffset ( gd ) ;
131+ var gLeft = getLeftOffset ( gd ) ;
132+
129133 var pointsData = hoverItems . map ( function ( hoverItem ) {
134+ var _x0 = hoverItem . _x0 || hoverItem . x0 || hoverItem . x || 0 ;
135+ var _x1 = hoverItem . _x1 || hoverItem . x1 || hoverItem . x || 0 ;
136+ var _y0 = hoverItem . _y0 || hoverItem . y0 || hoverItem . y || 0 ;
137+ var _y1 = hoverItem . _y1 || hoverItem . y1 || hoverItem . y || 0 ;
138+
139+ var eventData = hoverItem . eventData ;
140+ if ( eventData ) {
141+ var x0 = Math . min ( _x0 , _x1 ) ;
142+ var x1 = Math . max ( _x0 , _x1 ) ;
143+ var y0 = Math . min ( _y0 , _y1 ) ;
144+ var y1 = Math . max ( _y0 , _y1 ) ;
145+
146+ var trace = hoverItem . trace ;
147+ if ( Registry . traceIs ( trace , 'gl3d' ) ) {
148+ var container = gd . _fullLayout [ trace . scene ] . _scene . container ;
149+ var dx = container . offsetLeft ;
150+ var dy = container . offsetTop ;
151+ x0 += dx ;
152+ x1 += dx ;
153+ y0 += dy ;
154+ y1 += dy ;
155+ } // TODO: handle heatmapgl
156+
157+ eventData . bbox = {
158+ x0 : x0 + gLeft ,
159+ x1 : x1 + gLeft ,
160+ y0 : y0 + gTop ,
161+ y1 : y1 + gTop
162+ } ;
163+
164+ if ( opts . inOut_bbox ) {
165+ opts . inOut_bbox . push ( eventData . bbox ) ;
166+ }
167+ } else {
168+ eventData = false ;
169+ }
170+
130171 return {
131172 color : hoverItem . color || Color . defaultLine ,
132173 x0 : hoverItem . x0 || hoverItem . x || 0 ,
@@ -158,8 +199,9 @@ exports.loneHover = function loneHover(hoverItems, opts) {
158199 index : 0 ,
159200
160201 hovertemplate : hoverItem . hovertemplate || false ,
161- eventData : hoverItem . eventData || false ,
162202 hovertemplateLabels : hoverItem . hovertemplateLabels || false ,
203+
204+ eventData : eventData
163205 } ;
164206 } ) ;
165207
@@ -174,7 +216,7 @@ exports.loneHover = function loneHover(hoverItems, opts) {
174216 outerContainer : outerContainer3
175217 } ;
176218
177- var hoverLabel = createHoverText ( pointsData , fullOpts , opts . gd ) ;
219+ var hoverLabel = createHoverText ( pointsData , fullOpts , gd ) ;
178220
179221 // Fix vertical overlap
180222 var tooltipSpacing = 5 ;
@@ -199,8 +241,8 @@ exports.loneHover = function loneHover(hoverItems, opts) {
199241 d . offset -= anchor ;
200242 } ) ;
201243
202- var scaleX = opts . gd . _fullLayout . _invScaleX ;
203- var scaleY = opts . gd . _fullLayout . _invScaleY ;
244+ var scaleX = gd . _fullLayout . _invScaleX ;
245+ var scaleY = gd . _fullLayout . _invScaleY ;
204246 alignHoverText ( hoverLabel , fullOpts . rotateLabels , scaleX , scaleY ) ;
205247
206248 return multiHover ? hoverLabel : hoverLabel . node ( ) ;
@@ -732,6 +774,9 @@ function _hover(gd, evt, subplot, noHoverEvent) {
732774 var oldhoverdata = gd . _hoverdata ;
733775 var newhoverdata = [ ] ;
734776
777+ var gTop = getTopOffset ( gd ) ;
778+ var gLeft = getLeftOffset ( gd ) ;
779+
735780 // pull out just the data that's useful to
736781 // other people and send it to the event
737782 for ( itemnum = 0 ; itemnum < hoverData . length ; itemnum ++ ) {
@@ -746,6 +791,25 @@ function _hover(gd, evt, subplot, noHoverEvent) {
746791 pt . hovertemplate = ht || pt . trace . hovertemplate || false ;
747792 }
748793
794+ if ( pt . xa && pt . ya ) {
795+ var _x0 = pt . x0 + pt . xa . _offset ;
796+ var _x1 = pt . x1 + pt . xa . _offset ;
797+ var _y0 = pt . y0 + pt . ya . _offset ;
798+ var _y1 = pt . y1 + pt . ya . _offset ;
799+
800+ var x0 = Math . min ( _x0 , _x1 ) ;
801+ var x1 = Math . max ( _x0 , _x1 ) ;
802+ var y0 = Math . min ( _y0 , _y1 ) ;
803+ var y1 = Math . max ( _y0 , _y1 ) ;
804+
805+ eventData . bbox = {
806+ x0 : x0 + gLeft ,
807+ x1 : x1 + gLeft ,
808+ y0 : y0 + gTop ,
809+ y1 : y1 + gTop
810+ } ;
811+ }
812+
749813 pt . eventData = [ eventData ] ;
750814 newhoverdata . push ( eventData ) ;
751815 }
@@ -2033,3 +2097,9 @@ function getCoord(axLetter, winningPoint, fullLayout) {
20332097
20342098 return val ;
20352099}
2100+
2101+ // Top/left hover offsets relative to graph div. As long as hover content is
2102+ // a sibling of the graph div, it will be positioned correctly relative to
2103+ // the offset parent, whatever that may be.
2104+ function getTopOffset ( gd ) { return gd . offsetTop + gd . clientTop ; }
2105+ function getLeftOffset ( gd ) { return gd . offsetLeft + gd . clientLeft ; }
0 commit comments