/*
 Copyright 2020 TATA ELXSI

 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.

 Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
 */
 @import "../../assets/scss/mixins/mixin";
 @import "../../assets/scss/variable";
 $min-height-set: 200px;
 .dashboard {
   .custom-card {
     background-color: $white;
     word-wrap: break-word;
     @include box-shadow(0px, 1px, 15px, 0px, rgba(69, 90, 100, 0.1));
     @include transition(all, 0.2s, null, null);
     @include roundedCorners(5);
     @include border(all, 1, solid, rgba(238, 238, 238, 0.75));
     color: $white;
     &.card-hover {
       @include transition(all, 0.25s, ease, null);
       &:hover {
         -moz-transform: translateY(-4px) scale(1.01);
         -ms-transform: translateY(-4px) scale(1.01);
         -o-transform: translateY(-4px) scale(1.01);
         transform: translateY(-4px) scale(1.01);
       }
     }
     &.pink-card {
       @include background(
         linear-gradient(to left top,#d81b60,#e0306d,#e7407a,#ee4f87,#f55c94),
         null,
         null,
         null,
         null
       );
     }
     &.purple-card {
       @include background(
         linear-gradient(to left top,#605ca8,#736ebb,#8681ce,#9994e2,#aca7f6),
         null,
         null,
         null,
         null
       );
     }
     &.aqua-card {
       @include background(
         linear-gradient(to left top,#00c0ef,#00cdf5,#00dafa,#00e6fd,#0af3ff),
         null,
         null,
         null,
         null
       );
     }
     .custom-card-header {
       padding: 12px 20px 12px 20px;
       @include background(null, $primary, null, null, null);
       @include roundedTop(5);
       a {
         color: $white;
         @include flexbox(flex, space-between, null, null, center, null);
         @include padding-value(12, 20, 12, 20);
       }
     }
     .card-body {
       @include padding-value(5, 5, 5, 10);
       &.list-overflow {
         overflow-y: scroll;
         .list-group {
           .list-group-item {
             background-color: $white;
             cursor: default;
             @include border(all, 0, solid, $black-coral);
             @include border(bottom, 1, solid, rgba(0, 0, 0, 0.125));
             @include padding-value(10, 0, 10, 0);
             @include margin-value(0, 0, 0, 0);
             color: $gray-600;
             i {
               cursor: pointer;
               @include font(null, 14px, null);
               &.activeProjectLink {
                 cursor: default;
               }
             }
             &:last-child {
               @include border(bottom, 0, solid, rgba(0, 0, 0, 0.125));
             }
           }
         }
         &.failed-instances {
           max-height: $min-height-set;
         }
         &.project-list {
           max-height: 65vh;
         }
       }
     }
   }
   .instances {
     .graph-section {
       min-height: $min-height-set;
       @include flexbox(null, center, null, null, null, null);
       @include padding-value(10, 10, 10, 10);
       .card-title {
         color: $gray-600;
       }
       .instances-canvas {
         @include flexbox(none !important, null, null, null, null, null);
         &.show-canvas {
           @include flexbox(block !important, null, null, null, null, null);
         }
         #canvas {
           @include wh-value(100%, $min-height-set);
         }
       }
     }
   }
   .module-counts {
     .status-card {
       overflow: hidden;
       @include wh-value(null, 130px);
       @include roundedCorners(4);
       @include box-shadow(0px, 5px, 20px, 2px, $transparent-dark-bg);
       cursor: pointer;
       @include flexbox(null, null, null, null, center, null);
       @include padding-value(20, 20, 20, 20);
       @include border(all, 0, solid, $gray-80);
       i {
         @include font(null, 2rem, null);
         @include margin-value(0, 0, 8, 0);
       }
       h6 {
         @include font(null, 0.8rem, null);
       }
       &:hover .link-icon {
         @include position_value(null, null, -60px, null, null);
       }
       .link-icon {
         @include background(null, rgba(255, 255, 255, 0.5), null, null, null);
         @include position_value(absolute, 0px, -130px, null, null);
         @include wh-value(130px, 130px);
         @include font(null, 30px, null);
         @include padding-value(40, 20, 40, 20);
         @include roundedCornersPercentage(50%);
         @include transition(all, 0.3s, ease-in-out, null);
         i {
           @include font(null, 1.875rem, null);
         }
       }
     }
   }
   .font-weight-bold {
     border-radius: 10px;
   }
   .form-row {
     display: flex;
     flex-wrap: wrap;
     .form-group {
       flex: 0 0 auto;
       width: 47%;
       margin-right: 25px;
     }
   }
   .vimdetails {
     width: 100%;
   }
 }