// 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%;
    position: fixed;
    top: 65px;
    right: -400px;
    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;
    }
}