/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
.table-responsive {
  min-height: .01%;
  overflow-x: auto;

  @media (max-width: @screen-xs-max) {
    width: 100%;
    margin-bottom: 15px;
    overflow-y: hidden;
    -ms-overflow-style: -ms-autohiding-scrollbar;
  }
}

.table {
  background-color: transparent;

  border-spacing: 0;
  border-collapse: collapse;
  border: 1px solid #ddd;

  width: 100%;
  max-width: 100%;

  th {
    font-weight: 500;
    text-align: left;
    background-color: #f9f9f9;
    border-bottom: 1px solid #ddd;
    white-space: nowrap;
  }

  th,
  td {
    padding: 3px 6px;
    border: 1px solid #ddd;
    vertical-align: top;
  }

  td {
    // dont wrap whitespace for smaller screens
    // since tables are going to scroll anyway
    white-space: nowrap;

    @media (min-width: @screen-md-min) {
      white-space: normal;
    }
  }

  a {
    word-break: normal;
  }
}
