/*
 * 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;
                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;
    }

    #integration-logos {
        display: inline-block;

        & > a {
            margin: 5px 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: rgba(238,244,246,84);

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

#howitworks {
    background-color: #fff;

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

.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;
    }
}

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

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

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

    #news-container {
        .news-title {
            font-size: 24px;
            letter-spacing: 0.02em;
            font-weight: 200;

            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: 32px;
                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: 2px;
    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;
    }
}