@@ -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