#import "./custom_html.typ" as chtml /// Buttons to chose the theme to use (Light/Dark) /// label is the aria-label of the html element (for screenreader). /// label-auto, label-light and label-dark are the content of each button. #let theme-picker( label: "Theme Picker", label-auto: [Auto], label-light: [Light], label-dark: [Dark], ) = { ```raw-css /* Thanks to Lyra Rebane for no-js theme picker implementation: https://lyra.horse/blog/2025/08/you-dont-need-js/ */ theme-picker { display: flex; padding: 5px; label { transition: background 0.08s; &:first-child { border-radius: 8px 0 0 8px; } &:last-child { border-radius: 0 8px 8px 0; } &:has(input:checked) { box-shadow: inset 0px 0px 8px 0px var(--color-button-shadow); } &:has(input:focus-visible) { outline: 2px solid var(--color-button-focus); } &:hover { background: #0004; } &:active { background: #0006; } box-shadow: inset 0px 0px 1.2px 0px #000; padding: 10px; cursor: pointer; background: #0002; } input { /* To allow screen reader to still access these. */ opacity: 0; position: absolute; pointer-events: none; } /* Typst like to insert unecessary
elements */ p { margin: 0px; } } ``` chtml.theme-picker( label: label, { html.label({ html.input(type: "radio", name: "theme", id: "theme-auto", checked: true) label-auto }) html.label({ html.input(type: "radio", name: "theme", id: "theme-light") label-light }) html.label({ html.input(type: "radio", name: "theme", id: "theme-dark") label-dark }) } ) }