@@ -125,6 +125,7 @@ exports.loneHover = function loneHover(hoverItem, opts) {
125125 fontSize : hoverItem . fontSize ,
126126 fontColor : hoverItem . fontColor ,
127127 nameLength : hoverItem . nameLength ,
128+ textAlign : hoverItem . textAlign ,
128129
129130 // filler to make createHoverText happy
130131 trace : hoverItem . trace || {
@@ -182,6 +183,7 @@ exports.multiHovers = function multiHovers(hoverItems, opts) {
182183 fontSize : hoverItem . fontSize ,
183184 fontColor : hoverItem . fontColor ,
184185 nameLength : hoverItem . nameLength ,
186+ textAlign : hoverItem . textAlign ,
185187
186188 // filler to make createHoverText happy
187189 trace : hoverItem . trace || {
@@ -1281,20 +1283,18 @@ function alignHoverText(hoverLabels, rotateLabels) {
12811283 // box around it
12821284 hoverLabels . each ( function ( d ) {
12831285 var g = d3 . select ( this ) ;
1284- if ( d . del ) {
1285- g . remove ( ) ;
1286- return ;
1287- }
1286+ if ( d . del ) return g . remove ( ) ;
12881287
1289- var horzSign = d . anchor === 'end' ? - 1 : 1 ;
12901288 var tx = g . select ( 'text.nums' ) ;
1291- var alignShift = { start : 1 , end : - 1 , middle : 0 } [ d . anchor ] ;
1289+ var anchor = d . anchor ;
1290+ var horzSign = anchor === 'end' ? - 1 : 1 ;
1291+ var alignShift = { start : 1 , end : - 1 , middle : 0 } [ anchor ] ;
12921292 var txx = alignShift * ( HOVERARROWSIZE + HOVERTEXTPAD ) ;
12931293 var tx2x = txx + alignShift * ( d . txwidth + HOVERTEXTPAD ) ;
12941294 var offsetX = 0 ;
12951295 var offsetY = d . offset ;
12961296
1297- if ( d . anchor === 'middle' ) {
1297+ if ( anchor === 'middle' ) {
12981298 txx -= d . tx2width / 2 ;
12991299 tx2x += d . txwidth / 2 + HOVERTEXTPAD ;
13001300 }
@@ -1303,7 +1303,7 @@ function alignHoverText(hoverLabels, rotateLabels) {
13031303 offsetX = d . offset * YSHIFTX ;
13041304 }
13051305
1306- g . select ( 'path' ) . attr ( 'd' , d . anchor === 'middle' ?
1306+ g . select ( 'path' ) . attr ( 'd' , anchor === 'middle' ?
13071307 // middle aligned: rect centered on data
13081308 ( 'M-' + ( d . bx / 2 + d . tx2width / 2 ) + ',' + ( offsetY - d . by / 2 ) +
13091309 'h' + d . bx + 'v' + d . by + 'h-' + d . bx + 'Z' ) :
@@ -1316,8 +1316,21 @@ function alignHoverText(hoverLabels, rotateLabels) {
13161316 'V' + ( offsetY - HOVERARROWSIZE ) +
13171317 'Z' ) ) ;
13181318
1319- tx . call ( svgTextUtils . positionText ,
1320- txx + offsetX , offsetY + d . ty0 - d . by / 2 + HOVERTEXTPAD ) ;
1319+ var posX = txx + offsetX ;
1320+ var posY = offsetY + d . ty0 - d . by / 2 + HOVERTEXTPAD ;
1321+ var textAlign = d . textAlign || 'auto' ;
1322+
1323+ if ( textAlign !== 'auto' ) {
1324+ if ( textAlign === 'left' && anchor !== 'start' ) {
1325+ tx . attr ( 'text-anchor' , 'start' ) ;
1326+ posX = - d . bx - HOVERTEXTPAD ;
1327+ } else if ( textAlign === 'right' && anchor !== 'end' ) {
1328+ tx . attr ( 'text-anchor' , 'end' ) ;
1329+ posX = d . bx + HOVERTEXTPAD ;
1330+ }
1331+ }
1332+
1333+ tx . call ( svgTextUtils . positionText , posX , posY ) ;
13211334
13221335 if ( d . tx2width ) {
13231336 g . select ( 'text.name' )
@@ -1364,6 +1377,7 @@ function cleanPoint(d, hovermode) {
13641377 fill ( 'fontSize' , 'hts' , 'hoverlabel.font.size' ) ;
13651378 fill ( 'fontColor' , 'htc' , 'hoverlabel.font.color' ) ;
13661379 fill ( 'nameLength' , 'hnl' , 'hoverlabel.namelength' ) ;
1380+ fill ( 'textAlign' , 'hta' , 'hoverlabel.align' ) ;
13671381
13681382 d . posref = ( hovermode === 'y' || ( hovermode === 'closest' && trace . orientation === 'h' ) ) ?
13691383 ( d . xa . _offset + ( d . x0 + d . x1 ) / 2 ) :
0 commit comments