title: ipywidgets: GridspecLayout grid gap doesn't seem to be working
body: <p>Here is some code that creates a <code>GridspecLayout</code> object within an <code>Accordion</code> widget.</p>
  <pre><code>import ipywidgets as ipy
  from IPython.display import display
  
  FIELDS = {
      'ssh_key_path': ('SSH Key Path', ''),
      'email': ('Email', ''),
      'ssh_passphrase': ('SSH Passphrase', ''),        
      'database': ('Database', 'DASH_MFG_PROD'),
      'role': ('Role', 'PUBLIC'),
      'schema': ('Schema', 'PUBLIC')
  }
  
  widgets = {}
  
  widgets['grid'] = ipy.GridspecLayout(2, 2)
  
  widgets['connect'] = ipy.Button(
                      description='CONNECT',
                      icon='snowflake-o',
                      button_style='success')
  widgets['clear'] = ipy.Button(
                      description='CLEAR',
                      icon='eraser',
                      button_style='warning')
  
  widgets['grid'][0, :] = ipy.HBox(children=[widgets['connect'], widgets['clear']], layout=ipy.Layout(height='45px'))
  
  vbox_widgets = []
  for field_name, field_tuple in FIELDS.items():
      widget_descp = field_tuple[0]           
      layout = ipy.Layout(height='auto', width='125px')
      label = ipy.Label(widget_descp, layout=layout)            
      widget_default = field_tuple[1]
      if field_name == 'ssh_passphrase':
          layout = ipy.Layout(height='auto', width='90%')
          text_box = ipy.Password(
              value='password',
              placeholder='Enter password',
              layout=layout,
              disabled=False)
      else:
          layout = ipy.Layout(height='auto', width='90%')
          text_box = ipy.Text(
              disabled=False,
              layout=layout,
              value=widget_default)
      widgets[field_name] = ipy.HBox(children=[label, text_box])
      vbox_widgets.append(widgets[field_name])
  widgets['grid'][1, 0] = ipy.VBox(children=vbox_widgets)
  
  widgets['logger_label'] = ipy.Label(value=&quot;LOG OUTPUT&quot;)
  widgets['logger_text'] = ipy.Textarea(disabled=False, layout=ipy.Layout(width='99%', height='100%'))
  widgets['logger_text'].value = &quot;Fill in the Snowflake credentials and conneciton details and hit the 'CONNECT' button&quot;
  widgets['logger_vbox'] = ipy.VBox(children=[widgets['logger_label'], widgets['logger_text']])
  
  widgets['grid'][1, 1] = widgets['logger_vbox']
  widgets['grid'].grid_gap = '1px'
  accordion = ipy.Accordion(children=[widgets['grid']])
  accordion.set_title(0, 'Configuration')
  display(accordion)
  </code></pre>
  <p>The code displays the following when the accordion is opened:</p>
  <p><a href="https://i.stack.imgur.com/t6NcN.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/t6NcN.png" alt="Accordion with GridspecLayout object" /></a></p>
  <p>My issue is the large whitespace between the first grid row(the buttons <code>Hbox</code> widget) and the second grid row.  I have explicitly set the <code>grid_gap</code> to &quot;1px&quot; but no luck.  I checked the CSS properties using the Firefox inspector and the <code>HBox</code> widget is the correct height:</p>
  <p><a href="https://i.stack.imgur.com/fhaEr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fhaEr.png" alt="HBox CSS" /></a></p>
  <p>Can someone help explain why there is so much dead whitespace between the first row and the second row?</p>
  <p>thx</p>