CV/alta-typst.typ

133 lines
1.9 KiB
Plaintext

#let primary_colour = rgb("#ea2e2e") // vivid purple
#let link_colour = rgb("#78b9c4") // blue
#let icon(name, shift: 1.5pt) = {
box(
baseline: shift,
height: 10pt,
image("icons/" + name + ".svg")
)
h(3pt)
}
#let findMe(services) = {
set text(8pt)
let icon = icon.with(shift: 2.5pt)
services.map(service => {
icon(service.name)
if "display" in service.keys() {
link(service.link)[#{service.display}]
} else {
link(service.link)
}
}).join(h(10pt))
[
]
}
#let term(period, location) = {
text(9pt)[#icon("calendar") #period #h(1fr) #icon("location") #location]
}
#let birth(date, age) = {
text(size: 9pt, weight: "bold")[#icon("calendar") #date #h(1fr) #age]
}
#let date(period) = {
text(9pt)[#icon("calendar") #period]
}
#let max_rating = 5
#let skill(name, rating) = {
let done = false
let i = 1
name
h(1fr)
while (not done){
let colour = rgb("#c0c0c0") // grey
if (i <= rating){
colour = primary_colour
}
box(circle(
radius: 4pt,
fill: colour
))
if (max_rating == i){
done = true
} else {
// no spacing on last
h(2pt)
}
i += 1
}
[\ ]
}
#let styled-link(dest, content) = emph(text(
fill: link_colour,
link(dest, content)
))
#let alta(
name: "",
links: (),
tagline: [],
first,
second,
) = {
set document(
title: name + "'s CV",
author: name,
)
set text(11pt)
set page(
margin: (x: 40pt, y: 40pt),
)
show heading.where(
level: 2
): it => text(
fill: primary_colour,
[
#{it.body}
#v(-7pt)
#line(length: 100%, stroke: 1pt + primary_colour)
]
)
show heading.where(
level: 3
): it => text(it.body)
show heading.where(
level: 4
): it => text(
fill: primary_colour,
it.body
)
[= #name]
findMe(links)
tagline
grid(
columns: (1.1fr, 2fr),
gutter: 15pt,
first,
second,
)
}