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

$link: #4460de;

@media only screen and (max-width: 1024px) {
  .navigationSlider .slidingNav ul li:last-child {
    padding-top: 8px;
  }
}

.fixedHeaderContainer header img {
  position: absolute;
  top: -4px;
  height: 42px;
  margin: 0;
}

.navigationSlider .slidingNav ul li a {
  color: #9caeff;
  font-weight: 600;
  font-size: 15px;
}

.navigationSlider .slidingNav ul li:last-child a {
  display: inline-block;
  height: 32px;
  line-height: 32px;
  background: #9caeff;
  border-radius: 2px;
  padding: 0 10px;
  color: #1C1C26;
  font-weight: 600;
  min-width: 106px;
  text-align: center;
}

.toc .toggleNav .navGroup .navGroupSubcategoryTitle {
  color: #717171;
}

pre code {
  max-height: 500px;
}

.mainContainer a {
  color: $link;
}

footer.druid-footer {
  line-height: 1.4em;
  padding: 32px 0 48px 0;
  background-color: #f3f3f3;
  border-top: 1px solid white;
  margin-top: 50px;

  .text-center {
    text-align: center;
  }

  a {
    color: #4460de;
    cursor: pointer;
    font-weight: 600;

    &:hover {
      color: $link;
    }
  }

  .license {
    margin-top: 12px;
    font-size: 11px;
    color: #aaa;
    line-height: 1.4em;

    a {
      color: inherit;
      font-weight: inherit;

      &:hover {
        color: $link;
        text-decoration: underline;
      }
    }
  }

  .fa, .fab, .fas {
    font-size: 18px;
    margin: 6px 0;
    color: $link;
  }
}

.navGroups > .navGroup:last-child {
  display: none;
}

/* testing inline images */
article p img,
article iframe {
  display: inline;
  margin-left: auto;
  margin-right: auto;
  max-width: 100%;
}
