/*
 * 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.
 */

@font-face {
  font-family: Verdana,sans-serif;
  font-weight: 300;
  font-style: normal
}

@font-face {
  font-family: Verdana,sans-serif;
  font-weight: normal;
  font-style: normal
}

/* Reduce font size */
.reduceFontsize {
  font-size: 70%;
}

.svg-support .main-logo {
  background-size: contain;
}

.main-logo {
  display: inline-block;
  vertical-align: middle;
  width: 130px;
  height: $header-height;
  float: right;
  position: absolute;
  top: 0;
  right: 1em;
}

.tobago-box.card {
  border: 0;
  box-shadow: none;
  border-left: 10px solid $box-title-background-color;
}

.tobago-box-header.card-header  {
  overflow: hidden;
  border-bottom: 0;
  background-color: $box-title-background-color;
  padding-left: $box-spacer-x;

  h3 {
    margin-bottom: 0;
  }
}

h3::before {
  content: "# ";
  color: $gray-600;
}

h4 {
  color: $gray-600;
}

.card .card, .tab-pane .card {
  .card-header {
    padding-top: 0;
    padding-bottom: 0;
  }

  .card-header::after {
    display: none;
  }

  .card-header h3 {
    padding: 0.375em 1em 0.375em 0.375em;
    font-size: 1em;
    font-weight: bold;
  }

  .card-body {
    background-color: $gray-100;
    padding-left: 1em;
    margin-top: auto;
    margin-top: initial;
  }

  .card-header h3::before {
    content: "";
  }
}

/* KeyValue tables */
.key-values-table {
  text-align: center;
  border: 0.4em solid #e3e4e5;
  margin-bottom: 1em;

  th {
    text-align: center;
    background-color: #e3e4e5;
  }

  td {
    padding: 1em 1em 0.5em 1em;
    border: 0.25em solid #e3e4e5;
  }
}

/* special markups */
.red {
  color: $red;
}

.green {
  color: $green;
}

.largest-font {
  font-size: $h1-font-size;
}

.larger-font {
  font-size: $h3-font-size;
}