/*
 * 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.
 */
.brooklyn-catalog-uploader {
  padding: 50px;
  z-index: 100;
  visibility: hidden;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: white;
  overflow-y: scroll;
  transition: all 0.3s ease;
  opacity: 0;

  .upload-box {
    background: @gray-lighter;
    border: 5px @gray-light dashed;
  }

  .target-close {
    cursor: pointer;
  }

  input[type=file] {
    display: none;
  }

  label > strong {
    text-decoration: underline;
    cursor: pointer;
    color: @brand-primary;
  }

  .upload-item {
    margin-bottom: 1em;

    .progress {
      margin-bottom: 0;

      .progress-bar {
        transition: background-color 0.3s ease;
      }
    }
    .upload-item-details-link {
      cursor: pointer;
    }
  }
}

.br-drag-active .brooklyn-catalog-uploader {
  visibility: visible;
  opacity: 1;
}

