internal/web/static/style.css
307 lines · 9109 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 /* palette */
6 --bg: #ffffff;
7 --fg: #1f2328;
8 --muted: #667079;
9 --faint: #eceff1; /* hairlines, row separators */
10 --line: #d7dde2; /* control borders, card edges */
11 --surface: #f6f8fa; /* cards, code, table hover */
12 --accent: #0b6c80; /* sea blue: links, active tab, primary */
13 --accent-fg: #ffffff; /* text on accent */
14 --ok: #1a7f37;
15 --warn: #9a6700;
16 --bad: #cf222e;
17 --done: #8250df; /* merged */
18 --neutral: #667079;
19 --code-bg: #f6f8fa;
20
21 /* type */
22 --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
23 "Helvetica Neue", Arial, sans-serif;
24 --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas,
25 "Liberation Mono", monospace;
26 --fs-0: 0.8rem; /* 12.8px: chips, fine print */
27 --fs-1: 0.866rem; /* ~13px: metadata, mono in tables */
28 --fs-2: 0.933rem; /* 14px: dense table text */
29 --fs-3: 1rem; /* 15px: body */
30 --fs-4: 1.135rem; /* ~17px: h2 */
31 --fs-5: 1.335rem; /* ~20px: h1 */
32
33 /* spacing */
34 --sp-1: 0.25rem;
35 --sp-2: 0.5rem;
36 --sp-3: 0.75rem;
37 --sp-4: 1rem;
38 --sp-5: 1.5rem;
39 --sp-6: 2.5rem;
40
41 /* radii */
42 --r-sm: 4px;
43 --r-md: 6px;
44 --r-lg: 8px;
45 --r-pill: 999px;
46}
47@media (prefers-color-scheme: dark) {
48 :root {
49 --bg: #0d1117;
50 --fg: #e6edf3;
51 --muted: #8d96a0;
52 --faint: #1d242c;
53 --line: #30363d;
54 --surface: #161b22;
55 --accent: #58b7c9;
56 --accent-fg: #06272e;
57 --ok: #3fb950;
58 --warn: #d29922;
59 --bad: #f85149;
60 --done: #a371f7;
61 --neutral: #8d96a0;
62 --code-bg: #161b22;
63 }
64}
65
66* { box-sizing: border-box; }
67html { font-size: 15px; }
68body {
69 margin: 0;
70 background: var(--bg);
71 color: var(--fg);
72 font: var(--fs-3)/1.6 var(--sans);
73 min-height: 100vh;
74 display: flex;
75 flex-direction: column;
76}
77main { flex: 1; }
78
79a { color: var(--accent); text-decoration: none; }
80a:hover { text-decoration: underline; }
81
82h1 { font-size: var(--fs-5); font-weight: 600; line-height: 1.3;
83 margin: var(--sp-5) 0 var(--sp-3); letter-spacing: -0.01em; }
84h2 { font-size: var(--fs-4); font-weight: 600; line-height: 1.35;
85 margin: var(--sp-5) 0 var(--sp-3); }
86h3 { font-size: var(--fs-3); font-weight: 600; margin: var(--sp-5) 0 var(--sp-2); }
87
88code, pre, .code, td.mode, td.size {
89 font-family: var(--mono);
90 font-size: var(--fs-1);
91}
92
93/* layout */
94header {
95 border-bottom: 1px solid var(--faint);
96 padding: var(--sp-3) var(--sp-5);
97}
98a.site {
99 font-weight: 650;
100 color: var(--fg);
101 letter-spacing: -0.01em;
102 display: inline-flex;
103 align-items: center;
104 gap: var(--sp-2);
105}
106a.site:hover { text-decoration: none; color: var(--accent); }
107a.site svg.mark { display: block; }
108main {
109 max-width: 64rem;
110 margin: 0 auto;
111 padding: var(--sp-3) var(--sp-5) var(--sp-6);
112}
113
114/* tables */
115table { border-collapse: collapse; width: 100%; }
116td {
117 padding: var(--sp-2) var(--sp-4) var(--sp-2) 0;
118 border-bottom: 1px solid var(--faint);
119 vertical-align: top;
120 font-size: var(--fs-2);
121}
122td:last-child { padding-right: 0; }
123td.size, td.mode { color: var(--muted); white-space: nowrap; }
124
125/* repo header */
126.repohead { margin-bottom: var(--sp-4); }
127h1.repotitle { margin: var(--sp-4) 0 var(--sp-1); font-weight: 400; }
128h1.repotitle a { color: var(--fg); }
129h1.repotitle a:last-of-type { font-weight: 650; }
130h1.repotitle a:hover { color: var(--accent); text-decoration: none; }
131h1.repotitle .sep { color: var(--muted); margin: 0 0.15em; }
132.repohead .desc { margin: 0 0 var(--sp-2); }
133
134/* repo tabs */
135nav.tabs {
136 display: flex;
137 flex-wrap: wrap;
138 gap: var(--sp-1);
139 border-bottom: 1px solid var(--faint);
140 margin-top: var(--sp-3);
141}
142nav.tabs a {
143 color: var(--muted);
144 padding: var(--sp-1) var(--sp-2);
145 border-radius: var(--r-md) var(--r-md) 0 0;
146 border-bottom: 2px solid transparent;
147 margin-bottom: -1px;
148 font-size: var(--fs-2);
149}
150nav.tabs a:hover { color: var(--fg); background: var(--surface); text-decoration: none; }
151nav.tabs a.active { color: var(--fg); border-bottom-color: var(--accent); font-weight: 550; }
152
153p.clone code {
154 background: var(--surface);
155 border: 1px solid var(--faint);
156 padding: 0.15rem 0.5rem;
157 border-radius: var(--r-sm);
158}
159.crumbs { color: var(--muted); font-size: var(--fs-2); }
160.desc, td.desc { color: var(--muted); }
161.error { color: var(--bad); }
162
163/* cards: README, comments */
164.readme, .code {
165 border: 1px solid var(--faint);
166 border-radius: var(--r-lg);
167 padding: var(--sp-4) var(--sp-5);
168 margin-top: var(--sp-4);
169 overflow-x: auto;
170}
171/* chroma emits inline styles for a light background; pin code blocks to
172 light colors in both schemes so unstyled tokens stay legible. */
173.code { background: #f8f8f8; color: #1a1a1a; padding: var(--sp-3) var(--sp-4); }
174.code pre { margin: 0; background: transparent !important; }
175@media (prefers-color-scheme: dark) {
176 .code { border-color: var(--line); }
177}
178
179/* rendered markdown / org / html */
180.rendered { max-width: 100%; overflow-wrap: anywhere; }
181.rendered pre {
182 background: var(--code-bg);
183 border: 1px solid var(--faint);
184 padding: var(--sp-3) var(--sp-4);
185 border-radius: var(--r-md);
186 overflow-x: auto;
187}
188.rendered code { background: var(--code-bg); padding: 0.1rem 0.35rem; border-radius: var(--r-sm); }
189.rendered pre code { background: transparent; padding: 0; }
190.rendered blockquote {
191 border-left: 3px solid var(--line);
192 margin-left: 0;
193 padding-left: var(--sp-4);
194 color: var(--muted);
195}
196.rendered img { max-width: 100%; }
197.rendered h1, .rendered h2 { border-bottom: 1px solid var(--faint); padding-bottom: var(--sp-1); }
198
199pre.message {
200 background: var(--code-bg);
201 border: 1px solid var(--faint);
202 padding: var(--sp-3) var(--sp-4);
203 border-radius: var(--r-md);
204 white-space: pre-wrap;
205 overflow-wrap: anywhere;
206}
207
208/* diffs */
209pre.diff {
210 background: var(--code-bg);
211 border: 1px solid var(--faint);
212 padding: var(--sp-3) var(--sp-4);
213 border-radius: var(--r-md);
214 overflow-x: auto;
215 line-height: 1.5;
216}
217pre.diff .add { color: var(--ok); }
218pre.diff .del { color: var(--bad); }
219pre.diff .hunk { color: var(--accent); }
220pre.diff .meta { color: var(--muted); }
221
222/* badges: signature and check states. Semantic colors stay distinct:
223 green verified/success, amber pending/stale, red bad/failure, muted
224 unsigned. */
225.badge, .chip {
226 --chip: var(--neutral);
227 display: inline-block;
228 padding: 0.05rem 0.55rem;
229 border-radius: var(--r-pill);
230 font-size: var(--fs-0);
231 font-weight: 500;
232 line-height: 1.5;
233 color: var(--chip);
234 border: 1px solid color-mix(in srgb, var(--chip) 35%, transparent);
235 background: color-mix(in srgb, var(--chip) 7%, transparent);
236 white-space: nowrap;
237 vertical-align: middle;
238}
239.chip-open { --chip: var(--ok); }
240.chip-closed { --chip: var(--bad); }
241.chip-merged { --chip: var(--done); }
242.chip-neutral { --chip: var(--neutral); }
243.badge-verified { --chip: var(--ok); }
244.badge-unsigned { --chip: var(--neutral); }
245.badge-signed_unknown_key { --chip: var(--warn); }
246.badge-signed_email_mismatch { --chip: var(--bad); }
247.badge-signed_key_expired { --chip: var(--warn); }
248.badge-signed_key_revoked { --chip: var(--bad); }
249.badge-bad_signature { --chip: var(--bad); }
250.badge.check-success { --chip: var(--ok); }
251.badge.check-pending { --chip: var(--warn); }
252.badge.check-failure, .badge.check-error { --chip: var(--bad); }
253span.check-success { color: var(--ok); }
254span.check-pending { color: var(--warn); }
255span.check-failure, span.check-error { color: var(--bad); }
256
257/* review threads under diff lines */
258.thread {
259 border: 1px solid var(--faint);
260 border-left: 3px solid var(--accent);
261 border-radius: var(--r-md);
262 padding: var(--sp-2) var(--sp-4);
263 margin: var(--sp-2) 0 var(--sp-2) var(--sp-6);
264}
265.thread.resolved { border-left-color: var(--ok); opacity: 0.75; }
266.thread.stale { border-left-color: var(--warn); }
267
268/* forms */
269input, textarea, button, select { font: inherit; color: inherit; }
270input[type="text"], input:not([type]), textarea {
271 background: var(--bg);
272 border: 1px solid var(--line);
273 border-radius: var(--r-md);
274 padding: var(--sp-2) var(--sp-3);
275}
276textarea { width: 100%; resize: vertical; }
277input:focus, textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent); border-color: var(--accent); }
278button {
279 background: var(--accent);
280 color: var(--accent-fg);
281 border: none;
282 border-radius: var(--r-md);
283 padding: var(--sp-1) var(--sp-3);
284 font-weight: 500;
285 cursor: pointer;
286}
287button:hover { filter: brightness(1.08); }
288
289/* footer */
290footer {
291 max-width: 64rem;
292 margin: 0 auto;
293 padding: var(--sp-4) var(--sp-5);
294 border-top: 1px solid var(--faint);
295 color: var(--muted);
296 font-size: var(--fs-1);
297}
298footer p { margin: 0; }
299footer a { color: var(--muted); text-decoration: underline; }
300footer a:hover { color: var(--accent); }
301
302/* mobile */
303@media (max-width: 40rem) {
304 header { padding: var(--sp-3) var(--sp-4); }
305 main { padding: var(--sp-2) var(--sp-4) var(--sp-6); }
306 .thread { margin-left: var(--sp-3); }
307}