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

#banner-box {
    background: url(../../images/bg-mb-wrapper2.png) bottom center repeat-x #5483dd;

    #inner-banner-box {
        position: relative;
        z-index: 9;
        min-height: 300px;
        max-height: 300px;
        background: url(../../images/bg-main-box.jpg) bottom center no-repeat;

        #banner {
            min-height: 300px;
            padding: 35px 0 0 40px;

            a#get-started-btn {
                border-color: #c17dac !important;
                background-color: #fff !important;
                border-radius: 4px;
                color: #f67484 !important;
                font-weight: 500;
                margin-left: 2px;
            }

            #nat-lang-itf {
                color: #fff;
                font-size: 60px;
                letter-spacing: 0.02em;
                font-weight: 500;
                font-family: CanaroBold, Helvetica, sans-serif;
            }

            #banner-sub-title {
                color: #fff;
                font-size: 24px;
                font-weight: 400;
                margin-top: -5px;
                letter-spacing: 0.02em;
            }
        }
    }
}

@media (max-width: 1000px) {
    #banner-box #inner-banner-box #banner #nat-lang-itf {
        font-size: 45px;
    }
    #banner-box #inner-banner-box #banner {
        padding-top: 50px;
    }
}

@media (max-width: $min-width) {
    #banner-box #inner-banner-box #banner #nat-lang-itf {
        font-size: 35px;
    }
    #banner-box #inner-banner-box #banner #sub-title {
        font-size: 18px;
    }
    #banner-box #inner-banner-box #banner {
        padding-top: 70px;
    }
}

.bottom-arrow {
    position: relative;

    &:after {
        position: absolute;
        bottom: -16px;
        left: 50%;
        z-index: 10;
        margin-left: -23px;
        width: 0;
        height: 0;
        border-top: 16px solid;
        border-right: 23px solid transparent;
        border-left: 23px solid transparent;
        content: "";
        -moz-transform: scale(.9999);
    }
}

.main-section {
    padding: 0 30px 40px 30px;
    letter-spacing: 0.02em;

    .section-title {
        margin: 40px 0 15px 0;
        font-size: 35px;
        letter-spacing: 0.02em;
        font-weight: 200;
        display: block;

        span {
            font-weight: 500;
        }
    }

    .sub-section-title {
        margin: 0 0 10px 0;
        font-size: 25px;
        letter-spacing: 0.02em;
        font-weight: 200;
        display: block;

        span {
            font-weight: 500;
        }
    }

    &:last-child {
        margin-bottom: 150px;
    }

    #lang-logos, #integration-logos {
        display: inline-block;

        & > a {
            margin: 0 10px 0 0;
        }
    }
}

#banner-box:after {
    border-top-color: #ed8964;
}

#about-nlpcraft {
    background-color: #fff;

    &:after {
        border-top-color: #fff;
    }

    img#fig1 {
        padding: 50px;
    }
}

#features {
    background-color: #fff; //rgba(238,244,246,84);

    &:after {
        border-top-color: #fff; //rgba(238,244,246,84);
    }
}

.learn-more {
    margin-top: 10px;
}

.read-more {
    margin-top: 30px;

    // Reset to the default link colors.
    a, a:hover, a:active, i.fas {
        color: rgb(0, 123, 255) !important;
    }
}

#about {
    padding-bottom: 100px;
    background-color: #fff;

    &:after {
        border-top-color: transparent;
    }

    a, a:hover, a:active {
        color: $color-blue2;
    }

    .about-project-name {
        font-weight: 700;
        font-size: 150%;
        margin-bottom: 10px;
        display: inline-block;
    }
}

#home-events {
    background-color: #eafaff;

    &:after {
        border-top-color: #eafaff;
    }

    #event-container {
        margin-bottom: 20px;

        a, a:hover, a:active, i.fas {
            color: $color-asphalt;
        }

        img.event-logo {
            max-height: 56px;
            margin-bottom: 10px;
            vertical-align: middle;
        }

        .event-loc,
        .event-date,
        .event-link {
            font-size: 15px;
            font-weight: 400;
            letter-spacing: 0.02em;
            border-left: 1px dotted #aaa;
            padding-left: 10px;
        }

        .event-talk-name {
            margin-bottom: 10px;
        }

        .event-link {
            margin-bottom: 15px;
        }

        img.event-avatar-img {
            height: 36px;
            margin-right: 10px;
            vertical-align: middle;
            -webkit-border-radius: 100%;
            -moz-border-radius: 100%;
            border-radius: 100%;
        }

        .event-name {
            font-size: 25px;
            letter-spacing: 0.02em;
            font-weight: 200;

            a {
                color: $color-slack;
            }

            margin-bottom: 10px;
        }
    }
}

#news {
    background-color: $color-magnolia;

    &:after {
        border-top-color: $color-magnolia;
    }

    #news-container {
        margin-bottom: 20px;

        a, a:hover, a:active, i.fas {
            color: $color-asphalt;
        }

        .news-title {
            font-size: 22px;
            letter-spacing: 0.02em;
            font-weight: 400;

            i.fas {
                color: $color-asphalt;
            }
        }

        .news-excerpt {
            font-size: 15px;
            color: #666;
            font-weight: 200;
            letter-spacing: 0.05em;
            margin-bottom: 20px;
        }

        .news-footer {
            letter-spacing: 0.02em;

            img {
                height: 24px;
                margin-right: 5px;
                vertical-align: middle;
            }

            img.avatar-img {
                -webkit-border-radius: 100%;
                -moz-border-radius: 100%;
                border-radius: 100%;
            }

            a, span {
                vertical-align: middle;
            }

            a.news-author {
                margin-right: 15px;
                display: inline-block;
            }
        }
    }
}

div.quick-link {
    display: block;
    padding: 8px 0 0 15px;
    margin: 0 10px 20px 0;
    height: 50px;
    min-width: 350px;
    max-width: 430px;
    border: 1px solid #e0ded2;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    background-color: $color-magnolia;
    white-space: nowrap;

    .txt {
        font-size: 80%;
    }

    .sep {
        color: #cecab2;
    }

    img.quick-link-img {
        height: 32px;
        margin-right: 10px;
        vertical-align: middle;
    }

    span {
        vertical-align: middle;
        display: inline;
    }

    i.fas {
        vertical-align: middle;
    }

    a {
        color: $color-asphalt;
    }

    div.gh-btn {
        vertical-align: bottom;
        display: inline-block;
        margin-right: 10px;
    }
}