/*!
 * Copyright 2020 The Go Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style
 * license that can be found in the LICENSE file.
 */

@import url('./_build-context.css');
@import url('./_directories.css');
@import url('./_doc.css');
@import url('./_files.css');
@import url('./_meta.css');
@import url('./_outline.css');
@import url('./_readme_gen.css');
@import url('./_readme.css');

.UnitDetails {
  column-gap: 2rem;
  display: grid;
  grid-template-columns: minmax(0, auto);
  margin: auto;
  min-height: 32rem;
}
@media only screen and (min-width: 64rem) {
  .UnitDetails {
    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);
  }
}
@media only screen and (min-width: 80rem) {
  .UnitDetails {
    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;
    justify-content: center;
  }
}
.UnitDetails :target {
  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);
}
@media only screen and (min-width: 64rem) {
  .UnitDetails :target {
    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);
  }
}

.UnitDetails :target:not(details, h2) {
  background-color: var(--color-background-highlighted);
  padding: 0.25rem;
}
.UnitDetails-meta {
  order: -1;
}
@media only screen and (min-width: 64rem) {
  .UnitDetails-meta {
    display: block;
    margin-top: 2rem;
    order: initial;
  }
}
.UnitDetails-contentEmpty {
  align-items: center;
  background-color: var(--color-background-accented);
  color: var(--color-text-subtle);
  display: flex;
  flex-direction: column;
  height: 15rem;
  padding-top: 1rem;
  text-align: center;
}
.UnitDetails-contentEmpty img {
  height: 7.8125rem;
  width: auto;
}
