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

@mixin custom_btn {
    font-weight: 500;
    padding: 10px 25px !important;
}

#signin_show {
    @include custom_btn;
}

.page-landing__button-signin {
    align-self: center;
    margin-left: 30px;
    margin-right: var(--page-side-padding) !important;
    min-width: 80px;
    font-weight: 500;
    padding: 10px 25px !important;
    flex: 0 0 auto;
}

page-landing {
    display: block;
    margin: 0 calc(var(--page-side-padding) * -1) calc(var(--page-side-padding) * -1);

    .btn-custom {
        @include custom_btn;
    }

    section.intro-container-wrapper {
        padding: 40px 0;

        background-color: #f9f9f9;
        border-bottom: 1px solid #aaaaaa;

        .intro-content {
            padding-right: 70px;
        }

        h1 {
            margin-top: 45px;
            font-size: 48px;
            line-height: 55px;
            font-weight: 300;
        }

        h2 {
            margin-bottom: 20px;
            font-size: 24px;
            font-style: italic;
            font-weight: 300;
        }

        p {
            font-size: 16px;
            font-weight: 300;
            color: #777777;
        }

        .btn-custom {
            margin-top: 20px;
            padding: 10px 40px !important;
            border-color: #f9f9f9 !important;
        }
    }

    section.features-container-wrapper {
        padding: 25px 0 60px;
        background-color: #ffffff;

        .section-title {
            font-size: 38px;
            font-weight: 300;
            color: #444444;
            margin: 30px 0 60px;
        }

        .feature {
            margin: 30px 0;

            h3 {
                font-size: 24px;
                font-weight: normal;
                color: #000000;
                line-height: 28px;
                margin-bottom: 10px;
            }

            p {
                color: #666666;
                font-size: 16px;
            }

            i.fa {
                font-size: 48px;
                color: #bbbbbb;
            }
        }
    }
}
