summaryrefslogtreecommitdiffstats
path: root/moderncv.typ
diff options
context:
space:
mode:
Diffstat (limited to 'moderncv.typ')
-rw-r--r--moderncv.typ102
1 files changed, 102 insertions, 0 deletions
diff --git a/moderncv.typ b/moderncv.typ
new file mode 100644
index 0000000..001dc02
--- /dev/null
+++ b/moderncv.typ
@@ -0,0 +1,102 @@
+#let left_column_size = 15%
+#let grid_column_gutter = 10pt
+
+#let project(author: [], title: "", phone: "", email: "", github: "", color: navy, body) = {
+ set document(author: author, title: title)
+ set page(numbering: none)
+ set text(font: ("Latin Modern Sans", "Inria Sans"), lang: "en", fallback: true)
+ show math.equation: set text(weight: 400)
+
+ show heading.where(level: 1): element => [
+ #v(0em)
+ #box(
+ inset: (right: grid_column_gutter, bottom: 0.1em), rect(fill: color, width: left_column_size, height: 0.25em),
+ )
+ #text(element.body, fill: color, weight: 400)
+ ]
+
+ show heading.where(level: 2): element => [
+ #text(element.body + ",", size: 0.8em)
+ ]
+
+ show heading.where(level: 3): element => [
+ #text(element.body, size: 1em, weight: 400, style: "italic")
+ ]
+
+ show heading.where(level: 4): element => block[#text(element.body, size: 1em, weight: 400, fill: color)]
+
+ set list(marker: box(circle(radius: 0.2em, stroke: color), inset: (top: 0.15em)))
+
+ set enum(numbering: (n) => text(fill: color, [#n.]))
+
+ grid(
+ columns: (1fr, 1fr), box[
+ #text([#author], weight: 400, 2.5em)
+ #v(-1.2em)
+ #block(text(weight: 400, 1.5em, title, style: "italic", fill: gray))
+ ], align(
+ right + top,
+ )[
+ #set block(below: 0.5em)
+
+ #if github != "" {
+ align(top)[
+ #box(height: 1em, baseline: 20%)[#pad(right: 0.4em)[#image("icons/github.svg")]]
+ #link("https://github.com/" + github)[#github]
+ ]
+ }
+
+ #if phone != "" {
+ align(top)[
+ #box(height: 1em, baseline: 20%)[#pad(right: 0.4em)[#image("icons/phone-solid.svg")]]
+ #link("tel:" + phone)[#phone]
+ ]
+ }
+
+ #if email != "" {
+ align(
+ top,
+ )[
+ #box(height: 1em, baseline: 20%)[#pad(right: 0.4em)[#image("icons/envelope-regular.svg")]]
+ #link("mailto:" + email)
+ ]
+ }
+ ],
+ )
+
+ set par(justify: true, leading: 0.5em)
+
+ body
+}
+
+#let datebox(month: "", year: []) = box(
+ align(
+ center, stack(dir: ttb, spacing: 0.4em, text(size: 1em, [#year]), text(size: 0.75em, month)),
+ ),
+)
+
+#let daterange(start: (month: "", year: []), end: (month: "", year: [])) = box(
+ stack(
+ dir: ltr, spacing: 0.75em, datebox(month: start.at("month", default: ""), year: start.year), [--],
+ datebox(month: end.at("month", default: ""), year: end.year),
+ ),
+)
+
+#let cvgrid(..cells) = grid(
+ columns: (left_column_size, auto), row-gutter: 0em, column-gutter: grid_column_gutter, ..cells,
+)
+
+#let cvcol(content) = cvgrid([], content)
+
+#let cventry(
+ description, start: (month: "", year: ""), end: (month: "", year: ""), place: "",
+ role: [],
+) = cvgrid(align(center, daterange(start: start, end: end)), [
+ == #role
+ === #place
+], [], [
+ #v(0.5em)
+ #description
+])
+
+#let cvlanguage(language: [], description: [], certificate: []) = cvgrid(align(right, language), [#description #h(3em) #text(style: "italic", certificate)])