@@ -125,6 +125,7 @@ exports.loneHover = function loneHover(hoverItem, opts) {
125
125
fontSize : hoverItem . fontSize ,
126
126
fontColor : hoverItem . fontColor ,
127
127
nameLength : hoverItem . nameLength ,
128
+ textAlign : hoverItem . textAlign ,
128
129
129
130
// filler to make createHoverText happy
130
131
trace : hoverItem . trace || {
@@ -182,6 +183,7 @@ exports.multiHovers = function multiHovers(hoverItems, opts) {
182
183
fontSize : hoverItem . fontSize ,
183
184
fontColor : hoverItem . fontColor ,
184
185
nameLength : hoverItem . nameLength ,
186
+ textAlign : hoverItem . textAlign ,
185
187
186
188
// filler to make createHoverText happy
187
189
trace : hoverItem . trace || {
@@ -1281,20 +1283,18 @@ function alignHoverText(hoverLabels, rotateLabels) {
1281
1283
// box around it
1282
1284
hoverLabels . each ( function ( d ) {
1283
1285
var g = d3 . select ( this ) ;
1284
- if ( d . del ) {
1285
- g . remove ( ) ;
1286
- return ;
1287
- }
1286
+ if ( d . del ) return g . remove ( ) ;
1288
1287
1289
- var horzSign = d . anchor === 'end' ? - 1 : 1 ;
1290
1288
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 ] ;
1292
1292
var txx = alignShift * ( HOVERARROWSIZE + HOVERTEXTPAD ) ;
1293
1293
var tx2x = txx + alignShift * ( d . txwidth + HOVERTEXTPAD ) ;
1294
1294
var offsetX = 0 ;
1295
1295
var offsetY = d . offset ;
1296
1296
1297
- if ( d . anchor === 'middle' ) {
1297
+ if ( anchor === 'middle' ) {
1298
1298
txx -= d . tx2width / 2 ;
1299
1299
tx2x += d . txwidth / 2 + HOVERTEXTPAD ;
1300
1300
}
@@ -1303,7 +1303,7 @@ function alignHoverText(hoverLabels, rotateLabels) {
1303
1303
offsetX = d . offset * YSHIFTX ;
1304
1304
}
1305
1305
1306
- g . select ( 'path' ) . attr ( 'd' , d . anchor === 'middle' ?
1306
+ g . select ( 'path' ) . attr ( 'd' , anchor === 'middle' ?
1307
1307
// middle aligned: rect centered on data
1308
1308
( 'M-' + ( d . bx / 2 + d . tx2width / 2 ) + ',' + ( offsetY - d . by / 2 ) +
1309
1309
'h' + d . bx + 'v' + d . by + 'h-' + d . bx + 'Z' ) :
@@ -1316,8 +1316,21 @@ function alignHoverText(hoverLabels, rotateLabels) {
1316
1316
'V' + ( offsetY - HOVERARROWSIZE ) +
1317
1317
'Z' ) ) ;
1318
1318
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 ) ;
1321
1334
1322
1335
if ( d . tx2width ) {
1323
1336
g . select ( 'text.name' )
@@ -1364,6 +1377,7 @@ function cleanPoint(d, hovermode) {
1364
1377
fill ( 'fontSize' , 'hts' , 'hoverlabel.font.size' ) ;
1365
1378
fill ( 'fontColor' , 'htc' , 'hoverlabel.font.color' ) ;
1366
1379
fill ( 'nameLength' , 'hnl' , 'hoverlabel.namelength' ) ;
1380
+ fill ( 'textAlign' , 'hta' , 'hoverlabel.align' ) ;
1367
1381
1368
1382
d . posref = ( hovermode === 'y' || ( hovermode === 'closest' && trace . orientation === 'h' ) ) ?
1369
1383
( d . xa . _offset + ( d . x0 + d . x1 ) / 2 ) :
0 commit comments