/*
 * 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 {
  .editable {
    color: #000000;
    border: none;
  }

  .editable-column {
    padding: 0;

    .editable:not(.edit-disabled):after {
      font-family: "myriad-pro-1", Helvetica, Arial, sans-serif, FontAwesome;
      content: '\f040 Edit';
      opacity: 0.2;
      color: @primary-500;
    }
    .editable {
      display: flex;
      justify-content: space-between;
      width: 100%;
      padding: 8px;

      &:hover {
        border: none;
        background: fade(@primary-500, 10%);
        &:after {
          opacity: 1.0;
        }
      }
    }

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

        input {
          flex-grow: 2;
        }

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