/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed 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.
 */

[ng\:cloak], [ng-cloak], .ng-cloak {
    display: none !important;
}

html, body, div#frame, div#view {
    height: 100%;
}

head, body, footer,
h1, h2, h3, h4, h5, h6, p,
a, ul, li, div,
table, tr, td, th, thead, tbody,
form, select, input, option, label {
    padding: 0;
    margin: 0;
}

h1, h2, h3, h4, h5, h6,
p, a, li, th, td,
select, input, option, label {
    font-family: sans-serif, "Droid Sans", "Lucida Grande", Arial, Helvetica;
    color: #3C3C3C;
}

body {
    background-color: white;
    overflow: hidden;
}
table {
    border-spacing: 0;
    border-collapse: collapse;
}
th, td {
    color: rgba(0, 0, 0, 0.8);
}
h3 {
    margin-bottom: 4%;
    font-size: xx-large;
    font-weight: lighter;
}
h4 {
    font-size: large;
    font-weight: lighter;
}
h5 {
    color: rgb(107, 107, 107);
    font-style: italic;
    font-weight: normal;
    font-size: 90%;
    margin-bottom: 1%;
}
p {
    font-size: 100%;
    color: rgba(0,0,0, 0.8);
    text-indent: 20px;
    text-align: justify;
    padding-right: 5%;
}
th {
    background-color: #7AB6EA;
    color: white;
    letter-spacing: 0.05em;
    font-weight: lighter;
}

button,
input[type="button"],
input[type="reset"] {
    height: 30px;
    box-shadow: none;
    border: none;
    outline: none;
    cursor: pointer;
    letter-spacing: 0.02em;
    font-size: 14px;
    background-color: lightgray;
    transition: background-color 0.4s;
}
button:hover,
input[type="button"]:hover,
input[type="reset"]:hover {
    color: white;
    background-color: rgb(122, 188, 229);
}

button[disabled],
input[type="button"][disabled],
input[type="reset"][disabled] {
    background-color: lightgray;
    color: graytext;
}


button[disabled]:hover,
input[type="button"][disabled]:hover,
input[type="reset"][disabled]:hover {
    cursor: default;
}

div.container {
    width: 85%;
    margin: 0 auto;
    min-height: 100%;
}
div.main-left, div.main-right {
    float: left;
}
div.main-left {
    width: 37%;
    padding-left: 1%;
}
div.main-right {
    width: 61%;
}

svg#icon-defs {
    display: none;
}

g.icon circle {
    fill: none;
}
g.icon use.glyph.checkMark {
    fill: rgb(68, 189, 83)
}
g.icon use.glyph.xMark {
    fill: #CE5650;
}

th.user-pic {
    background-color: white;
}
th.user-pic,
td.user-pic {
    width: 30px;
    padding-left: 4%;
}
td.user-pic img {
    width: 25px;
}

/* animation */
.fadein {
    transition: all linear 0.5s;
}
.fadein.ng-enter-stagger,
.fadein.ng-leave-stagger {
    transition-delay: 0.2s;
    animation-delay: 0.2s;
}
.fadein.ng-enter {
    opacity: 0;
}
.fadein.ng-enter.ng-enter-active {
    opacity: 1;
}
.fadein.ng-leave,
.fadein.ng-leave-active {
    opacity: 0;
}
