@charset "UTF-8";
/*
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.
*/
html, body {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  background: white;
}

body {
  min-height: 100%;
  display: grid;
  grid-template-rows: auto 1fr auto;
  grid-template-columns: 100%;
  position: relative;
  pointer-events: auto;
}

body.blurbg:after {
  content: "";
  width: inherit;
  height: inherit;
  position: absolute;
  background: #2f3036;
  top: 0;
  left: 0;
  opacity: 0.75;
  transition: opacity 0.15s ease-in-out;
  z-index: 1;
}

header {
  display: grid;
  grid-template-columns: 30% auto;
  background: #2f3036;
  padding: 0;
  height: 64px;
}
header .header-logo {
  display: flex;
}
header .header-logo img {
  max-height: 64px;
}
header .header-text {
  display: flex;
  align-items: center;
  font-size: 24px;
  font-family: Helvetica, Arial, sans-serif;
  color: #eee;
  padding-left: 20px;
}
@media screen and (max-width: 810px) {
  header {
    grid-template-columns: auto;
  }
  header .header-logo {
    width: 100%;
    display: block;
  }
  header .header-text {
    display: block;
  }
  header .header-logo img {
    display: none;
  }
}
header nav ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
  position: absolute;
  z-index: 2;
}
header nav ul li {
  display: inline-block;
  float: left;
  margin-right: 1px;
  position: relative;
  background: #2f3036;
  top: 50%;
  z-index: 1;
}
header nav ul li a {
  display: block;
  height: 64px;
  margin-left: 24px;
  text-align: center;
  line-height: 64px;
  font-family: Helvetica, Arial, sans-serif;
  color: #ddd;
  text-decoration: none;
  pointer-events: auto;
}
header nav ul.hidden:after {
  min-width: 120px;
  content: "▲";
  color: white;
  font-size: 32px;
  position: absolute;
  top: -28px;
  left: 0;
  text-align: center;
}
header nav li:hover a {
  color: red;
  cursor: pointer;
}
header nav ul li:hover ul {
  width: 360px;
  display: block;
  background: white;
  line-height: 40px;
  pointer-events: auto;
}
header nav ul li:hover ul li {
  background: white;
  display: inline-block;
  color: #444;
}
header nav li:hover ul a:hover {
  color: red;
}
header nav li ul {
  display: none;
}
header nav ul.hidden {
  background-color: white;
  line-height: initial;
}
header nav ul.hidden a {
  color: #666;
  height: auto;
  text-align: left;
  line-height: initial;
  margin-bottom: 10px;
}
header nav ul.hidden p {
  font-size: 0.8rem;
  margin: 0px;
  padding: 0px;
  color: #888;
}
header nav .show-menu {
  font-family: Helvetica, Arial, sans-serif;
  text-decoration: none;
  color: #fff;
  background: red;
  text-align: center;
  padding: 10px 0;
  display: none;
}
header nav input[type=checkbox] {
  display: none;
  -webkit-appearance: none;
}
header nav input[type=checkbox]:checked ~ #menu {
  display: block;
}
@media screen and (max-width: 810px) {
  header nav ul {
    position: static;
    display: none;
  }
  header nav li {
    margin-bottom: 1px;
  }
  header nav ul li, header nav li a {
    width: 100%;
  }
  header nav .show-menu {
    display: block;
  }
}

footer {
  background-color: #2f3036;
  color: white;
  min-height: 100px;
}

main {
  padding: 0.5em;
  margin: 0 auto;
  max-width: 85%;
  color: #444;
  background: white;
  font-family: Helvetica, Arial, sans-serif;
}

#card {
  border-radius: 9px;
  border: 1px solid #333;
  background: linear-gradient(135deg, #7800FF 0px, #7800FF 64px, #FBFBFB 64px, #FBFBFB 100%);
  box-shadow: 0px 0px 5px #2f3036;
  width: 520px;
  height: 175px;
  text-align: left;
  padding: 10px 0px 4px 14px;
  margin: 20px;
}
#card img.mfaicon {
  position: absolute;
  right: -64px;
  top: -32px;
  width: 32px;
  height: 32px;
}
#card p.link {
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  margin-top: -4px;
  width: 98%;
}
#card img.avatar {
  border-radius: 50%;
  border: 6px solid #FBFBFB;
  width: 64px;
}
#card h1 {
  font-size: 16px;
  display: inline-block;
  position: absolute;
  margin: 30px 0;
  padding: 0px;
  text-align: center;
  width: 360px;
}

ul.striped {
  padding: 0;
}

.striped li {
  padding: 1.5px;
  font-size: 0.9rem;
}

.striped li:nth-child(odd), .striped tr:nth-child(odd) {
  background-color: #f4f4f4;
  list-style: none;
  border: 1px solid #aaa;
  border-bottom: none;
}

.striped li:nth-child(even), .striped tr:nth-child(even) {
  background-color: #fbfbfb;
  list-style: none;
  border: 1px solid #aaa;
  border-bottom: none;
}

.striped li:last-child, .striped tr:last-child {
  border-bottom: 1px solid #aaa;
  border-bottom-right-radius: 4px;
  border-bottom-left-radius: 4px;
}

.striped li:first-child {
  border-top-right-radius: 4px;
  border-top-left-radius: 4px;
}

.striped td {
  padding: 6px;
}

.striped th {
  background: #333;
  color: white;
  padding: 4px;
}

button {
  background: #4477a1;
  background: linear-gradient(180deg, #81a8cb, #4477a1);
  border-radius: 6px;
  cursor: pointer;
  font-size: 1.1rem;
  color: white;
}

.loader {
  font-size: 10px;
  margin: 100px auto;
  text-indent: -9999em;
  width: 16em;
  height: 16em;
  border-radius: 50%;
  background: darkblue;
  background: linear-gradient(to right, darkblue 10%, rgba(255, 255, 255, 0) 42%);
  position: relative;
  -webkit-animation: load3 1.4s infinite linear;
  animation: load3 1.4s infinite linear;
  -webkit-transform: translateZ(0);
  -ms-transform: translateZ(0);
  transform: translateZ(0);
}

.loader:before {
  width: 50%;
  height: 50%;
  background: darkblue;
  border-radius: 100% 0 0 0;
  position: absolute;
  top: 0;
  left: 0;
  content: "";
}

.loader:after {
  background: white;
  width: 75%;
  height: 75%;
  border-radius: 50%;
  content: "";
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}

@-webkit-keyframes load3 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes load3 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

/*# sourceMappingURL=boxer.css.map */
