#import "./custom_html.typ" as chtml #import "./theme_picker.typ": theme-picker #import "./theme_colors.typ": theme-colors-css #import "./nav_menu.typ": nav-menu, nav-menu-toggle /// Make the body of the webpage #let html_body( /// The visible header of the page header: [], /// Logo of the site, must be an url (TODO) logo, /// Logo alt-text logo_alt, /// Navigation menu content, css style expect a list menu: none, body ) = { theme-colors-css ```raw-css site-wrapper { display: flex; flex-wrap: wrap; width: 100%; justify-content: center; nav { display: flex; theme-picker { margin-left: auto; } & > * { margin-left: 0.25rem; margin-right: 0.25rem; } } site-container { width: 1050px; padding: 0 20px; header { // display: flex // flex-wrap: wrap; justify-content: space-between; align-items: center; padding: 15px 5px; border-bottom: solid 1px var(--color-border); margin-top: 15px; } } code-block { display: flex; justify-content: center; align-items: center; pre { width: min-content; padding: 8px; border-radius: 8px; background-color: var(--color-code-bg); box-shadow: inset 0px 0px 5px 0px #000; } } } ``` html.body({ chtml.site-wrapper({ chtml.site-container({ html.nav({ theme-picker() if menu != none { nav-menu-toggle() } }) if menu != none { nav-menu(menu) } html.header(style: "display: flex; flex-wrap: wrap-reverse;", { html.hgroup({ header }) // typst `image` function embed the image in the html, which is not great, // and logo is also used for icon, so it's necessarily an url if logo != none { html.img(src: logo, alt: logo_alt, height: 100) // TODO: height bad } }) body }) }) }) }