Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Refresh the web surface with Everforest, readable type, and clearer navigation

796ac8c0ce77461174cf520d5fad4dea37744662 · Keenan Nemetz · 11d ago · parent ac00929f

server/web/static/vole.css +292−171

@@ -1,5 +1,7 @@
1 /* Vole's web surface. One stylesheet, token-driven: a light theme is another
2 block of variables, and a real identity is a change to the top block only.
1 /* Vole's web surface. Token-driven: a light theme is another block of variables,
2 and a real identity is a change to the top block only. Everforest is the
3 permanent theme in static/everforest.css; this sheet supplies the layout and
4 the fallback tokens the theme sheet overrides.
3 5
4 6 Sections, in file order. Rules cascade in this order too, so a later section
5 7 can override an earlier one and a section cannot be moved without checking
@@ -69,10 +71,70 @@
69 71 /* shape and type */
70 72 --radius: 6px;
71 73 --radius-lg: 8px;
72 --font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
73 --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
74 --fs: 13px;
75 --lh: 1.5;
74 --font: "Lexend", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "Liberation Sans", Arial, sans-serif;
75 --mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
76 --fs: 15.4px;
77 --lh: 1.55;
78 /* Every explicit size is calc(<px> * var(--font-scale)) so the Account page's
79 Text size preset reaches labels and code, not just body copy. */
80 --font-scale: 1;
81 }
82
83 /* Text-size presets. The account page stores the choice in this browser and
84 static/theme.js applies the attribute before the first paint. */
85 :root[data-font-scale="small"] { --font-scale: 0.9; }
86 :root[data-font-scale="medium"] { --font-scale: 1; }
87 :root[data-font-scale="large"] { --font-scale: 1.1; }
88
89 /* Self-hosted, OFL fonts. The Latin/Latin-ext subsets keep the binary small;
90 anything outside them falls through to the system stack in --font/--mono. */
91 @font-face {
92 font-family: "Lexend";
93 font-style: normal;
94 font-weight: 100 900;
95 font-display: swap;
96 src: url("/static/fonts/lexend-latin-ext.woff2") format("woff2");
97 unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
98 }
99 @font-face {
100 font-family: "Lexend";
101 font-style: normal;
102 font-weight: 100 900;
103 font-display: swap;
104 src: url("/static/fonts/lexend-latin.woff2") format("woff2");
105 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
106 }
107 @font-face {
108 font-family: "JetBrains Mono";
109 font-style: normal;
110 font-weight: 100 800;
111 font-display: swap;
112 src: url("/static/fonts/jetbrains-mono-latin-ext.woff2") format("woff2");
113 unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
114 }
115 @font-face {
116 font-family: "JetBrains Mono";
117 font-style: normal;
118 font-weight: 100 800;
119 font-display: swap;
120 src: url("/static/fonts/jetbrains-mono-latin.woff2") format("woff2");
121 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
122 }
123 @font-face {
124 font-family: "JetBrains Mono";
125 font-style: italic;
126 font-weight: 100 800;
127 font-display: swap;
128 src: url("/static/fonts/jetbrains-mono-italic-latin-ext.woff2") format("woff2");
129 unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
130 }
131 @font-face {
132 font-family: "JetBrains Mono";
133 font-style: italic;
134 font-weight: 100 800;
135 font-display: swap;
136 src: url("/static/fonts/jetbrains-mono-italic-latin.woff2") format("woff2");
137 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
76 138 }
77 139
78 140 * { box-sizing: border-box; }
@@ -87,24 +149,27 @@ body {
87 149 margin: 0;
88 150 background: var(--bg);
89 151 color: var(--fg);
90 font: var(--fs)/var(--lh) var(--font);
91 -webkit-font-smoothing: antialiased;
152 font-family: var(--font);
153 font-size: calc(var(--fs) * var(--font-scale));
154 line-height: var(--lh);
155 -webkit-font-smoothing: auto;
156 font-kerning: normal;
92 157 }
93 158
94 159 a { color: var(--accent); text-decoration: none; }
95 160 a:hover { text-decoration: underline; }
96 161
97 162 h1, h2, h3 { margin: 0; font-weight: 600; letter-spacing: -0.005em; }
98 h1 { font-size: 18px; line-height: 1.35; margin: 2px 0 12px; }
99 h2 { font-size: 13px; color: var(--fg-muted); margin: 24px 0 8px; }
100 h3 { font-size: 13px; }
163 h1 { font-size: calc(19.8px * var(--font-scale)); line-height: 1.35; margin: 2px 0 12px; }
164 h2 { font-size: calc(14.3px * var(--font-scale)); color: var(--fg-muted); margin: 24px 0 8px; }
165 h3 { font-size: calc(14.3px * var(--font-scale)); }
101 166 p { margin: 0 0 10px; }
102 167 ul, ol { margin: 0 0 10px; padding-left: 20px; }
103 168 hr { border: 0; border-top: 1px solid var(--border); margin: 20px 0; }
104 169 img { max-width: 100%; }
105 170
106 171 .muted { color: var(--fg-muted); }
107 .sha { font-family: var(--mono); font-size: 12px; color: var(--fg-muted); }
172 .sha { font-family: var(--mono); font-size: calc(13.2px * var(--font-scale)); color: var(--fg-muted); }
108 173 .nowrap { white-space: nowrap; }
109 174 .adds { color: var(--good); }
110 175 .dels { color: var(--bad); }
@@ -121,8 +186,7 @@ img { max-width: 100%; }
121 186 padding: 0 20px;
122 187 background: color-mix(in srgb, var(--bg-panel) 92%, transparent);
123 188 border-bottom: 1px solid var(--border);
124 position: sticky;
125 top: 0;
189 position: relative;
126 190 z-index: 20;
127 191 backdrop-filter: blur(8px);
128 192 }
@@ -135,28 +199,44 @@ img { max-width: 100%; }
135 199 color: var(--fg);
136 200 }
137 201 .brand:hover { text-decoration: none; }
138 /* A dark tile with a white face, so the mark reads the same on the light and the
139 dark theme without a second set of assets. It sits inside the 46px bar with
140 room to breathe and stays within the 128px source at 4x. */
202 /* The head is a mask, not a fixed dark tile: currentColor takes the theme's ink,
203 and the facial cutouts show the bar behind it. The favicon is a separate
204 transparent mark that switches black/white with the browser window preference,
205 because its job is to contrast with the tab, not with the app theme. */
141 206 .brand .mark {
142 207 display: block;
143 208 flex: none;
144 209 width: 28px;
145 210 height: 28px;
211 background-color: currentColor;
212 -webkit-mask: url("/static/vole-head.png") center / contain no-repeat;
213 mask: url("/static/vole-head.png") center / contain no-repeat;
146 214 }
147 215
148 .topnav { display: flex; gap: 2px; }
216 .topnav { display: flex; gap: 6px; }
149 217 .topnav a {
150 218 display: inline-flex;
151 219 align-items: center;
152 gap: 5px;
153 padding: 4px 8px;
220 gap: 6px;
221 padding: 5px 11px;
222 border: 1px solid transparent;
154 223 border-radius: var(--radius);
155 color: var(--fg-muted);
156 font-size: 12.5px;
224 color: var(--fg);
225 font-size: calc(13.75px * var(--font-scale));
226 font-weight: 500;
227 white-space: nowrap;
228 }
229 .topnav a:hover {
230 background: var(--bg-hover);
231 border-color: var(--border);
232 color: var(--fg);
233 text-decoration: none;
234 }
235 .topnav a.active {
236 background: var(--accent-soft);
237 border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
238 color: var(--accent);
157 239 }
158 .topnav a:hover { background: var(--bg-hover); color: var(--fg); text-decoration: none; }
159 .topnav a.active { background: var(--bg-raised); color: var(--fg); }
160 240
161 241 .topsearch { margin-left: auto; }
162 242 .topsearch input[type="search"] { width: 12rem; max-width: 28vw; }
@@ -165,7 +245,7 @@ img { max-width: 100%; }
165 245 display: flex;
166 246 align-items: center;
167 247 gap: 12px;
168 font-size: 12.5px;
248 font-size: calc(13.75px * var(--font-scale));
169 249 color: var(--fg-muted);
170 250 }
171 251 .topright > a { display: inline-flex; align-items: center; gap: 5px; color: var(--fg-muted); }
@@ -215,7 +295,7 @@ img { max-width: 100%; }
215 295 background: none;
216 296 color: var(--fg);
217 297 font: inherit;
218 font-size: 12.5px;
298 font-size: calc(13.75px * var(--font-scale));
219 299 text-align: left;
220 300 cursor: pointer;
221 301 }
@@ -241,7 +321,8 @@ img { max-width: 100%; }
241 321 .topsearch { order: 3; flex: 1 1 100%; margin-left: 0; }
242 322 .topsearch input[type="search"] { width: 100%; max-width: none; }
243 323 .topright { margin-left: auto; }
244 .topnav { gap: 0; }
324 .topnav { gap: 4px; }
325 .topnav a { padding: 4px 8px; }
245 326 /* The icon is enough on a phone; the menu keeps the full name. */
246 327 .account-name { display: none; }
247 328 .page { padding: 16px 12px 56px; }
@@ -260,7 +341,7 @@ img { max-width: 100%; }
260 341 gap: 8px;
261 342 min-width: 0;
262 343 color: var(--fg);
263 font-size: 26px;
344 font-size: calc(28.6px * var(--font-scale));
264 345 line-height: 1.2;
265 346 font-weight: 600;
266 347 letter-spacing: -0.025em;
@@ -269,7 +350,7 @@ img { max-width: 100%; }
269 350 .repo-desc {
270 351 margin: 6px 0 0;
271 352 color: var(--fg-muted);
272 font-size: 13px;
353 font-size: calc(14.3px * var(--font-scale));
273 354 overflow: hidden;
274 355 text-overflow: ellipsis;
275 356 white-space: nowrap;
@@ -286,17 +367,17 @@ img { max-width: 100%; }
286 367 border-bottom: 0;
287 368 }
288 369 .repohead + .page-head h1 {
289 font-size: 18px;
370 font-size: calc(19.8px * var(--font-scale));
290 371 line-height: 1.35;
291 372 letter-spacing: -0.005em;
292 373 margin: 0 0 3px;
293 374 }
294 375 .repohead + .page-head h1:last-child { margin-bottom: 0; }
295 .repohead + .page-head .page-sub { font-size: 12.5px; }
376 .repohead + .page-head .page-sub { font-size: calc(13.75px * var(--font-scale)); }
296 377
297 378 @media (max-width: 720px) {
298 379 .repo-title { padding: 18px 0 10px; }
299 .repo-name { font-size: 22px; }
380 .repo-name { font-size: calc(24.2px * var(--font-scale)); }
300 381 .repo-name .repo-vis .icon { width: 14px; height: 14px; }
301 382 }
302 383
@@ -313,7 +394,7 @@ img { max-width: 100%; }
313 394 padding: 8px 10px 9px;
314 395 border-bottom: 2px solid transparent;
315 396 white-space: nowrap;
316 font-size: 12.5px;
397 font-size: calc(13.75px * var(--font-scale));
317 398 }
318 399 .tabs a:hover { color: var(--fg); text-decoration: none; }
319 400 .tabs a.active { color: var(--fg); border-bottom-color: var(--accent); }
@@ -339,7 +420,7 @@ img { max-width: 100%; }
339 420 table {
340 421 width: 100%;
341 422 border-collapse: collapse;
342 font-size: 12.5px;
423 font-size: calc(13.75px * var(--font-scale));
343 424 }
344 425 .panel > table { margin: 0; }
345 426 th, td {
@@ -352,7 +433,7 @@ tr:last-child > td { border-bottom: 0; }
352 433 th {
353 434 color: var(--fg-faint);
354 435 font-weight: 500;
355 font-size: 11px;
436 font-size: calc(12.1px * var(--font-scale));
356 437 text-transform: uppercase;
357 438 letter-spacing: 0.04em;
358 439 background: var(--bg-raised);
@@ -376,7 +457,10 @@ button, .button {
376 457 border: 1px solid transparent;
377 458 border-radius: var(--radius);
378 459 padding: 5px 11px;
379 font: 500 12.5px/1.4 var(--font);
460 font-family: var(--font);
461 font-size: calc(13.75px * var(--font-scale));
462 font-weight: 500;
463 line-height: 1.4;
380 464 cursor: pointer;
381 465 white-space: nowrap;
382 466 }
@@ -428,7 +512,7 @@ select, input[type="text"], input[type="password"], input[type="search"], textar
428 512 border-radius: var(--radius);
429 513 padding: 5px 8px;
430 514 font: inherit;
431 font-size: 12.5px;
515 font-size: calc(13.75px * var(--font-scale));
432 516 min-height: 30px;
433 517 }
434 518 select:focus, input:focus, textarea:focus {
@@ -441,7 +525,7 @@ input[type="text"], input[type="password"], input[type="search"], textarea {
441 525 max-width: 34rem;
442 526 }
443 527 textarea { min-height: 7rem; resize: vertical; line-height: 1.5; }
444 label { display: block; margin: 10px 0; color: var(--fg-muted); font-size: 12.5px; }
528 label { display: block; margin: 10px 0; color: var(--fg-muted); font-size: calc(13.75px * var(--font-scale)); }
445 529 /* The label text sits above the control. Without this, a max-width input shares
446 530 the line with its label and the form reads as a row of pairs. */
447 531 label > input, label > textarea, label > select {
@@ -483,7 +567,7 @@ label > select { width: 100%; max-width: 34rem; }
483 567 padding: 1px 6px;
484 568 border: 1px solid var(--border-strong);
485 569 border-radius: 10px;
486 font-size: 11px;
570 font-size: calc(12.1px * var(--font-scale));
487 571 line-height: 1.5;
488 572 color: var(--fg-muted);
489 573 vertical-align: 1px;
@@ -496,7 +580,7 @@ a.label:hover { color: var(--accent); border-color: var(--accent); text-decorati
496 580 border-radius: var(--radius);
497 581 padding: 8px 12px;
498 582 margin-bottom: 14px;
499 font-size: 12.5px;
583 font-size: calc(13.75px * var(--font-scale));
500 584 }
501 585 .flash.bad { border-color: color-mix(in srgb, var(--bad) 50%, var(--border)); background: var(--bad-soft); }
502 586 .flash.good { border-color: color-mix(in srgb, var(--good) 50%, var(--border)); background: var(--good-soft); }
@@ -509,12 +593,15 @@ a.label:hover { color: var(--accent); border-color: var(--accent); text-decorati
509 593 }
510 594 .empty-page .eyebrow {
511 595 color: var(--fg-faint);
512 font: 600 11px/1 var(--mono);
596 font-family: var(--mono);
597 font-size: calc(12.1px * var(--font-scale));
598 font-weight: 600;
599 line-height: 1;
513 600 letter-spacing: 0.1em;
514 601 text-transform: uppercase;
515 602 margin-bottom: 10px;
516 603 }
517 .empty-page h1 { font-size: 24px; margin-bottom: 8px; }
604 .empty-page h1 { font-size: calc(26.4px * var(--font-scale)); margin-bottom: 8px; }
518 605 .empty-page p { margin-bottom: 18px; }
519 606
520 607 /* ---------- auth ---------- */
@@ -536,7 +623,7 @@ details.clone > summary {
536 623 border: 1px solid var(--border-strong);
537 624 border-radius: var(--radius);
538 625 padding: 5px 11px;
539 font-size: 12.5px;
626 font-size: calc(13.75px * var(--font-scale));
540 627 }
541 628 details.clone > summary::-webkit-details-marker { display: none; }
542 629 details.clone > summary:hover { background: var(--bg-hover); }
@@ -571,7 +658,7 @@ code {
571 658 border: 1px solid var(--border);
572 659 border-radius: 4px;
573 660 padding: 1px 5px;
574 font-size: 11.5px;
661 font-size: calc(12.65px * var(--font-scale));
575 662 }
576 663 pre {
577 664 background: var(--bg-panel);
@@ -579,13 +666,13 @@ pre {
579 666 border-radius: var(--radius);
580 667 padding: 12px 14px;
581 668 overflow: auto;
582 font-size: 12px;
669 font-size: calc(13.2px * var(--font-scale));
583 670 line-height: 1.55;
584 671 margin: 10px 0;
585 672 }
586 673 pre code { background: none; border: 0; padding: 0; font-size: inherit; }
587 674
588 .crumbs { color: var(--fg-muted); font-size: 12.5px; margin: -4px 0 12px; }
675 .crumbs { color: var(--fg-muted); font-size: calc(13.75px * var(--font-scale)); margin: -4px 0 12px; }
589 676 .crumbs a { color: var(--fg-muted); }
590 677 .crumbs a:hover { color: var(--accent); }
591 678 .dir { color: var(--accent); }
@@ -599,10 +686,10 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
599 686 letter-spacing: -0.01em;
600 687 text-transform: none;
601 688 }
602 .md h1 { font-size: 20px; }
603 .md h2 { font-size: 16px; }
604 .md h3 { font-size: 14px; }
605 .md h4 { font-size: 13px; }
689 .md h1 { font-size: calc(22px * var(--font-scale)); }
690 .md h2 { font-size: calc(17.6px * var(--font-scale)); }
691 .md h3 { font-size: calc(15.4px * var(--font-scale)); }
692 .md h4 { font-size: calc(14.3px * var(--font-scale)); }
606 693 .md p { margin: 9px 0; }
607 694 .md ul, .md ol { padding-left: 22px; margin: 9px 0; }
608 695 .md blockquote {
@@ -615,7 +702,7 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
615 702 .md table { width: auto; }
616 703 .md img { border-radius: var(--radius); }
617 704
618 .diffsum { font-size: 12px; margin: 10px 0; }
705 .diffsum { font-size: calc(13.2px * var(--font-scale)); margin: 10px 0; }
619 706
620 707 .diff {
621 708 border: 1px solid var(--border);
@@ -629,13 +716,13 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
629 716 padding: 8px 12px;
630 717 background: var(--bg-raised);
631 718 border-bottom: 1px solid var(--border);
632 font-size: 12px;
719 font-size: calc(13.2px * var(--font-scale));
633 720 font-weight: 550;
634 721 }
635 722 .diff h3 .path { font-family: var(--mono); }
636 723 .diff table {
637 724 font-family: var(--mono);
638 font-size: 11.5px;
725 font-size: calc(12.65px * var(--font-scale));
639 726 border-collapse: collapse;
640 727 table-layout: fixed;
641 728 }
@@ -668,21 +755,21 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
668 755 color: var(--fg-muted);
669 756 background: var(--bg-raised);
670 757 padding: 5px 12px;
671 font-size: 11px;
758 font-size: calc(12.1px * var(--font-scale));
672 759 border-top: 1px solid var(--border);
673 760 border-bottom: 1px solid var(--border);
674 761 }
675 762 .diff tr.note td {
676 763 background: var(--bg-panel);
677 764 padding: 8px 12px;
678 font-size: 12px;
765 font-size: calc(13.2px * var(--font-scale));
679 766 }
680 767 .inline-note {
681 768 padding: 8px 10px;
682 769 border: 1px solid var(--border);
683 770 border-radius: var(--radius);
684 771 background: var(--bg-raised);
685 scroll-margin-top: 72px;
772 scroll-margin-top: 16px;
686 773 }
687 774 .inline-note + .inline-note { margin-top: 8px; }
688 775 .inline-note:target { border-color: var(--accent); }
@@ -693,14 +780,14 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
693 780 gap: 6px;
694 781 margin-bottom: 5px;
695 782 color: var(--fg-muted);
696 font-size: 11.5px;
783 font-size: calc(12.65px * var(--font-scale));
697 784 }
698 .inline-note-head .avatar { width: 17px; height: 17px; font-size: 8px; }
699 .inline-note-head .comment-author { color: var(--fg); font-size: 12px; }
785 .inline-note-head .avatar { width: 17px; height: 17px; font-size: calc(8.8px * var(--font-scale)); }
786 .inline-note-head .comment-author { color: var(--fg); font-size: calc(13.2px * var(--font-scale)); }
700 787 .inline-note .comment-body {
701 788 padding: 0;
702 789 max-width: none;
703 font-size: 12.5px;
790 font-size: calc(13.75px * var(--font-scale));
704 791 line-height: 1.55;
705 792 }
706 793 .inline-note .comment-body p { margin: 4px 0; }
@@ -730,17 +817,17 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
730 817 justify-content: space-between;
731 818 gap: 12px;
732 819 color: var(--fg-muted);
733 font-size: 12px;
820 font-size: calc(13.2px * var(--font-scale));
734 821 }
735 822 .inline-comment-head code { color: var(--fg); }
736 823 .inline-comment-form textarea { min-height: 5.5rem; max-width: none; }
737 824 .inline-comment-form .form-actions { margin-top: 0; }
738 .diff .binary { padding: 10px 12px; color: var(--fg-muted); font-size: 12px; margin: 0; }
825 .diff .binary { padding: 10px 12px; color: var(--fg-muted); font-size: calc(13.2px * var(--font-scale)); margin: 0; }
739 826
740 827 /* ---------- shared responsive rules ---------- */
741 828
742 829 @media (max-width: 720px) {
743 h1 { font-size: 16px; }
830 h1 { font-size: calc(17.6px * var(--font-scale)); }
744 831 .repohead { gap: 0 10px; }
745 832 th, td { padding: 7px 9px; }
746 833 .nowrap { white-space: normal; }
@@ -761,17 +848,17 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
761 848 .overview-side h2 { margin: 0 0 8px; }
762 849
763 850 .with-more { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
764 .with-more .more { font-size: 12px; font-weight: 400; color: var(--fg-muted); }
851 .with-more .more { font-size: calc(13.2px * var(--font-scale)); font-weight: 400; color: var(--fg-muted); }
765 852 .with-more .more:hover { color: var(--accent); }
766 853
767 854 .side-list { display: flex; flex-direction: column; gap: 6px; }
768 .side-row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; font-size: 12.5px; }
769 .side-row .muted { font-size: 11.5px; white-space: nowrap; }
855 .side-row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; font-size: calc(13.75px * var(--font-scale)); }
856 .side-row .muted { font-size: calc(12.65px * var(--font-scale)); white-space: nowrap; }
770 857
771 858 .contributors { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 6px; }
772 859 .contributors li { display: flex; align-items: center; gap: 8px; min-width: 0; }
773 .contributors .cname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12.5px; }
774 .contributors .muted { font-size: 11.5px; }
860 .contributors .cname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: calc(13.75px * var(--font-scale)); }
861 .contributors .muted { font-size: calc(12.65px * var(--font-scale)); }
775 862
776 863 .avatar {
777 864 display: inline-grid;
@@ -780,7 +867,10 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
780 867 width: 20px;
781 868 height: 20px;
782 869 border-radius: 50%;
783 font: 600 10px/1 var(--font);
870 font-family: var(--font);
871 font-size: calc(11px * var(--font-scale));
872 font-weight: 600;
873 line-height: 1;
784 874 color: #fff;
785 875 background: #4b5563;
786 876 }
@@ -792,8 +882,8 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
792 882 .avatar.c6 { background: #7a6a2f; }
793 883 .avatar.c7 { background: #5f5b6e; }
794 884
795 .lang { display: grid; grid-template-columns: 1fr auto; gap: 2px 8px; margin-bottom: 8px; font-size: 12px; }
796 .lang .muted { font-size: 11.5px; }
885 .lang { display: grid; grid-template-columns: 1fr auto; gap: 2px 8px; margin-bottom: 8px; font-size: calc(13.2px * var(--font-scale)); }
886 .lang .muted { font-size: calc(12.65px * var(--font-scale)); }
797 887 .bar {
798 888 grid-column: 1 / -1;
799 889 appearance: none;
@@ -819,10 +909,10 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
819 909 border-bottom: 0;
820 910 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
821 911 font-family: var(--mono);
822 font-size: 12px;
912 font-size: calc(13.2px * var(--font-scale));
823 913 }
824 914 .filehead .icon { width: 13px; height: 13px; margin-right: 6px; vertical-align: -2px; }
825 .filehead a { font-family: var(--font); font-size: 11.5px; color: var(--fg-muted); }
915 .filehead a { font-family: var(--font); font-size: calc(12.65px * var(--font-scale)); color: var(--fg-muted); }
826 916 .filehead a:hover { color: var(--accent); }
827 917 .readme {
828 918 background: var(--bg-panel);
@@ -844,16 +934,16 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
844 934 background: var(--bg-panel);
845 935 border: 1px solid var(--border);
846 936 border-radius: var(--radius);
847 font-size: 12.5px;
937 font-size: calc(13.75px * var(--font-scale));
848 938 }
849 .latest .muted { font-size: 11.5px; }
939 .latest .muted { font-size: calc(12.65px * var(--font-scale)); }
850 940 .latest a.sha { margin-left: auto; }
851 941
852 942 .status {
853 943 display: inline-flex;
854 944 align-items: center;
855 945 gap: 5px;
856 font-size: 11px;
946 font-size: calc(12.1px * var(--font-scale));
857 947 font-weight: 500;
858 948 line-height: 1.4;
859 949 text-transform: uppercase;
@@ -881,7 +971,7 @@ pre code { background: none; border: 0; padding: 0; font-size: inherit; }
881 971 padding: 3px 9px;
882 972 border: 1px solid var(--border-strong);
883 973 border-radius: 12px;
884 font-size: 11.5px;
974 font-size: calc(12.65px * var(--font-scale));
885 975 color: var(--fg-muted);
886 976 background: var(--bg-panel);
887 977 }
@@ -913,7 +1003,7 @@ td.fit { width: 1%; white-space: nowrap; }
913 1003 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
914 1004 color: var(--fg-muted);
915 1005 font-family: var(--mono);
916 font-size: 11.5px;
1006 font-size: calc(12.65px * var(--font-scale));
917 1007 }
918 1008 .code-tab-icon { display: inline-flex; flex: 0 0 auto; color: var(--fg-faint); }
919 1009 .code-tab-icon .icon { width: 13px; height: 13px; }
@@ -936,12 +1026,12 @@ td.fit { width: 1%; white-space: nowrap; }
936 1026 gap: 10px;
937 1027 margin-left: auto;
938 1028 font-family: var(--font);
939 font-size: 11.5px;
1029 font-size: calc(12.65px * var(--font-scale));
940 1030 }
941 1031 .code-tab-actions a { color: var(--fg-muted); }
942 1032 .code-tab-actions a:hover,
943 1033 .code-tab-actions a.active { color: var(--accent); }
944 .code-tab-actions .muted { font-size: 11.5px; }
1034 .code-tab-actions .muted { font-size: calc(12.65px * var(--font-scale)); }
945 1035 .code-tabbar + .panel,
946 1036 .code-tabbar + .filebody,
947 1037 .code-tabbar + .card,
@@ -960,14 +1050,14 @@ td.fit { width: 1%; white-space: nowrap; }
960 1050 gap: 18px;
961 1051 align-items: start;
962 1052 }
963 .code-main { min-width: 0; scroll-margin-top: 60px; }
1053 .code-main { min-width: 0; scroll-margin-top: 16px; }
964 1054
965 1055 .file-tree {
966 1056 display: flex;
967 1057 flex-direction: column;
968 1058 position: sticky;
969 top: 66px;
970 max-height: calc(100vh - 86px);
1059 top: 16px;
1060 max-height: calc(100vh - 32px);
971 1061 overflow: hidden;
972 1062 background: var(--bg-panel);
973 1063 border: 1px solid var(--border);
@@ -983,12 +1073,12 @@ td.fit { width: 1%; white-space: nowrap; }
983 1073 background: var(--bg-raised);
984 1074 border-bottom: 1px solid var(--border);
985 1075 color: var(--fg-muted);
986 font-size: 11px;
1076 font-size: calc(12.1px * var(--font-scale));
987 1077 letter-spacing: 0.05em;
988 1078 text-transform: uppercase;
989 1079 }
990 1080 .tree-head .icon { width: 13px; height: 13px; margin-right: 5px; vertical-align: -2px; }
991 .tree-head .muted { font-size: 10.5px; letter-spacing: 0; text-transform: none; }
1081 .tree-head .muted { font-size: calc(11.55px * var(--font-scale)); letter-spacing: 0; text-transform: none; }
992 1082 .tree-scroll { flex: 1 1 auto; min-height: 0; overflow: auto; padding: 6px 4px 8px; }
993 1083
994 1084 .tree-list { list-style: none; margin: 0; padding: 0; }
@@ -1001,7 +1091,7 @@ td.fit { width: 1%; white-space: nowrap; }
1001 1091 padding: 2px 7px;
1002 1092 border-radius: 4px;
1003 1093 color: var(--fg-muted);
1004 font-size: 12px;
1094 font-size: calc(13.2px * var(--font-scale));
1005 1095 line-height: 1.45;
1006 1096 }
1007 1097 summary.tree-row { list-style: none; cursor: pointer; }
@@ -1017,7 +1107,7 @@ summary.tree-row::-webkit-details-marker { display: none; }
1017 1107 details[open] > summary .tree-chevron { transform: rotate(90deg); }
1018 1108 .tree-file { padding-left: 25px; }
1019 1109 .tree-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1020 .tree-note, .tree-empty { margin: 0; padding: 8px 10px; font-size: 11px; }
1110 .tree-note, .tree-empty { margin: 0; padding: 8px 10px; font-size: calc(12.1px * var(--font-scale)); }
1021 1111 .tree-note { border-top: 1px solid var(--border); }
1022 1112
1023 1113 /* Review files: the changed-file tree reuses the code browser's shape, with a
@@ -1032,13 +1122,16 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1032 1122 border-radius: 3px;
1033 1123 background: var(--bg-active);
1034 1124 color: var(--fg-muted);
1035 font: 600 9px/1 var(--mono);
1125 font-family: var(--mono);
1126 font-size: calc(9.9px * var(--font-scale));
1127 font-weight: 600;
1128 line-height: 1;
1036 1129 }
1037 1130 .review-mark[data-status="A"] { color: var(--good); background: var(--good-soft); }
1038 1131 .review-mark[data-status="D"] { color: var(--bad); background: var(--bad-soft); }
1039 1132 .review-mark[data-status="R"] { color: var(--accent); background: var(--accent-soft); }
1040 1133 .review-mark[data-status="M"] { color: var(--warn); background: var(--warn-soft); }
1041 .review-main { min-width: 0; scroll-margin-top: 60px; }
1134 .review-main { min-width: 0; scroll-margin-top: 16px; }
1042 1135 /* The review pane opens with a bar the same height as the tree header, so both
1043 1136 columns start on the same line instead of dropping by a summary paragraph. */
1044 1137 .review-main .diffsum {
@@ -1050,7 +1143,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1050 1143 background: var(--bg-raised);
1051 1144 border: 1px solid var(--border);
1052 1145 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1053 font-size: 11px;
1146 font-size: calc(12.1px * var(--font-scale));
1054 1147 }
1055 1148 .review-main .diff {
1056 1149 margin-top: 0;
@@ -1101,7 +1194,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1101 1194 }
1102 1195 .blob table.code {
1103 1196 font-family: var(--mono);
1104 font-size: 11.5px;
1197 font-size: calc(12.65px * var(--font-scale));
1105 1198 border-collapse: collapse;
1106 1199 }
1107 1200 .blob td {
@@ -1180,7 +1273,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1180 1273 .side-commit:hover,
1181 1274 .side-run:hover { color: var(--accent); text-decoration: none; }
1182 1275 .side-subject {
1183 font-size: 12.5px;
1276 font-size: calc(13.75px * var(--font-scale));
1184 1277 overflow: hidden;
1185 1278 text-overflow: ellipsis;
1186 1279 white-space: nowrap;
@@ -1188,7 +1281,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1188 1281 .side-meta {
1189 1282 display: flex;
1190 1283 gap: 8px;
1191 font-size: 11px;
1284 font-size: calc(12.1px * var(--font-scale));
1192 1285 color: var(--fg-faint);
1193 1286 white-space: nowrap;
1194 1287 }
@@ -1217,20 +1310,20 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1217 1310 align-items: center;
1218 1311 gap: 5px;
1219 1312 color: var(--fg-faint);
1220 font-size: 10.5px;
1313 font-size: calc(11.55px * var(--font-scale));
1221 1314 font-weight: 500;
1222 1315 letter-spacing: 0.04em;
1223 1316 text-transform: uppercase;
1224 1317 }
1225 1318 .run-summary-label .icon { width: 12px; height: 12px; }
1226 1319 .run-summary strong {
1227 font-size: 16px;
1320 font-size: calc(17.6px * var(--font-scale));
1228 1321 font-weight: 600;
1229 1322 font-variant-numeric: tabular-nums;
1230 1323 overflow-wrap: anywhere;
1231 1324 }
1232 1325 .run-summary .status-note { margin: 0; }
1233 .run-summary code { font-size: 10.5px; overflow-wrap: anywhere; }
1326 .run-summary code { font-size: calc(11.55px * var(--font-scale)); overflow-wrap: anywhere; }
1234 1327
1235 1328 /* Step logs are loaded on demand. The details element is the trigger; the pre is
1236 1329 the target, and htmx uses textContent so a log can never become markup. */
@@ -1247,7 +1340,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1247 1340 gap: 6px;
1248 1341 padding: 6px 10px;
1249 1342 color: var(--fg-muted);
1250 font-size: 12px;
1343 font-size: calc(13.2px * var(--font-scale));
1251 1344 cursor: pointer;
1252 1345 list-style: none;
1253 1346 }
@@ -1265,7 +1358,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1265 1358 border-radius: 0;
1266 1359 background: var(--bg);
1267 1360 color: var(--fg);
1268 font-size: 12px;
1361 font-size: calc(13.2px * var(--font-scale));
1269 1362 line-height: 1.5;
1270 1363 max-height: 34rem;
1271 1364 min-height: 2.5rem;
@@ -1279,7 +1372,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1279 1372 align-items: center;
1280 1373 gap: 10px;
1281 1374 margin: 8px 0;
1282 font-size: 12px;
1375 font-size: calc(13.2px * var(--font-scale));
1283 1376 }
1284 1377
1285 1378 /* ---------- issues and changes ---------- */
@@ -1294,7 +1387,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1294 1387 border-bottom: 1px solid var(--border);
1295 1388 }
1296 1389 .page-head h1 {
1297 font-size: 26px;
1390 font-size: calc(28.6px * var(--font-scale));
1298 1391 line-height: 1.2;
1299 1392 letter-spacing: -0.025em;
1300 1393 margin: 0 0 4px;
@@ -1317,11 +1410,11 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1317 1410 align-items: center;
1318 1411 gap: 6px;
1319 1412 }
1320 .page-sub { color: var(--fg-muted); font-size: 13px; margin: 0; max-width: 80ch; }
1413 .page-sub { color: var(--fg-muted); font-size: calc(14.3px * var(--font-scale)); margin: 0; max-width: 80ch; }
1321 1414
1322 1415 @media (max-width: 720px) {
1323 1416 .page-head { padding: 18px 0 16px; }
1324 .page-head h1 { font-size: 22px; }
1417 .page-head h1 { font-size: calc(24.2px * var(--font-scale)); }
1325 1418 }
1326 1419
1327 1420 /* Secondary navigation inside a change: conversation and the review files. */
@@ -1339,7 +1432,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1339 1432 margin-bottom: -1px;
1340 1433 border-bottom: 2px solid transparent;
1341 1434 color: var(--fg-muted);
1342 font-size: 12.5px;
1435 font-size: calc(13.75px * var(--font-scale));
1343 1436 }
1344 1437 .subtabs a:hover { color: var(--fg); text-decoration: none; }
1345 1438 .subtabs a.active { color: var(--fg); border-bottom-color: var(--accent); }
@@ -1353,7 +1446,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1353 1446 padding: 1px 7px;
1354 1447 border: 1px solid var(--border-strong);
1355 1448 border-radius: 10px;
1356 font-size: 10.5px;
1449 font-size: calc(11.55px * var(--font-scale));
1357 1450 line-height: 1.6;
1358 1451 font-weight: 500;
1359 1452 text-transform: uppercase;
@@ -1385,7 +1478,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1385 1478 .chip.active .chip-count { color: var(--accent); }
1386 1479 .filter-label {
1387 1480 color: var(--fg-faint);
1388 font-size: 11px;
1481 font-size: calc(12.1px * var(--font-scale));
1389 1482 text-transform: uppercase;
1390 1483 letter-spacing: 0.04em;
1391 1484 }
@@ -1398,7 +1491,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1398 1491 align-items: center;
1399 1492 gap: 4px 8px;
1400 1493 margin-top: 2px;
1401 font-size: 11.5px;
1494 font-size: calc(12.65px * var(--font-scale));
1402 1495 color: var(--fg-faint);
1403 1496 }
1404 1497 .row-meta .label { margin-left: 0; }
@@ -1426,7 +1519,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1426 1519 .thread-side > section:first-child { padding-top: 0; }
1427 1520 .thread-side > section:last-child,
1428 1521 .thread-side #request-sidebar > section:last-child { border-bottom: 0; }
1429 .section-link { margin: 9px 0 0; font-size: 12px; }
1522 .section-link { margin: 9px 0 0; font-size: calc(13.2px * var(--font-scale)); }
1430 1523 .thread-side h2 { margin: 0 0 8px; }
1431 1524 .thread-side form { margin: 8px 0 0; }
1432 1525 .thread-side .meta-list { margin-bottom: 0; }
@@ -1437,7 +1530,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1437 1530 border-radius: var(--radius-lg);
1438 1531 margin: 10px 0;
1439 1532 overflow: visible;
1440 scroll-margin-top: 72px;
1533 scroll-margin-top: 16px;
1441 1534 }
1442 1535 .comment:target {
1443 1536 border-color: var(--accent);
@@ -1454,11 +1547,11 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1454 1547 border-bottom: 1px solid var(--border);
1455 1548 border-top-left-radius: calc(var(--radius-lg) - 1px);
1456 1549 border-top-right-radius: calc(var(--radius-lg) - 1px);
1457 font-size: 12px;
1550 font-size: calc(13.2px * var(--font-scale));
1458 1551 }
1459 1552 .comment-author { font-weight: 550; }
1460 .comment-head .muted { font-size: 11.5px; }
1461 .reply-context { color: var(--fg-muted); font-size: 11.5px; }
1553 .comment-head .muted { font-size: calc(12.65px * var(--font-scale)); }
1554 .reply-context { color: var(--fg-muted); font-size: calc(12.65px * var(--font-scale)); }
1462 1555 .reply-context a { color: var(--fg-muted); }
1463 1556 .reply-context a:hover { color: var(--accent); }
1464 1557 .comment-body { padding: 12px 14px; }
@@ -1475,7 +1568,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1475 1568 gap: 6px;
1476 1569 padding: 10px 14px;
1477 1570 color: var(--fg-faint);
1478 font-size: 12px;
1571 font-size: calc(13.2px * var(--font-scale));
1479 1572 font-style: italic;
1480 1573 }
1481 1574 .comment-deleted .icon { width: 13px; height: 13px; }
@@ -1506,7 +1599,10 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1506 1599 border-radius: 4px;
1507 1600 background: none;
1508 1601 color: var(--fg-muted);
1509 font: 600 16px/1 var(--font);
1602 font-family: var(--font);
1603 font-size: calc(17.6px * var(--font-scale));
1604 font-weight: 600;
1605 line-height: 1;
1510 1606 cursor: pointer;
1511 1607 }
1512 1608 .comment-menu-toggle:hover { background: var(--bg-hover); color: var(--fg); }
@@ -1533,7 +1629,10 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1533 1629 background: none;
1534 1630 color: var(--fg);
1535 1631 text-align: left;
1536 font: 400 12px/1.4 var(--font);
1632 font-family: var(--font);
1633 font-size: calc(13.2px * var(--font-scale));
1634 font-weight: 400;
1635 line-height: 1.4;
1537 1636 cursor: pointer;
1538 1637 }
1539 1638 .comment-menu-list button:hover { background: var(--bg-hover); }
@@ -1556,7 +1655,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1556 1655 width: max-content;
1557 1656 padding: 2px 0;
1558 1657 color: var(--fg-muted);
1559 font-size: 11.5px;
1658 font-size: calc(12.65px * var(--font-scale));
1560 1659 cursor: pointer;
1561 1660 list-style: none;
1562 1661 }
@@ -1591,7 +1690,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1591 1690 border-radius: var(--radius);
1592 1691 background: var(--accent-soft);
1593 1692 color: var(--fg-muted);
1594 font-size: 11.5px;
1693 font-size: calc(12.65px * var(--font-scale));
1595 1694 }
1596 1695 .reply-target[hidden] { display: none; }
1597 1696 .reply-target strong { color: var(--fg); }
@@ -1612,7 +1711,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1612 1711 gap: 4px 8px;
1613 1712 padding: 7px 10px;
1614 1713 color: var(--fg-muted);
1615 font-size: 11.5px;
1714 font-size: calc(12.65px * var(--font-scale));
1616 1715 cursor: pointer;
1617 1716 list-style: none;
1618 1717 }
@@ -1626,7 +1725,9 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1626 1725 .snippet-code {
1627 1726 overflow-x: auto;
1628 1727 background: var(--bg-panel);
1629 font: 11.5px/1.55 var(--mono);
1728 font-family: var(--mono);
1729 font-size: calc(12.65px * var(--font-scale));
1730 line-height: 1.55;
1630 1731 }
1631 1732 .snippet-line { display: flex; min-width: max-content; }
1632 1733 .snippet-line.anchor { background: var(--accent-soft); }
@@ -1642,7 +1743,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1642 1743 .snippet-actions {
1643 1744 padding: 6px 10px;
1644 1745 border-top: 1px solid var(--border);
1645 font-size: 11.5px;
1746 font-size: calc(12.65px * var(--font-scale));
1646 1747 }
1647 1748
1648 1749 .meta-list {
@@ -1650,7 +1751,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1650 1751 grid-template-columns: auto minmax(0, 1fr);
1651 1752 gap: 4px 10px;
1652 1753 margin: 0;
1653 font-size: 12px;
1754 font-size: calc(13.2px * var(--font-scale));
1654 1755 }
1655 1756 .meta-list dt { color: var(--fg-faint); }
1656 1757 .meta-list dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
@@ -1669,7 +1770,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1669 1770 width: 100%;
1670 1771 min-height: 28px;
1671 1772 padding: 3px 6px;
1672 font-size: 12px;
1773 font-size: calc(13.2px * var(--font-scale));
1673 1774 }
1674 1775 .request-target button {
1675 1776 display: inline-flex;
@@ -1678,14 +1779,14 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1678 1779 min-height: 28px;
1679 1780 padding: 3px 7px;
1680 1781 }
1681 .request-target p { margin: 6px 0 0; font-size: 11.5px; }
1782 .request-target p { margin: 6px 0 0; font-size: calc(12.65px * var(--font-scale)); }
1682 1783 .target-summary {
1683 1784 display: flex;
1684 1785 flex-wrap: wrap;
1685 1786 align-items: center;
1686 1787 gap: 5px;
1687 1788 margin: 0;
1688 font-size: 12px;
1789 font-size: calc(13.2px * var(--font-scale));
1689 1790 }
1690 1791 .label-row { display: inline-flex; flex-wrap: wrap; gap: 4px; }
1691 1792 .label-row .label { margin-left: 0; }
@@ -1697,7 +1798,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1697 1798 display: flex;
1698 1799 flex-direction: column;
1699 1800 gap: 6px;
1700 font-size: 12px;
1801 font-size: calc(13.2px * var(--font-scale));
1701 1802 }
1702 1803 .approval-list li, .check-list li { display: flex; align-items: center; gap: 7px; min-width: 0; }
1703 1804 .approval-list .cname, .check-list a {
@@ -1707,7 +1808,7 @@ details[open] > summary .tree-chevron { transform: rotate(90deg); }
1707 1808 text-overflow: ellipsis;
1708 1809 white-space: nowrap;
1709 1810 }
1710 .approval-list .muted { font-size: 11px; }
1811 .approval-list .muted { font-size: calc(12.1px * var(--font-scale)); }
1711 1812
1712 1813 @media (max-width: 900px) {
1713 1814 .thread { grid-template-columns: 1fr; }
@@ -1729,7 +1830,7 @@ table.acl select { min-width: 9rem; }
1729 1830 padding: 0;
1730 1831 margin: 0 0 8px;
1731 1832 color: var(--fg);
1732 font-size: 13px;
1833 font-size: calc(14.3px * var(--font-scale));
1733 1834 font-weight: 600;
1734 1835 }
1735 1836 .role-options > p { margin: 0 0 10px; }
@@ -1742,7 +1843,7 @@ table.acl select { min-width: 9rem; }
1742 1843 border: 1px solid var(--border);
1743 1844 border-radius: var(--radius);
1744 1845 color: var(--fg);
1745 font-size: 13px;
1846 font-size: calc(14.3px * var(--font-scale));
1746 1847 cursor: pointer;
1747 1848 }
1748 1849 .role-option:hover { border-color: var(--border-strong); background: var(--bg-raised); }
@@ -1758,7 +1859,7 @@ table.acl select { min-width: 9rem; }
1758 1859 accent-color: var(--accent);
1759 1860 }
1760 1861 .role-option .role-name { font-weight: 600; }
1761 .role-option .role-desc { color: var(--fg-muted); font-size: 12px; line-height: 1.45; }
1862 .role-option .role-desc { color: var(--fg-muted); font-size: calc(13.2px * var(--font-scale)); line-height: 1.45; }
1762 1863 .role-options.compact { display: flex; flex-wrap: wrap; gap: 4px 12px; }
1763 1864 .role-options.compact legend { display: none; }
1764 1865 .role-options.compact .role-option {
@@ -1770,7 +1871,7 @@ table.acl select { min-width: 9rem; }
1770 1871 border: 0;
1771 1872 border-radius: 0;
1772 1873 background: none;
1773 font-size: 12px;
1874 font-size: calc(13.2px * var(--font-scale));
1774 1875 }
1775 1876 .role-options.compact .role-option:hover { background: none; }
1776 1877 .role-options.compact .role-option:has(input[type="radio"]:checked) {
@@ -1799,6 +1900,26 @@ table.acl select { min-width: 9rem; }
1799 1900 max-width: none;
1800 1901 }
1801 1902
1903 /* The public-key card is the field: the label sits above it and the textarea
1904 fills the card edge to edge. The focus ring draws inside the card so the
1905 rounded frame does not clip it. */
1906 .key-card { padding: 0; overflow: hidden; }
1907 .key-card textarea {
1908 display: block;
1909 min-height: 8rem;
1910 margin: 0;
1911 padding: 12px 14px;
1912 border: 0;
1913 border-radius: 0;
1914 background: transparent;
1915 resize: vertical;
1916 }
1917 .key-card textarea:focus {
1918 outline: 2px solid var(--accent);
1919 outline-offset: -2px;
1920 border-color: transparent;
1921 }
1922
1802 1923 button, .button {
1803 1924 min-height: 30px;
1804 1925 padding-top: 0;
@@ -1833,7 +1954,7 @@ button.link, .link { min-height: 0; }
1833 1954 border-radius: 10px;
1834 1955 background: var(--accent-soft);
1835 1956 color: var(--accent);
1836 font-size: 11.5px;
1957 font-size: calc(12.65px * var(--font-scale));
1837 1958 line-height: 1.6;
1838 1959 }
1839 1960 .label-remove {
@@ -1842,7 +1963,7 @@ button.link, .link { min-height: 0; }
1842 1963 background: none;
1843 1964 border: 0;
1844 1965 color: inherit;
1845 font-size: 14px;
1966 font-size: calc(15.4px * var(--font-scale));
1846 1967 line-height: 1;
1847 1968 cursor: pointer;
1848 1969 }
@@ -1857,7 +1978,7 @@ button.link, .link { min-height: 0; }
1857 1978 background: none;
1858 1979 border: 0;
1859 1980 border-radius: 0;
1860 font-size: 12.5px;
1981 font-size: calc(13.75px * var(--font-scale));
1861 1982 color: var(--fg);
1862 1983 }
1863 1984 .label-tokens .label-entry:focus { outline: none; }
@@ -1887,7 +2008,7 @@ button.link, .link { min-height: 0; }
1887 2008 border-radius: 4px;
1888 2009 color: var(--fg);
1889 2010 text-align: left;
1890 font-size: 12px;
2011 font-size: calc(13.2px * var(--font-scale));
1891 2012 font-weight: 400;
1892 2013 }
1893 2014 .label-option:hover, .label-option:focus { background: var(--bg-hover); filter: none; }
@@ -1941,7 +2062,7 @@ form.htmx-request .label-tokens { opacity: 0.6; }
1941 2062 border-radius: 3px;
1942 2063 }
1943 2064 .diff td.comment-cell .icon { width: 12px; height: 12px; }
1944 .anchor-note { margin: 0 0 8px; font-size: 12px; }
2065 .anchor-note { margin: 0 0 8px; font-size: calc(13.2px * var(--font-scale)); }
1945 2066 @media (max-width: 720px) { .diff td.comment-cell a { opacity: 0.8; } }
1946 2067
1947 2068 /* ---------- activity feed ---------- */
@@ -1983,7 +2104,7 @@ form.htmx-request .label-tokens { opacity: 0.6; }
1983 2104 white-space: nowrap;
1984 2105 }
1985 2106 .activity-title:hover { color: var(--accent); text-decoration: none; }
1986 .activity-meta { color: var(--fg-faint); font-size: 11.5px; margin-top: 2px; }
2107 .activity-meta { color: var(--fg-faint); font-size: calc(12.65px * var(--font-scale)); margin-top: 2px; }
1987 2108 @media (max-width: 720px) {
1988 2109 .activity-title { white-space: normal; }
1989 2110 }
@@ -2056,17 +2177,17 @@ textarea:focus-visible {
2056 2177 /* ---------- pager ---------- */
2057 2178
2058 2179 .pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 12px 0; }
2059 .pager .button { font-size: 12px; }
2180 .pager .button { font-size: calc(13.2px * var(--font-scale)); }
2060 2181
2061 2182 /* ---------- code search ---------- */
2062 2183
2063 2184 /* One block per file, with line numbers linked to blob anchors. */
2064 2185 .search-code input[type="search"] { width: 10rem; }
2065 2186 .search-group { margin: 14px 0; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--bg-panel); overflow: hidden; }
2066 .search-group h3 { margin: 0; padding: 7px 10px; background: var(--bg-raised); border-bottom: 1px solid var(--border); font-size: 12px; }
2187 .search-group h3 { margin: 0; padding: 7px 10px; background: var(--bg-raised); border-bottom: 1px solid var(--border); font-size: calc(13.2px * var(--font-scale)); }
2067 2188 .search-group h3 a { color: var(--fg); }
2068 .search-lines td.code { font-family: var(--mono); font-size: 12px; white-space: pre-wrap; word-break: break-word; }
2069 .search-lines td.ln { width: 5ch; text-align: right; color: var(--fg-faint); font-family: var(--mono); font-size: 11px; }
2189 .search-lines td.code { font-family: var(--mono); font-size: calc(13.2px * var(--font-scale)); white-space: pre-wrap; word-break: break-word; }
2190 .search-lines td.ln { width: 5ch; text-align: right; color: var(--fg-faint); font-family: var(--mono); font-size: calc(12.1px * var(--font-scale)); }
2070 2191 .search-lines td.ln a { color: var(--fg-faint); }
2071 2192 .search-lines tr:hover td.ln a { color: var(--accent); }
2072 2193 @media (max-width: 720px) { .search-code { display: none; } }
@@ -2082,12 +2203,12 @@ textarea:focus-visible {
2082 2203 border-right: 1px solid var(--border);
2083 2204 background: var(--bg-raised);
2084 2205 vertical-align: top;
2085 font-size: 11.5px;
2206 font-size: calc(12.65px * var(--font-scale));
2086 2207 line-height: 1.45;
2087 2208 }
2088 .blame td.blame-meta .sha { font-size: 11px; }
2089 .blame td.ln { width: 6ch; text-align: right; color: var(--fg-faint); font-family: var(--mono); font-size: 11px; }
2090 .blame td.code { font-family: var(--mono); font-size: 12px; white-space: pre; }
2209 .blame td.blame-meta .sha { font-size: calc(12.1px * var(--font-scale)); }
2210 .blame td.ln { width: 6ch; text-align: right; color: var(--fg-faint); font-family: var(--mono); font-size: calc(12.1px * var(--font-scale)); }
2211 .blame td.code { font-family: var(--mono); font-size: calc(13.2px * var(--font-scale)); white-space: pre; }
2091 2212
2092 2213 /* ---------- landing page ---------- */
2093 2214
@@ -2105,13 +2226,13 @@ textarea:focus-visible {
2105 2226 }
2106 2227 .hero-main { min-width: 0; }
2107 2228 .hero h1 {
2108 font-size: 26px;
2229 font-size: calc(28.6px * var(--font-scale));
2109 2230 line-height: 1.2;
2110 2231 letter-spacing: -0.025em;
2111 2232 margin: 0 0 6px;
2112 2233 }
2113 .hero-tagline { color: var(--fg-muted); font-size: 13px; margin: 0 0 8px; max-width: 62ch; }
2114 .hero-vitals { color: var(--fg-faint); font: 11.5px/1.5 var(--mono); margin: 0; }
2234 .hero-tagline { color: var(--fg-muted); font-size: calc(14.3px * var(--font-scale)); margin: 0 0 8px; max-width: 62ch; }
2235 .hero-vitals { color: var(--fg-faint); font-family: var(--mono); font-size: calc(12.65px * var(--font-scale)); line-height: 1.5; margin: 0; }
2115 2236 .hero-vitals a { color: var(--fg-muted); }
2116 2237 .hero-actions { display: flex; flex: 0 0 auto; flex-wrap: wrap; align-items: center; gap: 8px; }
2117 2238
@@ -2122,7 +2243,7 @@ textarea:focus-visible {
2122 2243 align-items: start;
2123 2244 }
2124 2245 .home-main { min-width: 0; }
2125 .home-rail { position: sticky; top: 60px; }
2246 .home-rail { position: sticky; top: 16px; }
2126 2247 .section-head {
2127 2248 display: flex;
2128 2249 align-items: baseline;
@@ -2131,38 +2252,38 @@ textarea:focus-visible {
2131 2252 margin-bottom: 9px;
2132 2253 }
2133 2254 .section-head h2 { margin: 0; }
2134 .section-head .more { font-size: 11.5px; color: var(--fg-muted); }
2255 .section-head .more { font-size: calc(12.65px * var(--font-scale)); color: var(--fg-muted); }
2135 2256 .section-head .more:hover { color: var(--accent); }
2136 .section-head .muted { font-size: 11.5px; }
2257 .section-head .muted { font-size: calc(12.65px * var(--font-scale)); }
2137 2258
2138 2259 .repo-grid {
2139 2260 display: grid;
2140 grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
2141 gap: 10px;
2261 grid-template-columns: repeat(auto-fill, minmax(23rem, 1fr));
2262 gap: 12px;
2142 2263 }
2143 2264 .repo-card {
2144 2265 display: flex;
2145 2266 flex-direction: column;
2146 gap: 5px;
2267 gap: 6px;
2147 2268 min-width: 0;
2148 padding: 12px 13px;
2269 padding: 14px 16px;
2149 2270 background: var(--bg-panel);
2150 2271 border: 1px solid var(--border);
2151 2272 border-radius: var(--radius-lg);
2152 2273 }
2153 2274 .repo-card:hover { border-color: var(--border-strong); background: var(--bg-raised); }
2154 2275 .repo-card-top { display: flex; align-items: baseline; gap: 7px; min-width: 0; }
2155 .repo-card h3 { font-size: 13.5px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2276 .repo-card h3 { font-size: calc(14.85px * var(--font-scale)); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2156 2277 .repo-card h3 a { color: var(--fg); font-weight: 600; }
2157 2278 .repo-card h3 a:hover { color: var(--accent); text-decoration: none; }
2158 2279 .repo-vis { display: inline-flex; flex: 0 0 auto; color: var(--fg-faint); }
2159 2280 .repo-vis .icon { width: 12px; height: 12px; }
2160 .repo-lang { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; font-size: 10.5px; color: var(--fg-faint); }
2281 .repo-lang { display: inline-flex; align-items: center; gap: 4px; flex: 0 0 auto; font-size: calc(11.55px * var(--font-scale)); color: var(--fg-faint); }
2161 2282 .lang-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--fg-faint); }
2162 .repo-updated { margin-left: auto; flex: 0 0 auto; color: var(--fg-faint); font-size: 11px; }
2283 .repo-updated { margin-left: auto; flex: 0 0 auto; color: var(--fg-faint); font-size: calc(12.1px * var(--font-scale)); }
2163 2284 .repo-desc {
2164 2285 color: var(--fg-muted);
2165 font-size: 12px;
2286 font-size: calc(13.2px * var(--font-scale));
2166 2287 margin: 0;
2167 2288 overflow: hidden;
2168 2289 display: -webkit-box;
@@ -2175,15 +2296,15 @@ textarea:focus-visible {
2175 2296 gap: 2px 8px;
2176 2297 margin: 0;
2177 2298 color: var(--fg-faint);
2178 font-size: 11px;
2299 font-size: calc(12.1px * var(--font-scale));
2179 2300 min-width: 0;
2180 2301 }
2181 2302 .repo-meta .repo-subject { color: var(--fg-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
2182 .repo-meta .sha { font-size: 11px; color: var(--fg-faint); }
2303 .repo-meta .sha { font-size: calc(12.1px * var(--font-scale)); color: var(--fg-faint); }
2183 2304 .repo-chips { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 3px; }
2184 .repo-chips .chip { padding: 1px 7px; font-size: 10.5px; gap: 4px; }
2305 .repo-chips .chip { padding: 1px 7px; font-size: calc(11.55px * var(--font-scale)); gap: 4px; }
2185 2306 .repo-chips .chip .icon { width: 11px; height: 11px; }
2186 .repo-chips .status { font-size: 9.5px; letter-spacing: 0.03em; }
2307 .repo-chips .status { font-size: calc(10.45px * var(--font-scale)); letter-spacing: 0.03em; }
2187 2308 .repo-chips .status::before { width: 5px; height: 5px; }
2188 2309
2189 2310 .empty-state.first-run {
@@ -2204,13 +2325,13 @@ textarea:focus-visible {
2204 2325 color: var(--fg-faint);
2205 2326 }
2206 2327 .first-run .empty-icon .icon { width: 20px; height: 20px; }
2207 .first-run h2 { margin: 0 0 6px; font-size: 16px; color: var(--fg); }
2328 .first-run h2 { margin: 0 0 6px; font-size: calc(17.6px * var(--font-scale)); color: var(--fg); }
2208 2329 .first-run p { margin: 0 0 14px; }
2209 2330 .first-run .empty-actions { margin: 0 0 10px; }
2210 .first-run .empty-hint { margin: 0; font-size: 11.5px; color: var(--fg-faint); }
2211 .first-run .empty-hint code { font-size: 11px; }
2331 .first-run .empty-hint { margin: 0; font-size: calc(12.65px * var(--font-scale)); color: var(--fg-faint); }
2332 .first-run .empty-hint code { font-size: calc(12.1px * var(--font-scale)); }
2212 2333
2213 @media (max-width: 900px) {
2334 @media (max-width: 1040px) {
2214 2335 .home-grid { grid-template-columns: 1fr; }
2215 2336 .home-rail { position: static; order: 2; }
2216 2337 .home-main { order: 1; }
@@ -2218,7 +2339,7 @@ textarea:focus-visible {
2218 2339 @media (max-width: 720px) {
2219 2340 .hero { flex-wrap: wrap; align-items: flex-start; padding-top: 18px; }
2220 2341 .hero-actions { width: 100%; }
2221 .hero h1 { font-size: 22px; }
2342 .hero h1 { font-size: calc(24.2px * var(--font-scale)); }
2222 2343 .repo-grid { grid-template-columns: 1fr; }
2223 2344 }
2224 2345
@@ -2229,11 +2350,11 @@ textarea:focus-visible {
2229 2350 .status-tabs { margin-bottom: 14px; border-bottom: 1px solid var(--border); }
2230 2351 .status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 10px; margin: 14px 0; }
2231 2352 .status-grid .card { margin: 0; display: flex; flex-direction: column; gap: 4px; }
2232 .status-grid strong { font-size: 20px; font-weight: 600; font-variant-numeric: tabular-nums; }
2233 .status-note { color: var(--fg-muted); font-size: 11.5px; }
2234 .status-inventory { margin: 4px 0 18px; font-size: 12px; }
2353 .status-grid strong { font-size: calc(22px * var(--font-scale)); font-weight: 600; font-variant-numeric: tabular-nums; }
2354 .status-note { color: var(--fg-muted); font-size: calc(12.65px * var(--font-scale)); }
2355 .status-inventory { margin: 4px 0 18px; font-size: calc(13.2px * var(--font-scale)); }
2235 2356 .status-total td { font-weight: 600; border-top: 1px solid var(--border-strong); }
2236 .check-state { font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; }
2357 .check-state { font-size: calc(12.1px * var(--font-scale)); text-transform: uppercase; letter-spacing: 0.04em; }
2237 2358 .check-state.ok { color: var(--good); }
2238 2359 .check-state.warn { color: var(--warn); }
2239 2360 .check-state.fail { color: var(--bad); }
@@ -2245,7 +2366,7 @@ textarea:focus-visible {
2245 2366 .config-group td {
2246 2367 background: var(--bg-raised);
2247 2368 color: var(--fg-muted);
2248 font-size: 11px;
2369 font-size: calc(12.1px * var(--font-scale));
2249 2370 font-weight: 500;
2250 2371 letter-spacing: 0.04em;
2251 2372 text-transform: uppercase;