/*
 * Copyright 2012-2018 Christophe Friederich
 *
 * Licensed 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.
 */

.navbar,
.breadcrumb,
.toc-separator
#m-toc-topbar,
#m-toc-sidebar,
footer,
.subfooter {
	display: none !important;
}

body {
  padding-top: 0px !important;
}

/* CSS below taken from HTML5 Boilerplate */
* {
  background: transparent !important;
  color: #000 !important; /* Black prints faster: h5bp.com/s */
  box-shadow:none !important;
  text-shadow: none !important;
}

a, a:visited {
  text-decoration: underline;
}

a[href]:after {
  content: " (" attr(href) ")";
}

abbr[title]:after {
  content: " (" attr(title) ")";
}

/*
 * Don't show links for images, or javascript/internal links, or header links
 */

.header a:after, .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after {
  content: "" !important;
}

pre, blockquote {
  border: 1px solid #999;
  page-break-inside: avoid;
}

thead {
  display: table-header-group; /* h5bp.com/t */
}

tr, img {
  page-break-inside: avoid;
}

img {
  max-width: 100% !important;
}

@page {
  margin: 0.5cm;
}

p, h2, h3 {
  orphans: 3;
  widows: 3;
}

h2, h3 {
  page-break-after: avoid;
}
