#import "style.typ": template #show: template #include "assets.typ" #include "rss.typ" #import "shared.typ": ( asset_path, button, buttons, html_page, html_redirect, metaquery, redirects, sep, with_src, ) // NB: doesn't have an effect on the html output #set text(font: "Atkinson Hyperlegible Next"); #let left-right(left, right) = html.div(class: "left-right", { left right }) #asset("style.typ", read("style.typ")) #asset("assets.typ", read("assets.typ")) #asset("shared.typ", read("shared.typ")) #asset("config.typ", read("config.typ")) #asset("rss.typ", read("rss.typ")) #html_redirect("rss.xml.src", "rss.typ") #html_redirect("src", "index.html.src") #html_redirect(".src", "index.html.src") // https://grebedoc.dev/#redirects #context asset("_redirects", redirects.final().join("\n")) #let include_page(file) = with_src(file, () => include file) #include_page("posts/01-why-null-sucks.typ") #include_page("posts/02-you-would-not-use-filter_map.typ") #include_page("posts/03-a-place-to-pause.typ") #include_page("posts/04-what-mutref-to-slice-ref-means.typ") #include_page("posts/05-if-else-chains-considered-harmful.typ") // #include_page("posts/06-comments-are-weak.typ") // #include_page("posts/07-why-we-can-not-have-nice-things-min-max.typ") // #include_page("posts/08-abusing-rust-traits-to-write-silly-things.typ") #include_page("posts/09-preferred-pronouns.typ") #include_page("posts/0A-null-data-0x06.typ") #include_page( "posts/0B-tricking-cargo-into-generating-lock-files-for-an-old-msrv.typ", ) #include_page("buttons.typ") #with_src("meow.typ", () => context html_page( "index.html", [void.pink :: home], footer_buttons: true, )[ #{ left-right( html.img( src: asset_path(), alt: "a pink 7/2 star polygon constructed in a regular pink heptagon", ), [This is uhhh my blog I guess?? #linebreak() TODO: put stuff here], ) } = Talks #let talk(date, url, location, title) = { html.time(datetime: date, date.display("[month repr:short] [year]")) " " sep " " link(url, title) " " html.span(class: "talk-location", { "(" location ")" }) } // FIXME: this is not post list? // FIXME: say conference/location maybe? // FIXME: maybe make these expandable & show a talk description / preview image - #talk( datetime(year: 2026, month: 05, day: 19), "https://www.youtube.com/watch?v=3jM4cnEVrLc", [RustWeek, Utrecht], [When is never?], ) - #talk( datetime(year: 2026, month: 03, day: 27), // FIXME: replace with a recording url once available... "https://www.rustinparis.com/schedule", [Rust In Paris, Paris], [Little rust delights], ) - #talk( datetime(year: 2025, month: 05, day: 14), "https://www.youtube.com/watch?v=pNA-XAIrDTk", [RustWeek, Utrecht], [Re-inventing trait objects], ) = Archive #html.ul(class: "post-list")[ #for meta in query().rev() { let post = meta.value html.li({ html.time(datetime: post.date, post.date.display()) " " sep " " link(post.label, post.title) }) } ] = (not so) Secret pages - #link("/buttons")[buttons] - #link("/rss.xml")[rss] ])