/**
 * By Oskar Wickström
 * Licensed under the MIT License (https://github.com/owickstrom/the-monospace-web/blob/main/LICENSE.md)
 **/
@import url('https://fonts.cdnfonts.com/css/jetbrains-mono-2');

:root {
  --font-family: "JetBrains Mono", monospace;
  --line-height: 1.25rem;
  --border-thickness: 2px;
  --text-color: #000;
  --text-color-alt: #666;
  --background-color: #fff;
  --background-color-alt: #eee;

  --body-max-width: 52.8rem;

  --font-weight-normal: 500;
  --font-weight-medium: 600;
  --font-weight-bold: 800;

  font-family: var(--font-family);
  font-optical-sizing: auto;
  font-weight: var(--font-weight-normal);
  font-style: normal;
  font-variant-numeric: tabular-nums lining-nums;
  font-size: 16px;
}

:root:lang(zh) {
  --font-family: "PlemoCJK SC", "JetBrains Mono", monospace;
}
:root:is(:lang(zh-Hant), :lang(zh-TW), :lang(zh-HK), :lang(zh-MO)) {
  --font-family: "PlemoCJK TC", "JetBrains Mono", monospace;
}
:root:lang(ja) {
  --font-family: "PlemoCJK JP", "JetBrains Mono", monospace;
}
:root:lang(ko) {
  --font-family: "PlemoCJK KR", "JetBrains Mono", monospace;
}
:root:is(:lang(zh), :lang(ja), :lang(ko)) {
  --font-weight-normal: 450;
  --font-weight-medium: 500;
  --font-weight-bold: 700;
}
:root:is(:lang(zh), :lang(ja), :lang(ko)) th {
  font-weight: 600;
}
/* box drawing and other ambiguous-width characters in <pre> are one column wide, as in a
   terminal; .ascii-cjk keeps them two columns wide to line up with CJK characters */
pre {
  font-feature-settings: "hwid";
}
pre.ascii-cjk {
  font-feature-settings: normal;
}

@media (prefers-color-scheme: dark) {
  :root {
    --text-color: #fff;
    --text-color-alt: #aaa;
    --background-color: #000;
    --background-color-alt: #111;
  }
}

* {
  box-sizing: border-box;
}


* + * {
  margin-top: var(--line-height);
}

html {
  display: flex;
  width: 100%;
  margin: 0;
  padding: 0;
  flex-direction: column;
  align-items: center;
  background: var(--background-color);
  color: var(--text-color);
}

body {
  position: relative;
  width: 100%;
  margin: 0;
  /* The frame (width, left padding) doesn't depend on the font, so the text column stays put
     when switching languages. The content width is rounded down to 2ch and the remainder goes
     to the right padding. +0.5px: layout units truncate to 1/64px, so exact multiples of ch
     would lose a step (inside round() for the body, after it for descendants' round()). */
  --body-padding: 1.8rem;
  --body-content: min(var(--body-max-width), 100% - 2 * var(--body-padding));
  padding: var(--line-height)
    calc(var(--body-padding) + var(--body-content) - round(down, var(--body-content) + 0.5px, 2ch) - 0.5px)
    var(--line-height) var(--body-padding);
  max-width: calc(var(--body-max-width) + 2 * var(--body-padding));
  line-height: var(--line-height);
  overflow-x: hidden;
}

@media screen and (max-width: 480px) {
  :root {
    font-size: 14px;
  }
  body {
    --body-padding: 1.2rem;
  }
}

h1, h2, h3, h4, h5, h6 {
  font-weight: var(--font-weight-bold);
  margin: calc(var(--line-height) * 2) 0 var(--line-height);
  line-height: var(--line-height);
}

h1 {
  font-size: 2rem;
  line-height: calc(2 * var(--line-height));
  margin-bottom: calc(var(--line-height) * 2);
  text-transform: uppercase;
}
h2 {
  font-size: 1rem;
  text-transform: uppercase;
}

/* two lines tall with the rule centered on the grid line between them: the same four lines
   as before, but the box starts and ends on whole lines, so collapsing with a larger margin
   (a heading's) can't put what follows half a line off */
hr {
  position: relative;
  display: block;
  height: calc(var(--line-height) * 2);
  margin: var(--line-height) 0;
  border: none;
  color: var(--text-color);
}
hr:after {
  display: block;
  content: "";
  position: absolute;
  top: calc(var(--line-height) - var(--border-thickness) * 1.5);
  left: 0;
  width: 100%;
  border-top: calc(var(--border-thickness) * 3) double var(--text-color);
  height: 0;
}

a {
  text-decoration-thickness: var(--border-thickness);
}

a:link, a:visited {
  color: var(--text-color);
}

p {
  margin-bottom: var(--line-height);
}

