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

body,
html {
    height: 100%;
}

.guidePageContainer {
    align-items: start;
    display: flex;
    justify-content: center;
    min-width: 100%;
    min-height: 100%;
}

.guidePage {
    width: 90%;
    max-width: 1200px;
    font-size: 10px;
}

.guidePage .content {
    margin-top: 20px;
}

.guidePage p {
    font-size: 1.3em;
}

.guidePage .path {
    background-color: #2d2d2d;
    color: #f8f8f2;
    padding: 2px;
    border-radius: 4px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    font-family: "Courier New", Courier, monospace;
}

.guidePage .codeContainer {
    position: relative;
    background-color: #2d2d2d;
    padding: 10px;
    border-radius: 4px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.guidePage .codeContainer pre {
    margin: 0;
    font-size: 1.2em;
    color: #f8f8f2;
    overflow-x: auto;
    font-family: "Courier New", Courier, monospace;
}

.guidePage .codeContainer .unknownPath {
    color: #cc0000;
}

.guidePage .title {
    margin-top: 1em;
}

.guidePage .subtitle {
    margin-bottom: 0.8em;
}

.guidePage .title h1 {
    padding: 0;
    margin: 0;
    border: none;
    font-weight: normal;
    font-size: 3.6em;
    white-space: nowrap;
}

.guidePage .subtitle h2 {
    font-weight: lighter;
    padding: 0;
    margin: 0;
    border: none;
    font-size: 2.6em;
    line-height: initial;
    white-space: nowrap;
}

.guidePage .subtitle h3 {
    padding: 0;
    margin: 0;
    border: none;
    font-size: 1.7em;
    line-height: initial;
    white-space: nowrap;
}

.guidePage .list-steps > ul {
    font-size: 1.3em;
}

.guidePage .list-steps li {
    min-width: 0;
    font-weight: 300;
    white-space: nowrap;
}

.guidePage .list-steps .inner-list > li {
    list-style-type: disc;
    font-size: 1em;
}

.guidePage .footer .showOnStartup {
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.guidePage .footer {
    padding-top: 1em;
}

.guidePage .footer .guideControl {
    font-size: 1.3em;
}

.guidePage .footer .guideControl > .checkbox {
    transform: scale(1.2);
    vertical-align: bottom !important;
}

.guidePage .footer .guideControl > .checkboxLabel {
    vertical-align: top !important;
}

.guidePage .footer .guideControl > .checkbox:focus {
    outline: 1px solid;
    outline-color: var(--vscode-focusBorder);
}

.guidePage .propertyValue {
    background-color: #2d2d2d;
    color: #f8f8f2;
    padding: 2px;
    border-radius: 4px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
