/*
 *
 * 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.
 *
 */
html, body {
    margin-top: 20px;
    margin-left: 40px;
    margin-right: 40px;
    padding: 0;
    font-family: Lucida Sans,Lucida Grande,Arial,sans-serif !important;
    font-size: 13px !important;
    background: white;
    color: #333;
}

th, td {
    text-align: left;
}

.type {
    font-family: "Courier New", courier, monospace;
}

table.types td.name {
    width: 20em;
}

table.attributes td.name {
    font-family: "Courier New", courier, monospace;
    width: 20em;
}

table.attributes td.type {
    width: 7em;
}

table.operation td.name {
    font-family: "Courier New", courier, monospace;
    width: 20em;
}

table.operation td.type {
    width: 20em;
}

table.parameters td.name {
    font-family: "Courier New", courier, monospace;
    width: 20em;
}

table.parameters td.type {
    width: 20em;
}

table.parameters td.default {
    width: 20em;
}

table.parameters td.mandatory {
    width: 15em;
}

table.api td,th {
    vertical-align: top;
}


table.api td.type {
    width: 12em;
}


table.api td.path {
    width: 20em;
}


table.api td.description {
    width: 25em;
}

table.api a:link {
    color: #333;
    text-decoration: none;
}

table.api a:visited {
    color: #666;
    text-decoration: none;
}


div.restriction {
    border-bottom: 1px dotted #666;
    display: inline;
}
