// 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;
  position: relative;

  .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 {
  display: flex;
  align-items: center;
  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;
  }
  .no-results-screen-warning {
    text-align: center;
    i {
      padding-right: 0.5rem;
    }
  }
}
.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;
  }
}
