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

.downloads-panel {
    width: 25%;
    max-width: 450px;
    position: fixed;
    top: 65px;
    right: -700px;
    color: #686868;
    font-size: 16px;
    z-index: 999;
    max-height: initial;
    transition: all .3s ease;
    box-shadow: 0px 3px 5px 0px #ccc;
    border: 1px solid #37bb9b;
    border-radius: 10px;
    background-color: #fff;

    .download-header {
        padding: 10px;
        display: flex;
        align-items: center;
        color: #686868;
        border-bottom: 1px solid #ccc;
        background-color: #eee;
        border-top-left-radius: 10px;
        border-top-right-radius: 10px;

        .download-header-actions {
            position: absolute;
            right: 15px;
        }

        .pretty.p-switch.p-fill input:checked~.state.p-primary:before {
            background-color: #37bb9b !important;
        }
    }

    .downloadListLoader {
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translateX(-50%, -50%);

        i {
            color: #37bb9b;
        }
    }

    .download-body {
        max-height: 600px;
        overflow-y: auto;
        position: relative;

        #download-list-wrapper {
            padding: 0px;
            margin: 0px;

            li {
                padding: 12px;
                border-bottom: 1px solid #ccc;
                display: flex;
                align-items: center;
                position: relative;
                color: #686868;

                i {
                    color: #37bb9b;
                }

                a {
                    color: #686868 !important;
                    width: 100%;
                }

                .file-name {
                    padding: 0 10px 0 10px;
                    word-wrap: break-word;
                    width: 90%;
                }

                .download-state {
                    position: absolute;
                    right: 15px;
                }
            }
        }
    }
}

@media screen and (min-width: 768px) {
    .download-content-wrapper {
        width: 385px;
    }
}