/*
 * 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%;
    overflow: scroll;
}

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