/*
 * 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.
 */
.entity-policy {

  p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .animate-show {
    opacity: 1;
  }

  .animate-show.ng-hide-add, .animate-show.ng-hide-remove {
    transition: all linear 0.5s;
  }

  .animate-show.ng-hide {
    opacity: 0;
  }

  .check-element {
    background: white;
  }

}

.entity-policy {
  padding: 20px;

  .policy-name {
    font-size: 18px;
    color: @brand-primary;
    display: block;
    margin-top: -5px;

    overflow: hidden;
    text-overflow: ellipsis;
  }

  .policy-description {
    font-size: 12px;
    color: #7F7F7F;
  }

  .policy-status {
    width: 26px;
    height: 26px;
    display: block;
  }

  .entity-policy-inline-actions {
    margin-right: 15px;
  }
  status-icon {
    margin-right: 15px;
  }
  
  .expand-button {
    padding: 8px;
    cursor: pointer;
    margin: -4px;
  }

  .btn-primary {
  }

  &.active {
    border: 1px solid fade(@brand-primary, 41%);
    background: @primary-5;
    margin-top: -1px;
  }

  table {
    background: white;
  }
}

entity-policy {
  .entity-policy {
    border-bottom: 1px solid #E1E1E1;
  }
}

.entity-policy-config {
  padding-top: 20px;
}


/* Editable text */


.table-editable {
  td.editable-click {
    color: black;
    &:hover {
      border: none;
    }
  }
  td.editable:not(.edit-disabled) {
    cursor: pointer;
    color: black;

    &:hover {
      border: none;
      background: fade(@primary-500, 10%);
      &:before {
        opacity: 1.0;
      }
    }
  }
  td.editable:not(.edit-disabled):before {
    font-family: "myriad-pro-1", Helvetica, Arial, sans-serif, FontAwesome;
    content: '\f040 Edit';
    float: right;
    opacity: 0.2;
    color: @primary-500;
  }

  .editable-wrap {
    width: 100%;
    .editable-controls {
      display: flex;
      flex-direction: row;

      input {
        flex-grow: 2;
      }

      .editable-buttons {
        flex-grow: 0;
        flex-shrink: 0;
      }
    }
  }
}
