@@ -556,6 +556,8 @@ function computeLegendDimensions(gd, groups, traces) {
556556
557557 var extraWidth = 0 ;
558558
559+ var traceGap = 5 ;
560+
559561 opts . _width = 0 ;
560562 opts . _height = 0 ;
561563
@@ -589,23 +591,53 @@ function computeLegendDimensions(gd, groups, traces) {
589591 extraWidth = 40 ;
590592 }
591593 else if ( isGrouped ) {
592- var groupXOffsets = [ opts . _width ] ;
594+ var maxHeight = 0 ;
595+ var maxWidth = 0 ;
593596 var groupData = groups . data ( ) ;
594597
595- for ( var i = 0 , n = groupData . length ; i < n ; i ++ ) {
596- var textWidths = groupData [ i ] . map ( function ( legendItemArray ) {
598+ var maxItems = 0 ;
599+
600+ var i ;
601+ for ( i = 0 ; i < groupData . length ; i ++ ) {
602+ var group = groupData [ i ] ;
603+ var groupWidths = group . map ( function ( legendItemArray ) {
597604 return legendItemArray [ 0 ] . width ;
598605 } ) ;
599606
600- var groupWidth = 40 + Math . max . apply ( null , textWidths ) ;
607+ var groupWidth = Lib . aggNums ( Math . max , null , groupWidths ) ;
608+ var groupHeight = group . reduce ( function ( a , b ) {
609+ return a + b [ 0 ] . height ;
610+ } , 0 ) ;
601611
602- opts . _width += opts . tracegroupgap + groupWidth ;
612+ maxWidth = Math . max ( maxWidth , groupWidth ) ;
613+ maxHeight = Math . max ( maxHeight , groupHeight ) ;
614+ maxItems = Math . max ( maxItems , group . length ) ;
615+ }
603616
617+ maxWidth += traceGap ;
618+ maxWidth += 40 ;
619+
620+ var groupXOffsets = [ opts . _width ] ;
621+ var groupYOffsets = [ ] ;
622+ var rowNum = 0 ;
623+ for ( i = 0 ; i < groupData . length ; i ++ ) {
624+ if ( fullLayout . _size . w < ( borderwidth + opts . _width + traceGap + maxWidth ) ) {
625+ groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
626+ opts . _width = maxWidth ;
627+ rowNum ++ ;
628+ } else {
629+ opts . _width += maxWidth + borderwidth ;
630+ }
631+
632+ var rowYOffset = ( rowNum * maxHeight ) ;
633+ rowYOffset += rowNum > 0 ? opts . tracegroupgap : 0 ;
634+
635+ groupYOffsets . push ( rowYOffset ) ;
604636 groupXOffsets . push ( opts . _width ) ;
605637 }
606638
607639 groups . each ( function ( d , i ) {
608- Drawing . setTranslate ( this , groupXOffsets [ i ] , 0 ) ;
640+ Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
609641 } ) ;
610642
611643 groups . each ( function ( ) {
@@ -623,11 +655,13 @@ function computeLegendDimensions(gd, groups, traces) {
623655
624656 groupHeight += textHeight ;
625657 } ) ;
626-
627- opts . _height = Math . max ( opts . _height , groupHeight ) ;
628658 } ) ;
629659
630- opts . _height += 10 + borderwidth * 2 ;
660+ var maxYLegend = groupYOffsets [ groupYOffsets . length - 1 ] + maxHeight ;
661+ opts . _height = 10 + ( borderwidth * 2 ) + maxYLegend ;
662+
663+ var maxOffset = Math . max . apply ( null , groupXOffsets ) ;
664+ opts . _width = maxOffset + maxWidth + 40 ;
631665 opts . _width += borderwidth * 2 ;
632666 }
633667 else {
@@ -636,7 +670,6 @@ function computeLegendDimensions(gd, groups, traces) {
636670 var maxTraceWidth = 0 ;
637671 var offsetX = 0 ;
638672 var fullTracesWidth = 0 ;
639- var traceGap = opts . tracegroupgap || 5 ;
640673
641674 // calculate largest width for traces and use for width of all legend items
642675 traces . each ( function ( d ) {
0 commit comments