#import "@preview/hei-synd-thesis:0.2.3": * #import "@preview/wrap-it:0.1.1": * #let iconbox( width: 100%, radius: 4pt, border: 4pt, inset: 10pt, outset: -10pt, linecolor: code-border, icon: none, iconheight: 1cm, body ) = { if body != none { align(left, rect( stroke: (left:linecolor+border, rest:code-border+0.1pt), radius: (left:0pt, right:radius), fill: code-bg, outset: (left:outset, right:outset), inset: (left:inset*2, top:inset, right:inset*2, bottom:inset), width: width)[ #if icon != none { align(left, table( stroke:none, align:left+horizon, columns: (auto,auto), image(icon, height:iconheight), [#body] ) ) } else { body } ] ) } } #let llm-proofread = iconbox( icon:"/resources/img/logos/chatgpt.svg", linecolor: hei-blue )[ #text(size: small)[ Assistance for the reformulation and paraphrasing of this document was provided by Gemini 3.1. Regardless of this assistance, all original code and text remain the work of the original author. ]] #let ai-warning(txt) = grid( columns: 2, align: horizon, column-gutter: 1em, image("/resources/img/logos/chatgpt.svg", width: 2em), [#txt] ) #import "@preview/chronos:0.3.0" #let actor( name, disp_name: none, ..args ) = { let dn = name if disp_name != none { dn = align(center+horizon)[#disp_name] } let par = chronos._par(name, display-name: dn, ..args.named()) let actor = ( "display": par, "name" : name ) return actor } #let sync(actor1, actor2, comment, ..args) = { return chronos._seq( actor1.name, actor2.name, comment: comment, comment-align: "start", ..args.named() ) } #let async(actor1, actor2, comment, slant: auto, ..args) = { return chronos._seq( actor1.name, actor2.name, comment: comment, comment-align: "start", end-tip: ">>", slant: slant, ..args.named() ) }