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

/* START From hugo academic css */
#homepage section {
  font-family: "Merriweather", serif;
  font-size: 16px;
  line-height: 1.65;
}
#homepage pre,
#homepage code {
  font-family: "Roboto Mono", "Courier New", "Courier", monospace;
}
#homepage h2,
#homepage h3,
#homepage h4 {
  font-family: "Lato", sans-serif;
  font-weight: 400;
  margin-bottom: 1em;
  line-height: 1.25;
  color: #313131;
  text-rendering: optimizeLegibility;
}
#homepage h3 {
  font-weight: 700;
}
nav.navbar {
  font-family: "Lato", sans-serif;
  font-weight: 400;
  line-height: 1.25;
  text-rendering: optimizeLegibility;
  font-size: 16px;
}
.home-section:first-of-type {
  padding-top: 50px;
}
.home-section:nth-of-type(even) {
  background-color: rgb(247, 247, 247);
}
@media screen and (min-width: 58em) {
  #homepage section {
    font-size: 20px;
  }
}
/* END From hugo academic css */

pre.clean {
  border: none !important;
  border-radius: 0 !important;
  background-color: #f8f8f8;
  overflow: auto;
  display: block;
  padding: 5px;
  margin: 0 0 10px;
  font-size: 13px;
  line-height: 1.42857143;
  color: #333;
  word-break: break-all;
  word-wrap: break-word;
}

@media screen and (max-width: 1200px) {
  pre.clean {
	padding: 9.5px;
  }
}

#intro {
  margin-top: 80px;
  /* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#2c5fa3+0,4096ee+100 */
  background: rgb(44, 95, 163);
  /* Old browsers */
  background: -moz-linear-gradient(
    top,
    rgba(44, 95, 163, 1) 0%,
    rgba(64, 150, 238, 1) 100%
  );
  /* FF3.6-15 */
  background: -webkit-linear-gradient(
    top,
    rgba(44, 95, 163, 1) 0%,
    rgba(64, 150, 238, 1) 100%
  );
  /* Chrome10-25,Safari5.1-6 */
  background: linear-gradient(
    to bottom,
    rgba(44, 95, 163, 1) 0%,
    rgba(64, 150, 238, 1) 100%
  );
  /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2c5fa3', endColorstr='#4096ee', GradientType=0);
  /* IE6-9 */
  color: white;
}
#intro p {
  margin: 0 0 10px;
  margin-bottom: 2rem;
}
/* hack for issue with padding disappearing in middle 2 sizes on home page */
@media screen and (max-width: 1200px) {
  #intro .container {
    margin-top: 80px;
  }
  #intro.home-section .container {
    margin-top: 50px;
  }
}
@media screen and (max-width: 750px) {
  #intro {
    margin-top: 0px;
  }
  #intro .container {
    margin-top: 0px;
  }
  #intro.home-section {
    padding-top: 1px;
  }
}

/* hack for issue with title being overlapped by breadcrumb in middle 2 sizes */
@media screen and (max-width: 1200px) {
    div.body-content, div.contribution {
        margin-top: 50px;
    }
}
@media screen and (max-width: 750px) {
    div.body-content, div.contribution {
        margin-top: 0px;
    }
    div.body-content {
        padding-bottom: 30px;
    }
}

.project-links {
  margin-top: 20px;
  font-size: 30px;

  vertical-align: bottom;
}

.project-links a {
  color: white;
}

.project-links a:hover {
  color: #0095eb;
  text-decoration: none;
  transition: color 0.6s ease;
}

.project-links i {
  font-size: 1.7em;
  margin-left: 2rem;
}

#intro h1 h2 h3 h4 h5 {
  color: white;
}

.no-padding {
  padding: 0 !important;
  margin: 0 !important;
}

.nuget-well {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  background-color: #202020;
  border: 4px solid silver;
  border-radius: 5px;
  box-shadow: 2px 2px 3px #6e6e6e;
  color: #e2e2e2;
  display: block;
  font: 1em "andale mono", "lucida console", monospace;
  line-height: 1em;
  overflow: auto;
  padding: 15px;
  text-align: center;
}

.home-section {
  padding: 4rem 0 4rem 0;
}

.home-section.books .row {
  text-align: center;
}

.home-section.books img {
  max-width: 90%;
}
.home-section.books a {
  display: block;
  padding: 20px;
}

@media screen and (min-width: 700px) {
  .project-links {
    margin-top: 4rem;
  }
}
