/*
 * 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 */
@media screen and (max-width: 1200px) {
  #intro .container {
    padding-top: 50px;
  }
}
@media screen and (max-width: 750px) {
  #intro {
    margin-top: 0px;
  }
  #intro .container {
    padding-top: 0px;
  }
}

.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;
  }
}

/* FORK ME ON GITHUB */
#forkongithub a {
  background: #1764aa;
  color: #fff;
  text-decoration: none;
  font-family: arial, sans-serif;
  text-align: center;
  font-weight: bold;
  padding: 5px 40px;
  font-size: 1rem;
  line-height: 2rem;
  position: relative;
  transition: 0.5s;
}
#forkongithub a:hover {
  background: black;
  color: #fff;
}
#forkongithub a::before,
#forkongithub a::after {
  content: "";
  width: 100%;
  display: block;
  position: absolute;
  top: 1px;
  left: 0;
  height: 1px;
  background: #fff;
}
#forkongithub a::after {
  bottom: 1px;
  top: auto;
}
@media screen and (min-width: 768px) {
  #forkongithub {
    position: fixed;
    display: block;
    top: 0;
    right: 0;
    width: 200px;
    overflow: hidden;
    height: 200px;
    z-index: 9999;
  }
  #forkongithub a {
    width: 200px;
    position: absolute;
    top: 40px;
    right: -40px;
    transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
  }
}
