49 lines
1.4 KiB
Plaintext
49 lines
1.4 KiB
Plaintext
#import "../utilities/icon-with-text.typ": icon_with_text
|
|
#import "../utilities/localize.typ": localize
|
|
|
|
#let personal_project(data, language) = {
|
|
let icon_size = 1.4em
|
|
|
|
let personal_project_name = localize(data, "name", language)
|
|
|
|
let personal_project_heading = heading(level: 3, link(data.link, personal_project_name));
|
|
|
|
let personal_project_header = if "header_image" in data {
|
|
icon_with_text(
|
|
clip_icon: true,
|
|
icon: "../" + data.header_image,
|
|
icon_alt_text: personal_project_name,
|
|
icon_size: icon_size,
|
|
personal_project_heading,
|
|
)
|
|
} else {
|
|
personal_project_heading
|
|
}
|
|
|
|
// Use a grid to space out the header and the body.
|
|
grid(
|
|
gutter: 0.5em,
|
|
// Set the height explicitly so the ones with icons don't look different
|
|
// from the ones without.
|
|
box(
|
|
height: icon_size,
|
|
// Use another grid to position the title and date.
|
|
grid(
|
|
columns: (1fr, auto),
|
|
personal_project_header,
|
|
align(horizon, text(size: 0.9em, localize(data, "date", language))),
|
|
),
|
|
),
|
|
// The body can contain Typst code so we use `eval()` to render it.
|
|
eval(localize(data, "body", language)),
|
|
)
|
|
}
|
|
|
|
#let personal_projects_section(data, language) = [
|
|
== #localize(data.locale, "personal_projects", language)
|
|
|
|
#for data in data.personal_projects {
|
|
personal_project(data, language)
|
|
}
|
|
]
|