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

.data-table {
  width: 100%;
}

table {
  width: 100%;

  .header-row {
    position: sticky;
    background-clip:padding-box;
    th {
      padding: 5px;
    }

    .label {
      display: inline-block;
      padding-top: 10px;
      vertical-align: super !important;
      padding-left: 5px;
      font-size: 12px;
    }
  }

  .exploratory {
    padding: 0;

    .element-row {
      display: flex;
      min-height: 48px;
      height: initial;

      td {
        padding: 5px;

        &.name-col {
          padding-right: 5px;
          padding-left: 24px;
          cursor: pointer;
          overflow: hidden;
          text-overflow: ellipsis;
        }

        &.resources-col {
          overflow: hidden;
          text-overflow: ellipsis;
        }
      }
    }

    tr:not(:last-child) {
      border-bottom: 1px solid #d9d9d9;
    }
  }

  .element-row {
    td {
      border-bottom-width: 0;
    }
  }

  .filter-row {
    height: 0 !important;
    background-clip:padding-box;

    th {
      padding: 5px;
      background-clip: padding-box;
      &:last-child {
        padding-right: 6px;
      }
    }
  }

  .name-col {
    width: 18%;
    padding-right: 5px;
    padding-left: 24px;
    background-color: inherit;
    .label{
      padding-top: 14px;
    }
  }

  .status-col,
  .shape-col {
    width: 14%;
    .label{
      padding-top: 14px;
    }
  }

  .tag-col {
    width: 10%;

    mat-chip {
      min-height: 20px;
      padding: 5px 10px;
      font-size: 13px;
      max-width: 110px !important;
      text-overflow: ellipsis;
      white-space: nowrap;
      display: inline-block;
      line-height: 10px;
      margin: 2px;
    }
  }

  .resources-col {
    width: 28%;
    .label{
      padding-top: 14px;
    }
  }

  .cost-col {
    width: 10%;
    text-align: center;
  }

  .actions-col {
    width: 10%;
    padding-right: 24px;
    text-align: right;
    background-color: inherit;
    .label{
      padding-right: 5px;
    }
  }
}

tr.detail-row {
  height: 0;
}


.element-diagram {
  min-width: 80px;
  border: 2px solid black;
  padding: 8px;
  font-weight: lighter;
  margin: 8px 0;
  height: 104px;
}

.element-symbol {
  font-weight: bold;
  font-size: 40px;
  line-height: normal;
}

.element-description {
  padding: 16px;
}

.element-description-attribution {
  opacity: 0.5;
}



.dashboard_table {
  width: 100%;
  table-layout: fixed;
}



.dashboard_table tr {
  vertical-align: top;
}

.dashboard_table tr th span {
  width: 50px;
  text-align: center;
  height: 100%;
  line-height: 40px;
}

.dashboard_table tr td {
  font-size: 14px;
  padding: 20px 15px 16px;
}

.dashboard_table tr td,
.dashboard_table tr th {
  border: 1px solid #d5dfea;
  text-align: left;
}

.dashboard_table tr td:last-child {
  text-align: center;
}

.dashboard_table_body td:first-child {
  background: #f3fbfd;
  color: #455c74;
  font-weight: 600;
  font-size: 16px;
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
}

.dashboard_table tr:nth-child(2n + 1) {
  background: #f9fafb;
}

.dashboard_table tr.filter-row td {
  padding: 10px;
}

.dashboard_table tr.filter-row td:first-child {
  font-weight: 400;
}

.dashboard_table tr.filter-row td:last-child {
  padding: 10px 0;
}

.filter-row .actions {
  text-align: right;
  display: flex;
  justify-content: flex-end;
}

.filter-row .actions button {
  background: #fff;
  border-color: #35afd5;
  color: #35afd5;
  outline: none;
}

.filter-row .actions .reset:hover {
  border-color: #f1696e;
  background: #f9fafb;
  color: #f1696e;
}

.filter-row .actions .apply:hover {
  border-color: #49af38;
  background: #f9fafb;
  color: #49af38;
}

.dashboard_table tr:nth-child(2n + 1) td:first-child {
  background: #edf6f9;
}

.dashboard_table th {
  background: #a1b7d1;
  color: #fff;
  font-weight: 600;
  line-height: 40px;
  text-transform: uppercase;
  padding-left: 12px;
  font-size: 12px;
}

.data-grid .status {
  text-transform: capitalize;
}

.data-grid .list-menu {
  left: auto;
  margin-left: 0;
  right: 15px;
  padding: 10px 15px;
  box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
    0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12);
  border: none;
  min-width: 190px;
}

.settings {
  position: relative;
  text-align: right;
  min-width: 5%;

  .actions {
    background-image: url(../../../assets/svg/settings_icon.svg);
    width: 16px;
    height: 16px;
    display: inline-block;
    text-align: center;
    cursor: pointer;
  }

  .disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
  }
}


.data-grid .list-menu li {
  font-size: 14px;
  border-bottom: 1px solid #edf1f5;
  padding: 8px 15px;
  cursor: pointer;
  margin: 5px -5px;
  color: #577289;
  transition: all 0.45s ease-in-out;
}

.data-grid .list-menu a.navigate {
  text-decoration: none;
  color: #577289;
  transition: all 0.45s ease-in-out;
}

.data-grid .list-menu li i {
  font-size: 18px;
  padding-right: 5px;
  vertical-align: bottom;
}

.data-grid .list-menu li:hover,
.data-grid .list-menu li:hover a {
  background: none !important;
  color: #36afd5;
}

.data-grid .list-menu li:last-child {
  border-bottom: 0;
}

.data-grid .list-menu ul {
  margin-bottom: 0;
}

.data-grid .list-menu .active-items li {
  border-bottom: 1px solid #edf1f5;
}

.data-grid .message_block {
  background: #edf6f9;
}

.message_block td {
  text-align: left !important;
}

.data-grid .total_cost {
  display: inline-block;
  width: 70%;
  color: #455c74;
}

.currency_details {
  float: right;
  color: #35afd5;
  cursor: pointer;
  transition: all 0.45s ease-in-out;
}

.currency_details:hover {
  color: #3392b0;
}

.currency_details .material-icons {
  font-size: 18px;
}

.mat-icon-button .mat-icon,
.mat-icon-button i {
  line-height: 42px;
  font-size: 18px;
}

.info {
  padding: 40px;
  text-align: center;
}

.content-row{
  background-clip: padding-box;
}

.not-allow{
  cursor: not-allowed !important;
}
