/*
 * 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.
 */

#user div {
    padding-top: 2%;
}

#user .icon-saved{
    background-image: url('../../../imgs/icon-saved.gif');
    display: inline-block;
    width: 15px;
    height: 15px;
    background-size: cover;
}

/* when hiding the picture */
#user .icon-saved.ng-hide-add         { animation:0.5s lightSpeedOut ease; }

/* when showing the picture */
#user .icon-saved.ng-hide-remove      { animation:0.5s lightSpeedIn ease; }

/* light speed out */
@keyframes lightSpeedOut {
    0% {
        opacity: 1;
    }

    100% {
        transform: translate3d(100%, 0, 0) skewX(30deg);
        transform: translate3d(100%, 0, 0) skewX(30deg);
        opacity: 0;
    }
}

@keyframes lightSpeedIn {

    0% {
        transform: translate3d(100%, 0, 0) skewX(30deg);
        transform: translate3d(100%, 0, 0) skewX(30deg);
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

#user div.main-left {
    width: 98%;
    padding-left: 1%;
}
#user div.main-left.family {
    width: 62%;
    padding-left: 1%;
}

#user div.main-right {
    width: 0;
}
#user div.main-right.family {
    width: 37%;
}

#user table.user-info,
#user table.user-form {
    float: left;
    width: 100%;
}

#user table.user-info th,
#user table.user-form th {
    text-align: left;
    padding: 2% 1%;
}

#user span.help:hover {
    cursor: pointer;
    color: #CE5650;
}

#user div.main-left.family table.user-info th,
#user div.main-right.family table.user-form th {
    padding: 17px;
}

#user div.main-left.family table.user-info td,
#user div.main-right.family table.user-form td {
    padding: 10px;
    height: 23px;
}
#user table.user-info td {
    padding: 1%;
}

#user table.user-form td {
    border-left: 1px solid #CE5650;
}

#user table.user-form td.buttons {
    text-align: right;
    border: none;
}

#user table.user-form tr.options td {
    padding-left: 5%;
}

#user select,
#user select:focus {
    border: none;
}

#user select {
    font-size: 95%;
}

#user option,
#user option:focus {
    border: none;
}

#user option[selected] {
    background-color: rgb(122, 188, 229);
}

#user label {
    font-weight: bold;
    display: block;
    text-align: center;
    padding: 5%;
}

#user input[type="button"],
#user input[type="reset"] {
    width: 30%;
}

#user td.buttons div {
    display: inline;
}
#user td.buttons svg {
    vertical-align: middle;
}

#rating-panel th,
#rating-panel td {
    text-align: center;
    padding: 1%;
    font-weight: lighter;
}

#rating-panel th.title,
#rating-panel td.title {
    width: 125px;
    text-align: left;
}

#rating-panel th {
    background-color: white;
    padding-top: 3%;
    border-bottom: 1px solid #CE5650;
    color: #3C3C3C;
    font-weight: normal;
}

#rating-panel tr th:first-child,
#rating-panel tr td:first-child {
    padding-left: 5%;
}
#rating-panel tr th:last-child,
#rating-panel tr td:last-child {
    padding-right: 5%;
}

div#rating-panel {
    position: relative;
    pointer-events: none;
}

#rating-panel div.ng-hide-add.ng-hide-add-active,
#rating-panel div.ng-hide-remove.ng-hide-remove-active {
    -webkit-transition: all linear 0.75s;
    transition: all linear 0.75s;
}

#rating-panel div.panel {
    position: absolute;
    top: 0;
    left: -6%;
    height: 545px;
    overflow: auto;
    padding: 0;
    pointer-events: auto;
    box-shadow: 0 3px 23px 7px rgb(118, 118, 118);
    border-radius: 3px;
}
#rating-panel table {
    table-layout: fixed;
    width: 500px;
    background-color: white;
    opacity: 1;
}

#rating-panel div.ng-hide {
    opacity: 0;
    left: -55%;
}
