diff options
| author | hachem <im@hachem.wtf> | 2026-09-18 13:59:45 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-18 13:59:45 +0200 |
| commit | 2720a126aa5a8412f8d355f8937cf6c37975be78 (patch) | |
| tree | 1070b2bbc875b6bb56ca1c19e652f882dfe10279 /templates/letter.typ | |
| parent | ab2774b23c66521e13541ab3e361bba95c394a8a (diff) | |
feat: add letter template
Diffstat (limited to 'templates/letter.typ')
| -rw-r--r-- | templates/letter.typ | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/templates/letter.typ b/templates/letter.typ new file mode 100644 index 0000000..361f47b --- /dev/null +++ b/templates/letter.typ @@ -0,0 +1,90 @@ +#let sender-block(sender) = if type(sender) == dictionary { + text(weight: "medium", tracking: 0.03em)[#smallcaps(sender.name)] + if sender.at("address", default: none) != none { + v(0.35em) + text(size: 0.85em, fill: luma(30%))[#sender.address] + } +} else { + sender +} + +#let recipient-block(recipient) = if type(recipient) == dictionary { + recipient.name + if recipient.at("address", default: none) != none { + linebreak() + text(size: 0.9em, fill: luma(30%))[#recipient.address] + } +} else { + recipient +} + +#let letter( + sender: none, + recipient: none, + place: none, + date: none, + subject: none, + opening: [Madame, Monsieur,], + closing: [Veuillez agréer, Madame, Monsieur, l'expression de mes salutations distinguées.], + signature: none, + lang: "fr", + region: "FR", + font: "EB Garamond", + size: 11pt, + doc, +) = { + set page(paper: "a4", margin: (x: 26mm, top: 30mm, bottom: 26mm), numbering: none) + set par(justify: true, leading: 0.72em, spacing: 1.3em) + set text(font: font, size: size, lang: lang, region: region, number-type: "old-style") + + let dateline = if place != none and date != none { + [#place, le #date] + } else if date != none { + [le #date] + } else { + place + } + + let sign = if signature != none { + signature + } else if type(sender) == dictionary { + sender.name + } else { + none + } + + grid( + columns: (1fr, 1fr), + align: (left + top, right + top), + sender-block(sender), + { + recipient-block(recipient) + if dateline != none { + if recipient != none { v(1.4em) } + dateline + } + }, + ) + + v(1.9em) + line(length: 100%, stroke: 0.4pt) + v(1.9em) + + if subject != none { + [#text(weight: "bold")[Objet :] #subject] + v(1.4em) + } + + opening + + v(0.6em) + doc + + v(1.6em) + closing + + if sign != none { + v(3.2em) + align(right, smallcaps(sign)) + } +} |
