Files
website/simple-page-layout.typ
2025-08-11 16:38:10 +02:00

117 lines
3.0 KiB
Typst

#import "common.typ": *
#import "core-page-style.typ": *
#let html-href(target, content) = {
[#context if is-html() {
html.elem("a", attrs:(href:target), content)
} else { content }]
}
#let variant-link(content, variant) = {
[#context if is-html() {
html.elem("a", attrs:(href:"#",onclick:"gotoVariant(\""+variant+"\");"), content)
} else { content }]
}
#let simple-page(
gen-table-of-contents: true,
gen-index-ref: true,
min-pdf-link: true,
html-title,
content) = {
let head = context if is-html() {
[
#html.elem("title", html-title)
]
} else {[]}
core-page-style(html-head: head)[
#if is-web {
let off = 3;
table(
stroke: none,
columns: (25%, 50%, 25%),
html-style(class:"sidebar", "", column-fixed(
[#if gen-table-of-contents { [#table-of-contents()] }],
[#if gen-index-ref {[
#context br()
#context html-href("index.html")[#html-bold[Website Home]]
#context br()
]}],
[#context if min-pdf-link and is-html() [
Renderings of this page:
- #variant-link("minimal PDF (printable)", ".min.pdf")
// TODO: fix and re-add - #variant-link("less bloated HTML", ".min.html")
- #variant-link("minimal HTML", ".nano.html")
]],
[#if gen-index-ref [
#html-href("atom.xml")[Atom feed]
#context br()
]],
[#context if is-html() {
html.elem("style", "
@media only screen and (max-width: 1200px) {
.sidebar {
display: none !important;
}
.column-fixed {
width: 0% !important;
}
.body-column {
left: "+str(off)+"% !important;
}
}
@media only screen and (max-width: 1800px) {
.body-column > span {
width: 75% !important;
}
}
@media only screen and (max-width: 1200px) {
.body-column {
width: "+str(100-off)+"% !important;
}
.body-column > span {
width: 100% !important;
}
}
.hide { display: inline; background: black; transition: background 0.3s linear; }
.hide:hover, .hide:focus { background: transparent; }
")
}],
)),
[
#html-style(class:"body-column","position: absolute; left: "+str(25+off)+"%; width: "+str(75-off)+"%")[
#box(width: 50%, content)
]
],
)
} else {
content
}
#context if (not is-nano) and is-html() {
html-script("
function gotoVariant(variant) {
window.location.href = window.location.href.replace(/\.\w+.html/g, variant);
}
window.addEventListener('beforeprint', (event) => {
gotoVariant('.min.pdf');
});
")
html.elem("script", attrs:("src":"coffee.js","async":""))
}
]
}