/*
 * Licensed to the Apache Software Foundation (ASF)
 * under one or more contributor license agreements.
 */

/*
 * Table of content, to be shown on the left side.
 * main{left} should be at least equal to nav{width}.
 * We use <p> element for the "Table of content" title instead than <h1>
 * because we don't want those textes to be inserted in the auto-generated TOC.
 */
nav {
  position:         absolute;
  top:              0;
  left:             0;
  right:            0;
  bottom:           0;
  width:            450px;
  white-space:      nowrap;
  overflow:         auto;
  font-family:      sans-serif;
  font-size:        smaller;
  color:            #1a5276;
  background-color: #f8f9f9;
  border-right:     #cacfd2 1px solid;
}

main {
  position:      fixed;
  left:          450px;
  top:           0;
  right:         0;
  bottom:        0;
  overflow:      auto;
  padding-left:  42px;
  padding-right: 30px;
  font-size:     18px;
  /*
   * Firefox has a monospace font size different than the proportional font size.
   * By setting a font size in the main block, we force the same size for both fonts.
   *
   * https://bugzilla.mozilla.org/show_bug.cgi?id=328621
   */
}

nav a {
  display:         block;
  text-decoration: none;
  font-family:     sans-serif;
  color:           #5d6d7e;
  transition:      all 50ms ease-in-out;
}

nav a:focus,
nav a:hover {
  color:           #154360;
  text-decoration: underline;
}

nav p {
  font-size:      large;
  font-weight:    bold;
  padding-left:   15px;
  padding-bottom: 4px;
  margin-bottom:  6px;
  border-bottom:  #2471a3 1px solid;
}

nav ul {
  list-style-type: none;
  padding-left:    15px;
}

nav ul li {
  margin-top:    3px;
  margin-bottom: 3px;
}

nav li.active > a {
  color: #154360;
  font-weight: bolder;
}

div.example,
article,
aside {
  margin-left:  80px;
  margin-right: 68px;
}

li > div.example,
dd > div.example {
  margin-left:  30px;
  margin-right: 60px;
}

section > ul,
section > ol,
section > dl {
  margin-left: 30px;
}

/*
 * Lists.
 */
ul.verbose li {
  margin-top:    9px;
  margin-bottom: 9px;
}

/*
 * Chapters and sections titles (excluding the book titles).
 */
section > h1,
section > header > h1 {
  font-family:         sans-serif;
  margin-top:          200px;
  border-bottom-style: solid;
  border-bottom-width: 3px;
  padding-top:         6px;
  padding-bottom:      6px;
  margin-bottom:       0px;
}

section > h2,
section > header > h2 {
  font-family:         sans-serif;
  margin-top:          160px;
  border-bottom-style: solid;
  border-bottom-width: 2px;
}

section > h3,
section > header > h3 {
  font-family: sans-serif;
  margin-top:  100px;
}

section > h4,
section > header > h4 {
  font-family: sans-serif;
  margin-top:  60px;
}

span.section-number {
  margin-right: 9px;
}

section p {
  text-align: justify;
}

summary:hover {
  cursor: pointer;
}

div.example {
  font-size: smaller;
}

article div.example {
  font-size: inherit;
}

article, aside {
  margin-top:       21px;
  margin-bottom:    21px;
  padding-left:     21px;
  padding-right:    21px;
  border-style:     solid;
  border-width:     2px;
  background-color: #EEEEEE;
  border-color:     #BBBBBB;
  font-size:        smaller;
}

aside h1, article h1,
aside h2, article h2,
aside h3, article h3,
aside h4, article h4,
aside h5, article h5 {
  font-family:   sans-serif;
  font-size:     medium;
  margin-top:    12px;
  margin-bottom: 12px;
}

aside h2, article h2 {
  font-size: large;
  margin-top: 15px;
}

caption {
  font-family:    sans-serif;
  font-weight:    bold;
  padding-top:    12px;
  padding-bottom: 3px;
}

table {
  margin-left:    auto;
  margin-right:   auto;
  border-style:   solid;
  border-width:   1px;
  border-spacing: 0px;
}

table tr th {
  background-color:    #B9DCFF;
  border-bottom-style: solid;
  border-bottom-width: 1px;
  padding:             6px;
}

table tr td {
  padding-left:  12px;
  padding-right: 12px;
}

table tr td.leftBorder {
  border-left-style: solid;
  border-left-width: 2px;
  border-left-color: lightgray;
}

table tr td.separator {
  text-align:          center;
  font-weight:         bold;
  background-color:    #EEEEFF;
  border-top-color:    LightGray;
  border-bottom-color: LightGray;
  border-top-style:    solid;
  border-bottom-style: solid;
  border-top-width:    1px;
  border-bottom-width: 1px;
  padding-top:         6px;
  padding-bottom:      6px;
}

/*
 * Table with the first column in monospaced font, used for drawing trees.
 * Because line-wrap is disabled, the table in HTML may need a `font-size`
 * style element with a magic number using the `vw` unit.
 */
table.monospacedHeaderColumn {
  white-space: nowrap;
  line-height: 1;
  border:      none;
}

table.monospacedHeaderColumn tr > :nth-child(1) {
  font-family: monospace;
}

div.caption {
  margin:      6px;
  text-align:  center;
  font-weight: bold;
  font-family: sans-serif;
}

div.row-of-boxes {
  display:         flex;
  align-items:     flex-start;
  justify-content: center;
}

div.row-of-boxes > div {
  padding: 6px 30px;
}

pre {
  margin-top:    21px;
  margin-bottom: 21px;
  padding:       12px;
  border: 2px solid silver;
  background: #F8F8F8
}

samp.xml {
}

/*
 * OGC/ISO, GeoAPI and SIS legends.
 */
code.OGC {
  color: MediumBlue;
}

code.GeoAPI {
  color: Green;
}

code.SIS {
  color: SaddleBrown;
}

code.comment {
  color:       Gray;
  font-family: serif;
  font-size:   80%;
}

div.warning {
  color:        crimson;
  background:   lightyellow;
  border-color: lightcoral;
  border-style: solid;
  border-width: 2px;
  padding:      9px;
  margin:      21px;
}
