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