/* codehub.css — The code area's look (codehub ADR-0001). Every colour and face is a --codehub-* token, so a host
   restyles codehub by setting them on `.codehub` in its own stylesheet. Ridgun files are coloured with Solstice's
   rg-* classes (Solstice ADR-0019); the host's stylesheet usually styles those already, so they have defaults here
   only inside .codehub. No JavaScript: line links are plain anchors (#L12). */

/* The shared look (Solstice ADR-0024): each property reads the host's --sx-* property first, so every addon on a
   site matches; the values after it are this addon's own, for a host that sets none. */
.codehub {
  --codehub-paper: var(--sx-card, #ffffff);
  --codehub-ink: var(--sx-ink, #1d2025);
  --codehub-muted: var(--sx-muted, #646a75);
  --codehub-line: var(--sx-line, #e3e5ea);
  --codehub-soft: var(--sx-soft, #f5f6f8);
  --codehub-accent: var(--sx-accent, #2f5bd3);
  --codehub-accent-ink: var(--sx-accent-ink, #ffffff);
  --codehub-added: #1f7a45;
  --codehub-added-bg: #e7f6ec;
  --codehub-removed: #b42318;
  --codehub-removed-bg: #fdecea;
  --codehub-code-bg: #f8f9fb;
  --codehub-hunk-bg: #eef2ff;
  --codehub-mark: #fff4c2;
  --codehub-radius: var(--sx-radius, 10px);
  --codehub-wrap: 76rem;
  --codehub-sans: var(--sx-sans, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
  --codehub-mono: var(--sx-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
}
@media (prefers-color-scheme: dark) {
  .codehub {
    --codehub-paper: var(--sx-card, #15171c);
    --codehub-ink: var(--sx-ink, #eceef2);
    --codehub-muted: var(--sx-muted, #9aa1ad);
    --codehub-line: var(--sx-line, #2b2f37);
    --codehub-soft: var(--sx-soft, #1d2027);
    --codehub-accent: var(--sx-accent, #8aa8ff);
    --codehub-accent-ink: var(--sx-accent-ink, #11131a);
    --codehub-added: #6cc495;
    --codehub-added-bg: #15291e;
    --codehub-removed: #f08a80;
    --codehub-removed-bg: #2f1715;
    --codehub-code-bg: #101216;
    --codehub-hunk-bg: #1a2036;
    --codehub-mark: #3a3418;
  }
}

/* ── The page ───────────────────────────────────────────── */
.codehub {
  box-sizing: border-box;
  max-width: var(--codehub-wrap);
  margin: 0 auto;
  padding: clamp(1.5rem, 5vw, 3.5rem) 1rem clamp(3rem, 7vw, 5rem);
  color: var(--codehub-ink);
  font: 400 1rem/1.55 var(--codehub-sans);
}
.codehub *, .codehub *::before, .codehub *::after { box-sizing: inherit; }
.codehub h1, .codehub h2 { margin: 0; line-height: 1.15; text-wrap: balance; }
.codehub p { margin: 0; }
.codehub a { color: var(--codehub-accent); text-underline-offset: .18em; text-decoration-thickness: 1px; }
.codehub code, .codehub pre, .codehub time, .codehub .codehub-sha { font-family: var(--codehub-mono); font-variant-ligatures: none; }
.codehub a:focus-visible { outline: 2px solid var(--codehub-accent); outline-offset: 2px; border-radius: 3px; }

/* ── The index of repositories ──────────────────────────── */
/* Each repository is a card with a mark (its initial) whose colours take turns, and its description. The
   whole card is the link. */
.codehub-index-head { margin-bottom: 2.5rem; }
.codehub-index-head h1 { font-size: clamp(2.4rem, 6vw, 3.6rem); line-height: 1; letter-spacing: -.04em; }
.codehub-lede { margin-top: .9rem; max-width: 40rem; color: var(--codehub-muted); font-size: 1.15rem; }
.codehub-empty { padding: 1.5rem; border: 1px dashed var(--codehub-line); border-radius: var(--codehub-radius); color: var(--codehub-muted); }
.codehub-repos { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 21rem), 1fr)); gap: 1.25rem; margin: 0; padding: 0; list-style: none; }
.codehub-repo { position: relative; display: grid; grid-template-columns: auto minmax(0, 1fr); grid-template-rows: auto 1fr; column-gap: 1rem; align-items: start; padding: 1.5rem; border: 1px solid var(--codehub-line); border-radius: calc(var(--codehub-radius) + 4px); background: var(--codehub-paper); transition: border-color .2s, transform .2s, box-shadow .2s; }
.codehub-repo:hover { border-color: var(--codehub-accent); transform: translateY(-3px); box-shadow: 0 22px 44px -30px rgb(10 12 16 / .45); }
.codehub-repo-mark { display: grid; place-items: center; width: 3.25rem; height: 3.25rem; border-radius: 14px; font: 700 1.5rem/1 var(--codehub-mono); background: var(--codehub-accent); color: var(--codehub-accent-ink); }
.codehub-repo:nth-child(4n+2) .codehub-repo-mark { background: var(--codehub-ink); color: var(--codehub-paper); }
.codehub-repo:nth-child(4n+3) .codehub-repo-mark { background: color-mix(in srgb, var(--codehub-accent) 14%, var(--codehub-paper)); color: var(--codehub-accent); }
.codehub-repo:nth-child(4n+4) .codehub-repo-mark { background: var(--codehub-soft); color: var(--codehub-ink); box-shadow: inset 0 0 0 1px var(--codehub-line); }
.codehub .codehub-card-head { display: flex; flex-wrap: wrap; align-items: baseline; align-self: center; gap: .15rem .6rem; min-width: 0; }
.codehub-repo-title { font-weight: 650; font-size: 1.3rem; letter-spacing: -.02em; text-decoration: none; color: var(--codehub-ink); }
.codehub-repo-title::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }
.codehub-repo:hover .codehub-repo-title { color: var(--codehub-accent); }
.codehub .codehub-repo-description { grid-column: 1 / -1; margin-top: 1rem; color: var(--codehub-muted); font-size: .97rem; line-height: 1.5; }
.codehub-tag { display: inline-block; padding: .1rem .5rem; border: 1px solid var(--codehub-line); border-radius: 999px; font: 500 .75rem/1.4 var(--codehub-mono); color: var(--codehub-ink); text-decoration: none; }
a.codehub-tag:hover { border-color: var(--codehub-accent); }
@media (prefers-reduced-motion: reduce) { .codehub-repo { transition: none; } .codehub-repo:hover { transform: none; } }

/* ── A repository's header and tabs ─────────────────────── */
.codehub-repo-head { margin-bottom: 1.5rem; }
.codehub-crumbs { margin-bottom: .5rem; font-size: .875rem; }
.codehub-repo-head h1 { font-size: clamp(1.75rem, 4vw, 2.5rem); letter-spacing: -.03em; }
.codehub-repo-head h1 a { color: inherit; text-decoration: none; }
.codehub-description { margin-top: .5rem; max-width: 46rem; color: var(--codehub-muted); }
.codehub-tabs { display: flex; gap: .25rem; margin-top: 1.25rem; border-bottom: 1px solid var(--codehub-line); overflow-x: auto; }
.codehub-tabs a { margin-bottom: -1px; padding: .6rem .9rem; border-bottom: 2px solid transparent; color: var(--codehub-muted); font-weight: 500; text-decoration: none; white-space: nowrap; }
.codehub-tabs a:hover { color: var(--codehub-ink); }
.codehub-tabs a[aria-current="page"] { color: var(--codehub-ink); border-bottom-color: var(--codehub-accent); }

/* ── The repository's page: files and README, a side column ── */
.codehub-repo-page { display: grid; grid-template-columns: minmax(0, 1fr) 18rem; gap: 2rem; align-items: start; }
.codehub-main { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr); gap: 1.5rem; }
.codehub-side { min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem; }
/* The README spans both columns, under the files and the side boxes: long documents get the whole width. */
.codehub-repo-readme { grid-column: 1 / -1; min-width: 0; }
.codehub-box { min-width: 0; padding: 1rem 1.1rem; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-paper); font-size: .9rem; }
.codehub-box h2 { margin-bottom: .6rem; font-size: .75rem; letter-spacing: .08em; text-transform: uppercase; color: var(--codehub-muted); }
.codehub-command { margin: 0; padding: .6rem .75rem; overflow-x: auto; border-radius: 6px; background: var(--codehub-code-bg); font-size: .8rem; }
.codehub-hint { margin-top: .5rem; color: var(--codehub-muted); font-size: .8rem; }
.codehub-mini-log { margin: 0 0 .75rem; padding: 0; list-style: none; display: grid; gap: .6rem; }
.codehub-mini-log li { min-width: 0; display: grid; gap: .1rem; }
.codehub-mini-log a { color: var(--codehub-ink); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.codehub-mini-log a:hover { color: var(--codehub-accent); }
.codehub-mini-log span { color: var(--codehub-muted); font-size: .8rem; }

/* Folders and files. */
.codehub-entries { width: 100%; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); border-collapse: separate; border-spacing: 0; overflow: hidden; background: var(--codehub-paper); font-size: .925rem; }
.codehub-entries th { padding: .55rem 1rem; background: var(--codehub-soft); color: var(--codehub-muted); font-size: .75rem; font-weight: 500; letter-spacing: .06em; text-transform: uppercase; text-align: left; }
.codehub-entries td { padding: .5rem 1rem; border-top: 1px solid var(--codehub-line); }
.codehub-entries tr:hover td { background: var(--codehub-soft); }
.codehub-entries a { color: var(--codehub-ink); text-decoration: none; }
.codehub-entries a:hover { color: var(--codehub-accent); text-decoration: underline; }
.codehub-entry td:first-child::before { display: inline-block; width: 1.4rem; color: var(--codehub-muted); font-family: var(--codehub-mono); }
.codehub-entry-folder td:first-child::before { content: "▸"; color: var(--codehub-accent); }
.codehub-entry-file td:first-child::before { content: "·"; }
.codehub-entry-link td:first-child::before { content: "↪"; }
.codehub-entry-submodule td:first-child::before { content: "⊕"; }
.codehub-entry-folder a { font-weight: 600; }
.codehub-slash { color: var(--codehub-muted); }
.codehub-size { width: 9rem; color: var(--codehub-muted); text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }

.codehub-readme { padding: 2rem 2.25rem; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-paper); line-height: 1.72; overflow-wrap: break-word; }
.codehub .codehub-readme > :first-child { margin-top: 0; }
/* Prose keeps a readable measure; tables, code and images use the whole width. */
.codehub-readme > :is(p, ul, ol, blockquote, h1, h2, h3, h4, h5, h6) { max-width: 46rem; }
.codehub .codehub-readme :is(h1, h2, h3, h4) { margin: 2em 0 .6em; line-height: 1.25; letter-spacing: -.02em; }
.codehub .codehub-readme :is(p, ul, ol, pre, blockquote, table, hr) { margin: 0 0 1.15em; }
.codehub .codehub-readme :is(ul, ol) { padding-left: 1.4em; }
.codehub .codehub-readme li + li { margin-top: .35em; }
.codehub .codehub-readme li > :is(ul, ol) { margin: .35em 0 0; }
.codehub-readme blockquote { padding-left: 1em; border-left: 3px solid var(--codehub-line); color: var(--codehub-muted); }
.codehub-readme :not(pre) > code { padding: .12em .38em; border-radius: 4px; background: var(--codehub-soft); font-size: .88em; }
.codehub-readme pre { padding: 1rem 1.15rem; overflow-x: auto; border-radius: 8px; background: var(--codehub-code-bg); font-size: .85rem; line-height: 1.55; }
.codehub-readme img { max-width: 100%; height: auto; }
/* Words and code in a cell are never broken mid-way; a table wider than the page scrolls sideways. */
.codehub-readme table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; font-size: .92rem; line-height: 1.55; }
.codehub-readme th, .codehub-readme td { padding: .55rem .85rem; border: 1px solid var(--codehub-line); text-align: left; vertical-align: top; overflow-wrap: normal; }
.codehub-readme th { background: var(--codehub-soft); white-space: nowrap; }

/* ── A file ─────────────────────────────────────────────── */
.codehub-path { margin-bottom: 1rem; font-family: var(--codehub-mono); font-size: .9rem; overflow-wrap: anywhere; }
.codehub-path span { color: var(--codehub-muted); }
.codehub-file { border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-paper); overflow: hidden; }
.codehub-file-head { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; padding: .65rem 1rem; border-bottom: 1px solid var(--codehub-line); background: var(--codehub-soft); font-size: .875rem; }
.codehub-file-name { font-family: var(--codehub-mono); font-weight: 600; }
.codehub-file-meta { color: var(--codehub-muted); }
.codehub-file-actions { display: flex; gap: .75rem; margin-left: auto; }
.codehub-file-note { padding: 1rem; color: var(--codehub-muted); }
.codehub-file > .codehub-readme { border: 0; border-radius: 0; }
.codehub-code { width: 100%; border-collapse: collapse; background: var(--codehub-code-bg); font: 400 .8125rem/1.6 var(--codehub-mono); font-variant-ligatures: none; tab-size: 4; }
.codehub-code tbody { display: block; overflow-x: auto; }
.codehub-ln { position: sticky; left: 0; width: 1%; padding: 0 .9rem 0 1rem; background: var(--codehub-code-bg); text-align: right; user-select: none; vertical-align: top; }
.codehub-ln a { color: var(--codehub-muted); text-decoration: none; opacity: .7; }
.codehub-ln a:hover { color: var(--codehub-accent); opacity: 1; }
.codehub-lc { padding: 0 1rem 0 .5rem; white-space: pre; }
.codehub-code tr:first-child td { padding-top: .6rem; }
.codehub-code tr:last-child td { padding-bottom: .6rem; }
.codehub-code tr:target td { background: var(--codehub-mark); }

/* Ridgun's colours, for hosts that don't style Solstice's rg-* classes. */
.codehub-lc .rg-kw, .codehub-lc .rg-logic { color: #c2410c; }
.codehub-lc .rg-type { color: #2f5bd3; }
.codehub-lc .rg-str { color: #1f7a45; }
.codehub-lc .rg-interp { color: #a16207; }
.codehub-lc .rg-num, .codehub-lc .rg-bool { color: #b45309; }
.codehub-lc .rg-op { color: #6b7280; }
.codehub-lc .rg-pragma { color: #7c3aed; }
.codehub-lc .rg-cmt { color: #8a8f98; font-style: italic; }
@media (prefers-color-scheme: dark) {
  .codehub-lc .rg-kw, .codehub-lc .rg-logic { color: #ff8a6b; }
  .codehub-lc .rg-type { color: #8fb6ff; }
  .codehub-lc .rg-str { color: #b9d98c; }
  .codehub-lc .rg-interp { color: #ffd27a; }
  .codehub-lc .rg-num, .codehub-lc .rg-bool { color: #f2ad6b; }
  .codehub-lc .rg-op { color: #8d94a1; }
  .codehub-lc .rg-pragma { color: #c6a8ff; }
  .codehub-lc .rg-cmt { color: #6d7480; }
}

/* ── History ────────────────────────────────────────────── */
.codehub-history { margin: 0; }
.codehub-log { margin: 0; padding: 0; list-style: none; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-paper); overflow: hidden; }
.codehub-log li { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: .25rem 1rem; padding: .8rem 1rem; border-top: 1px solid var(--codehub-line); }
.codehub-log li:first-child { border-top: 0; }
.codehub-log-subject { min-width: 0; color: var(--codehub-ink); font-weight: 500; text-decoration: none; overflow-wrap: anywhere; }
.codehub-log-subject:hover { color: var(--codehub-accent); }
.codehub-log-meta { display: flex; gap: .75rem; color: var(--codehub-muted); font-size: .85rem; }
.codehub-sha { font-size: .8rem; }
a.codehub-sha { text-decoration: none; }
.codehub-count { margin-bottom: .75rem; color: var(--codehub-muted); font-size: .9rem; }
.codehub-pages { display: flex; justify-content: space-between; gap: 1rem; margin-top: 1rem; }

/* A commit and its diff. */
.codehub-commit { display: grid; gap: 1rem; }
.codehub-commit-subject { font-size: clamp(1.15rem, 2.2vw, 1.45rem); line-height: 1.3; letter-spacing: -.015em; overflow-wrap: anywhere; }
.codehub-message { margin: 0; padding: .9rem 1rem; border-radius: 8px; background: var(--codehub-soft); white-space: pre-wrap; overflow-wrap: anywhere; font-size: .875rem; }
.codehub-commit-meta { color: var(--codehub-muted); font-size: .9rem; overflow-wrap: anywhere; }
.codehub-commit-meta span { color: var(--codehub-ink); font-weight: 500; }
.codehub-files { width: 100%; border-collapse: collapse; font: .85rem/1.5 var(--codehub-mono); }
.codehub-files td { padding: .3rem .75rem .3rem 0; border-bottom: 1px solid var(--codehub-line); }
.codehub-file-path { overflow-wrap: anywhere; }
.codehub-added, .codehub-removed { width: 4rem; text-align: right; font-variant-numeric: tabular-nums; }
.codehub-added { color: var(--codehub-added); }
.codehub-removed { color: var(--codehub-removed); }
.codehub-diff { margin: 0; padding: .5rem 0; overflow-x: auto; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-code-bg); font: .8125rem/1.55 var(--codehub-mono); }
.codehub-diff span { display: block; min-width: max-content; padding: 0 1rem; white-space: pre; }
.codehub-d-file { margin-top: .75rem; padding-block: .35rem !important; background: var(--codehub-soft); font-weight: 600; }
.codehub-d-file:first-child { margin-top: 0; }
.codehub-d-meta { color: var(--codehub-muted); }
.codehub-d-hunk { background: var(--codehub-hunk-bg); color: var(--codehub-accent); }
.codehub-d-add { background: var(--codehub-added-bg); color: var(--codehub-added); }
.codehub-d-del { background: var(--codehub-removed-bg); color: var(--codehub-removed); }

/* ── Releases ───────────────────────────────────────────── */
.codehub-releases { display: grid; gap: 1.25rem; margin: 0; padding: 0; list-style: none; }
.codehub-release { padding: 1.25rem 1.4rem; border: 1px solid var(--codehub-line); border-radius: var(--codehub-radius); background: var(--codehub-paper); }
.codehub-release h2 { font-size: 1.35rem; letter-spacing: -.02em; }
.codehub-release-meta { margin-top: .35rem; color: var(--codehub-muted); font-size: .875rem; }
.codehub-notes { margin-top: 1rem; line-height: 1.6; }
.codehub-notes > :last-child { margin-bottom: 0; }
.codehub-downloads { width: 100%; margin-top: 1rem; border-collapse: collapse; font-size: .9rem; }
.codehub-downloads td { padding: .5rem .75rem .5rem 0; border-top: 1px solid var(--codehub-line); vertical-align: top; }
.codehub-sha256 { display: block; color: var(--codehub-muted); font: .72rem/1.4 var(--codehub-mono); word-break: break-all; user-select: all; }

@media (max-width: 52rem) {
  .codehub-repo-page { grid-template-columns: minmax(0, 1fr); }
  .codehub-size { width: auto; }
  .codehub-readme { padding: 1.1rem 1.15rem; }
}
