internal/web/static/style.css
640 lines · 18867 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: #0b6c80; /* sea 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: #58b7c9;
60 --accent-fg: #06272e;
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; }
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; }
117main.container {
118 width: 100%;
119 padding-top: var(--sp-3);
120 padding-bottom: var(--sp-6);
121}
122
123/* tables */
124table { border-collapse: collapse; width: 100%; }
125td {
126 padding: var(--sp-2) var(--sp-4) var(--sp-2) 0;
127 border-bottom: 1px solid var(--faint);
128 vertical-align: top;
129 font-size: var(--fs-2);
130}
131td:last-child { padding-right: 0; }
132td.size, td.mode { color: var(--muted); white-space: nowrap; }
133
134/* repo header */
135.repohead { margin-bottom: var(--sp-4); }
136h1.repotitle { margin: var(--sp-4) 0 var(--sp-1); font-weight: 400; }
137h1.repotitle a { color: var(--fg); }
138h1.repotitle a:last-of-type { font-weight: 650; }
139h1.repotitle a:hover { color: var(--accent); text-decoration: none; }
140h1.repotitle .sep { color: var(--muted); margin: 0 0.15em; }
141.repohead .desc { margin: 0 0 var(--sp-2); }
142
143/* repo tabs */
144nav.tabs {
145 display: flex;
146 flex-wrap: wrap;
147 gap: var(--sp-1);
148 border-bottom: 1px solid var(--faint);
149 margin-top: var(--sp-3);
150}
151nav.tabs a {
152 color: var(--muted);
153 padding: var(--sp-1) var(--sp-2);
154 border-radius: var(--r-md) var(--r-md) 0 0;
155 border-bottom: 2px solid transparent;
156 margin-bottom: -1px;
157 font-size: var(--fs-2);
158}
159nav.tabs a:hover { color: var(--fg); background: var(--surface); text-decoration: none; }
160nav.tabs a.active { color: var(--fg); border-bottom-color: var(--accent); font-weight: 550; }
161
162.clone { color: var(--muted); font-size: var(--fs-2); }
163.clone code {
164 background: var(--surface);
165 border: 1px solid var(--faint);
166 padding: 0.15rem 0.5rem;
167 border-radius: var(--r-sm);
168}
169
170/* path bar on tree and blob pages */
171.pathbar {
172 display: flex;
173 flex-wrap: wrap;
174 align-items: center;
175 gap: var(--sp-2) var(--sp-3);
176 margin: var(--sp-3) 0;
177 font-size: var(--fs-2);
178}
179.pathbar .spacer { flex: 1; }
180.refchip {
181 display: inline-flex;
182 align-items: center;
183 gap: 0.3rem;
184 background: var(--surface);
185 border: 1px solid var(--faint);
186 border-radius: var(--r-md);
187 padding: 0.1rem 0.55rem;
188 font-family: var(--mono);
189 font-size: var(--fs-1);
190 color: var(--fg);
191}
192.pathbar .crumbs strong { color: var(--fg); }
193
194/* file and refs tables: bordered cards, rows inside */
195table.tree, table.refs {
196 border: 1px solid var(--line);
197 border-radius: var(--r-lg);
198 border-collapse: separate;
199 border-spacing: 0;
200 overflow: hidden;
201 margin-bottom: var(--sp-4);
202}
203table.tree td, table.refs td {
204 padding: var(--sp-2) var(--sp-4);
205 border-bottom: 1px solid var(--faint);
206}
207table.tree tr:last-child td, table.refs tr:last-child td { border-bottom: none; }
208table.tree tr:hover td, table.refs tr:hover td { background: var(--surface); }
209table.tree td.name { width: 100%; }
210table.tree td.name a { color: var(--fg); }
211table.tree td.name a:hover { color: var(--accent); }
212table.tree td.size { text-align: right; }
213table.tree td.empty, table.refs td.empty, li.empty, ul.loglist li.empty { color: var(--muted); }
214
215/* refs page */
216table.refs td.name { width: 100%; }
217table.refs td.sha { color: var(--muted); }
218
219/* card header (README) */
220.cardhead {
221 font-family: var(--mono);
222 font-size: var(--fs-1);
223 color: var(--muted);
224 border-bottom: 1px solid var(--faint);
225 margin: calc(-1 * var(--sp-4)) calc(-1 * var(--sp-5)) var(--sp-4);
226 padding: var(--sp-2) var(--sp-5);
227 background: var(--surface);
228 border-radius: var(--r-lg) var(--r-lg) 0 0;
229}
230
231/* log */
232ul.loglist {
233 list-style: none;
234 margin: var(--sp-3) 0;
235 padding: 0;
236 border: 1px solid var(--line);
237 border-radius: var(--r-lg);
238 overflow: hidden;
239}
240ul.loglist li {
241 display: flex;
242 align-items: baseline;
243 gap: var(--sp-3);
244 padding: var(--sp-2) var(--sp-4);
245 border-bottom: 1px solid var(--faint);
246}
247ul.loglist li:last-child { border-bottom: none; }
248ul.loglist li:hover { background: var(--surface); }
249ul.loglist .commitmain { flex: 1; min-width: 0; }
250ul.loglist p { margin: 0; }
251ul.loglist .subject a { color: var(--fg); font-weight: 550; }
252ul.loglist .subject a:hover { color: var(--accent); }
253ul.loglist .commitside {
254 display: flex;
255 align-items: baseline;
256 gap: var(--sp-2);
257 white-space: nowrap;
258}
259p.pager { margin-top: var(--sp-4); }
260
261/* commit page */
262.commithead p { margin: var(--sp-1) 0; }
263.commithead h2 { margin-bottom: var(--sp-1); }
264code.fullsha { color: var(--muted); overflow-wrap: anywhere; }
265.empty-note { color: var(--muted); }
266.crumbs { color: var(--muted); font-size: var(--fs-2); }
267.desc, td.desc { color: var(--muted); }
268.error { color: var(--bad); }
269.meta { color: var(--muted); font-size: var(--fs-1); }
270svg.icon { vertical-align: -0.125em; }
271.lede { font-size: var(--fs-3); margin: var(--sp-2) 0; }
272
273/* repo listings (index, owner pages): responsive card grid */
274.repogrid {
275 display: grid;
276 grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
277 gap: var(--sp-3);
278 margin: var(--sp-3) 0 var(--sp-5);
279}
280.repogrid .empty { color: var(--muted); grid-column: 1 / -1; }
281.repocard {
282 display: flex;
283 flex-direction: column;
284 gap: var(--sp-1);
285 border: 1px solid var(--line);
286 border-radius: var(--r-lg);
287 padding: var(--sp-3) var(--sp-4);
288 min-width: 0;
289}
290.repocard p { margin: 0; }
291.repocard .reponame {
292 font-weight: 550;
293 overflow: hidden;
294 text-overflow: ellipsis;
295 white-space: nowrap;
296}
297.repocard .desc {
298 font-size: var(--fs-2);
299 display: -webkit-box;
300 -webkit-line-clamp: 2;
301 -webkit-box-orient: vertical;
302 overflow: hidden;
303}
304.repocard .meta { margin-top: auto; padding-top: var(--sp-1); }
305.repocard .reponame .sep { color: var(--muted); margin: 0 0.1em; }
306
307/* owner profile header */
308.profilehead {
309 border-bottom: 1px solid var(--faint);
310 padding-bottom: var(--sp-4);
311 margin-bottom: var(--sp-4);
312}
313.profilehead h1 { margin: var(--sp-4) 0 var(--sp-1); }
314.profilehead .lede { margin: 0 0 var(--sp-1); }
315.profilehead .meta { margin: var(--sp-1) 0 0; }
316h2 .count { color: var(--muted); font-weight: 400; font-size: var(--fs-2); }
317
318/* heading row with actions on the right */
319.headrow {
320 display: flex;
321 align-items: baseline;
322 gap: var(--sp-4);
323 flex-wrap: wrap;
324}
325.headrow .spacer { flex: 1; }
326
327/* member and org chips on owner pages */
328a.memberchip {
329 display: inline-block;
330 border: 1px solid var(--line);
331 border-radius: var(--r-pill);
332 padding: 0.05rem 0.6rem;
333 color: var(--fg);
334 font-size: var(--fs-1);
335 margin: 0 0.15rem 0.15rem 0;
336}
337a.memberchip:hover { text-decoration: none; border-color: var(--accent); color: var(--accent); }
338a.memberchip .role { color: var(--muted); }
339
340/* index toolbar */
341p.toolbar { color: var(--muted); font-size: var(--fs-2); margin-top: var(--sp-4); }
342form.inline { display: inline; }
343button.linklike {
344 background: none;
345 border: none;
346 color: var(--accent);
347 padding: 0;
348 font: inherit;
349 font-size: var(--fs-2);
350 cursor: pointer;
351}
352button.linklike:hover { text-decoration: underline; filter: none; }
353
354/* cards: README, comments */
355.readme, .code {
356 border: 1px solid var(--faint);
357 border-radius: var(--r-lg);
358 padding: var(--sp-4) var(--sp-5);
359 margin-top: var(--sp-4);
360 overflow-x: auto;
361}
362/* chroma emits inline styles for a light background; pin code blocks to
363 light colors in both schemes so unstyled tokens stay legible. */
364.code { background: #f8f8f8; color: #1a1a1a; padding: var(--sp-3) var(--sp-4); color-scheme: light; }
365.code pre { margin: 0; background: transparent !important; }
366@media (prefers-color-scheme: dark) {
367 .code { border-color: var(--line); }
368}
369
370/* rendered markdown / org / html */
371.rendered { max-width: 100%; overflow-wrap: anywhere; }
372.rendered pre {
373 background: var(--code-bg);
374 border: 1px solid var(--faint);
375 padding: var(--sp-3) var(--sp-4);
376 border-radius: var(--r-md);
377 overflow-x: auto;
378}
379.rendered code { background: var(--code-bg); padding: 0.1rem 0.35rem; border-radius: var(--r-sm); }
380.rendered pre code { background: transparent; padding: 0; }
381.rendered blockquote {
382 border-left: 3px solid var(--line);
383 margin-left: 0;
384 padding-left: var(--sp-4);
385 color: var(--muted);
386}
387.rendered img { max-width: 100%; }
388.rendered h1, .rendered h2 { border-bottom: 1px solid var(--faint); padding-bottom: var(--sp-1); }
389
390pre.message {
391 background: var(--code-bg);
392 border: 1px solid var(--faint);
393 padding: var(--sp-3) var(--sp-4);
394 border-radius: var(--r-md);
395 white-space: pre-wrap;
396 overflow-wrap: anywhere;
397}
398
399/* diffs */
400pre.diff {
401 background: var(--code-bg);
402 border: 1px solid var(--faint);
403 padding: var(--sp-3) var(--sp-4);
404 border-radius: var(--r-md);
405 overflow-x: auto;
406 line-height: 1.5;
407}
408pre.diff .add { color: var(--ok); }
409pre.diff .del { color: var(--bad); }
410pre.diff .hunk { color: var(--accent); }
411pre.diff .meta { color: var(--muted); }
412
413/* badges: signature and check states. Semantic colors stay distinct:
414 green verified/success, amber pending/stale, red bad/failure, muted
415 unsigned. */
416.badge, .chip {
417 --chip: var(--neutral);
418 display: inline-block;
419 padding: 0.05rem 0.55rem;
420 border-radius: var(--r-pill);
421 font-size: var(--fs-0);
422 font-weight: 500;
423 line-height: 1.5;
424 color: var(--chip);
425 border: 1px solid color-mix(in srgb, var(--chip) 35%, transparent);
426 background: color-mix(in srgb, var(--chip) 7%, transparent);
427 white-space: nowrap;
428 vertical-align: middle;
429}
430.chip-open { --chip: var(--ok); }
431.chip-closed { --chip: var(--bad); }
432.chip-merged, .chip-done { --chip: var(--done); }
433.chip-neutral, .chip-source_gone { --chip: var(--neutral); }
434.chip-stale { --chip: var(--warn); }
435.chip.label { font-weight: 500; }
436.chip.topic { --chip: var(--accent); }
437.repohead .topics { margin: 0 0 var(--sp-2); }
438.badge-verified { --chip: var(--ok); }
439.badge-unsigned { --chip: var(--neutral); }
440.badge-signed_unknown_key { --chip: var(--warn); }
441.badge-signed_email_mismatch { --chip: var(--bad); }
442.badge-signed_key_expired { --chip: var(--warn); }
443.badge-signed_key_revoked { --chip: var(--bad); }
444.badge-bad_signature { --chip: var(--bad); }
445.badge.check-success { --chip: var(--ok); }
446.badge.check-pending { --chip: var(--warn); }
447.badge.check-failure, .badge.check-error { --chip: var(--bad); }
448span.check-success { color: var(--ok); }
449span.check-pending { color: var(--warn); }
450span.check-failure, span.check-error { color: var(--bad); }
451
452/* issue and MR listings */
453.listhead {
454 display: flex;
455 align-items: baseline;
456 gap: var(--sp-4);
457 flex-wrap: wrap;
458}
459.listhead h2 { margin-bottom: var(--sp-2); }
460nav.filters { display: flex; gap: var(--sp-1); }
461nav.filters a {
462 color: var(--muted);
463 font-size: var(--fs-2);
464 padding: 0.05rem var(--sp-2);
465 border-radius: var(--r-pill);
466}
467nav.filters a:hover { color: var(--fg); background: var(--surface); text-decoration: none; }
468nav.filters a.active { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); }
469
470ul.issuelist {
471 list-style: none;
472 margin: var(--sp-2) 0;
473 padding: 0;
474 border: 1px solid var(--line);
475 border-radius: var(--r-lg);
476 overflow: hidden;
477}
478ul.issuelist li {
479 display: flex;
480 align-items: baseline;
481 gap: var(--sp-3);
482 padding: var(--sp-3) var(--sp-4);
483 border-bottom: 1px solid var(--faint);
484}
485ul.issuelist li:last-child { border-bottom: none; }
486ul.issuelist li:hover { background: var(--surface); }
487ul.issuelist li.empty { display: block; color: var(--muted); }
488ul.issuelist .issuemain { flex: 1; min-width: 0; }
489ul.issuelist p { margin: 0; }
490ul.issuelist .title a { color: var(--fg); font-weight: 550; }
491ul.issuelist .title a:hover { color: var(--accent); }
492
493/* issue / MR detail */
494h2.issuetitle { margin-bottom: var(--sp-1); font-size: var(--fs-5); }
495.issuenumber { color: var(--muted); font-weight: 400; }
496.issuemeta { color: var(--muted); font-size: var(--fs-2); margin-top: 0; }
497.review { font-size: var(--fs-2); }
498
499/* comment cards; discussion stays at a readable measure */
500article.comment, form.commentform {
501 max-width: 48rem;
502}
503article.comment {
504 border: 1px solid var(--faint);
505 border-radius: var(--r-lg);
506 margin: var(--sp-4) 0;
507}
508article.comment .commenthead {
509 background: var(--surface);
510 border-bottom: 1px solid var(--faint);
511 border-radius: var(--r-lg) var(--r-lg) 0 0;
512 padding: var(--sp-2) var(--sp-4);
513 font-size: var(--fs-2);
514}
515article.comment .commenthead .when { color: var(--muted); }
516article.comment .rendered { padding: 0 var(--sp-4); }
517article.comment .rendered > :first-child { margin-top: var(--sp-3); }
518article.comment .rendered > :last-child { margin-bottom: var(--sp-3); }
519form.commentform { margin: var(--sp-4) 0; }
520
521/* review threads under diff lines */
522.thread {
523 border: 1px solid var(--faint);
524 border-left: 3px solid var(--accent);
525 border-radius: var(--r-md);
526 padding: var(--sp-2) var(--sp-4);
527 margin: var(--sp-2) 0 var(--sp-2) var(--sp-6);
528}
529.thread.resolved { border-left-color: var(--ok); opacity: 0.75; }
530.thread.stale { border-left-color: var(--warn); }
531.thread p.commenthead { font-size: var(--fs-2); margin: var(--sp-2) 0 0; }
532.thread .when { color: var(--muted); }
533.thread .rendered p { margin: var(--sp-1) 0; }
534.thread .threadstate { color: var(--muted); font-size: var(--fs-1); margin: var(--sp-1) 0 0; }
535
536/* forms */
537input, textarea, button, select { font: inherit; color: inherit; }
538input[type="text"], input:not([type]), textarea {
539 background: var(--bg);
540 border: 1px solid var(--line);
541 border-radius: var(--r-md);
542 padding: var(--sp-2) var(--sp-3);
543}
544textarea { width: 100%; resize: vertical; }
545textarea[name="content"] { font-family: var(--mono); font-size: var(--fs-1); }
546input:focus, textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); border-color: var(--accent); }
547button {
548 background: var(--accent);
549 color: var(--accent-fg);
550 border: none;
551 border-radius: var(--r-md);
552 padding: var(--sp-1) var(--sp-3);
553 font-weight: 500;
554 cursor: pointer;
555}
556button:hover { filter: brightness(1.08); }
557
558/* 404 */
559.notfound { text-align: center; padding: var(--sp-6) 0; }
560.notfound .bigcode {
561 font-family: var(--mono);
562 font-size: 4rem;
563 color: var(--faint);
564 -webkit-text-stroke: 1px var(--line);
565 margin: 0;
566 line-height: 1;
567}
568.notfound h1 { margin-top: var(--sp-3); }
569
570/* footer */
571footer {
572 border-top: 1px solid var(--faint);
573 padding: var(--sp-4) 0;
574 color: var(--muted);
575 font-size: var(--fs-1);
576}
577footer p { margin: 0; }
578footer a { color: var(--muted); text-decoration: underline; }
579footer a:hover { color: var(--accent); }
580
581/* blame */
582.blame {
583 border: 1px solid var(--line);
584 border-radius: var(--rad-2, 6px);
585 overflow: hidden;
586}
587.blamehunk {
588 display: flex;
589 gap: var(--sp-3);
590 border-top: 1px solid var(--line);
591 align-items: flex-start;
592}
593.blamehunk:first-child { border-top: none; }
594.blameinfo {
595 flex: none;
596 width: 17rem;
597 padding: var(--sp-2) var(--sp-3);
598 min-width: 0;
599}
600.blameinfo .subject {
601 margin: 0;
602 font-size: var(--fs-1);
603 white-space: nowrap;
604 overflow: hidden;
605 text-overflow: ellipsis;
606}
607.blameinfo .meta { margin: 0; font-size: var(--fs-1); color: var(--muted); }
608.blamecode {
609 flex: 1;
610 margin: 0;
611 padding: var(--sp-2) var(--sp-3) var(--sp-2) 0;
612 overflow-x: auto;
613 border-left: 1px solid var(--line);
614 align-self: stretch;
615}
616.lineno {
617 display: inline-block;
618 min-width: 3.5em;
619 padding-right: 1em;
620 text-align: right;
621 color: var(--muted);
622 user-select: none;
623}
624
625/* mobile */
626@media (max-width: 40rem) {
627 .container { padding-left: var(--sp-4); padding-right: var(--sp-4); }
628 main.container { padding-top: var(--sp-2); }
629 .repogrid { grid-template-columns: 1fr; }
630 .thread { margin-left: var(--sp-3); }
631 table.tree td.mode { display: none; }
632 .readme, .code { padding: var(--sp-3); }
633 .blamehunk { flex-direction: column; gap: 0; }
634 .blameinfo { width: auto; }
635 .blamecode { border-left: none; padding-left: var(--sp-3); width: 100%; }
636 .cardhead {
637 margin: calc(-1 * var(--sp-3)) calc(-1 * var(--sp-3)) var(--sp-3);
638 padding: var(--sp-2) var(--sp-3);
639 }
640}