challenger-postal.typ (1991B)
1 // Form to render postal addresses validated via Challenger. 2 // Pass JSON data as content dictionary 3 4 #let form(data) = { 5 set page( 6 paper: "a4", 7 margin: (left: 2cm, right: 2cm, top: 2cm, bottom: 2.5cm), 8 footer: context [ 9 #grid( 10 columns: (1fr, 1fr), 11 align: (left, right), 12 text(size: 8pt)[ 13 ], 14 text(size: 8pt)[ 15 Page #here().page() of #counter(page).final().first() 16 ] 17 ) 18 ] 19 ) 20 21 set text(font: "Liberation Sans", size: 10pt) 22 set par(justify: false, leading: 0.65em) 23 24 // Helper function to get value or empty string 25 let get(key, default: "") = { 26 data.at(key, default: default) 27 } 28 29 // Helper function for checkbox 30 let checkbox(checked) = { 31 box( 32 width: 3mm, 33 height: 3mm, 34 stroke: 0.5pt + black, 35 inset: 0.3mm, 36 if checked == true or checked == "true" { 37 place(center + horizon, text(size: 8pt, sym.checkmark)) 38 } 39 ) 40 } 41 42 // Header 43 align(center, text(size: 11pt, weight: "bold")[CONFIDENTIAL]) 44 45 v(0.5em) 46 47 grid( 48 columns: (50%, 50%), 49 gutter: 1em, 50 image("taler-logo.svg", width: 80%), 51 align(right)[ 52 #table( 53 columns: (1fr, 1fr), 54 stroke: 0.5pt + black, 55 inset: 5pt, 56 align: (left, left), 57 [AMLA File No.], 58 [#get("FILE_NUMBER")] 59 ) 60 ] 61 ) 62 63 v(1em) 64 65 // Section 1: Validated address 66 text(size: 11pt, weight: "bold")[Validated address:] 67 68 v(0.5em) 69 70 block(breakable: false)[ 71 #v(0.5em) 72 #table( 73 columns: (35%, 65%), 74 stroke: 0.5pt + black, 75 inset: 5pt, 76 [Contact name:], [#get("CONTACT_NAME")], 77 [Address:], [#get("ADDRESS_LINES").split("\n").join(linebreak())], 78 [Country:], [#get("ADDRESS_COUNTRY")], 79 ) 80 #v(0.5em) 81 ] 82 } 83 84 // Example usage: 85 #form(( 86 "VQF_MEMBER_NUMBER": "12345", 87 "FILE_NUMBER": "42", 88 "CONTACT_NAME": "Bob Builder", 89 "ADDRESS_LINES" : "Parkallee 42\n12345 Bielefeld", 90 "ADDRESS_COUNTRY" : "Germany", 91 ))