/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */


.table-wrapper{
  height: calc(100vh - 120px);
  overflow: auto;
  position: relative;
  margin:  0 -15px -15px -15px;
  padding: 0 15px 15px 15px;
  .mat-header-cell {
    position: sticky;
    top: 0;
    z-index: 999;
    background: white;
  }
}
table {
  width: 100%;

  td {
    vertical-align: middle;
  }

  .name {
    width: 25%;
    padding: 20px 0 10px 24px;
    &.project-name{
      padding-top: 10px;
    }
  }

  th.name{
    padding-top: 10px;
  }

  .mat-header-row{
    padding-top: 12px;
  }

  .endpoints {
    width: 45%;
    padding: 15px 0;

    .resource-wrap {
      .resource-name, .resource-status {
        width: 30%;
        padding-left: 0;
      }
    }

    .label-endpoint, .label-endpoint-status {
      display: inline-block;
      width: 30%;
    }

    .label-status {
      width: 30%;
    }

    &.source {
      &.endpoints .resource-wrap{
        justify-content: flex-start;
      }
      .no-details {
        padding-left: 0;
      }
    }
  }

  .groups {
    width: 20%;
    padding: 10px 0;
  }

  .status {
    width: 15%;
  }

  .project-actions {
    color: #607d8b;
    width: 10%;
    text-align: right;
    vertical-align: top;
    padding: 10px 24px;

    &.mat-header-cell{
      padding-top: 19px;
      color: rgba(0,0,0,.54);
    }

    span:not(.mat-header-cell span) {
      transition: all .5s ease-in-out;
      cursor: pointer;

      .mat-icon {
        font-size: 18px;
        padding-top: 5px;
      }

      &:hover {
        color: darken(#607d8b, 10%);
      }
    }
  }
}

td.settings {
  position: relative;
  vertical-align: middle !important;
  text-align: right;
  .actions {
    margin-top: 3px;
    background-image: url(../../../../assets/svg/settings_icon.svg);
    width: 16px;
    height: 16px;
    display: inline-block;
    text-align: center;
    cursor: pointer;
  }
}
.project-seting-item{
  display: flex;
  padding: 10px;
  align-items: center;
  border-bottom: 1px solid #edf1f5;
  cursor: pointer;
  color: #577289;
  &:last-child{
    border-bottom: none;
  }
  &:hover{
    color: #36afd5;
    transition: all .45s ease-in-out;
  }
  a{
    padding-left: 5px;
  }
}
.material-icons {
  font-size: 18px;
  padding-top: 1px;
}

.list-menu{
  min-width: 205px;
}

.project-endpoint-name{
   color: #577289;
}

.actions-list{
  padding: 10px 15px;
}

.mat-chip{
  max-width: 200px !important;
  white-space: nowrap;
  display: inline-block;
}




