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

@import "../../../../../assets/less/variables.less";

.document-result-screen {

  .loading-lines-wrapper {
    margin-left: auto;
    margin-right: auto;
    width:  80px;
  }

  .loading-lines {
    position: absolute;
  }
}

.document-result-screen__toolbar {
  display: flex;
  padding-bottom: 20px;

  .bulk-action-component {
    min-width: 90px;
    min-height: 26px;
    padding: 8px 0;
  }

  .text-overflow-switch {
    min-width: 145px;
    min-height: 26px;
    padding: 8px 0;
  }

  .toolbar-dropdown {    
    
    .btn {
      color: #666;
    }
    
    .dropdown-menu.arrow:before {
      right: 80%;
    }

    a.dropdown-toggle {
      padding-left: 16px;
    }

    .dropdown-menu li a {
      padding: 10px 15px 10px 12px;
      &:hover {
        background-color: @hoverHighlight;
        color: white;
      }
    }
  }
  
}

.document-result-screen__toolbar-flex-container {
  width: 100%;
  display: flex;
  justify-content: flex-end;
}

.document-result-screen__toolbar-create-btn {
  height: 42px;
}

a.document-result-screen__toolbar-create-btn:active,
a.document-result-screen__toolbar-create-btn:visited {
  color: #fff;
}

.no-results-screen {
  position: absolute;
  margin: -15px;
  top: 50%;
  margin-top: -125px;
  width: 100%;
  h3 {
    border-top: 1px solid #ccc;
    height: 45px;
    font-size: 20px;
    font-weight: normal;
    width: 400px;
    text-align: center;
    padding-top: 8px;
    margin: 0 auto;
  }
}
.watermark-logo {
  background: transparent url('../../../../../assets/img/couch-watermark.png') no-repeat 50% 50%;
  height: 205px;
  text-align: center;
  margin: 0 20%;
  .preview {
    margin: 0 10px;
  }
}

.table-view-docs {
  position: absolute;


  .bulk-action-component {
    padding-bottom: 0;
    min-height: 0;
  }
  .bulk-action-component-panel input {
    width: auto;
  }

  .tableview-data-cell-id {
    a {
      color: @linkColor;
    }
    div:first-of-type {
      font-weight: 700;
    }
    div {
      text-overflow: ellipsis;
      overflow: hidden;
    }
  }
  tbody tr {
    cursor: pointer;
    &:hover {
      border-left: 2px solid @hoverHighlight;
      td {
        color: @hoverHighlight;
        input[type="checkbox"] {
          margin-left: 7px;
        }
      }
    }
  }
  td, th, td a {
    vertical-align: middle;
    line-height: 20px;
    font-size: 0.875rem;
  }

  td, th {
    color: @defaultHTag;
    max-width: 160px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: top;
    &.showall {
      overflow: visible;
      white-space: normal;
      word-wrap: break-word;
    }
    &.small-font {
      font-size: 0.75rem;
    }
    &.large-font {
      font-size: 1rem;
    }
  }
  td.tableview-checkbox-cell, th.tableview-header-el-checkbox {
    width: 35px;
    padding-left: 0px;
  }
  .tableview-conflict {
    color: #F00;
  }
  .icon-code-fork {
    padding-right: 2px;
    color: #F00;
  }
  .tableview-el-last {
    width: 75px;
  }
  .tableview-el-copy {
    width: 35px;
  }

  thead input {
    max-width: 138px;
    width: 100%;
    overflow: visible;
  }

  .table-dropdown-item {
    padding: 2px 6px;
    cursor: pointer;
    background: #2b2f33;
    color: white;
    margin: 0 2px;
  }
  .table-dropdown-item-highlight {
    background: #e23632;
  }

  .icon.icon-filter {
    position: absolute;
    right: 6px;
    top: 6px;
    pointer-events: none;
    color: #999;
  }

  .table-container-autocomplete {
    position: relative;
    width: 128px;
    height: 29px;
  }

  th {
    overflow: visible;
  }

  .table-container-autocomplete .table-select-wrapper {
    width: inherit;
    overflow: visible;
  }
}

.document-result-screen {

  .table-bulkselector-section {
    .bulk-action-component {
      float: left;
    }
    width: 300px;
  }
}

.execution-stats-popup {
  font-size: 14px;
  .execution-stats-popup-component {
    [data-status="false"] {
      color: @fontGrey;
    }
    [data-status="true"] {
      .value {
        font-weight: bold;
      }
    }
  }
  .warning {
    color: @errorAlertColor;
    margin-top: 8px;
  }
}

.execution-stats {
  font-size: 13px;
  padding: 8px 8px 8px 0;

  .fonticon-attention-circled {
    margin-right: 4px;
  }
}