strong {
  font-weight: var(--font-weight-bold);
}
em {
  font-style: italic;
}

sub {
  position: relative;
  display: inline-block;
  margin: 0;
  vertical-align: sub;
  line-height: 0;
  width: calc(1ch / 0.75);
  font-size: .75rem;
}
sup {
  position: relative;
  display: inline-block;
  margin: 0;
  vertical-align: super;
  line-height: 0;
  width: calc(1ch / 0.75);
  font-size: .75rem;
}

table {
  position: relative;
  top: calc(var(--line-height) / 2);
  /* center collapsed borders on grid lines so every cell's text lands on the grid */
  left: calc(var(--border-thickness) / -2);
  width: calc(round(down, 100%, 1ch) + var(--border-thickness));
  border-collapse: collapse;
  margin: 0 0 calc(var(--line-height) * 2);
}

th, td {
  border: var(--border-thickness) solid var(--text-color);
  padding: 
    calc((var(--line-height) / 2))
    calc(1ch - var(--border-thickness) / 2)
    calc((var(--line-height) / 2) - (var(--border-thickness)))
  ;
  line-height: var(--line-height);
  vertical-align: top;
  text-align: left;
}
/* the table's first row, whether in thead or the first tbody */
table thead tr:first-child > *,
table tbody:not(thead ~ tbody, tbody ~ tbody) tr:first-child > * {
  padding-top: calc((var(--line-height) / 2) - var(--border-thickness));
}


th {
  font-weight: 700;
}
.width-min {
  width: 0%;
}
.width-auto {
  width: 100%;
}
/* keep CJK words whole instead of squeezing narrow columns to one character per line */
th, .width-min {
  word-break: keep-all;
}

.header {
  margin-bottom: calc(var(--line-height) * 2);
}
.header h1 {
  margin: 0;
}
.header tr td:last-child {
  text-align: right;
}

p {
  word-break: break-word;
  word-wrap: break-word;
  hyphens: auto;
}

img, video {
  display: block;
  width: 100%;
  object-fit: contain;
  overflow: hidden;
}
img {
  font-style: italic;
  color: var(--text-color-alt);
}

details {
  border: var(--border-thickness) solid var(--text-color);
  padding: calc(var(--line-height) - var(--border-thickness)) calc(1ch - var(--border-thickness));
  margin-bottom: var(--line-height);
}

summary {
  font-weight: var(--font-weight-medium);
  cursor: pointer;
}
details[open] summary {
  margin-bottom: var(--line-height);
}

details ::marker {
  display: inline-block;
  content: '▶';
  margin: 0;
}
details[open] ::marker {
  content: '▼';
}

details :last-child {
  margin-bottom: 0;
}

pre {
  white-space: pre;
  overflow-x: auto;
  margin: var(--line-height) 0;
  overflow-y: hidden;
}
figure pre {
  margin: 0;
}

pre, code {
  font-family: var(--font-family);
}

code {
  font-weight: var(--font-weight-medium);
}

figure {
  margin: calc(var(--line-height) * 2) 3ch;
  overflow-x: auto;
  overflow-y: hidden;
}

figcaption {
  display: block;
  font-style: italic;
  margin-top: var(--line-height);
}

ul, ol {
  padding: 0;
  margin: 0 0 var(--line-height);
}
blockquote {
  margin: 0 0 var(--line-height);
  padding-left: calc(2ch - var(--border-thickness));
  border-left: var(--border-thickness) solid var(--text-color);
}
blockquote > :last-child {
  margin-bottom: 0;
}
dl {
  margin: 0 0 var(--line-height);
}
dt {
  font-weight: var(--font-weight-bold);
}
dd {
  margin: 0 0 0 2ch;
}

ul {
  list-style-type: square;
  padding: 0 0 0 2ch;
}
ol {
  list-style-type: none;
  counter-reset: item;
  padding: 0;
}
ol ul,
ol ol,
ul ol,
ul ul {
  padding: 0 0 0 3ch;
  margin: 0;
}
/* float keeps the number on the first line when the item starts with a block (loose lists, footnotes) */
ol li:before {
  float: left;
  white-space: pre;
  content: counter(item) ". ";
  counter-increment: item;
  font-weight: var(--font-weight-medium);
}
/* counters() only when nested: a counter's scope extends to following siblings, so a later,
   unrelated list would otherwise be numbered as a sublist of the previous one */
li ol li:before {
  content: counters(item, ".") ". ";
}

li {
  margin: 0;
  padding: 0;
}

li::marker {
  line-height: 0;
}

::-webkit-scrollbar {
    height: var(--line-height);
}

