:root {
--bg: #ffffff;
--fg: #1a1a1a;
--muted: #6b6b6b;
--border: #d8d8d8;
--panel-bg: #fafafa;
--unmarked: #6b6b6b;
--matched: #0969da;
--deleted: #cf222e;
--inserted: #1a7f37;
--update: #9a6700;
--moved: #8250df;
--selected-bg: #ffe58a;
--selected-fg: #1a1a1a;
--highlight-bg: #cfe6ff;
--link: #0969da;
--button-bg: #f0f0f0;
--button-border: #c8c8c8;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #0d1117;
--fg: #e6edf3;
--muted: #9aa4af;
--border: #30363d;
--panel-bg: #161b22;
--unmarked: #9aa4af;
--matched: #58a6ff;
--deleted: #ff7b72;
--inserted: #56d364;
--update: #d29922;
--moved: #a371f7;
--selected-bg: #6b5900;
--selected-fg: #f5e6a8;
--highlight-bg: #16324a;
--link: #58a6ff;
--button-bg: #21262d;
--button-border: #30363d;
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0 1rem 5rem;
font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace;
font-size: 13px;
background: var(--bg);
color: var(--fg);
}
a {
color: var(--link);
}
.page-header {
padding: 1rem 0;
border-bottom: 1px solid var(--border);
margin-bottom: 1rem;
}
.page-header h1 {
font-size: 1.1rem;
margin: 0.25rem 0;
}
.back-link {
font-size: 0.85rem;
}
.language-badge {
display: inline-block;
padding: 0.1rem 0.5rem;
border-radius: 999px;
border: 1px solid var(--border);
color: var(--muted);
font-size: 0.75rem;
}
.source-link {
display: inline-block;
margin-left: 0.75rem;
font-size: 0.8rem;
}
.legend {
list-style: none;
display: flex;
flex-wrap: wrap;
gap: 0.25rem 1rem;
margin: 0.5rem 0 0;
padding: 0;
font-size: 0.8rem;
color: var(--muted);
}
.legend li {
display: flex;
align-items: center;
gap: 0.3em;
}
.fixture-table {
border-collapse: collapse;
max-width: 60rem;
width: 100%;
}
.fixture-table th,
.fixture-table td {
padding: 0.35rem 0.75rem;
border-bottom: 1px solid var(--border);
text-align: left;
}
.fixture-table td:nth-child(n + 3),
.fixture-table th:nth-child(n + 3) {
text-align: right;
font-variant-numeric: tabular-nums;
}
.fixture-table th {
cursor: pointer;
-webkit-user-select: none;
user-select: none;
color: var(--muted);
font-weight: 600;
white-space: nowrap;
}
.fixture-table th:hover {
color: var(--fg);
}
.fixture-table th[aria-sort="ascending"],
.fixture-table th[aria-sort="descending"] {
color: var(--matched);
}
.fixture-table th[aria-sort="ascending"]::after {
content: " \25b4";
}
.fixture-table th[aria-sort="descending"]::after {
content: " \25be";
}
.panels {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
@media (max-width: 900px) {
.panels {
grid-template-columns: 1fr;
}
}
.panel {
border: 1px solid var(--border);
border-radius: 6px;
background: var(--panel-bg);
padding: 0.5rem 0.75rem;
overflow-x: auto;
}
.panel[data-focused="true"] {
border-color: var(--matched);
}
.panel h2 {
font-size: 0.85rem;
margin: 0 0 0.5rem;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.tree {
white-space: nowrap;
}
.node {
display: block;
}
details.node {
margin: 0;
}
details.node > summary {
cursor: pointer;
list-style: none;
}
details.node > summary::-webkit-details-marker {
display: none;
}
details.node > summary::before {
content: "\25b8";
display: inline-block;
width: 1em;
color: var(--muted);
}
details.node[open] > summary::before {
content: "\25be";
}
details.node > *:not(summary) {
margin-left: 1.1em;
}
.node.leaf {
padding-left: 1.1em;
}
.node.leaf,
details.node > summary {
padding: 0.05rem 0.2rem;
border-radius: 3px;
}
.node.leaf:hover,
details.node > summary:hover {
background: color-mix(in srgb, var(--matched) 12%, transparent);
}
.status-unmarked {
color: var(--unmarked);
}
.status-matched {
color: var(--matched);
}
.status-deleted {
color: var(--deleted);
text-decoration: line-through;
text-decoration-thickness: 1px;
}
.status-inserted {
color: var(--inserted);
}
.changed {
font-weight: 700;
}
.status-matched.op-update {
color: var(--update);
}
.status-matched.op-moved {
color: var(--moved);
}
body.hide-identical .node:not(.status-deleted, .status-inserted, .changed):not(
:has(.status-deleted, .status-inserted, .changed)
) {
display: none;
}
.node.placeholder {
font-style: italic;
opacity: 0.75;
}
.node.selected > summary,
.node.leaf.selected {
background: var(--selected-bg) !important;
color: var(--selected-fg) !important;
}
.node.counterpart > summary,
.node.leaf.counterpart {
background: var(--highlight-bg) !important;
}
.page-footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(--bg);
border-top: 1px solid var(--border);
padding: 0.5rem 1rem;
display: flex;
align-items: center;
gap: 1rem;
}
#file-issue,
#toggle-identical {
font-family: inherit;
font-size: 0.85rem;
padding: 0.4rem 0.8rem;
border-radius: 6px;
border: 1px solid var(--button-border);
background: var(--button-bg);
color: var(--fg);
cursor: pointer;
text-decoration: none;
}
#file-issue[aria-disabled="true"] {
opacity: 0.5;
cursor: default;
pointer-events: none;
}
#toggle-identical[aria-pressed="true"] {
background: var(--matched);
color: #fff;
border-color: var(--matched);
}
#status-line {
color: var(--muted);
font-size: 0.8rem;
}
#help-overlay {
position: fixed;
top: 10%;
left: 50%;
transform: translateX(-50%);
background: var(--panel-bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 1rem 1.5rem;
max-width: 30rem;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
z-index: 10;
}
#help-overlay.hidden {
display: none;
}
#help-overlay dl {
display: grid;
grid-template-columns: auto 1fr;
gap: 0.25rem 1rem;
margin: 0.5rem 0 0;
}
#help-overlay dt {
font-weight: bold;
color: var(--matched);
}
#help-overlay dd {
margin: 0;
color: var(--fg);
}
#search-prompt {
position: fixed;
bottom: 3.2rem;
left: 1rem;
background: var(--panel-bg);
border: 1px solid var(--border);
border-radius: 6px;
padding: 0.4rem 0.6rem;
z-index: 10;
}
#search-prompt.hidden {
display: none;
}
#search-prompt input {
font-family: inherit;
font-size: 0.85rem;
background: var(--bg);
color: var(--fg);
border: 1px solid var(--button-border);
border-radius: 4px;
padding: 0.2rem 0.4rem;
}
:root {
--deleted-bg: #ffd7d5;
--inserted-bg: #cdf3d5;
--update-bg: #f7e6bd;
--moved-bg: #e6dbfb;
--deleted-row-bg: #ffefee;
--inserted-row-bg: #eaf9ee;
--update-row-bg: #fbf4e2;
--moved-row-bg: #f3eefc;
--counterpart-outline: #0969da;
}
@media (prefers-color-scheme: dark) {
:root {
--deleted-bg: #67282c;
--inserted-bg: #1f5c30;
--update-bg: #5c4409;
--moved-bg: #402e63;
--deleted-row-bg: #2b1b1d;
--inserted-row-bg: #172a1d;
--update-row-bg: #2a2413;
--moved-row-bg: #221c2f;
--counterpart-outline: #58a6ff;
}
}
.code-panels {
margin-bottom: 1rem;
}
.code {
white-space: pre;
line-height: 1.45;
}
.cl {
display: flex;
align-items: flex-start;
}
.cl .ln {
flex: 0 0 4ch;
text-align: right;
padding-right: 1ch;
color: var(--muted);
user-select: none;
}
.cl .lt {
flex: 1 1 auto;
min-width: 0;
}
.cl.fold {
color: var(--muted);
font-style: italic;
border-top: 1px dashed var(--border);
border-bottom: 1px dashed var(--border);
margin: 0.15rem 0;
}
.cl.row-cd-delete {
background: var(--deleted-row-bg);
}
.cl.row-cd-insert {
background: var(--inserted-row-bg);
}
.cl.row-cd-update {
background: var(--update-row-bg);
}
.cl.row-cd-move {
background: var(--moved-row-bg);
}
.cd {
border-radius: 2px;
cursor: pointer;
}
.cd-delete {
background: var(--deleted-bg);
}
.cd-insert {
background: var(--inserted-bg);
}
.cd-update {
background: var(--update-bg);
}
.cd-move {
background: var(--moved-bg);
}
.cd.cd-gap {
display: inline-block;
width: 0;
background: none;
border-left: 2px solid var(--deleted);
margin: 0 -1px;
}
.cd.cd-gap.cd-insert {
border-left-color: var(--inserted);
}
.cl.row-gap .ln {
border-right: 2px solid var(--muted);
}
.cd.selected {
outline: 2px solid var(--selected-fg);
outline-offset: -1px;
}
.cd.counterpart {
outline: 2px dashed var(--counterpart-outline);
outline-offset: -1px;
}
body[data-view="code"] .tree-panels,
body[data-view="tree"] .code-panels {
display: none;
}
.view-switch {
display: inline-flex;
gap: 0;
margin-top: 0.5rem;
}
.view-switch button {
font: inherit;
padding: 0.15rem 0.6rem;
background: var(--button-bg);
color: var(--fg);
border: 1px solid var(--button-border);
cursor: pointer;
}
.view-switch button:first-child {
border-radius: 4px 0 0 4px;
}
.view-switch button:last-child {
border-radius: 0 4px 4px 0;
}
.view-switch button + button {
border-left: none;
}
.view-switch button[aria-pressed="true"] {
background: var(--matched);
border-color: var(--matched);
color: var(--bg);
}
.notice {
margin: 0 0 0.75rem;
padding: 0.4rem 0.6rem;
border-left: 3px solid var(--update);
background: var(--panel-bg);
color: var(--muted);
}
body[data-view="tree"] .code-legend,
body[data-view="code"] .legend:not(.code-legend) {
display: none;
}
.cd-inserted-swatch {
display: inline-block;
width: 1.2em;
height: 0.85em;
cursor: default;
}
.code-panels.hidden {
display: none;
}
.painting-switch {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.6rem;
flex-wrap: wrap;
}
.painting-switch-label {
color: var(--muted);
}
.painting-switch button {
font: inherit;
padding: 0.15rem 0.6rem;
background: var(--button-bg);
color: var(--fg);
border: 1px solid var(--button-border);
cursor: pointer;
}
.painting-switch button:first-of-type {
border-radius: 4px 0 0 4px;
}
.painting-switch button:last-of-type {
border-radius: 0 4px 4px 0;
}
.painting-switch button + button {
border-left: none;
}
.painting-switch button[aria-pressed="true"] {
background: var(--matched);
border-color: var(--matched);
color: var(--bg);
}
body[data-view="tree"] .painting-switch,
body[data-view="tree"] .painting-notice {
display: none;
}
.fixture-table td.paintings {
color: var(--muted);
}
.description {
margin: 0 0 0.75rem;
padding: 0.4rem 0.6rem;
border-left: 3px solid var(--matched);
background: var(--panel-bg);
white-space: pre-wrap;
}
.source-path {
color: var(--muted);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 0.9em;
}
.fixture-note {
color: var(--muted);
font-size: 0.9em;
margin-top: 0.15rem;
max-width: 60ch;
}