diff options
Diffstat (limited to 'moderncv.typ')
-rw-r--r-- | moderncv.typ | 102 |
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)]) |