/*!
 * 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;
}