input, button, textarea {
  border: var(--border-thickness) solid var(--text-color);
  padding: 
    calc(var(--line-height) / 2 - var(--border-thickness))
    calc(1ch - var(--border-thickness));
  margin: 0;
  font: inherit;
  font-weight: inherit;
  height: calc(var(--line-height) * 2);
  width: auto;
  overflow: visible;
  background: var(--background-color);
  color: var(--text-color);
  line-height: normal;
  -webkit-font-smoothing: inherit;
  -moz-osx-font-smoothing: inherit;
  -webkit-appearance: none;
}

input[type=checkbox],
input[type=radio] {
  display: inline-grid;
  place-content: center;
  vertical-align: top;
  width: 2ch;
  height: var(--line-height);
  cursor: pointer;
}
input[type=checkbox]:checked:before,
input[type=radio]:checked:before {
  content: "";
  width: 1ch;
  height: calc(var(--line-height) / 2);
  background: var(--text-color);
}
input[type=radio],
input[type=radio]:before {
  border-radius: 100%;
}
input[type=radio] {
  height: 2ch;
  padding: 0;
  margin: calc((var(--line-height) - 2ch) / 2) 0;
}
input[type=radio]:checked:before {
  height: 1ch;
}

button:focus, input:focus {
  --border-thickness: 3px;
  outline: none;
}

input {
  width: calc(round(down, 100%, 1ch));
}
::placeholder {
  color: var(--text-color-alt);
  opacity: 1;
}
::-ms-input-placeholder {
  color: var(--text-color-alt);
}
button::-moz-focus-inner {
  padding: 0;
  border: 0
}

button {
  text-transform: uppercase;
  font-weight: var(--font-weight-medium);
  cursor: pointer;
}

button:hover {
  background: var(--background-color-alt);
}
button:active {
  transform: translate(2px, 2px);
}

label {
  display: block;
  width: calc(round(down, 100%, 1ch));
  height: auto;
  line-height: var(--line-height);
  font-weight: var(--font-weight-medium);
  margin: 0;
}

label input {
  width: 100%;
}

.tree, .tree ul {
  position: relative;
  padding-left: 0;
  list-style-type: none;
  line-height: var(--line-height);
}
.tree ul {
  margin: 0;
}
.tree ul li {
  position: relative;
  padding-left: calc(1.5ch - var(--border-thickness) / 2);
  margin-left: calc(1.5ch - var(--border-thickness) / 2);
  border-left: var(--border-thickness) solid var(--text-color);
}
.tree ul li:before {
  position: absolute;
  display: block;
  top: calc(var(--line-height) / 2);
  left: 0;
  content: "";
  width: 1ch;
  border-bottom: var(--border-thickness) solid var(--text-color);
}
.tree ul li:last-child {
  border-left-color: transparent;
}
.tree ul li:last-child:after {
  position: absolute;
  display: block;
  top: 0;
  left: calc(-1 * var(--border-thickness));
  content: "";
  height: calc(var(--line-height) / 2 + var(--border-thickness));
  border-left: var(--border-thickness) solid var(--text-color);
}

.grid {
  --grid-cells: 0;
  display: flex;
  gap: 1ch;
  width: calc(round(down, 100%, (1ch * var(--grid-cells)) - (1ch * var(--grid-cells) - 1)));
  margin-bottom: var(--line-height);
}

.grid > *,
.grid > input {
  flex: 0 0 calc(round(down, (100% - (1ch * (var(--grid-cells) - 1))) / var(--grid-cells), 1ch));
}
.grid:has(> :last-child:nth-child(1)) { --grid-cells: 1; }
.grid:has(> :last-child:nth-child(2)) { --grid-cells: 2; }
.grid:has(> :last-child:nth-child(3)) { --grid-cells: 3; }
.grid:has(> :last-child:nth-child(4)) { --grid-cells: 4; }
.grid:has(> :last-child:nth-child(5)) { --grid-cells: 5; }
.grid:has(> :last-child:nth-child(6)) { --grid-cells: 6; }
.grid:has(> :last-child:nth-child(7)) { --grid-cells: 7; }
.grid:has(> :last-child:nth-child(8)) { --grid-cells: 8; }
.grid:has(> :last-child:nth-child(9)) { --grid-cells: 9; }

/* DEBUG UTILITIES */

.debug .debug-grid {
  --color: color-mix(in srgb, var(--text-color) 10%, var(--background-color) 90%);
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: -1;
  background-image:
    repeating-linear-gradient(var(--color) 0 1px, transparent 1px 100%),
    repeating-linear-gradient(90deg, var(--color) 0 1px, transparent 1px 100%);
  background-size: 1ch var(--line-height);
  /* -0.5px: center the 1px lines on cell boundaries instead of inside each cell */
  background-position: calc(var(--body-padding) - 0.5px) -0.5px;
  margin: 0;
}

.debug .off-grid {
  background: rgba(255, 0, 0, 0.1);
}

.debug-toggle-label {
  text-align: right;
}
