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

.markdown-body {
    min-width: 200px;
    max-width: 790px;
    margin: 0 auto;
    padding: 30px;
}

h1, .center {
    text-align: center;
}

table.triptych tr, table.triptych td {
    border: 0;
}

table.triptych td:nth-child(1) input {
    text-align: right;
}

table.triptych td:nth-child(2) {
    width: 3em;
    text-align: center;
}

table.triptych input {
    box-sizing: border-box;
    width: 100%;
    padding: 4px;
    font-size: 1em;
    background-color: lightyellow;
}

p.format {
    text-align: center;
}

p.format input {
    font-size: 1.5em;
    width: 30%;
}

table.result {
    table-layout: fixed;
}

table.result td {
    text-align: center;
}

table.triptych.result td:nth-child(1) {
    text-align: right;
}
table.triptych.result td:nth-child(2) {
    text-align: center;
}
table.triptych.result td:nth-child(3) {
    text-align: left;
}

.note {
    font-style: italic;
    font-size: .8em;
    background: none !important;
}

.desc {
    font-size: .8em;
    background: none !important;
}

.winner {
    font-size: 2em;
    background-color: lightgreen;
    padding: 4px;
}

table.details {
    font-size: .9em;
    table-layout: fixed;
}

footer {
    text-align: center;
    margin-top: 60px;
}

.prettyRevText {
    width: 80%;
    height: 150px;
}
