/*!
 * 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 (width >= 64rem) {
  .UnitDetails {
    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);
  }
}

@media only screen and (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 (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 (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;
}
