/*
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.
 */
#modal {
    display: none;
    position: fixed;
    z-index: 1;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    overflow: auto;
    background-color: rgb(0,0,0);
    background-color: rgba(0,0,0,0.5);
}

#modal_content {
    background-color: #fefefe;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    border-radius: 4px;
    border-top: 8px solid #c04331;
    width: 80%;
    max-width: 720px;
}

#modal.modal_help > #modal_content {
    background-color: #fefefe;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    border-radius: 4px;
    border-top: 8px solid #43c031;
    width: 80%;
    max-width: 720px;
}


#modal.modal_error > #modal_content {
    background-color: #fefefe;
    background-image: url(/images/jim.png);
    background-repeat: no-repeat;
    background-size: 64px;
    background-position: 6px 6px;
    margin: 15% auto;
    padding: 20px;
    padding-left: 74px;
    border: 1px solid #888;
    border-radius: 4px;
    border-top: 8px solid #c04331;
    width: 80%;
    max-width: 720px;
}

#composer_modal > #modal_content {
    background-color: #fefefe;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    border-radius: 4px;
    border-top: 8px solid #3143c0;
    width: 80%;
    max-width: 720px;
}

#modal_content > h2 {
    float: left;
    margin-top: -10px;
    font-size: 3rem;
}

#modal_close {
    color: #aaa;
    float: right;
    font-size: 28px;
    margin-top: -16px;
    font-weight: bold;
}

#modal_close:hover,
#modal_close:focus {
    color: black;
    text-decoration: none;
    cursor: pointer;
}


#modal_content > div > p {
    margin-top: 40px;
}




/* Composer */
#composer_modal {
    display: none;
    position: fixed;
    z-index: 1;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    overflow: auto;
    background-color: rgb(0,0,0);
    background-color: rgba(0,0,0,0.5);
}

#composer_modal_content {
    background-color: #fefefe;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    border-radius: 4px;
    border-top: 8px solid #3143c0;
    width: 80%;
    max-width: 720px;
}



#composer_modal_content > h2 {
    margin-top: -10px;
    font-size: 2rem;
    min-width: 75%;
}

#composer_modal_close {
    color: #aaa;
    float: right;
    font-size: 28px;
    margin-top: -16px;
    font-weight: bold;
}

#composer_modal_close:hover,
#composer_modal_close:focus {
    color: black;
    text-decoration: none;
    cursor: pointer;
}


#composer_modal_content > div > p {
    margin-top: 40px;
}

