@font-face {
  font-family: "InterVariable";
  src: local("Inter Variable"), local("InterVariable"), url("/fonts/inter/InterVariable.woff2") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "InterVariable";
  src: local("Inter Variable Italic"), local("InterVariableItalic"), url("/fonts/inter/InterVariable-Italic.woff2") format("woff2");
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: "Ioskeley";
  src: local("Ioskeley Mono"), local("Ioskeley-Mono"), url("/fonts/ioskeley/IoskeleyMono-Regular.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Ioskeley";
  src: local("Ioskeley Mono Medium"), local("Ioskeley-Mono-Medium"), url("/fonts/ioskeley/IoskeleyMono-Medium.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Ioskeley";
  src: local("Ioskeley Mono Semibold"), local("Ioskeley-Mono-Semibold"), url("/fonts/ioskeley/IoskeleyMono-SemiBold.woff2") format("woff2");
  font-weight: 600;
  font-style: normal;
  font-display: swap;
}

/* palette & syntax colours lifted from char.lt */
:root {
  --bg-col: #100e11;
  --bg-col-2: #181419;
  --bg-col-3: #211a22;

  --fg-col: #f3eef2;
  --fg-col-mute: #958792;

  --accent-col: #ff9df5;
  --accent-col-mute-1: #b86caf;
  --accent-col-mute-2: #493045;
  --accent-col-fade-1: #ffd0fb;

  --hl-comment: #9da8bb;
  --hl-keyword: #9bedff;
  --hl-builtin: #ff94d1;
  --hl-string: #95ffc3;
  --hl-ident: #d8a8ff;
  --hl-number: var(--hl-string);

  --font-mono: "Ioskeley", ui-monospace, "SF Mono", "Cascadia Code", "Roboto Mono", monospace;
}

* {
  box-sizing: border-box;
}

html {
  color-scheme: dark;
  font-family: "InterVariable", "Inter", sans-serif;
  line-height: 1.5;
  text-rendering: optimizeLegibility;
  background: var(--bg-col);
  color: var(--fg-col);
}

body {
  max-width: 64rem;
  margin: 0 auto;
  padding: 1.5rem 1.25rem 4rem;
}

::selection {
  background-color: #6d3567;
}

/* type scale: 0.75 / 0.875 / 1 / 1.5 / 1.75rem. Ioskeley has a larger
   x-height than Inter, so mono sits a step down to read as the same size. */
h1 { font-size: 1.75rem; font-weight: 520; margin: 0 0 0.75em; line-height: 1.08; }
h1:has(+ .desc) { margin-bottom: 0.25em; }
h2 { font-size: 1.5rem; font-weight: 650; margin-top: 2rem; }
/* repositories page: user headings sit directly on their list */
h2:has(+ .catalog) { margin-bottom: 0; }

pre, code, kbd, .code, .cid, .sha, .path, table.diff, table.commit-meta td {
  font-family: var(--font-mono);
  font-size: 0.875rem;
  font-weight: 500;
}
pre, table.diff {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}
time { font-variant-numeric: tabular-nums; }

/* chrome links are bare and signal with colour; only prose underlines */
a { color: var(--accent-col); text-decoration: none; }
a:hover { color: var(--accent-col-fade-1); }
.readme a {
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
}

progress { accent-color: var(--accent-col); }

noscript .callout {
  margin: 0 0 1.5rem;
  padding: 0.6rem 1rem;
  background: var(--bg-col-2);
  border: 1px solid var(--accent-col-mute-2);
  color: var(--fg-col-mute);
  font-size: 0.875rem;
  
  p { margin: 0; }
}

/* ref switcher (static only), crumbs, stats, actions;
   its rule separates the chrome from the content below */
.topbar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  align-items: center;
  margin: 0 0 1.5rem;
  padding: 0 0 0.75rem;
  border-bottom: 1px solid var(--accent-col-mute-2);
  font-size: 0.875rem;
}
.topbar:has(+ .languages) { margin-bottom: 0; border-bottom: none; }
.topbar nav.crumbs { margin: 0; white-space: nowrap; overflow-x: auto; }
.topbar > .actions {
  display: flex;
  gap: 0.75rem;
  margin-left: auto;
  white-space: nowrap;
}
.topbar > .actions:empty { display: none; }

a.back {
  display: inline-block;
  margin-bottom: 0.75rem;
  color: var(--fg-col-mute);
}
a.back:hover { color: var(--accent-col); }

details.switcher { position: relative; }
details.switcher > summary {
  list-style: none;
  cursor: pointer;
  background: var(--bg-col-2);
  border: 1px solid var(--accent-col-mute-2);
  padding: 0.2em 0.75em;
  font-weight: 650;
}
details.switcher > summary::-webkit-details-marker { display: none; }
details.switcher > summary::after { content: " ▾"; color: var(--fg-col-mute); }
details.switcher[open] > summary { background: var(--bg-col-3); }
details.switcher > .menu {
  position: absolute;
  z-index: 1;
  top: calc(100% + 0.25rem);
  left: 0;
  min-width: 14rem;
  max-height: 60vh;
  overflow-y: auto;
  background: var(--bg-col-2);
  border: 1px solid var(--accent-col-mute-2);
  padding: 0.4rem 0;
  display: flex;
  flex-direction: column;
}
details.switcher > .menu strong {
  padding: 0.3rem 0.75rem 0.1rem;
  color: var(--fg-col-mute);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
details.switcher > .menu a {
  padding: 0.15rem 0.75rem;
  color: var(--fg-col);
  white-space: nowrap;
}
details.switcher > .menu a:hover { background: var(--accent-col-mute-2); }
details.switcher > .menu a.current { color: var(--accent-col); font-weight: 650; }
details.switcher > .menu a.all { color: var(--fg-col-mute); margin-top: 0.25rem; }

nav.crumbs { color: var(--fg-col-mute); }
nav.crumbs .cur { color: var(--fg-col); }

.view-stats {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
  color: var(--fg-col-mute);
  white-space: nowrap;
}
.snapshot-commit {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin: 0 0 0.75rem;
  color: var(--fg-col-mute);
  font-size: 0.875rem;
}
.view-stats > span + span::before {
  content: "";
  width: 3px;
  height: 3px;
  border: 1.5px solid var(--fg-col-mute);
  border-radius: 50%;
  background: var(--fg-col-mute);
}
.view-stats > span {
  display: inline-flex;
  align-items: center;
  gap: 0.75rem;
}
.snapshot-commit .commit-message { color: var(--fg-col); }
.snapshot-commit a.commit-message:hover { color: var(--accent-col); }
.snapshot-sha {
  margin-left: auto;
  padding: 0.1em 0.55em;
  background: var(--bg-col-2);
  color: var(--fg-col-mute);
}
a.snapshot-sha:hover { color: var(--accent-col); }
.history-status { min-height: 1.3rem; margin-top: 0; }
.history-log { margin-top: 0.25rem; }
.history-log .deleted { color: var(--hl-builtin); }
@media (max-width: 760px) {
  .snapshot-sha { margin-left: 0; }
}
.meta {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  color: var(--fg-col-mute);
  font-size: 0.875rem;
}

/* Small circle separators between adjacent segments, as tangled. The
   segments are inline-flex so the dot centres geometrically against the
   text; vertical-align can't do this portably. */
.meta > span,
.who > * {
  display: inline-flex;
  align-items: center;
}
.meta > span + span::before,
.who > * + *::before,
nav.crumbs > .label::before {
  content: "";
  width: 3px;
  height: 3px;
  border: 1.5px solid var(--fg-col-mute);
  border-radius: 50%;
  background: var(--fg-col-mute);
  margin-right: 0.75rem;
}
nav.crumbs > .label::before {
  display: inline-block;
  vertical-align: middle;
  margin: 0 0.75rem;
}
.desc { color: var(--fg-col-mute); margin: 0; }

/* repo header: name and description beside the clone command, which is
   read once and shouldn't outweigh them */
header.repo {
  display: grid;
  grid-template-columns: minmax(50%, 1fr) auto;
  gap: 1rem 2rem;
  align-items: center;
  margin: 0 0 1.5rem;
}
@media (max-width: 760px) {
  header.repo { grid-template-columns: 1fr; }
}

/* root pages: file listing beside the recent-commits log */
/* columns stretch to the row height so the divider spans it fully */
.overview {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
/* structural boundary: stronger than the per-row rules, like .readme's */
.overview > .files {
  padding-right: 1.25rem;
  border-right: 1px solid var(--accent-col-mute-1);
}
.overview > .commits {
  padding-left: 1.25rem;
}
@media (max-width: 920px) {
  .overview { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
  .overview > .files { padding-right: 0; border-right: 0; }
  .overview > .commits { padding-left: 0; }
}

/* the overview owns its divider from a following readme, so the readme's
   margin sits below the line rather than above it */
.overview:has(+ .readme) {
  padding-bottom: 1.5rem;
  border-bottom: 1px solid var(--accent-col-mute-1);
}
.overview + .readme {
  margin-top: 1.5rem;
  border-top: 0;
  padding-top: 0;
}

.overview h2,
h2.file-heading {
  margin: 0 0 0.25rem;
  font-size: 0.875rem;
  font-weight: 650;
  color: var(--fg-col-mute);
  text-align: right;
}
.overview h2 > a { color: inherit; }
.overview h2 > a:hover { color: var(--accent-col); }
ol.log { list-style: none; margin: 0; padding: 0; }
ol.log li {
  padding: 0.4rem 0;
  border-top: 1px solid var(--accent-col-mute-2);
}
ol.log .cid { color: var(--hl-ident); }
ol.log .sha { color: var(--fg-col-mute); }
ol.log a:is(.cid, .sha):hover { color: var(--accent-col); }
ol.log .msg { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
ol.log .who {
  float: right;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  color: var(--fg-col-mute);
  font-size: 0.875rem;
}
ol.log .who > * + *::before { margin-right: 0.5rem; }
/* hold ten two-line rows so paging doesn't shift the readme below */
.overview > .commits > ol.log.paginated:not(.exhausted) {
  min-height: calc(10 * (2lh + 0.8rem + 1px));
}
.log-pagination { justify-content: space-between; margin: 0.4rem 0 0; }
button.log-page-button {
  appearance: none;
  border: 0;
  padding: 0;
  background: none;
  color: var(--accent-col);
  font: inherit;
  cursor: pointer;
}
button.log-page-button:hover { color: var(--accent-col-fade-1); }
button.log-page-button:disabled { color: var(--fg-col-mute); cursor: default; }

.catalog {
  margin: 0;
  padding: 0;
  list-style: none;
}
.catalog a {
  display: grid;
  grid-template-columns: minmax(10rem, 1fr) minmax(0, 4fr);
  gap: 0.75rem;
  width: 100%;
  padding: 0.25rem 0;
  border-top: 1px solid var(--accent-col-mute-2);
}
.catalog .msg { color: var(--fg-col-mute); }
.catalog a:hover { background: var(--bg-col-2); }
.catalog a:focus-visible { outline: 1px solid var(--accent-col); outline-offset: 2px; }
@media (max-width: 35rem) {
  .catalog a { grid-template-columns: 1fr; gap: 0; }
}

table.list { border-collapse: collapse; width: 100%; }
/* rows carry their top edge: a line under the heading, none after the last row */
table.list td {
  padding: 0.25rem 0.75rem 0.25rem 0;
  border-top: 1px solid var(--accent-col-mute-2);
}
table.list td.size, table.list td.date {
  color: var(--fg-col-mute);
  text-align: right;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
table.list td.msg { color: var(--fg-col-mute); }

/* blob view: each logical line shares a grid row with its number, so wrapped
   source makes that row taller without displacing the following numbers */
pre.code {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  margin: 0;
  padding: 1rem 0;
  background: var(--bg-col-2);
  border-left: 2px solid var(--accent-col-mute-1);
  line-height: 1.45;
}
.code-line { display: contents; }
.code-break {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}
pre.code .ln {
  padding-left: 0.75rem;
  padding-right: 0.6rem;
  text-align: right;
  color: var(--fg-col-mute);
  user-select: none;
  border-right: 1px solid var(--accent-col-mute-2);
}
pre.code a.ln:hover { color: var(--fg-col); }
pre.code a.ln:target { color: var(--accent-col); font-weight: 600; }
.code-text {
  min-width: 0;
  min-height: 1lh;
  padding-left: 1rem;
  padding-right: 1rem;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}

/* markdown blob pages: no-JS rendered/code tabs */
.markdown-view {
  display: grid;
  grid-template-columns: repeat(2, max-content) 1fr;
  gap: 0 0.25rem;
}
.markdown-view > input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
}
.markdown-view > label {
  cursor: pointer;
  padding: 0.2em 0.75em;
  border: 1px solid var(--accent-col-mute-2);
  color: var(--fg-col-mute);
}
.markdown-view > input:focus-visible + label { outline: 2px solid var(--accent-col); }
.markdown-view > input:checked + label {
  color: var(--accent-col);
  background: var(--bg-col-2);
  border-color: var(--accent-col-mute-1);
  font-weight: 650;
}
.markdown-view > .rendered,
.markdown-view > .code-panel {
  display: none;
  grid-column: 1 / -1;
}
#markdown-rendered:checked ~ .rendered,
#markdown-code:checked ~ .code-panel { display: block; }
.markdown-view > .readme { margin-top: 1rem; }
.markdown-view > .code-panel { margin-top: 1rem; }

.readme {
  width: 100%;
  margin-top: 2.5rem;
  border-top: 1px solid var(--accent-col-mute-1);
  padding-top: 0.5rem;
  overflow-wrap: anywhere;
}
/* a readme's own title sits under the page h1, so its headings step down */
.readme h1 { font-size: 1.5rem; font-weight: 650; }
.readme h2 { font-size: 1.25rem; }
.readme pre {
  background: var(--bg-col-2);
  border-left: 2px solid var(--accent-col-mute-1);
  padding: 1rem;
  overflow-x: auto;
  line-height: 1.45;
}
.readme code {
  background: var(--bg-col-2);
  padding: 0.125em 0.25em;
  margin: 0 0.125em;
  font-size: 0.875em;
}
.readme pre code { background: none; padding: 0; margin: 0; font-size: inherit; }
.readme img { max-width: 100%; }
.readme blockquote {
  border-left: 2px solid var(--accent-col-mute-1);
  margin: 1.5rem 0;
  padding-left: 1rem;
  color: var(--fg-col-mute);
}
.readme table { border-collapse: collapse; }
.readme th, .readme td { border: 1px solid var(--accent-col-mute-2); padding: 0.25rem 0.6rem; }

/* right-aligned in the header, so the accent rule sits on the outer edge */
pre.clone {
  margin: 0;
  background: var(--bg-col-2);
  border: 1px solid var(--accent-col-mute-2);
  border-right: 2px solid var(--accent-col-mute-1);
  padding: 0.6rem 1rem;
  overflow-x: auto;
}

.languages { margin: 0 0 1.5rem; }
.languages summary {
  display: flex;
  gap: 2px;
  height: 0.5rem;
  overflow: hidden;
  cursor: pointer;
  list-style: none;
}
.languages summary::-webkit-details-marker { display: none; }
.languages summary > span:not(.language-label) { display: block; }
.languages .language-label {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
}
.languages ul {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.25rem;
  margin: 0;
  padding: 0.5rem 0 0;
  list-style: none;
}
.languages li { display: flex; align-items: center; gap: 0.4rem; font-size: 0.875rem; }
.languages li i { width: 0.65rem; height: 0.65rem; border-radius: 50%; }
.languages li small { color: var(--fg-col-mute); }
.languages li a { color: inherit; }
.languages li a:hover { color: var(--accent-col); }

/* client-rendered commit view, laid out like tangled's commit page. the
   subject and body read as one block; the metadata table and the diff each
   sit a full step below */
.commit-view .commit-subject { margin: 0.25rem 0 0; }
.commit-view .commit-body {
  white-space: pre-wrap;
  font: inherit;
  color: var(--fg-col-mute);
  margin: 0.5rem 0 0;
}

table.commit-meta {
  border-collapse: collapse;
  margin-top: 1.5rem;
  font-size: 0.875rem;
}
table.commit-meta th {
  text-align: left;
  font-weight: 400;
  color: var(--fg-col-mute);
  padding: 0.05rem 1.5rem 0.05rem 0;
  vertical-align: top;
}
table.commit-meta td { word-break: break-all; }

.add-count { color: var(--hl-string); }
.del-count { color: var(--hl-builtin); }
.diffstat { margin: 1.5rem 0 0; }

.commit-view .status.added { color: var(--hl-string); }
.commit-view .status.deleted { color: var(--hl-builtin); }
.commit-view .status.modified { color: var(--fg-col-mute); }

.file-diff {
  margin-top: 0.75rem;
  border: 1px solid var(--accent-col-mute-2);
}
.file-diff + .file-diff { margin-top: 1.5rem; }
.file-diff > summary {
  display: flex;
  align-items: baseline;
  gap: 0.75rem;
  padding: 0.35rem 0.75rem;
  background: var(--bg-col-2);
  color: var(--fg-col-mute);
  font-size: 0.875rem;
  cursor: pointer;
  list-style: none;
}
.file-diff > summary::-webkit-details-marker { display: none; }
.file-diff > summary::before {
  content: "";
  position: relative;
  top: -0.17rem;
  width: 0.4rem;
  height: 0.4rem;
  flex: none;
  align-self: baseline;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg);
}
.file-diff:not([open]) > summary::before {
  top: -0.1rem;
  transform: rotate(-45deg);
}
.file-diff > summary:focus-visible { outline: 2px solid var(--accent-col); outline-offset: 2px; }
.file-summary-content {
  display: inline-flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0 0.6rem;
  flex: 1;
  min-width: 0;
}
.file-summary-content .path {
  color: var(--fg-col);
  font-weight: 600;
  overflow-wrap: anywhere;
}
.file-summary-content .file-actions {
  display: inline-flex;
  align-items: baseline;
  gap: 0.6rem;
  margin-left: auto;
}
.file-diff .binary-note { padding: 0.5rem 0.75rem; }
.file-diff .generated-note { color: var(--fg-col-mute); font-style: italic; }

table.diff {
  width: 100%;
  border-collapse: collapse;
  border-top: 1px solid var(--accent-col-mute-2);
  line-height: 1.5;
}
table.diff td { padding: 0 0.6rem; }
table.diff td.text { white-space: pre-wrap; word-break: break-word; width: 100%; }
table.diff td.text::before {
  content: " ";
  display: inline-block;
  width: 1ch;
  margin-right: 0.5ch;
}
table.diff tr.add td.text::before { content: "+"; color: var(--hl-string); }
table.diff tr.del td.text::before { content: "-"; color: var(--hl-builtin); }
table.diff td.ln {
  text-align: right;
  color: var(--fg-col-mute);
  user-select: none;
  white-space: nowrap;
  min-width: 2.5rem;
}
table.diff tr.hunk td {
  color: var(--fg-col-mute);
  background: var(--bg-col-2);
  padding-top: 0.15rem;
  padding-bottom: 0.15rem;
}
table.diff tr.add { background: color-mix(in srgb, var(--hl-string) 9%, transparent); }
table.diff tr.del { background: color-mix(in srgb, var(--hl-builtin) 9%, transparent); }

/* syntax highlighting, as char.lt */
a-c, a-cd, a-er {
  color: var(--hl-comment);
}

a-k, a-kc, a-ko, a-kd, a-ke, a-kf, a-ki, a-kp, a-kr, a-kt, a-ky, a-km, a-dr,
a-in, a-sc, a-rp, a-cn, a-ex, a-pp,
a-co, a-cb, a-m,
a-tu, a-tr {
  color: var(--hl-keyword);
  font-weight: 600;
}

/* builtins & types */
a-t, a-tb, a-tq, a-tf, a-fb {
  color: var(--hl-builtin);
}

a-s, a-ss, a-se, a-rx, a-ch, a-cs {
  color: var(--hl-string);
}

a-n {
  color: var(--hl-number);
}

a-f, a-fm, a-fd, a-fc, a-cr, a-ns,
a-tg, a-td, a-at, a-pr, a-vm, a-l {
  color: var(--hl-ident);
}

a-da { color: var(--hl-string); }
a-dd { color: var(--hl-comment); }

a-em { font-style: italic; }
a-st, a-tt { font-weight: 600; }
a-tx { text-decoration: line-through; }

/* match the old behaviour of only colouring shell-script variables */
.language-bash a-v, .language-shell a-v, .language-zsh a-v {
  color: var(--hl-ident);
}
