/*
 * 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.
 */
@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: #4460de; }

footer.druid-footer {
  line-height: 1.4em;
  padding: 32px 0 48px 0;
  background-color: #f3f3f3;
  border-top: 1px solid white;
  margin-top: 50px; }
  footer.druid-footer .text-center {
    text-align: center; }
  footer.druid-footer a {
    color: #4460de;
    cursor: pointer;
    font-weight: 600; }
    footer.druid-footer a:hover {
      color: #4460de; }
  footer.druid-footer .license {
    margin-top: 12px;
    font-size: 11px;
    color: #aaa;
    line-height: 1.4em; }
    footer.druid-footer .license a {
      color: inherit;
      font-weight: inherit; }
      footer.druid-footer .license a:hover {
        color: #4460de;
        text-decoration: underline; }
  footer.druid-footer .fa, footer.druid-footer .fab, footer.druid-footer .fas {
    font-size: 18px;
    margin: 6px 0;
    color: #4460de; }

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

