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

.first-column {
    ul.side-nav {
        list-style: none;
        margin: 0 0 20px 0;
        padding: 0;

        li.side-nav-title {
            margin-top: 5px;
            display: block;
            font-size: 1.1rem;
            color: #303e4c;
            font-weight: 500;

            &:not(:first-child) {
                margin-top: 25px !important;
            }
        }

        li:not(.side-nav-title) {
            margin-left: 10px;
        }

        li {
            padding: 3px 10px 3px 0;
            display: block;
            text-align: left;

            a {
                color: #999;
                text-align: left;
                width: 100%;
                padding-right: 20px;
                border-right: 1px solid white;

                &:hover {
                    cursor: pointer;
                    text-decoration: none;
                    color: #369;
                    border-right: 3px solid $color-beta;
                }
            }
        }
    }
}

.second-column {
    padding-right: 40px;
    
    section {
        .section-title {
            color: $color-slack2;
            font-weight: 700;
            margin-top: 0;
            display: inline-block;
            margin-bottom: 10px;
            font-size: 150%;
        }

        .section-sub-title {
            color: $color-slack2;
            font-weight: 700;
            margin-top: 25px;
            display: block;
            font-size: 110%;
            margin-bottom: 5px;
        }

        figure {
            margin: 15px 0;

            img {
                display: block;
                border: 1px solid #dfdfdf;
                border-radius: 6px;
                padding: 30px;
            }

            figcaption {
                font-size: 80%;
                text-align: left;
                margin-top: 5px;
            }
        }

        figure.alt {
            margin: 15px 0;

            img {
                display: block;
                border-radius: 6px;
                padding: 0;
                border: none;
            }

            figcaption {
                font-size: 80%;
                text-align: left;
                margin-top: 5px;
            }
        }

        dl {
            margin-top: 10px;
            margin-left: 20px;

            dd {
                margin-bottom: 10px;
                margin-left: 20px;
            }
        }

        div.bq {

            h4 {
                margin: 0 0 10px 0 !important;
            }

            p, li {
                width: 100% !important;
            }
        }

        margin-bottom: 30px;

        p, li {
            letter-spacing: 0.02em;
        }
    }
    
    section:last-child {
        margin-bottom: 60px;
    }
}

.third-column {
    ul.side-nav {
        list-style: none;
        margin: 0 0 20px 0;
        padding: 0 0 0 10px;
        border-left: 1px solid #dfdfdf;

        li.side-nav-title {
            margin-top: 5px;
            display: block;
            font-size: 1.1rem;
            color: #303e4c;
            font-weight: 500;

            &:not(:first-child) {
                margin-top: 25px !important;
            }
        }

        li:not(.side-nav-title) {
            margin-left: 10px;
        }

        li {
            padding: 3px 10px 3px 0;
            display: block;
            text-align: left;

            a {
                color: #999;
                text-align: left;
                width: 100%;
                padding-right: 20px;
                border-right: 1px solid white;

                &:hover {
                    cursor: pointer;
                    text-decoration: none;
                    color: #369;
                    border-right: 3px solid $color-beta;
                }
            }
        }
    }
}

ul.side-nav {
    & img.quick-link-img {
        height: 16px;
        vertical-align: text-top;
    }

    a.toc2 {
        padding-left: 15px;
    }
}

i.fa-download {
    color: $color-turquoise;
}

i.fa-magic {
    color: $color-amethyst;
}

.page-title {
    i.fa-magic {
        color: $color-amethyst;
    }
}
.breadcrumb {
    i.fa-magic {
        display: none; // Hide it.
    }
}

li.side-nav-title:after {
    font-size: 75%;
    content: "\f105";
    padding-left: 5px;
    font-family: "Font Awesome\ 5 Free", serif;
    font-style: normal;
    font-weight: 700;
}

.three-cols-container {
    margin: 12px 0 72px 0;
    display: flex;
}
