/* Repo listing — owned by views/index.html */ /* ---- Grid variant (.repo-row) ------------------------------------------ minmax(0, …) lets the fr tracks shrink below their min-content width; bare `2fr` is minmax(auto, 2fr), so one long unbroken repo name would hold the track open and overflow the row. */ .repo-row { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr) auto; gap: 1rem; align-items: center; } .repo-name a { color: var(--fg); font-weight: 600; /* `anywhere` (unlike `break-word`) also lowers min-content width, which is what actually lets the track shrink. */ overflow-wrap: anywhere; } .repo-name a:hover { color: var(--accent); } .repo-owner { display: inline-block; margin-left: .5rem; padding: .05rem .4rem; border-radius: 999px; background: var(--bg-subtle, rgba(127, 127, 127, .15)); color: var(--fg-subtle); font-size: .7rem; font-weight: 500; vertical-align: middle; } .repo-desc { color: var(--fg-muted); font-size: .85rem; overflow-wrap: anywhere; } .repo-meta { color: var(--fg-subtle); font-size: .8rem; text-align: right; overflow-wrap: break-word; } @media (max-width: 640px) { .repo-row { grid-template-columns: minmax(0, 1fr); gap: .5rem; } .repo-meta { text-align: left; } } /* ---- Table variant (.table-repos) -------------------------------------- Each section is its own . Fixed layout with shared percentages keeps the columns aligned across sections. Two requirements: - The table needs a non-auto width. Without it, browsers fall back to auto layout (CSS 2.1 §17.5.2.1), which sizes columns from content per table and produces the cross-section drift. - The percentages must sum to 100%. col-meta at 17% fits "2026-09-03 15:04" on one line down to roughly a 900px viewport. Narrower than that, the cell wraps at the space between date and time. This only works because the cell isn't `nowrap`: overflow-wrap never applies where white-space forbids wrapping. */ .table-repos { table-layout: fixed; width: 100%; } .table-repos .col-repo { width: 25%; } .table-repos .col-desc { width: 58%; } .table-repos .col-meta { width: 17%; } .table-repos td:last-child { white-space: normal; } /* Only the full header labels are shown. The narrow layout below hides the header row visually, so the short labels are no longer used; delete .label-short from the markup and this rule can go. */ .table-repos .label-short { display: none; } /* Below 640px, columns are dropped and each row is stacked: name ............ date description Once nothing sits side by side, cross-section alignment no longer matters. The header is hidden visually but stays in the accessibility tree. Changing `display` on table elements can remove their implicit table roles in some engines, so add role="table" / "row" / "cell" in the markup if screen-reader semantics matter. */ @media (max-width: 640px) { .table-repos, .table-repos tbody, .table-repos td { display: block; width: auto; } .table-repos thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } .table-repos tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "repo meta" "desc desc"; gap: .25rem .75rem; padding: .6rem 0; } .table-repos td:nth-child(1) { grid-area: repo; } .table-repos td:nth-child(2) { grid-area: desc; } .table-repos td:nth-child(3) { grid-area: meta; text-align: right; /* Safe to keep on one line here: the `auto` track sizes to fit it. */ white-space: nowrap; } }