Skip to main content

max / makenotwork

24.6 KB · 618 lines History Blame Raw
1 /* ===========================================
2 RESPONSIVE, 768px (tablet)
3 =========================================== */
4
5 /* ==========================================================================
6 Git Source Browser
7 ========================================================================== */
8
9 .git-repo-header { margin-bottom: var(--gap-pane); }
10 /* The identity line, templated (`.git-repo-name`) and described
11 (`#git-repo-name`). The separator is punctuation the reader never presses,
12 so a described one is drawn here rather than said in the description. */
13 .git-repo-name,
14 #git-repo-name { font-size: var(--text-head); margin: 0 0 var(--gap-bound); }
15 .git-repo-name a,
16 #git-repo-name a { color: var(--content); text-decoration: none; }
17 .git-repo-name a:hover,
18 #git-repo-name a:hover { opacity: 0.6; }
19 .git-repo-name .sep { opacity: 0.3; margin: 0 var(--gap-bound); }
20 #git-repo-name .run { gap: 0; }
21 #git-repo-name .link + .link::before {
22 content: "/";
23 opacity: 0.3;
24 margin: 0 var(--gap-bound);
25 }
26 .git-repo-desc { opacity: 0.6; margin: 0 0 var(--gap-section); font-size: var(--text-note); }
27 .git-clone-url {
28 font-family: var(--font-mono);
29 font-size: var(--text-fine);
30 padding: var(--gap-peer) var(--gap-group);
31 background: var(--surface-overlay);
32 border: 1px solid var(--border);
33 border-radius: var(--radius-control);
34 display: inline-block;
35 user-select: all;
36 margin-bottom: var(--gap-section);
37 }
38 .git-linked-project { margin-top: var(--gap-peer); font-size: var(--text-note); }
39 .git-linked-project a { color: var(--content); }
40
41 /* Ref bar (branch/tag chooser + the places the repo has).
42
43 Described: `crate::quasi::widgets::git_nav` emits the region, the field and
44 the list, so these rules dress the renderer's own class names rather than
45 hand-written ones. The strip is a list drawn across, which is where "how a
46 set is laid out" has always lived. */
47 #git-nav { margin-bottom: var(--gap-section); font-size: var(--text-note); }
48 /* The run already lays out across and wraps; only the rhythm is the app's. */
49 #git-nav .run { gap: var(--gap-section); }
50 /* The label reads beside the control rather than over it: the bar is one line
51 and a stacked label would set its height. */
52 #git-nav .form-group {
53 display: flex;
54 align-items: center;
55 gap: var(--gap-peer);
56 margin: 0;
57 }
58 #git-nav .form-label { margin: 0; white-space: nowrap; }
59 #git-nav select.field {
60 width: auto;
61 font-family: var(--font-mono);
62 font-size: var(--text-fine);
63 padding: var(--gap-bound) var(--gap-peer);
64 border: 1px solid var(--border);
65 border-radius: var(--radius-control);
66 }
67 /* The strip is the list drawn across. Everything else about a list -- the
68 markers, the box -- is the design system's and is not restated here. */
69 #git-nav .list { display: flex; gap: var(--gap-section); }
70 #git-nav .row {
71 margin: 0;
72 padding: 0;
73 border: 0;
74 background: none;
75 }
76 #git-nav .row-activate { text-decoration: none; color: var(--content); opacity: 0.6; }
77 #git-nav .row-activate:hover,
78 #git-nav .row-current .row-activate { opacity: 1; }
79
80 /* Breadcrumb navigation */
81 .git-breadcrumb,
82 #git-breadcrumb {
83 font-family: var(--font-mono);
84 font-size: var(--text-note);
85 margin-bottom: var(--gap-section);
86 }
87 .git-breadcrumb a,
88 #git-breadcrumb a { color: var(--content); text-decoration: none; }
89 .git-breadcrumb a:hover,
90 #git-breadcrumb a:hover { text-decoration: underline; }
91 .git-breadcrumb .sep { opacity: 0.3; margin: 0 var(--gap-bound); }
92 /* The trail's separators, for `#git-repo-name`'s reason. `.text` is the last
93 crumb, which is the thing itself and goes nowhere. */
94 #git-breadcrumb .run { gap: 0; }
95 #git-breadcrumb .run > * + *::before,
96 #git-breadcrumb .run > * + * > .text::before {
97 content: "/";
98 opacity: 0.3;
99 margin: 0 var(--gap-bound);
100 }
101 #git-breadcrumb .text { display: inline; margin: 0; }
102
103 /* File tree table */
104 .git-tree { width: 100%; border-collapse: collapse; font-size: var(--text-note); }
105 .git-tree th {
106 text-align: left;
107 padding: var(--gap-peer) var(--gap-group);
108 border-bottom: 2px solid var(--border);
109 font-family: var(--font-mono);
110 font-size: var(--text-fine);
111 opacity: 0.5;
112 text-transform: uppercase;
113 }
114 .git-tree td { padding: var(--gap-peer) var(--gap-group); border-bottom: 1px solid var(--border); }
115 .git-tree tr:last-child td { border-bottom: none; }
116 .git-tree .icon { width: 1.5rem; text-align: center; opacity: 0.4; font-family: var(--font-mono); }
117 .tree-icon-dir { font-weight: 700; color: var(--content); }
118 .tree-icon-file { font-size: var(--text-note); }
119 .git-tree .name a { text-decoration: none; color: var(--content); }
120 .git-tree .name a:hover { text-decoration: underline; }
121 .git-tree .size {
122 text-align: right;
123 opacity: 0.5;
124 font-family: var(--font-mono);
125 font-size: var(--text-fine);
126 }
127 /* The same listing, described (`crate::quasi::git_browse`). `.git-tree` stays
128 because `repo.html` still writes it; the `col-` classes are the renderer's,
129 taken from the column names. The icon column is gone on purpose: it was one
130 character wide and said what the trailing slash on a directory's name
131 already said. */
132 #git-browse .table { font-size: var(--text-note); }
133 #git-browse .col-Name .cell-link { font-family: var(--font-mono); }
134 #git-browse .col-Size {
135 text-align: right;
136 opacity: 0.5;
137 font-family: var(--font-mono);
138 font-size: var(--text-fine);
139 }
140
141 /* README rendering */
142 .git-readme { margin-top: var(--gap-page); padding-top: var(--gap-pane); border-top: 1px solid var(--border); }
143 .git-readme h2 { font-size: var(--text-body); opacity: 0.5; margin-bottom: var(--gap-section); }
144 .git-readme-body { line-height: 1.6; }
145 .git-readme-body h1,
146 .git-readme-body h2,
147 .git-readme-body h3 { margin-top: var(--gap-pane); margin-bottom: var(--gap-peer); }
148 .git-readme-body pre {
149 background: var(--surface-overlay);
150 padding: var(--gap-section);
151 border-radius: var(--radius-control);
152 overflow-x: auto;
153 font-family: var(--font-mono);
154 font-size: var(--text-fine);
155 }
156 .git-readme-body code {
157 font-family: var(--font-mono);
158 font-size: var(--text-note);
159 background: var(--surface-overlay);
160 padding: var(--gap-bound);
161 border-radius: var(--radius-fine);
162 }
163 .git-readme-body pre code { background: none; padding: 0; }
164 .git-readme-body table { border-collapse: collapse; margin: var(--gap-section) 0; }
165 .git-readme-body th,
166 .git-readme-body td { border: 1px solid var(--border); padding: var(--gap-peer) var(--gap-group); }
167
168 /* The strip over a file: how big it is, and the other ways to read it.
169 Described (`crate::quasi::git_browse`, `crate::quasi::git_blame`). */
170 #git-file-header {
171 padding: var(--gap-peer) var(--gap-group);
172 background: var(--surface-overlay);
173 border: 1px solid var(--border);
174 border-bottom: none;
175 border-radius: var(--radius-control) var(--radius-control) 0 0;
176 font-size: var(--text-fine);
177 }
178 /* The described strip is a run, which lays out across already; what the app
179 still says is that the count and the links go to opposite ends. */
180 #git-file-header .run { justify-content: space-between; }
181 #git-file-header .text { margin: 0; font-family: var(--font-mono); opacity: 0.6; }
182 /* The design system's link colour and underline stand; what the strip adds is
183 that these read as file actions rather than as prose links. */
184 #git-file-header .link { font-family: var(--font-mono); opacity: 0.6; }
185 #git-file-header .link:hover { opacity: 1; }
186 /* The file view, described (`crate::quasi::git_browse`): a table of one row per
187 line, under the strip that names the file. The `col-` classes are the
188 renderer's. */
189 #git-browse .col-Line {
190 width: 1px;
191 white-space: nowrap;
192 text-align: right;
193 user-select: none;
194 opacity: 0.3;
195 font-family: var(--font-mono);
196 font-size: var(--text-fine);
197 border-right: 1px solid var(--border);
198 }
199 #git-browse .col-Line .cell-link { color: inherit; display: block; }
200 #git-browse .col-Line .cell-link:hover { opacity: 0.7; }
201 #git-browse .col-Code {
202 white-space: pre;
203 font-family: var(--font-mono);
204 font-size: var(--text-fine);
205 line-height: 1.5;
206 }
207 /* The line the address names. `data-value` rather than `:target`, since a row
208 identity is not an element id: `page-git-file.js` sets this. */
209 #git-browse .table-row.is-line { background: var(--highlight-faint); }
210 /* The strip and the table are one box: the strip rounds its top corners and
211 the table under it rounds the bottom two. Only the file view has a strip,
212 which is why this is a sibling rule and not one on the table. */
213 #git-file-header ~ .table {
214 border: 1px solid var(--border);
215 border-radius: 0 0 var(--radius-control) var(--radius-control);
216 overflow-x: auto;
217 }
218 #git-binary-notice {
219 padding: var(--gap-page);
220 text-align: center;
221 opacity: 0.5;
222 font-family: var(--font-mono);
223 font-size: var(--text-note);
224 border: 1px solid var(--border);
225 border-radius: 0 0 var(--radius-control) var(--radius-control);
226 }
227 #git-binary-notice .run { justify-content: center; }
228 #git-binary-notice .text { margin: 0; }
229
230 /* Syntax highlighting.
231 The class names are quasi-webview's, from `makeover_layout::Syntax::name`,
232 and the scope-to-class mapping is `src/git/mod.rs`'s `syntax_of` (quasi
233 `19d7602d`, 2026-09-02). It matched syntect's own emitted scopes until then,
234 which meant this file held half a mapping the server held the other half of.
235 The palette below it is unchanged and still fixed across all 31 themes.
236
237 Not scoped under `.git-file-content` any more: a code node is a code node
238 wherever it is drawn, and a fingerprint in a table or a clone URL in a
239 sentence wants the same colours as a line of a file. */
240 .lex-keyword { color: var(--syntax-keyword); }
241 .lex-string { color: var(--syntax-string); }
242 .lex-comment { color: var(--syntax-comment); font-style: italic; }
243 .lex-constant { color: var(--syntax-constant); }
244 .lex-entity { color: var(--syntax-entity); }
245 .lex-variable { color: var(--syntax-variable); }
246 .lex-support { color: var(--syntax-support); }
247
248 /* The element the runs sit in. `code` is quasi-webview's, and it is the whole
249 of what makes an inline literal read as one: a monospace face and the
250 whitespace kept. A block form (`<pre>`) inherits both from the browser. */
251 code.code {
252 font-family: var(--font-mono);
253 white-space: pre;
254 }
255
256 /* Commit list */
257 .git-commit-list { list-style: none; }
258 .git-commit { padding: var(--gap-section) 0; border-bottom: 1px solid var(--border); }
259 .git-commit:last-child { border-bottom: none; }
260 .git-commit-message { font-size: var(--text-note); margin: 0 0 var(--gap-bound); }
261 .git-commit-message .summary { font-weight: 600; }
262 .git-commit-meta {
263 font-family: var(--font-mono);
264 font-size: var(--text-fine);
265 opacity: 0.5;
266 display: flex;
267 gap: var(--gap-section);
268 flex-wrap: wrap;
269 }
270 .git-commit-oid { font-family: var(--font-mono); font-size: var(--text-fine); }
271 .git-commit-oid a { color: var(--content); text-decoration: none; }
272 .git-commit-oid a:hover { text-decoration: underline; }
273 .git-pagination {
274 display: flex;
275 justify-content: center;
276 gap: var(--gap-section);
277 margin-top: var(--gap-pane);
278 padding-top: var(--gap-section);
279 font-size: var(--text-note);
280 }
281 .git-pagination a { color: var(--content); text-decoration: none; }
282 .git-pagination a:hover { text-decoration: underline; }
283
284 /* Release items on repo page */
285 .git-release { margin-bottom: var(--gap-pane); padding: var(--gap-section); background: var(--surface-overlay); }
286 .git-release-title { margin: 0 0 var(--gap-bound); font-size: var(--text-lead); }
287 .git-release-title a { color: var(--content); text-decoration: none; }
288 .git-release-meta { font-size: var(--text-note); opacity: 0.6; margin-bottom: var(--gap-peer); }
289 .git-release-desc { font-size: var(--text-note); opacity: 0.8; margin-bottom: var(--gap-section); }
290 .git-release-versions { font-size: var(--text-fine); }
291 .git-release-version {
292 display: flex;
293 gap: var(--gap-section);
294 align-items: center;
295 padding: var(--gap-bound) 0;
296 border-top: 1px solid var(--border);
297 }
298 .git-release-version .version-number { font-family: var(--font-mono); }
299 .git-release-version .version-badge {
300 font-size: var(--text-fine);
301 padding: var(--gap-bound) var(--gap-peer);
302 background: var(--content);
303 color: var(--surface-page);
304 border-radius: var(--radius-fine);
305 }
306 .git-release-version .version-meta { opacity: 0.5; }
307
308 /* Git commit detail + diff */
309 /* The commit page, described (`crate::quasi::git_commit`). */
310 #git-commit-detail { margin-bottom: var(--gap-pane); }
311 /* The message, as it was written: a commit message's line breaks are the
312 author's and wrapping them away loses the shape of the thing. */
313 #git-commit-detail > .text {
314 font-family: var(--font-mono);
315 font-size: var(--text-note);
316 white-space: pre-wrap;
317 line-height: 1.5;
318 padding: var(--gap-section);
319 background: var(--surface-overlay);
320 border: 1px solid var(--border);
321 margin-bottom: var(--gap-section);
322 }
323 /* Trailers, lifted out of the message body and shown as what they are. Rows
324 here rather than a `dl`: the description says a list of pairs and the grid is
325 this sheet's reading of it. */
326 #git-commit-detail > .list { font-size: var(--text-note); margin-bottom: var(--gap-section); }
327 #git-commit-detail > .list .row {
328 display: grid;
329 grid-template-columns: max-content 1fr;
330 gap: var(--gap-bound) var(--gap-section);
331 }
332 #git-commit-detail > .list .row-primary { opacity: 0.6; }
333 #git-commit-detail > .list .row-meta { font-family: var(--font-mono); font-size: var(--text-fine); }
334 #git-commit-detail-meta { font-size: var(--text-note); opacity: 0.7; line-height: 1.8; }
335 #git-commit-detail-meta .text { margin: 0; }
336 #git-commit-oid .code { font-size: var(--text-fine); word-break: break-all; }
337 #git-commit-parents .link { font-family: var(--font-mono); }
338 /* Tags, with the annotation an annotated tag carries */
339 .git-tag-list { list-style: none; }
340 .git-tag { padding: var(--gap-section) 0; border-bottom: 1px solid var(--border); }
341 .git-tag:last-child { border-bottom: none; }
342 .git-tag-name { font-size: var(--text-note); font-weight: 600; margin: 0 0 var(--gap-bound); }
343 .git-tag-name a { color: var(--content); text-decoration: none; }
344 .git-tag-name a:hover { text-decoration: underline; }
345 .git-tag-lightweight { font-weight: 400; font-size: var(--text-fine); opacity: 0.5; }
346 .git-tag-message {
347 font-family: var(--font-mono);
348 font-size: var(--text-note);
349 white-space: pre-wrap;
350 line-height: 1.5;
351 padding: var(--gap-peer) var(--gap-section);
352 border-left: 2px solid var(--border);
353 margin-bottom: var(--gap-bound);
354 }
355 .git-tag-meta {
356 font-family: var(--font-mono);
357 font-size: var(--text-fine);
358 opacity: 0.5;
359 display: flex;
360 gap: var(--gap-section);
361 flex-wrap: wrap;
362 }
363 .git-tag-meta a { color: var(--content); text-decoration: none; }
364 .git-tag-meta a:hover { text-decoration: underline; }
365 /* Signature state. Neutral by default: only a bad signature gets a colour. */
366 .git-signature { font-size: var(--text-fine); opacity: 0.7; }
367 .git-signature a { color: var(--content); }
368 .git-signature.is-verified { opacity: 1; }
369 .git-signature.is-bad { color: var(--danger); opacity: 1; }
370 /* refs/replace/*: object substitutions, listed but not applied while browsing */
371 .git-replace-intro { padding-bottom: var(--gap-section); font-size: var(--text-note); }
372 .git-replace-intro p { margin: 0; }
373 .git-replace-notice {
374 font-size: var(--text-note);
375 border-left: 2px solid var(--border);
376 padding: var(--gap-peer) var(--gap-section);
377 margin: 0 0 var(--gap-section);
378 }
379 .git-replace-table { width: 100%; border-collapse: collapse; font-size: var(--text-note); }
380 .git-replace-table th {
381 text-align: left;
382 font-weight: 400;
383 opacity: 0.5;
384 font-size: var(--text-fine);
385 padding: var(--gap-bound) var(--gap-section) var(--gap-bound) 0;
386 border-bottom: 1px solid var(--border);
387 }
388 .git-replace-table td { padding: var(--gap-peer) var(--gap-section) var(--gap-peer) 0; border-bottom: 1px solid var(--border); }
389 .git-replace-table a { color: var(--content); text-decoration: none; }
390 .git-replace-table a:hover { text-decoration: underline; }
391 /* Git notes (refs/notes/*) shown against the object they annotate.
392
393 Described: `crate::quasi::widgets::git_notes` emits the panel, so these rules
394 dress the renderer's classes. The body is the one part that is still the
395 app's own markup -- it comes out of docengine already -- and it keeps
396 `.git-note-body`, which the annotations panel writes too. */
397 #notes { margin-bottom: var(--gap-pane); }
398 #notes > .region {
399 border: 1px solid var(--border);
400 border-left: 2px solid var(--content);
401 margin-bottom: var(--gap-section);
402 }
403 /* The header is the note's leading row: the namespace on the left and where it
404 came from on the right. The auto margin is what puts it there; the shipped
405 rule used `space-between` on a header that held its own elements. */
406 #notes > .region > .region .run {
407 padding: var(--gap-peer) var(--gap-section);
408 border-bottom: 1px solid var(--border);
409 font-size: var(--text-fine);
410 }
411 #notes > .region > .region .run > :first-child { margin-right: auto; }
412 #notes .text { margin: 0; opacity: 0.6; }
413 .git-note-namespaces {
414 display: flex;
415 flex-wrap: wrap;
416 gap: var(--gap-group);
417 padding: var(--gap-section) 0;
418 border-bottom: 1px solid var(--border);
419 margin-bottom: var(--gap-section);
420 font-size: var(--text-note);
421 }
422 .git-note-namespaces a { color: var(--content); text-decoration: none; opacity: 0.6; }
423 .git-note-namespaces a:hover { opacity: 1; }
424 .git-note-namespaces a.is-selected { opacity: 1; text-decoration: underline; }
425 .git-note-target-kind { opacity: 0.6; }
426 .git-notes-fetch { padding-bottom: var(--gap-section); font-size: var(--text-note); }
427 .git-notes-fetch p { margin: 0 0 var(--gap-peer); }
428 .git-note-feed-cap { font-size: var(--text-fine); opacity: 0.6; padding-top: var(--gap-section); }
429 .git-note-search {
430 display: flex;
431 flex-wrap: wrap;
432 align-items: center;
433 gap: var(--gap-group);
434 padding-bottom: var(--gap-section);
435 font-size: var(--text-note);
436 }
437 .git-note-search input[type="search"] { flex: 1 1 16rem; }
438 .git-note-search label { display: flex; align-items: center; gap: var(--gap-bound); opacity: 0.8; }
439 .git-note-excerpt {
440 margin: var(--gap-bound) 0 0;
441 font-size: var(--text-note);
442 opacity: 0.7;
443 }
444 .git-note-paging {
445 display: flex;
446 gap: var(--gap-group);
447 align-items: center;
448 padding-top: var(--gap-section);
449 font-size: var(--text-note);
450 }
451 .git-note-paging span { font-size: var(--text-fine); opacity: 0.6; }
452 .git-note-feed-link { padding-top: var(--gap-peer); font-size: var(--text-fine); }
453 .git-note-badge {
454 font-size: var(--text-fine);
455 padding: var(--gap-bound) var(--gap-peer);
456 border: 1px solid var(--border);
457 border-radius: var(--radius-fine);
458 color: var(--content);
459 text-decoration: none;
460 opacity: 0.7;
461 }
462 .git-note-badge:hover { opacity: 1; }
463 .git-note-body { padding: var(--gap-section); font-size: var(--text-note); }
464 .git-note-body > :first-child { margin-top: 0; }
465 .git-note-body > :last-child { margin-bottom: 0; }
466 /* Writing a note. Only rendered for a reader who can push. */
467 /* The write halves and the reader's own annotations, described. `#annotation`
468 is the reader's own note on this commit, which lives in their annotation
469 repository rather than in the one being browsed; `#annotations` is the
470 read-only panel above it. */
471 #git-notes-edit,
472 #annotation,
473 #annotations {
474 border-top: 1px solid var(--border);
475 padding-top: var(--gap-section);
476 margin-bottom: var(--gap-pane);
477 }
478 #git-notes-edit textarea,
479 #annotation textarea { font-family: var(--font-mono); font-size: var(--text-note); }
480 #git-notes-edit .form { margin-bottom: var(--gap-section); }
481 #git-notes-edit .button { margin-bottom: var(--gap-pane); }
482 #annotations .heading { font-size: var(--text-note); margin: 0 0 var(--gap-peer); }
483 #annotations > .text { font-size: var(--text-note); color: var(--content-muted); }
484 /* A merge notice: what is on screen is not exactly what was typed. */
485 #git-notes-edit > .text[data-tone="warning"],
486 #annotation > .text[data-tone="warning"] {
487 border-left: 2px solid var(--content);
488 padding: var(--gap-peer) var(--gap-section);
489 margin-bottom: var(--gap-section);
490 font-size: var(--text-note);
491 }
492 .git-annotations-privacy,
493 .git-annotations-empty,
494 .git-annotations-count { font-size: var(--text-note); color: var(--content-muted); }
495 .git-annotations-list { list-style: none; margin: 0; padding: 0; }
496 .git-annotation-entry {
497 border: 1px solid var(--border);
498 padding: var(--gap-section);
499 margin-bottom: var(--gap-section);
500 }
501 .git-annotation-header {
502 display: flex;
503 gap: var(--gap-peer);
504 flex-wrap: wrap;
505 align-items: baseline;
506 font-size: var(--text-note);
507 margin-bottom: var(--gap-peer);
508 }
509 .git-annotation-target,
510 .git-annotation-namespace,
511 .git-annotation-when { font-family: var(--font-mono); color: var(--content-muted); }
512 .git-annotation-orphan { font-size: var(--text-note); color: var(--content-muted); }
513 /* The diff, described (`crate::quasi::git_commit`). `19d7602d`: a row says
514 which side it is on through `data-change`, and the sign is drawn here rather
515 than written into the content, so a terminal can spell it its own way. */
516 #git-diff-stats {
517 font-size: var(--text-note);
518 padding: var(--gap-section) 0;
519 margin-bottom: var(--gap-section);
520 border-bottom: 1px solid var(--border);
521 }
522 #git-diff-stats .text { margin: 0; }
523 #git-diff-stats .text[data-tone="success"] { color: var(--diff-add); }
524 #git-diff-stats .text[data-tone="danger"] { color: var(--diff-del); }
525 #git-commit [id^="diff-"] { margin-bottom: var(--gap-pane); border: 1px solid var(--border); }
526 #git-commit [id^="diff-header-"] {
527 padding: var(--gap-peer) var(--gap-section);
528 background: var(--surface-overlay);
529 border-bottom: 1px solid var(--border);
530 border-radius: 0;
531 font-size: var(--text-note);
532 }
533 /* The counts sit at the far end, as `.git-diff-file-stats` did with its auto
534 margin. */
535 #git-commit [id^="diff-header-"] .link + .cell-drops-next { margin-left: auto; }
536 #git-commit [id^="diff-header-"] .text { margin: 0; font-size: var(--text-fine); }
537 #git-commit [id^="diff-header-"] .text[data-tone="success"] { color: var(--diff-add); }
538 #git-commit [id^="diff-header-"] .text[data-tone="danger"] { color: var(--diff-del); }
539 #git-commit [id^="diff-"] .table {
540 font-family: var(--font-mono);
541 font-size: var(--text-fine);
542 border: 0;
543 }
544 #git-commit [id^="diff-"] .col-Old,
545 #git-commit [id^="diff-"] .col-New {
546 text-align: right;
547 opacity: 0.35;
548 user-select: none;
549 }
550 #git-commit [id^="diff-"] .col-Line { white-space: pre-wrap; word-break: break-all; }
551 /* The hunk header: the one row of the table that is on neither side. */
552 #git-commit [id^="diff-"] .table-row:not([data-change]) .col-Line {
553 background: var(--highlight-faint);
554 opacity: 0.6;
555 }
556 #git-commit [id^="diff-"] .table-row[data-change="added"] { background: var(--diff-add-bg); }
557 #git-commit [id^="diff-"] .table-row[data-change="removed"] { background: var(--diff-del-bg); }
558 /* The sign, drawn rather than said. `::before` on the line cell, so it lands in
559 the gutter the origin column used to be. */
560 #git-commit [id^="diff-"] .table-row[data-change] .col-Line::before {
561 display: inline-block;
562 width: 1ch;
563 margin-right: var(--gap-bound);
564 user-select: none;
565 }
566 #git-commit [id^="diff-"] .table-row[data-change="added"] .col-Line::before {
567 content: "+";
568 color: var(--diff-add);
569 }
570 #git-commit [id^="diff-"] .table-row[data-change="removed"] .col-Line::before {
571 content: "-";
572 color: var(--diff-del);
573 }
574 #git-commit [id^="diff-"] .table-row[data-change="context"] .col-Line::before { content: " "; }
575
576 /* Git blame view */
577 /* Git blame view, described (`crate::quasi::git_blame`). The `col-` classes are
578 the renderer's, taken from the column names the description gives. */
579 #git-blame .table {
580 border: 1px solid var(--border);
581 border-radius: 0 0 var(--radius-control) var(--radius-control);
582 font-size: var(--text-fine);
583 }
584 #git-blame .cell { font-family: var(--font-mono); }
585 #git-blame .cell-link { color: var(--content); text-decoration: none; }
586 #git-blame .cell-link:hover { text-decoration: underline; }
587 #git-blame .col-Author { opacity: 0.5; }
588 #git-blame .col-Date { opacity: 0.35; }
589 #git-blame .col-Line { text-align: right; opacity: 0.35; user-select: none; }
590 #git-blame .col-Code { white-space: pre; }
591
592 /* The two repository listings, /git and /git/{owner}, moved to the description
593 layer. Both were a <ul> of two-line entries with a visibility chip; both are
594 a `Node::Table` now, so which column carries the identity and which can be
595 dropped on a narrow viewport is stated rather than left to wrapping, and the
596 chip is a `Tag` on a cell. */
597
598 .git-file-log-label {
599 font-family: var(--font-mono);
600 font-size: var(--text-fine);
601 opacity: 0.5;
602 margin-right: var(--gap-bound);
603 }
604
605 /* Site-wide footer */
606 .site-footer {
607 margin-top: var(--gap-page);
608 padding: var(--gap-page) 0;
609 text-align: center;
610 font-family: var(--font-mono);
611 font-size: var(--text-fine);
612 opacity: 0.5;
613 }
614 .site-footer-links { margin-bottom: var(--gap-peer); }
615 .site-footer-links a { margin: 0 var(--gap-section); color: inherit; text-decoration: none; }
616 .site-footer-links a:hover { text-decoration: underline; }
617
618