hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/templates/letter.typ
blob: 361f47b628c7b71dcb9a1f8cfdbda4c905860c32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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))
  }
}