internal/web/static/style.css
872 lines · 27430 bytes
1/* gitbay stylesheet. One file, light and dark via prefers-color-scheme.
2 Tokens first; components use tokens only. No external requests. */
3
4:root {
5 /* declare native light+dark support: correct form controls and
6 scrollbars per scheme, and opt out of browser auto-darkening */
7 color-scheme: light dark;
8
9 /* palette */
10 --bg: #ffffff;
11 --fg: #1f2328;
12 --muted: #667079;
13 --faint: #eceff1; /* hairlines, row separators */
14 --line: #d7dde2; /* control borders, card edges */
15 --surface: #f6f8fa; /* cards, code, table hover */
16 --accent: #0000f0; /* blue: links, active tab, primary */
17 --accent-fg: #ffffff; /* text on accent */
18 --ok: #1a7f37;
19 --warn: #9a6700;
20 --bad: #cf222e;
21 --done: #8250df; /* merged */
22 --neutral: #667079;
23 --code-bg: #f6f8fa;
24
25 /* type */
26 --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
27 "Helvetica Neue", Arial, sans-serif;
28 --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas,
29 "Liberation Mono", monospace;
30 --fs-0: 0.8rem; /* 12.8px: chips, fine print */
31 --fs-1: 0.866rem; /* ~13px: metadata, mono in tables */
32 --fs-2: 0.933rem; /* 14px: dense table text */
33 --fs-3: 1rem; /* 15px: body */
34 --fs-4: 1.135rem; /* ~17px: h2 */
35 --fs-5: 1.335rem; /* ~20px: h1 */
36
37 /* spacing */
38 --sp-1: 0.25rem;
39 --sp-2: 0.5rem;
40 --sp-3: 0.75rem;
41 --sp-4: 1rem;
42 --sp-5: 1.5rem;
43 --sp-6: 2.5rem;
44
45 /* radii */
46 --r-sm: 4px;
47 --r-md: 6px;
48 --r-lg: 8px;
49 --r-pill: 999px;
50}
51@media (prefers-color-scheme: dark) {
52 :root {
53 --bg: #0d1117;
54 --fg: #e6edf3;
55 --muted: #8d96a0;
56 --faint: #1d242c;
57 --line: #30363d;
58 --surface: #161b22;
59 --accent: #8899ff;
60 --accent-fg: #0a1030;
61 --ok: #3fb950;
62 --warn: #d29922;
63 --bad: #f85149;
64 --done: #a371f7;
65 --neutral: #8d96a0;
66 --code-bg: #161b22;
67 }
68}
69
70* { box-sizing: border-box; }
71html { font-size: 15px; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
72body {
73 margin: 0;
74 background: var(--bg);
75 color: var(--fg);
76 font: var(--fs-3)/1.6 var(--sans);
77 min-height: 100vh;
78 display: flex;
79 flex-direction: column;
80}
81main { flex: 1; }
82
83a { color: var(--accent); text-decoration: none; }
84a:hover { text-decoration: underline; }
85
86h1 { font-size: var(--fs-5); font-weight: 600; line-height: 1.3;
87 margin: var(--sp-5) 0 var(--sp-3); letter-spacing: -0.01em; }
88h2 { font-size: var(--fs-4); font-weight: 600; line-height: 1.35;
89 margin: var(--sp-5) 0 var(--sp-3); }
90h3 { font-size: var(--fs-3); font-weight: 600; margin: var(--sp-5) 0 var(--sp-2); }
91
92code, pre, .code, td.mode, td.size {
93 font-family: var(--mono);
94 font-size: var(--fs-1);
95}
96
97/* layout: one shared container aligns header, content, and footer */
98.container {
99 max-width: 64rem;
100 margin: 0 auto;
101 padding: 0 var(--sp-5);
102}
103header {
104 border-bottom: 1px solid var(--faint);
105 padding: var(--sp-3) 0;
106}
107a.site {
108 font-weight: 650;
109 color: var(--fg);
110 letter-spacing: -0.01em;
111 display: inline-flex;
112 align-items: center;
113 gap: var(--sp-2);
114}
115a.site:hover { text-decoration: none; color: var(--accent); }
116a.site svg.mark { display: block; }
117nav.topnav {
118 display: flex;
119 align-items: center;
120 gap: var(--sp-4);
121}
122nav.topnav .spacer { flex: 1; }
123nav.topnav > a:not(.site) { color: var(--fg); font-size: var(--fs-2); }
124nav.topnav > a:not(.site):hover { color: var(--accent); text-decoration: none; }
125nav.topnav a.navuser { font-weight: 600; }
126nav.topnav button.linklike { color: var(--muted); }
127nav.topnav button.linklike:hover { color: var(--accent); text-decoration: none; }
128main.container {
129 width: 100%;
130 padding-top: var(--sp-3);
131 padding-bottom: var(--sp-6);
132}
133
134/* tables */
135table { border-collapse: collapse; width: 100%; }
136td {
137 padding: var(--sp-2) var(--sp-4) var(--sp-2) 0;
138 border-bottom: 1px solid var(--faint);
139 vertical-align: top;
140 font-size: var(--fs-2);
141}
142td:last-child { padding-right: 0; }
143td.size, td.mode { color: var(--muted); white-space: nowrap; }
144
145/* repo header */
146.repohead { margin-bottom: var(--sp-4); }
147h1.repotitle { margin: var(--sp-4) 0 var(--sp-1); font-weight: 400; }
148h1.repotitle a { color: var(--fg); }
149h1.repotitle a:last-of-type { font-weight: 650; }
150h1.repotitle a:hover { color: var(--accent); text-decoration: none; }
151h1.repotitle .sep { color: var(--muted); margin: 0 0.15em; }
152form.pinform { display: inline; margin-left: var(--sp-2); vertical-align: middle; }
153button.pinbtn {
154 background: none;
155 border: 1px solid var(--line);
156 border-radius: var(--r-pill);
157 color: var(--muted);
158 font-size: var(--fs-0);
159 padding: 0.05rem 0.55rem;
160 cursor: pointer;
161}
162button.pinbtn:hover { border-color: var(--accent); color: var(--accent); filter: none; }
163button.pinbtn.pinned { color: var(--accent); border-color: var(--accent); }
164a.chip.label:hover, a.chip.topic:hover { text-decoration: none; filter: brightness(1.15); }
165.repohead .desc { margin: 0 0 var(--sp-2); }
166
167/* repo tabs */
168nav.tabs {
169 display: flex;
170 flex-wrap: wrap;
171 gap: var(--sp-1);
172 border-bottom: 1px solid var(--faint);
173 margin-top: var(--sp-3);
174}
175nav.tabs a {
176 color: var(--muted);
177 padding: var(--sp-1) var(--sp-2);
178 border-radius: var(--r-md) var(--r-md) 0 0;
179 border-bottom: 2px solid transparent;
180 margin-bottom: -1px;
181 font-size: var(--fs-2);
182}
183nav.tabs a:hover { color: var(--fg); background: var(--surface); text-decoration: none; }
184nav.tabs a.active { color: var(--fg); border-bottom-color: var(--accent); font-weight: 550; }
185
186.clone { color: var(--muted); font-size: var(--fs-2); }
187.clone code {
188 background: var(--surface);
189 border: 1px solid var(--faint);
190 padding: 0.15rem 0.5rem;
191 border-radius: var(--r-sm);
192}
193
194/* path bar on tree and blob pages */
195.pathbar {
196 display: flex;
197 flex-wrap: wrap;
198 align-items: center;
199 gap: var(--sp-2) var(--sp-3);
200 margin: var(--sp-3) 0;
201 font-size: var(--fs-2);
202}
203.pathbar .spacer { flex: 1; }
204.refchip {
205 display: inline-flex;
206 align-items: center;
207 gap: 0.3rem;
208 background: var(--surface);
209 border: 1px solid var(--faint);
210 border-radius: var(--r-md);
211 padding: 0.1rem 0.55rem;
212 font-family: var(--mono);
213 font-size: var(--fs-1);
214 color: var(--fg);
215}
216.pathbar .crumbs strong { color: var(--fg); }
217details.refmenu { position: relative; }
218details.refmenu summary { cursor: pointer; list-style: none; }
219details.refmenu summary::-webkit-details-marker { display: none; }
220details.refmenu summary::after { content: " ▾"; color: var(--muted); }
221details.refmenu .refdrop {
222 position: absolute;
223 z-index: 10;
224 top: calc(100% + 4px);
225 left: 0;
226 min-width: 12rem;
227 max-height: 20rem;
228 overflow-y: auto;
229 background: var(--bg);
230 border: 1px solid var(--line);
231 border-radius: var(--r-md);
232 box-shadow: 0 4px 16px rgba(0,0,0,0.12);
233 padding: var(--sp-1) 0;
234}
235details.refmenu .refdrop a {
236 display: block;
237 padding: var(--sp-1) var(--sp-3);
238 color: var(--fg);
239 font-family: var(--mono);
240 font-size: var(--fs-1);
241}
242details.refmenu .refdrop a:hover { background: var(--surface); text-decoration: none; }
243details.refmenu .refdrop a.allrefs { color: var(--accent); font-family: var(--sans); border-top: 1px solid var(--faint); margin-top: var(--sp-1); }
244
245/* file and refs tables: bordered cards, rows inside */
246table.tree, table.refs {
247 border: 1px solid var(--line);
248 border-radius: var(--r-lg);
249 border-collapse: separate;
250 border-spacing: 0;
251 overflow: hidden;
252 margin-bottom: var(--sp-4);
253}
254table.tree td, table.refs td {
255 padding: var(--sp-2) var(--sp-4);
256 border-bottom: 1px solid var(--faint);
257}
258table.tree tr:last-child td, table.refs tr:last-child td { border-bottom: none; }
259table.tree tr:hover td, table.refs tr:hover td { background: var(--surface); }
260table.tree tr.cols th {
261 text-align: left;
262 font-weight: 500;
263 font-size: var(--fs-1);
264 color: var(--muted);
265 padding: var(--sp-1) var(--sp-4);
266 border-bottom: 1px solid var(--line);
267 background: var(--surface);
268}
269table.tree tr.cols:hover th { background: var(--surface); }
270table.tree th.size { text-align: right; }
271table.tree td.name { width: 100%; }
272table.tree td.name a { color: var(--fg); }
273table.tree td.name a:hover { color: var(--accent); }
274table.tree td.size { text-align: right; }
275table.tree td.empty, table.refs td.empty, li.empty, ul.loglist li.empty { color: var(--muted); }
276
277/* refs page */
278table.refs td.name { width: 100%; }
279table.refs td.sha { color: var(--muted); }
280
281/* card header (README) */
282.cardhead {
283 font-family: var(--mono);
284 font-size: var(--fs-1);
285 color: var(--muted);
286 border-bottom: 1px solid var(--faint);
287 margin: calc(-1 * var(--sp-4)) calc(-1 * var(--sp-5)) var(--sp-4);
288 padding: var(--sp-2) var(--sp-5);
289 background: var(--surface);
290 border-radius: var(--r-lg) var(--r-lg) 0 0;
291}
292
293/* log */
294ul.loglist {
295 list-style: none;
296 margin: var(--sp-3) 0;
297 padding: 0;
298 border: 1px solid var(--line);
299 border-radius: var(--r-lg);
300 overflow: hidden;
301}
302ul.loglist li {
303 display: flex;
304 align-items: baseline;
305 gap: var(--sp-3);
306 padding: var(--sp-2) var(--sp-4);
307 border-bottom: 1px solid var(--faint);
308}
309ul.loglist li:last-child { border-bottom: none; }
310ul.loglist li:hover { background: var(--surface); }
311ul.loglist .commitmain { flex: 1; min-width: 0; }
312ul.loglist p { margin: 0; }
313ul.loglist .subject a { color: var(--fg); font-weight: 550; }
314ul.loglist .subject a:hover { color: var(--accent); }
315ul.loglist .commitside {
316 display: flex;
317 align-items: baseline;
318 gap: var(--sp-2);
319 white-space: nowrap;
320}
321p.pager { margin-top: var(--sp-4); }
322
323/* commit page */
324.commithead p { margin: var(--sp-1) 0; }
325.commithead h2 { margin-bottom: var(--sp-1); }
326code.fullsha { color: var(--muted); overflow-wrap: anywhere; }
327.empty-note { color: var(--muted); }
328.crumbs { color: var(--muted); font-size: var(--fs-2); }
329.desc, td.desc { color: var(--muted); }
330.error { color: var(--bad); }
331.meta { color: var(--muted); font-size: var(--fs-1); }
332svg.icon { vertical-align: -0.125em; }
333.lede { font-size: var(--fs-3); margin: var(--sp-2) 0; }
334
335/* repo listings (explore, owner pages, dashboard): one row per repo */
336ul.repolist {
337 list-style: none;
338 margin: var(--sp-3) 0 var(--sp-5);
339 padding: 0;
340 border: 1px solid var(--line);
341 border-radius: var(--r-lg);
342 overflow: hidden;
343}
344ul.repolist li { padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--faint); }
345/* pinned repos: a compact wrap of name pills, no description or meta */
346ul.pinlist {
347 list-style: none;
348 margin: var(--sp-3) 0 var(--sp-5);
349 padding: 0;
350 display: flex;
351 flex-wrap: wrap;
352 gap: var(--sp-2);
353}
354ul.pinlist li {
355 border: 1px solid var(--line);
356 border-radius: var(--r-md);
357 padding: var(--sp-1) var(--sp-3);
358}
359ul.pinlist li:hover { background: var(--surface); }
360ul.pinlist li a { color: var(--fg); }
361ul.pinlist li a:hover { color: var(--accent); text-decoration: none; }
362ul.pinlist .sep { color: var(--muted); margin: 0 0.15em; }
363ul.repolist li:last-child { border-bottom: none; }
364ul.repolist li:hover { background: var(--surface); }
365ul.repolist li.empty { color: var(--muted); }
366ul.repolist p { margin: 0; }
367ul.repolist .reponame { font-size: var(--fs-3); }
368ul.repolist .reponame a { color: var(--fg); }
369ul.repolist .reponame a strong { color: var(--accent); font-weight: 600; }
370ul.repolist .reponame .sep { color: var(--muted); margin: 0 0.1em; }
371ul.repolist .desc { margin-top: 0.1rem; }
372ul.repolist .topics { margin-top: var(--sp-1); }
373ul.repolist .meta { margin-top: var(--sp-1); }
374
375/* owner profile header */
376.profilehead {
377 border-bottom: 1px solid var(--faint);
378 padding-bottom: var(--sp-4);
379 margin-bottom: var(--sp-4);
380}
381.profilehead h1 { margin: var(--sp-4) 0 var(--sp-1); }
382.profilehead .lede { margin: 0 0 var(--sp-1); }
383.profilehead .meta { margin: var(--sp-1) 0 0; }
384h2 .count { color: var(--muted); font-weight: 400; font-size: var(--fs-2); }
385
386/* activity graph: 53 week columns x 7 day rows, accent-tinted levels */
387.actgraph-scroll { overflow-x: auto; padding-bottom: var(--sp-1); }
388.actgraph { display: flex; gap: 3px; width: max-content; }
389.actweek { display: flex; flex-direction: column; gap: 3px; }
390.actday {
391 width: 11px;
392 height: 11px;
393 border-radius: 2px;
394 background: var(--faint);
395}
396.actday.pad { background: transparent; }
397.actday.l1 { background: color-mix(in srgb, var(--accent) 25%, var(--bg)); }
398.actday.l2 { background: color-mix(in srgb, var(--accent) 50%, var(--bg)); }
399.actday.l3 { background: color-mix(in srgb, var(--accent) 75%, var(--bg)); }
400.actday.l4 { background: var(--accent); }
401
402/* heading row with actions on the right */
403.headrow {
404 display: flex;
405 align-items: baseline;
406 gap: var(--sp-4);
407 flex-wrap: wrap;
408}
409.headrow .spacer { flex: 1; }
410
411/* member and org chips on owner pages */
412a.memberchip {
413 display: inline-block;
414 border: 1px solid var(--line);
415 border-radius: var(--r-pill);
416 padding: 0.05rem 0.6rem;
417 color: var(--fg);
418 font-size: var(--fs-1);
419 margin: 0 0.15rem 0.15rem 0;
420}
421a.memberchip:hover { text-decoration: none; border-color: var(--accent); color: var(--accent); }
422a.memberchip .role { color: var(--muted); }
423
424/* landing page */
425.landing { max-width: 44rem; padding: var(--sp-6) 0; }
426.landing h1 { font-size: 1.8rem; margin-bottom: var(--sp-3); }
427.landing .lede { font-size: var(--fs-4); color: var(--muted); line-height: 1.7; margin: 0 0 var(--sp-4); }
428pre.quickstart {
429 background: var(--code-bg);
430 border: 1px solid var(--faint);
431 border-radius: var(--r-md);
432 padding: var(--sp-3) var(--sp-4);
433 overflow-x: auto;
434 margin: 0 0 var(--sp-4);
435}
436.landing .explorelink { font-weight: 550; }
437
438/* index toolbar */
439p.toolbar { color: var(--muted); font-size: var(--fs-2); margin-top: var(--sp-4); }
440form.inline { display: inline; }
441button.linklike {
442 background: none;
443 border: none;
444 color: var(--accent);
445 padding: 0;
446 font: inherit;
447 font-size: var(--fs-2);
448 cursor: pointer;
449}
450button.linklike:hover { text-decoration: underline; filter: none; }
451
452/* cards: README, comments */
453.readme, .code {
454 border: 1px solid var(--faint);
455 border-radius: var(--r-lg);
456 padding: var(--sp-4) var(--sp-5);
457 margin-top: var(--sp-4);
458 overflow-x: auto;
459}
460/* chroma emits inline styles for a light background; pin code blocks to
461 light colors in both schemes so unstyled tokens stay legible. */
462.code { background: #f8f8f8; color: #1a1a1a; padding: var(--sp-3) var(--sp-4); color-scheme: light; }
463.code pre { margin: 0; background: transparent !important; }
464@media (prefers-color-scheme: dark) {
465 .code { border-color: var(--line); }
466}
467
468/* rendered markdown / org / html */
469.rendered { max-width: 100%; overflow-wrap: anywhere; }
470.rendered pre {
471 background: var(--code-bg);
472 border: 1px solid var(--faint);
473 padding: var(--sp-3) var(--sp-4);
474 border-radius: var(--r-md);
475 overflow-x: auto;
476}
477.rendered code { background: var(--code-bg); padding: 0.1rem 0.35rem; border-radius: var(--r-sm); }
478.rendered pre code { background: transparent; padding: 0; }
479.rendered blockquote {
480 border-left: 3px solid var(--line);
481 margin-left: 0;
482 padding-left: var(--sp-4);
483 color: var(--muted);
484}
485.rendered img { max-width: 100%; }
486.rendered h1, .rendered h2 { border-bottom: 1px solid var(--faint); padding-bottom: var(--sp-1); }
487.rendered table {
488 border-collapse: collapse;
489 margin: var(--sp-3) 0;
490 display: block;
491 max-width: 100%;
492 overflow-x: auto;
493}
494.rendered th, .rendered td {
495 border: 1px solid var(--line);
496 padding: var(--sp-1) var(--sp-3);
497 text-align: left;
498}
499.rendered th { background: var(--surface); font-weight: 600; }
500.blobimage { text-align: center; }
501.blobimage img {
502 max-width: 100%;
503 border: 1px solid var(--faint);
504 border-radius: var(--r-md);
505 background: var(--surface);
506}
507
508pre.message {
509 background: var(--code-bg);
510 border: 1px solid var(--faint);
511 padding: var(--sp-3) var(--sp-4);
512 border-radius: var(--r-md);
513 white-space: pre-wrap;
514 overflow-wrap: anywhere;
515}
516
517/* diffs */
518details.difffold summary {
519 cursor: pointer;
520 display: flex;
521 align-items: baseline;
522 gap: var(--sp-3);
523 margin: var(--sp-5) 0 var(--sp-2);
524 list-style: none;
525}
526details.difffold summary::-webkit-details-marker { display: none; }
527/* flex summaries lose the native disclosure marker; draw our own */
528details.difffold summary::before { content: "▸"; color: var(--muted); }
529details.difffold[open] summary::before { content: "▾"; }
530details.difffold summary h3 { display: inline; margin: 0; }
531details.difffold summary .add { color: var(--ok); }
532details.difffold summary .del { color: var(--bad); }
533pre.diff {
534 background: var(--code-bg);
535 border: 1px solid var(--faint);
536 padding: var(--sp-3) var(--sp-4);
537 border-radius: var(--r-md);
538 overflow-x: auto;
539 line-height: 1.5;
540}
541pre.diff .add { color: var(--ok); }
542pre.diff .del { color: var(--bad); }
543pre.diff .hunk { color: var(--accent); }
544pre.diff .meta { color: var(--muted); }
545
546/* badges: signature and check states. Semantic colors stay distinct:
547 green verified/success, amber pending/stale, red bad/failure, muted
548 unsigned. */
549.badge, .chip {
550 --chip: var(--neutral);
551 display: inline-block;
552 padding: 0.05rem 0.55rem;
553 border-radius: var(--r-pill);
554 font-size: var(--fs-0);
555 font-weight: 500;
556 line-height: 1.5;
557 color: var(--chip);
558 border: 1px solid color-mix(in srgb, var(--chip) 35%, transparent);
559 background: color-mix(in srgb, var(--chip) 7%, transparent);
560 white-space: nowrap;
561 vertical-align: middle;
562}
563.chip-open { --chip: var(--ok); }
564.chip-closed { --chip: var(--bad); }
565.chip-merged, .chip-done { --chip: var(--done); }
566.chip-neutral, .chip-source_gone { --chip: var(--neutral); }
567.chip-stale { --chip: var(--warn); }
568.chip.label { font-weight: 500; }
569.chip.topic { --chip: var(--accent); }
570.repohead .topics { margin: 0 0 var(--sp-2); }
571.repohead .mirrorline { margin: 0 0 var(--sp-2); }
572.mirrorerr { color: var(--bad); }
573.badge-verified { --chip: var(--ok); }
574.badge-unsigned { --chip: var(--neutral); }
575.badge-signed_unknown_key { --chip: var(--warn); }
576.badge-signed_email_mismatch { --chip: var(--bad); }
577.badge-signed_key_expired { --chip: var(--warn); }
578.badge-signed_key_revoked { --chip: var(--bad); }
579.badge-bad_signature { --chip: var(--bad); }
580.badge.check-success { --chip: var(--ok); }
581.badge.check-pending { --chip: var(--warn); }
582.badge.check-failure, .badge.check-error { --chip: var(--bad); }
583span.check-success { color: var(--ok); }
584span.check-pending { color: var(--warn); }
585span.check-failure, span.check-error { color: var(--bad); }
586
587/* issue and MR listings */
588.listhead {
589 display: flex;
590 align-items: baseline;
591 gap: var(--sp-4);
592 flex-wrap: wrap;
593}
594.listhead h2 { margin-bottom: var(--sp-2); }
595nav.filters { display: flex; gap: var(--sp-1); }
596nav.filters a {
597 color: var(--muted);
598 font-size: var(--fs-2);
599 padding: 0.05rem var(--sp-2);
600 border-radius: var(--r-pill);
601}
602nav.filters a:hover { color: var(--fg); background: var(--surface); text-decoration: none; }
603nav.filters a.active { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); }
604
605ul.issuelist {
606 list-style: none;
607 margin: var(--sp-2) 0;
608 padding: 0;
609 border: 1px solid var(--line);
610 border-radius: var(--r-lg);
611 overflow: hidden;
612}
613ul.issuelist li {
614 display: flex;
615 align-items: baseline;
616 gap: var(--sp-3);
617 padding: var(--sp-3) var(--sp-4);
618 border-bottom: 1px solid var(--faint);
619}
620ul.issuelist li:last-child { border-bottom: none; }
621ul.issuelist li:hover { background: var(--surface); }
622ul.issuelist li.empty { display: block; color: var(--muted); }
623ul.issuelist .issuemain { flex: 1; min-width: 0; }
624ul.issuelist p { margin: 0; }
625ul.issuelist .title a { color: var(--fg); font-weight: 550; }
626ul.issuelist .title a:hover { color: var(--accent); }
627
628/* releases */
629article.release {
630 border: 1px solid var(--line);
631 border-radius: var(--r-lg);
632 padding: var(--sp-3) var(--sp-4);
633 margin: var(--sp-4) 0;
634}
635.releasehead h3 { margin: 0 0 var(--sp-1); }
636.releasehead .meta { margin: 0 0 var(--sp-2); }
637table.assets { margin-top: var(--sp-2); }
638table.assets td.size { color: var(--muted); white-space: nowrap; text-align: right; }
639table.assets td.name { width: 100%; font-family: var(--mono); font-size: var(--fs-1); }
640
641/* milestones */
642ul.milestonelist {
643 list-style: none;
644 margin: var(--sp-2) 0;
645 padding: 0;
646 border: 1px solid var(--line);
647 border-radius: var(--r-lg);
648 overflow: hidden;
649}
650ul.milestonelist li { padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--faint); }
651ul.milestonelist li:last-child { border-bottom: none; }
652ul.milestonelist li.empty { color: var(--muted); }
653ul.milestonelist p { margin: 0; }
654ul.milestonelist .title { font-weight: 550; }
655.progress {
656 height: 6px;
657 background: var(--faint);
658 border-radius: var(--r-pill);
659 margin-top: var(--sp-2);
660 overflow: hidden;
661 max-width: 24rem;
662}
663.progress .bar { height: 100%; background: var(--ok); }
664.listhead .spacer { flex: 1; }
665
666/* issue / MR detail */
667h2.issuetitle { margin-bottom: var(--sp-1); font-size: var(--fs-5); }
668.issuenumber { color: var(--muted); font-weight: 400; }
669.issuemeta { color: var(--muted); font-size: var(--fs-2); margin-top: 0; }
670.review { font-size: var(--fs-2); }
671
672/* comment cards; discussion stays at a readable measure */
673article.comment, form.commentform {
674 max-width: 48rem;
675}
676article.comment {
677 border: 1px solid var(--faint);
678 border-radius: var(--r-lg);
679 margin: var(--sp-4) 0;
680}
681article.comment .commenthead {
682 background: var(--surface);
683 border-bottom: 1px solid var(--faint);
684 border-radius: var(--r-lg) var(--r-lg) 0 0;
685 padding: var(--sp-2) var(--sp-4);
686 font-size: var(--fs-2);
687}
688article.comment .commenthead .when { color: var(--muted); }
689article.comment .rendered { padding: 0 var(--sp-4); }
690article.comment .rendered > :first-child { margin-top: var(--sp-3); }
691article.comment .rendered > :last-child { margin-bottom: var(--sp-3); }
692form.commentform { margin: var(--sp-4) 0; }
693details.editbox { margin: var(--sp-2) 0; max-width: 48rem; }
694details.editbox summary { cursor: pointer; color: var(--muted); font-size: var(--fs-2); }
695details.editbox summary:hover { color: var(--accent); }
696details.editbox input[type="text"] { width: 100%; }
697.syscomment {
698 max-width: 48rem;
699 color: var(--muted);
700 font-size: var(--fs-2);
701 margin: var(--sp-3) 0;
702 padding-left: var(--sp-4);
703 border-left: 3px solid var(--faint);
704}
705.syscomment p { display: inline; margin: 0; }
706
707/* review threads under diff lines */
708.thread {
709 border: 1px solid var(--faint);
710 border-left: 3px solid var(--accent);
711 border-radius: var(--r-md);
712 padding: var(--sp-2) var(--sp-4);
713 margin: var(--sp-2) 0 var(--sp-2) var(--sp-6);
714}
715.thread.resolved { border-left-color: var(--ok); opacity: 0.75; }
716.thread.stale { border-left-color: var(--warn); }
717.thread p.commenthead { font-size: var(--fs-2); margin: var(--sp-2) 0 0; }
718.thread .when { color: var(--muted); }
719.thread .rendered p { margin: var(--sp-1) 0; }
720.thread .threadstate { color: var(--muted); font-size: var(--fs-1); margin: var(--sp-1) 0 0; }
721
722/* forms */
723input, textarea, button, select { font: inherit; color: inherit; }
724input[type="text"], input:not([type]), textarea {
725 background: var(--bg);
726 border: 1px solid var(--line);
727 border-radius: var(--r-md);
728 padding: var(--sp-2) var(--sp-3);
729}
730textarea { width: 100%; resize: vertical; }
731textarea[name="content"] { font-family: var(--mono); font-size: var(--fs-1); }
732input:focus, textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); border-color: var(--accent); }
733button {
734 background: var(--accent);
735 color: var(--accent-fg);
736 border: none;
737 border-radius: var(--r-md);
738 padding: var(--sp-1) var(--sp-3);
739 font-weight: 500;
740 cursor: pointer;
741}
742button:hover { filter: brightness(1.08); }
743
744/* 404 */
745.notfound { text-align: center; padding: var(--sp-6) 0; }
746.notfound .bigcode {
747 font-family: var(--mono);
748 font-size: 4rem;
749 color: var(--faint);
750 -webkit-text-stroke: 1px var(--line);
751 margin: 0;
752 line-height: 1;
753}
754.notfound h1 { margin-top: var(--sp-3); }
755
756/* footer */
757footer {
758 border-top: 1px solid var(--faint);
759 padding: var(--sp-4) 0;
760 color: var(--muted);
761 font-size: var(--fs-1);
762}
763footer p { margin: 0; }
764footer a { color: var(--muted); text-decoration: underline; }
765footer a:hover { color: var(--accent); }
766
767/* search */
768form.searchform {
769 display: flex;
770 gap: var(--sp-2);
771 margin: var(--sp-3) 0 var(--sp-4);
772}
773form.searchform input[type="search"] { flex: 1; max-width: 32rem; }
774form.searchform.compact { margin: 0; }
775form.searchform.compact input[type="search"] {
776 padding: var(--sp-1) var(--sp-3);
777 font-size: var(--fs-2);
778 min-width: 18rem;
779}
780ul.matchlist { list-style: none; margin: var(--sp-3) 0; padding: 0; }
781ul.matchlist li { margin-bottom: var(--sp-3); }
782ul.matchlist .matchpath { font-family: var(--mono); font-size: var(--fs-1); }
783pre.matchline {
784 background: var(--code-bg);
785 border: 1px solid var(--faint);
786 border-radius: var(--r-md);
787 padding: var(--sp-1) var(--sp-3);
788 margin: var(--sp-1) 0 0;
789 overflow-x: auto;
790}
791pre.matchline mark {
792 background: color-mix(in srgb, var(--warn) 25%, transparent);
793 color: inherit;
794 border-radius: 2px;
795}
796
797/* wiki */
798.wikilayout { display: flex; gap: var(--sp-5); align-items: flex-start; }
799.wikipage { flex: 1; min-width: 0; }
800.wikinav { flex: none; width: 13rem; padding-top: var(--sp-4); }
801.wikinav ul { list-style: none; margin: var(--sp-1) 0 var(--sp-4); padding: 0; }
802.wikinav li a { display: block; padding: 0.15rem 0; color: var(--fg); }
803.wikinav li a:hover { color: var(--accent); text-decoration: none; }
804.wikinav li a.active { color: var(--accent); font-weight: 550; }
805@media (max-width: 40rem) {
806 /* Column direction + the desktop align-items:flex-start lets .wikipage
807 take its content's intrinsic width, overflowing the viewport (and
808 triggering iOS font inflation). Stretch pins it to the container. */
809 .wikilayout { flex-direction: column; align-items: stretch; }
810 .wikinav { width: auto; padding-top: 0; }
811}
812
813/* blame */
814.blame {
815 border: 1px solid var(--line);
816 border-radius: var(--rad-2, 6px);
817 overflow: hidden;
818}
819.blamehunk {
820 display: flex;
821 gap: var(--sp-3);
822 border-top: 1px solid var(--line);
823 align-items: flex-start;
824}
825.blamehunk:first-child { border-top: none; }
826.blameinfo {
827 flex: none;
828 width: 17rem;
829 padding: var(--sp-2) var(--sp-3);
830 min-width: 0;
831}
832.blameinfo .subject {
833 margin: 0;
834 font-size: var(--fs-1);
835 white-space: nowrap;
836 overflow: hidden;
837 text-overflow: ellipsis;
838}
839.blameinfo .meta { margin: 0; font-size: var(--fs-1); color: var(--muted); }
840.blamecode {
841 flex: 1;
842 margin: 0;
843 padding: var(--sp-2) var(--sp-3) var(--sp-2) 0;
844 overflow-x: auto;
845 border-left: 1px solid var(--line);
846 align-self: stretch;
847}
848.lineno {
849 display: inline-block;
850 min-width: 3.5em;
851 padding-right: 1em;
852 text-align: right;
853 color: var(--muted);
854 user-select: none;
855}
856
857/* mobile */
858@media (max-width: 40rem) {
859 .container { padding-left: var(--sp-4); padding-right: var(--sp-4); }
860 main.container { padding-top: var(--sp-2); }
861 .repogrid { grid-template-columns: 1fr; }
862 .thread { margin-left: var(--sp-3); }
863 table.tree td.mode, table.tree th.mode { display: none; }
864 .readme, .code { padding: var(--sp-3); }
865 .blamehunk { flex-direction: column; gap: 0; }
866 .blameinfo { width: auto; }
867 .blamecode { border-left: none; padding-left: var(--sp-3); width: 100%; }
868 .cardhead {
869 margin: calc(-1 * var(--sp-3)) calc(-1 * var(--sp-3)) var(--sp-3);
870 padding: var(--sp-2) var(--sp-3);
871 }
872}