char/sorcery

static-files based git repo viewer

git clone https://git.t4t.associates/char/sorcery

Charlotte Somset text-size-adjust6f745f9

main
18.8 KiB711 linesraw
1@font-face {
2  font-family: "InterVariable";
3  src: local("Inter Variable"), local("InterVariable"), url("/fonts/inter/InterVariable.woff2") format("woff2");
4  font-weight: 100 900;
5  font-style: normal;
6  font-display: swap;
7}
8@font-face {
9  font-family: "InterVariable";
10  src: local("Inter Variable Italic"), local("InterVariableItalic"), url("/fonts/inter/InterVariable-Italic.woff2") format("woff2");
11  font-weight: 100 900;
12  font-style: italic;
13  font-display: swap;
14}
15@font-face {
16  font-family: "Ioskeley";
17  src: local("Ioskeley Mono"), local("Ioskeley-Mono"), url("/fonts/ioskeley/IoskeleyMono-Regular.woff2") format("woff2");
18  font-weight: 400;
19  font-style: normal;
20  font-display: swap;
21}
22@font-face {
23  font-family: "Ioskeley";
24  src: local("Ioskeley Mono Medium"), local("Ioskeley-Mono-Medium"), url("/fonts/ioskeley/IoskeleyMono-Medium.woff2") format("woff2");
25  font-weight: 500;
26  font-style: normal;
27  font-display: swap;
28}
29@font-face {
30  font-family: "Ioskeley";
31  src: local("Ioskeley Mono Semibold"), local("Ioskeley-Mono-Semibold"), url("/fonts/ioskeley/IoskeleyMono-SemiBold.woff2") format("woff2");
32  font-weight: 600;
33  font-style: normal;
34  font-display: swap;
35}
36
37/* palette & syntax colours lifted from char.lt */
38:root {
39  --bg-col: #100e11;
40  --bg-col-2: #181419;
41  --bg-col-3: #211a22;
42
43  --fg-col: #f3eef2;
44  --fg-col-mute: #958792;
45
46  --accent-col: #ff9df5;
47  --accent-col-mute-1: #b86caf;
48  --accent-col-mute-2: #493045;
49  --accent-col-fade-1: #ffd0fb;
50
51  --hl-comment: #9da8bb;
52  --hl-keyword: #9bedff;
53  --hl-builtin: #ff94d1;
54  --hl-string: #95ffc3;
55  --hl-ident: #d8a8ff;
56  --hl-number: var(--hl-string);
57
58  --font-mono: "Ioskeley", ui-monospace, "SF Mono", "Cascadia Code", "Roboto Mono", monospace;
59}
60
61* {
62  box-sizing: border-box;
63}
64
65html {
66  color-scheme: dark;
67  font-family: "InterVariable", "Inter", sans-serif;
68  line-height: 1.5;
69  text-rendering: optimizeLegibility;
70  background: var(--bg-col);
71  color: var(--fg-col);
72}
73
74body {
75  max-width: 64rem;
76  margin: 0 auto;
77  padding: 1.5rem 1.25rem 4rem;
78}
79
80::selection {
81  background-color: #6d3567;
82}
83
84/* type scale: 0.75 / 0.875 / 1 / 1.5 / 1.75rem. Ioskeley has a larger
85   x-height than Inter, so mono sits a step down to read as the same size. */
86h1 { font-size: 1.75rem; font-weight: 520; margin: 0 0 0.75em; line-height: 1.08; }
87h1:has(+ .desc) { margin-bottom: 0.25em; }
88h2 { font-size: 1.5rem; font-weight: 650; margin-top: 2rem; }
89/* repositories page: user headings sit directly on their list */
90h2:has(+ .catalog) { margin-bottom: 0; }
91
92pre, code, kbd, .code, .cid, .sha, .path, table.diff, table.commit-meta td {
93  font-family: var(--font-mono);
94  font-size: 0.875rem;
95  font-weight: 500;
96}
97pre, table.diff {
98  -webkit-text-size-adjust: 100%;
99  text-size-adjust: 100%;
100}
101time { font-variant-numeric: tabular-nums; }
102
103/* chrome links are bare and signal with colour; only prose underlines */
104a { color: var(--accent-col); text-decoration: none; }
105a:hover { color: var(--accent-col-fade-1); }
106.readme a {
107  text-decoration: underline;
108  text-decoration-thickness: 1px;
109  text-underline-offset: 0.2em;
110}
111
112progress { accent-color: var(--accent-col); }
113
114noscript .callout {
115  margin: 0 0 1.5rem;
116  padding: 0.6rem 1rem;
117  background: var(--bg-col-2);
118  border: 1px solid var(--accent-col-mute-2);
119  color: var(--fg-col-mute);
120  font-size: 0.875rem;
121  
122  p { margin: 0; }
123}
124
125/* ref switcher (static only), crumbs, stats, actions;
126   its rule separates the chrome from the content below */
127.topbar {
128  display: flex;
129  flex-wrap: wrap;
130  gap: 0.75rem;
131  align-items: center;
132  margin: 0 0 1.5rem;
133  padding: 0 0 0.75rem;
134  border-bottom: 1px solid var(--accent-col-mute-2);
135  font-size: 0.875rem;
136}
137.topbar:has(+ .languages) { margin-bottom: 0; border-bottom: none; }
138.topbar nav.crumbs { margin: 0; white-space: nowrap; overflow-x: auto; }
139.topbar > .actions {
140  display: flex;
141  gap: 0.75rem;
142  margin-left: auto;
143  white-space: nowrap;
144}
145.topbar > .actions:empty { display: none; }
146
147a.back {
148  display: inline-block;
149  margin-bottom: 0.75rem;
150  color: var(--fg-col-mute);
151}
152a.back:hover { color: var(--accent-col); }
153
154details.switcher { position: relative; }
155details.switcher > summary {
156  list-style: none;
157  cursor: pointer;
158  background: var(--bg-col-2);
159  border: 1px solid var(--accent-col-mute-2);
160  padding: 0.2em 0.75em;
161  font-weight: 650;
162}
163details.switcher > summary::-webkit-details-marker { display: none; }
164details.switcher > summary::after { content: " ▾"; color: var(--fg-col-mute); }
165details.switcher[open] > summary { background: var(--bg-col-3); }
166details.switcher > .menu {
167  position: absolute;
168  z-index: 1;
169  top: calc(100% + 0.25rem);
170  left: 0;
171  min-width: 14rem;
172  max-height: 60vh;
173  overflow-y: auto;
174  background: var(--bg-col-2);
175  border: 1px solid var(--accent-col-mute-2);
176  padding: 0.4rem 0;
177  display: flex;
178  flex-direction: column;
179}
180details.switcher > .menu strong {
181  padding: 0.3rem 0.75rem 0.1rem;
182  color: var(--fg-col-mute);
183  font-size: 0.75rem;
184  text-transform: uppercase;
185  letter-spacing: 0.05em;
186}
187details.switcher > .menu a {
188  padding: 0.15rem 0.75rem;
189  color: var(--fg-col);
190  white-space: nowrap;
191}
192details.switcher > .menu a:hover { background: var(--accent-col-mute-2); }
193details.switcher > .menu a.current { color: var(--accent-col); font-weight: 650; }
194details.switcher > .menu a.all { color: var(--fg-col-mute); margin-top: 0.25rem; }
195
196nav.crumbs { color: var(--fg-col-mute); }
197nav.crumbs .cur { color: var(--fg-col); }
198
199.view-stats {
200  display: inline-flex;
201  align-items: center;
202  gap: 0.75rem;
203  color: var(--fg-col-mute);
204  white-space: nowrap;
205}
206.snapshot-commit {
207  display: flex;
208  align-items: baseline;
209  flex-wrap: wrap;
210  gap: 0.4rem;
211  margin: 0 0 0.75rem;
212  color: var(--fg-col-mute);
213  font-size: 0.875rem;
214}
215.view-stats > span + span::before {
216  content: "";
217  width: 3px;
218  height: 3px;
219  border: 1.5px solid var(--fg-col-mute);
220  border-radius: 50%;
221  background: var(--fg-col-mute);
222}
223.view-stats > span {
224  display: inline-flex;
225  align-items: center;
226  gap: 0.75rem;
227}
228.snapshot-commit .commit-message { color: var(--fg-col); }
229.snapshot-commit a.commit-message:hover { color: var(--accent-col); }
230.snapshot-sha {
231  margin-left: auto;
232  padding: 0.1em 0.55em;
233  background: var(--bg-col-2);
234  color: var(--fg-col-mute);
235}
236a.snapshot-sha:hover { color: var(--accent-col); }
237.history-status { min-height: 1.3rem; margin-top: 0; }
238.history-log { margin-top: 0.25rem; }
239.history-log .deleted { color: var(--hl-builtin); }
240@media (max-width: 760px) {
241  .snapshot-sha { margin-left: 0; }
242}
243.meta {
244  display: flex;
245  align-items: center;
246  gap: 0.75rem;
247  color: var(--fg-col-mute);
248  font-size: 0.875rem;
249}
250
251/* Small circle separators between adjacent segments, as tangled. The
252   segments are inline-flex so the dot centres geometrically against the
253   text; vertical-align can't do this portably. */
254.meta > span,
255.who > * {
256  display: inline-flex;
257  align-items: center;
258}
259.meta > span + span::before,
260.who > * + *::before,
261nav.crumbs > .label::before {
262  content: "";
263  width: 3px;
264  height: 3px;
265  border: 1.5px solid var(--fg-col-mute);
266  border-radius: 50%;
267  background: var(--fg-col-mute);
268  margin-right: 0.75rem;
269}
270nav.crumbs > .label::before {
271  display: inline-block;
272  vertical-align: middle;
273  margin: 0 0.75rem;
274}
275.desc { color: var(--fg-col-mute); margin: 0; }
276
277/* repo header: name and description beside the clone command, which is
278   read once and shouldn't outweigh them */
279header.repo {
280  display: grid;
281  grid-template-columns: minmax(50%, 1fr) auto;
282  gap: 1rem 2rem;
283  align-items: center;
284  margin: 0 0 1.5rem;
285}
286@media (max-width: 760px) {
287  header.repo { grid-template-columns: 1fr; }
288}
289
290/* root pages: file listing beside the recent-commits log */
291/* columns stretch to the row height so the divider spans it fully */
292.overview {
293  display: grid;
294  grid-template-columns: repeat(2, minmax(0, 1fr));
295}
296/* structural boundary: stronger than the per-row rules, like .readme's */
297.overview > .files {
298  padding-right: 1.25rem;
299  border-right: 1px solid var(--accent-col-mute-1);
300}
301.overview > .commits {
302  padding-left: 1.25rem;
303}
304@media (max-width: 920px) {
305  .overview { grid-template-columns: minmax(0, 1fr); gap: 2rem; }
306  .overview > .files { padding-right: 0; border-right: 0; }
307  .overview > .commits { padding-left: 0; }
308}
309
310/* the overview owns its divider from a following readme, so the readme's
311   margin sits below the line rather than above it */
312.overview:has(+ .readme) {
313  padding-bottom: 1.5rem;
314  border-bottom: 1px solid var(--accent-col-mute-1);
315}
316.overview + .readme {
317  margin-top: 1.5rem;
318  border-top: 0;
319  padding-top: 0;
320}
321
322.overview h2,
323h2.file-heading {
324  margin: 0 0 0.25rem;
325  font-size: 0.875rem;
326  font-weight: 650;
327  color: var(--fg-col-mute);
328  text-align: right;
329}
330.overview h2 > a { color: inherit; }
331.overview h2 > a:hover { color: var(--accent-col); }
332ol.log { list-style: none; margin: 0; padding: 0; }
333ol.log li {
334  padding: 0.4rem 0;
335  border-top: 1px solid var(--accent-col-mute-2);
336}
337ol.log .cid { color: var(--hl-ident); }
338ol.log .sha { color: var(--fg-col-mute); }
339ol.log a:is(.cid, .sha):hover { color: var(--accent-col); }
340ol.log .msg { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
341ol.log .who {
342  float: right;
343  display: inline-flex;
344  align-items: center;
345  gap: 0.5rem;
346  color: var(--fg-col-mute);
347  font-size: 0.875rem;
348}
349ol.log .who > * + *::before { margin-right: 0.5rem; }
350/* hold ten two-line rows so paging doesn't shift the readme below */
351.overview > .commits > ol.log.paginated:not(.exhausted) {
352  min-height: calc(10 * (2lh + 0.8rem + 1px));
353}
354.log-pagination { justify-content: space-between; margin: 0.4rem 0 0; }
355button.log-page-button {
356  appearance: none;
357  border: 0;
358  padding: 0;
359  background: none;
360  color: var(--accent-col);
361  font: inherit;
362  cursor: pointer;
363}
364button.log-page-button:hover { color: var(--accent-col-fade-1); }
365button.log-page-button:disabled { color: var(--fg-col-mute); cursor: default; }
366
367.catalog {
368  margin: 0;
369  padding: 0;
370  list-style: none;
371}
372.catalog a {
373  display: grid;
374  grid-template-columns: minmax(10rem, 1fr) minmax(0, 4fr);
375  gap: 0.75rem;
376  width: 100%;
377  padding: 0.25rem 0;
378  border-top: 1px solid var(--accent-col-mute-2);
379}
380.catalog .msg { color: var(--fg-col-mute); }
381.catalog a:hover { background: var(--bg-col-2); }
382.catalog a:focus-visible { outline: 1px solid var(--accent-col); outline-offset: 2px; }
383@media (max-width: 35rem) {
384  .catalog a { grid-template-columns: 1fr; gap: 0; }
385}
386
387table.list { border-collapse: collapse; width: 100%; }
388/* rows carry their top edge: a line under the heading, none after the last row */
389table.list td {
390  padding: 0.25rem 0.75rem 0.25rem 0;
391  border-top: 1px solid var(--accent-col-mute-2);
392}
393table.list td.size, table.list td.date {
394  color: var(--fg-col-mute);
395  text-align: right;
396  white-space: nowrap;
397  font-variant-numeric: tabular-nums;
398}
399table.list td.msg { color: var(--fg-col-mute); }
400
401/* blob view: each logical line shares a grid row with its number, so wrapped
402   source makes that row taller without displacing the following numbers */
403pre.code {
404  display: grid;
405  grid-template-columns: max-content minmax(0, 1fr);
406  margin: 0;
407  padding: 1rem 0;
408  background: var(--bg-col-2);
409  border-left: 2px solid var(--accent-col-mute-1);
410  line-height: 1.45;
411}
412.code-line { display: contents; }
413.code-break {
414  position: absolute;
415  width: 0;
416  height: 0;
417  overflow: hidden;
418}
419pre.code .ln {
420  padding-left: 0.75rem;
421  padding-right: 0.6rem;
422  text-align: right;
423  color: var(--fg-col-mute);
424  user-select: none;
425  border-right: 1px solid var(--accent-col-mute-2);
426}
427pre.code a.ln:hover { color: var(--fg-col); }
428pre.code a.ln:target { color: var(--accent-col); font-weight: 600; }
429.code-text {
430  min-width: 0;
431  min-height: 1lh;
432  padding-left: 1rem;
433  padding-right: 1rem;
434  white-space: pre-wrap;
435  overflow-wrap: anywhere;
436}
437
438/* markdown blob pages: no-JS rendered/code tabs */
439.markdown-view {
440  display: grid;
441  grid-template-columns: repeat(2, max-content) 1fr;
442  gap: 0 0.25rem;
443}
444.markdown-view > input {
445  position: absolute;
446  width: 1px;
447  height: 1px;
448  opacity: 0;
449}
450.markdown-view > label {
451  cursor: pointer;
452  padding: 0.2em 0.75em;
453  border: 1px solid var(--accent-col-mute-2);
454  color: var(--fg-col-mute);
455}
456.markdown-view > input:focus-visible + label { outline: 2px solid var(--accent-col); }
457.markdown-view > input:checked + label {
458  color: var(--accent-col);
459  background: var(--bg-col-2);
460  border-color: var(--accent-col-mute-1);
461  font-weight: 650;
462}
463.markdown-view > .rendered,
464.markdown-view > .code-panel {
465  display: none;
466  grid-column: 1 / -1;
467}
468#markdown-rendered:checked ~ .rendered,
469#markdown-code:checked ~ .code-panel { display: block; }
470.markdown-view > .readme { margin-top: 1rem; }
471.markdown-view > .code-panel { margin-top: 1rem; }
472
473.readme {
474  width: 100%;
475  margin-top: 2.5rem;
476  border-top: 1px solid var(--accent-col-mute-1);
477  padding-top: 0.5rem;
478  overflow-wrap: anywhere;
479}
480/* a readme's own title sits under the page h1, so its headings step down */
481.readme h1 { font-size: 1.5rem; font-weight: 650; }
482.readme h2 { font-size: 1.25rem; }
483.readme pre {
484  background: var(--bg-col-2);
485  border-left: 2px solid var(--accent-col-mute-1);
486  padding: 1rem;
487  overflow-x: auto;
488  line-height: 1.45;
489}
490.readme code {
491  background: var(--bg-col-2);
492  padding: 0.125em 0.25em;
493  margin: 0 0.125em;
494  font-size: 0.875em;
495}
496.readme pre code { background: none; padding: 0; margin: 0; font-size: inherit; }
497.readme img { max-width: 100%; }
498.readme blockquote {
499  border-left: 2px solid var(--accent-col-mute-1);
500  margin: 1.5rem 0;
501  padding-left: 1rem;
502  color: var(--fg-col-mute);
503}
504.readme table { border-collapse: collapse; }
505.readme th, .readme td { border: 1px solid var(--accent-col-mute-2); padding: 0.25rem 0.6rem; }
506
507/* right-aligned in the header, so the accent rule sits on the outer edge */
508pre.clone {
509  margin: 0;
510  background: var(--bg-col-2);
511  border: 1px solid var(--accent-col-mute-2);
512  border-right: 2px solid var(--accent-col-mute-1);
513  padding: 0.6rem 1rem;
514  overflow-x: auto;
515}
516
517.languages { margin: 0 0 1.5rem; }
518.languages summary {
519  display: flex;
520  gap: 2px;
521  height: 0.5rem;
522  overflow: hidden;
523  cursor: pointer;
524  list-style: none;
525}
526.languages summary::-webkit-details-marker { display: none; }
527.languages summary > span:not(.language-label) { display: block; }
528.languages .language-label {
529  position: absolute;
530  width: 1px;
531  height: 1px;
532  overflow: hidden;
533  clip-path: inset(50%);
534}
535.languages ul {
536  display: flex;
537  flex-wrap: wrap;
538  gap: 0.5rem 1.25rem;
539  margin: 0;
540  padding: 0.5rem 0 0;
541  list-style: none;
542}
543.languages li { display: flex; align-items: center; gap: 0.4rem; font-size: 0.875rem; }
544.languages li i { width: 0.65rem; height: 0.65rem; border-radius: 50%; }
545.languages li small { color: var(--fg-col-mute); }
546.languages li a { color: inherit; }
547.languages li a:hover { color: var(--accent-col); }
548
549/* client-rendered commit view, laid out like tangled's commit page. the
550   subject and body read as one block; the metadata table and the diff each
551   sit a full step below */
552.commit-view .commit-subject { margin: 0.25rem 0 0; }
553.commit-view .commit-body {
554  white-space: pre-wrap;
555  font: inherit;
556  color: var(--fg-col-mute);
557  margin: 0.5rem 0 0;
558}
559
560table.commit-meta {
561  border-collapse: collapse;
562  margin-top: 1.5rem;
563  font-size: 0.875rem;
564}
565table.commit-meta th {
566  text-align: left;
567  font-weight: 400;
568  color: var(--fg-col-mute);
569  padding: 0.05rem 1.5rem 0.05rem 0;
570  vertical-align: top;
571}
572table.commit-meta td { word-break: break-all; }
573
574.add-count { color: var(--hl-string); }
575.del-count { color: var(--hl-builtin); }
576.diffstat { margin: 1.5rem 0 0; }
577
578.commit-view .status.added { color: var(--hl-string); }
579.commit-view .status.deleted { color: var(--hl-builtin); }
580.commit-view .status.modified { color: var(--fg-col-mute); }
581
582.file-diff {
583  margin-top: 0.75rem;
584  border: 1px solid var(--accent-col-mute-2);
585}
586.file-diff + .file-diff { margin-top: 1.5rem; }
587.file-diff > summary {
588  display: flex;
589  align-items: baseline;
590  gap: 0.75rem;
591  padding: 0.35rem 0.75rem;
592  background: var(--bg-col-2);
593  color: var(--fg-col-mute);
594  font-size: 0.875rem;
595  cursor: pointer;
596  list-style: none;
597}
598.file-diff > summary::-webkit-details-marker { display: none; }
599.file-diff > summary::before {
600  content: "";
601  position: relative;
602  top: -0.17rem;
603  width: 0.4rem;
604  height: 0.4rem;
605  flex: none;
606  align-self: baseline;
607  border-right: 1.5px solid currentColor;
608  border-bottom: 1.5px solid currentColor;
609  transform: rotate(45deg);
610}
611.file-diff:not([open]) > summary::before {
612  top: -0.1rem;
613  transform: rotate(-45deg);
614}
615.file-diff > summary:focus-visible { outline: 2px solid var(--accent-col); outline-offset: 2px; }
616.file-summary-content {
617  display: inline-flex;
618  align-items: baseline;
619  flex-wrap: wrap;
620  gap: 0 0.6rem;
621  flex: 1;
622  min-width: 0;
623}
624.file-summary-content .path {
625  color: var(--fg-col);
626  font-weight: 600;
627  overflow-wrap: anywhere;
628}
629.file-summary-content .file-actions {
630  display: inline-flex;
631  align-items: baseline;
632  gap: 0.6rem;
633  margin-left: auto;
634}
635.file-diff .binary-note { padding: 0.5rem 0.75rem; }
636.file-diff .generated-note { color: var(--fg-col-mute); font-style: italic; }
637
638table.diff {
639  width: 100%;
640  border-collapse: collapse;
641  border-top: 1px solid var(--accent-col-mute-2);
642  line-height: 1.5;
643}
644table.diff td { padding: 0 0.6rem; }
645table.diff td.text { white-space: pre-wrap; word-break: break-word; width: 100%; }
646table.diff td.text::before {
647  content: " ";
648  display: inline-block;
649  width: 1ch;
650  margin-right: 0.5ch;
651}
652table.diff tr.add td.text::before { content: "+"; color: var(--hl-string); }
653table.diff tr.del td.text::before { content: "-"; color: var(--hl-builtin); }
654table.diff td.ln {
655  text-align: right;
656  color: var(--fg-col-mute);
657  user-select: none;
658  white-space: nowrap;
659  min-width: 2.5rem;
660}
661table.diff tr.hunk td {
662  color: var(--fg-col-mute);
663  background: var(--bg-col-2);
664  padding-top: 0.15rem;
665  padding-bottom: 0.15rem;
666}
667table.diff tr.add { background: color-mix(in srgb, var(--hl-string) 9%, transparent); }
668table.diff tr.del { background: color-mix(in srgb, var(--hl-builtin) 9%, transparent); }
669
670/* syntax highlighting, as char.lt */
671a-c, a-cd, a-er {
672  color: var(--hl-comment);
673}
674
675a-k, a-kc, a-ko, a-kd, a-ke, a-kf, a-ki, a-kp, a-kr, a-kt, a-ky, a-km, a-dr,
676a-in, a-sc, a-rp, a-cn, a-ex, a-pp,
677a-co, a-cb, a-m,
678a-tu, a-tr {
679  color: var(--hl-keyword);
680  font-weight: 600;
681}
682
683/* builtins & types */
684a-t, a-tb, a-tq, a-tf, a-fb {
685  color: var(--hl-builtin);
686}
687
688a-s, a-ss, a-se, a-rx, a-ch, a-cs {
689  color: var(--hl-string);
690}
691
692a-n {
693  color: var(--hl-number);
694}
695
696a-f, a-fm, a-fd, a-fc, a-cr, a-ns,
697a-tg, a-td, a-at, a-pr, a-vm, a-l {
698  color: var(--hl-ident);
699}
700
701a-da { color: var(--hl-string); }
702a-dd { color: var(--hl-comment); }
703
704a-em { font-style: italic; }
705a-st, a-tt { font-weight: 600; }
706a-tx { text-decoration: line-through; }
707
708/* match the old behaviour of only colouring shell-script variables */
709.language-bash a-v, .language-shell a-v, .language-zsh a-v {
710  color: var(--hl-ident);
711}