Offer the manual as PDF and EPUB, laid out for print
Build and test / Publish the release (push) Blocked by required conditions
Benchmarks / CPU and I/O (per commit) (push) Successful in 3m5s
Benchmarks / Frame budget (on demand) (push) Skipped
Build and test / Desktop (Linux) (push) Successful in 1h5m29s
Build and test / Layer separation (push) Successful in 29s
🐳 Android image / Build and push (push) Successful in 5s
Build and test / android-image (push) Successful in 8s
Build and test / Android (aarch64) (push) Waiting to run
🐳 Windows image / Build and push (push) Successful in 5s
Build and test / windows-image (push) Successful in 7s
Build and test / Windows (x86_64, cross) (push) Waiting to run
Manual pages / Publish the manual (push) Successful in 1m2s
Traceability / Requirement traces (push) Successful in 1m1s

The page gains a print stylesheet: A4 with a cover, a contents page whose
entries carry their page numbers, a chapter to a page with its name at the
head of each page and the page count at the foot, figures and table rows
never split, and the light palette. A line above the title links the PDF
and the EPUB on the published site, absolutely, since an installed copy
has none beside it.

The Manual pages workflow makes both: tools/manual/pdf.py renders the page
with WeasyPrint from JPEG copies of its pictures, which takes the PDF from
28 MB to 8, and pandoc makes the EPUB from the Markdown.
This commit is contained in:
2026-10-08 22:41:07 -04:00
parent 90d0985db8
commit b53d4dc391
4 changed files with 186 additions and 1 deletions
+36
View File
@@ -90,15 +90,50 @@ figcaption { margin-top: 0.4rem; color: var(--ink-dim); font-size: 0.9rem; }
table { border-collapse: collapse; width: 100%; font-size: 0.95rem; }
th, td { text-align: left; padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--rule); vertical-align: top; }
th { color: var(--ink-dim); font-weight: 600; }
td img { aspect-ratio: auto 1 / 1; }
.downloads { margin: 0 0 1.2rem; color: var(--ink-dim); font-size: 0.9rem; }
.cover { display: none; }
@media (max-width: 52rem) {
.page { grid-template-columns: minmax(0, 1fr); gap: 1rem; padding: 1rem 16px 3rem; }
.toc { position: static; max-height: none; border: 1px solid var(--rule); border-radius: 6px; padding: 0.8rem 1rem; background: var(--panel); }
body { font-size: 16px; }
}
@page {
size: A4;
margin: 18mm 16mm 20mm;
@top-right { content: string(chapter); font: 8.5pt system-ui, sans-serif; color: #5c5955; }
@bottom-center { content: counter(page) " / " counter(pages); font: 8.5pt system-ui, sans-serif; color: #5c5955; }
}
@page :first { @top-right { content: none; } @bottom-center { content: none; } }
@media print {
:root { --bg: #fff; --ink: #1d1c1a; --ink-dim: #5c5955; --rule: #dedad4; --accent: #8a4b12; --panel: #f1eee9; --mark: transparent; }
body { font-size: 10.5pt; line-height: 1.5; }
.page { display: block; padding: 0; }
.downloads { display: none; }
.cover { display: block; break-after: page; padding-top: 80mm; }
.cover-title { font-size: 34pt; font-weight: 700; margin: 0 0 6mm; }
.cover-sub { color: var(--ink-dim); margin: 0; }
.toc { position: static; max-height: none; overflow: visible; break-after: page; font-size: 10pt; }
.toc-title { font-size: 9pt; }
.toc a { color: var(--ink); }
.toc a::after { content: leader('.') target-counter(attr(href), page); color: var(--ink-dim); }
.toc ul ul a { color: var(--ink-dim); }
main { display: contents; }
h1 { font-size: 24pt; }
h2 { break-before: page; border-top: none; padding-top: 0; margin-top: 0; string-set: chapter content(); }
h2, h3 { break-after: avoid; }
figure, tr, img { break-inside: avoid; }
figure img, main img { max-height: 100mm; width: auto; max-width: 100%; margin: 0 auto; }
figure { margin: 4mm 0; }
td img { max-height: 60mm; }
a { color: inherit; text-decoration: none; }
p, li { orphans: 3; widows: 3; }
}
</style>
</head>
<body>
<div class="page">
<header class="cover"><p class="cover-title">DarkRoom, shown</p><p class="cover-sub">The DarkRoom manual · https://pages.tourolle.paris/dtourolle/darkroom/</p></header>
<nav class="toc" aria-label="Contents">
<p class="toc-title">Contents</p>
<ul>
@@ -137,6 +172,7 @@ th { color: var(--ink-dim); font-weight: 600; }
</ul>
</nav>
<main>
<p class="downloads">Also as <a href="https://pages.tourolle.paris/dtourolle/darkroom/darkroom-manual.pdf" download>PDF</a> · <a href="https://pages.tourolle.paris/dtourolle/darkroom/darkroom-manual.epub" download>EPUB</a> · <a href="https://pages.tourolle.paris/dtourolle/darkroom/">online</a></p>
<h1 id="darkroom-shown">DarkRoom, shown</h1>
<p>A tour of what the application does, one picture per thing. Every image on
this page was captured from the desktop build driving itself — nothing is a