diff --git a/finely-crafted-cv/0.1.0/LICENSE b/finely-crafted-cv/0.1.0/LICENSE new file mode 100644 index 0000000..35d39a7 --- /dev/null +++ b/finely-crafted-cv/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Stephen Waits + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/finely-crafted-cv/0.1.0/README.md b/finely-crafted-cv/0.1.0/README.md new file mode 100644 index 0000000..8560050 --- /dev/null +++ b/finely-crafted-cv/0.1.0/README.md @@ -0,0 +1,118 @@ +# Finely Crafted CV Template + +This Typst template provides a clean and professional format for creating a +curriculum vitae (CV) or résumé. It comes with functions and styles to help you +easily generate a well-structured document, complete with sections for +education, experience, skills, and more. + +## Features + +- **Modern Design:** Aesthetic and professional layout designed for readability. +- **Responsive Header & Footer:** Includes contact information dynamically. + +## Usage + +To use this template, import it with the version number and utilize the `resume` or `cv` function: + +```typst +#import "@preview/finely-crafted-cv:0.1.0": * + +#show: resume.with( + name: "Amira Patel", + tagline: "Innovative marine biologist with 15+ years of experience in ocean conservation and research.", + keywords: "marine biology, conservation, research, education, patents", + email: "amira.patel@oceandreams.org", + phone: "+1-305-555-7890", + linkedin_username: "amirapatel", + thumbnail: image("assets/my-qr-code.svg"), +) + += Introduction + +#lorem(100) + += Experience + +#company-heading("Some Company", start: "March 2018", end: "Present", icon: image("icons/earth.svg"))[ + #job-heading("Some Job", location: "Some Location")[ + - Here is an achievement + - Here's another one. + ] + // companies can have multiple jobs + #job-heading("First Job", location: "Some Location")[ + - Here is an achievement + - Here's another one. + ] +] + +// for companies which have less detail, you can use the `comment` instead of a +// body of tasks, as follows: +#company-heading("Another Company", start: "July 2005", end: "August 2009", icon: image("icons/microscope.svg"))[ + #job-heading("Another Job", location: "Another Location", + comment: [Contributed to 7 published studies. #footnote[Visit https://amirapatel.org/publications for full list of publications.]] + )[] +] + += Education + +// school-heading is an alias for company-heading, accepts the same parameters as company-heading +#school-heading("University of California, San Diego", start: "Fall 2001", end: "Spring 2005", icon: image("icons/graduation-cap.svg"))[ + // degree-heading is an alias for job-heading, accepts the same parameters as job-heading + #degree-heading("Ph.D. in Marine Biology")[] +] +``` + +## Functions and Parameters + +### `resume` or `cv` + +This is the main function to create a CV document. + +- **Parameters:** + - `name`: (String) Your full name. Default is "YOUR NAME HERE". + - `tagline`: (String) A brief description of your professional identity or mission. + - `paper`: (String) The paper size, default is "us-letter". + - `heading_font`: (Font) Font for headings, customizable. + - `body_font`: (Font) Font for body text, customizable. + - `body_size`: (Size) Font size for body text. + - `email`: (String) Your email address. + - `phone`: (String) Your phone number. + - `linkedin_username`: (String) Your LinkedIn username. + - `keywords`: (String) Keywords for searchability. + - `thumbnail`: (Image) Thumbnail or QR code image, optional. + - `body`: (Block) The main content of your CV. + +### `company-heading` + +Used to create a heading for a company or organization. + +- **Parameters:** + - `name`: (String) Name of the company. + - `start`: (String) Start date. + - `end`: (String) End date, optional. + - `icon`: (Image) Icon image associated with the company, optional. + - `body`: (Block) Content related to the company role or tasks. + +### `job-heading` + +Defines a job title within a company heading. + +- **Parameters:** + - `title`: (String) Job title. + - `location`: (String) Location of the job, optional. + - `start`: (String) Start date, optional. + - `end`: (String) End date, optional. + - `comment`: (String) Additional comments or notes, optional. + - `body`: (Block) Tasks or responsibilities. + +### `school-heading` + +Alias for `company-heading`, used for educational institutions. + +### `degree-heading` + +Alias for `job-heading`, used for academic degrees or certifications. + +## License + +This template is released under the MIT License. diff --git a/finely-crafted-cv/0.1.0/lib.typ b/finely-crafted-cv/0.1.0/lib.typ new file mode 100644 index 0000000..011e014 --- /dev/null +++ b/finely-crafted-cv/0.1.0/lib.typ @@ -0,0 +1 @@ +#import "src/resume.typ": cv, resume, company-heading, job-heading, school-heading, degree-heading diff --git a/finely-crafted-cv/0.1.0/src/constants.typ b/finely-crafted-cv/0.1.0/src/constants.typ new file mode 100644 index 0000000..ad73d13 --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/constants.typ @@ -0,0 +1,57 @@ +// Constants +#let SIZE_HUGE = 1.3em +#let SIZE_LARGE = 1.1em +#let SIZE_NORMAL = 1em +#let SIZE_SMALL = 0.9em +#let SIZE_TINY = 0.7em + +#let BODY_FONT = "Linux Libertine" +#let BODY_SIZE = 11pt +#let BODY_WEIGHT = "light" +#let HEADING_FONT = "Linux Libertine Display" + +#let PAGE_MARGIN = 0.5in + +#let HEADER_SIZE = SIZE_SMALL +#let HEADER_ICON_HEIGHT = SIZE_NORMAL +#let HEADER_ICON_SPACING = 0.25em + +#let FOOTER_SIZE = SIZE_TINY +#let FOOTER_TEXT_WEIGHT = "thin" + +#let HEADLINE_NAME_SIZE = SIZE_HUGE +#let HEADLINE_NAME_WEIGHT = "black" +#let HEADLINE_HRULE_STROKE = 1pt + black + +#let TAGLINE_SIZE = SIZE_NORMAL +#let TAGLINE_STYLE = "italic" +#let TAGLINE_WEIGHT = "regular" + +#let SECTION_HEADING_SIZE = 0.7em // TODO: this seems wrong, should be SIZE_NORMAL (etc) +#let SECTION_HEADING_WEIGHT = "bold" +#let SECTION_HEADING_HRULE_STROKE = 0.75pt + black.lighten(25%) +#let SECTION_HEADING_SPACE_ABOVE = 1em +#let SECTION_HEADING_SPACE_BELOW = 0.5em + +#let COMPANY_ICON_SIZE = SIZE_NORMAL +#let COMPANY_ICON_SPACING = 0.25em +#let COMPANY_NAME_SIZE = SIZE_LARGE +#let COMPANY_NAME_WEIGHT = "bold" +#let COMPANY_DATE_SIZE = COMPANY_NAME_SIZE +#let COMPANY_DATE_WEIGHT = "bold" +#let COMPANY_BLOCK_BELOW = 1.3em + +#let JOB_NAME_SIZE = SIZE_NORMAL +#let JOB_NAME_STYLE = "normal" +#let JOB_NAME_WEIGHT = "medium" +#let JOB_LOCATION_SIZE = SIZE_SMALL +#let JOB_LOCATION_STYLE = JOB_NAME_STYLE +#let JOB_LOCATION_WEIGHT = "light" +#let JOB_BLOCK_ABOVE = 0.6em +#let JOB_BLOCK_BELOW = 1em + +#let TABLE_HEADER_COLOR = blue.lighten(60%) +#let TABLE_ZEBRA_COLOR_0 = green.lighten(85%) +#let TABLE_ZEBRA_COLOR_1 = green.lighten(95%) + +#let HRULE_HEIGHT = 0.5em diff --git a/finely-crafted-cv/0.1.0/src/helpers.typ b/finely-crafted-cv/0.1.0/src/helpers.typ new file mode 100644 index 0000000..3b0eada --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/helpers.typ @@ -0,0 +1,25 @@ +#import "constants.typ":* + +#let icon_and_contact(icon, content) = { + grid( + columns: 2, + align: center+horizon, + gutter: COMPANY_ICON_SPACING, + + box( + height: HEADER_ICON_HEIGHT, + width: auto, + image(icon) + ), + content + ) +} + +#let hrule(stroke: 1pt + black) = { + block( + above: HRULE_HEIGHT, + below: 0em, + breakable: false, + line(length: 100%, stroke: stroke) + ) +} diff --git a/finely-crafted-cv/0.1.0/src/icons/email.svg b/finely-crafted-cv/0.1.0/src/icons/email.svg new file mode 100644 index 0000000..ee04080 --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/icons/email.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/src/icons/linkedin.svg b/finely-crafted-cv/0.1.0/src/icons/linkedin.svg new file mode 100644 index 0000000..edc5fc6 --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/icons/linkedin.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/src/icons/phone.svg b/finely-crafted-cv/0.1.0/src/icons/phone.svg new file mode 100644 index 0000000..778648a --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/icons/phone.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/src/resume.typ b/finely-crafted-cv/0.1.0/src/resume.typ new file mode 100644 index 0000000..b63661a --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/resume.typ @@ -0,0 +1,228 @@ +#import "constants.typ": * +#import "helpers.typ": * +#import "state.typ": __get, __set + +// Main resume function +#let resume( + name: "YOUR NAME HERE", + tagline: none, + paper: "us-letter", + heading_font: HEADING_FONT, + body_font: BODY_FONT, + body_size: BODY_SIZE, + email: none, + phone: none, + linkedin_username: none, + keywords: "", + thumbnail: none, // check out https://qrframe.kylezhe.ng/ for QR code generation + body +) = { + // Save our settings needed in other functions + __set("heading_font", heading_font) + + // Document setup, mostly metadata in a PDF + set document( + title: "Résumé/CV of " + name, + author: name, + keywords: keywords, + ) + + // Page setup, including header and footer + set page( + paper: paper, + margin: PAGE_MARGIN, + numbering: "1 / 1", + header: context { + if here().page() == 1 { + text( + size: HEADER_SIZE, + grid( + columns: (1fr, auto, auto, auto, auto, auto), + gutter: 1em, + align: center+horizon, + "", + icon_and_contact("icons/email.svg", link("mailto:" + email, email)), + sym.divides, + icon_and_contact("icons/phone.svg", link("tel:" + phone, phone)), + sym.divides, + icon_and_contact("icons/linkedin.svg", link("https://www.linkedin.com/in/" + linkedin_username, linkedin_username)) + ) + ) + } + }, + footer: context { + let multi_page = counter(page).final().first() > 1 + let date = datetime.today().display("[month repr:long] [day], [year]") + text(size: FOOTER_SIZE, weight: FOOTER_TEXT_WEIGHT, font: heading_font)[ + #grid( + columns: (1fr, 1fr, 1fr), + align: (left, center, right + horizon), + // left column + [Last updated: #date], + // center column + if multi_page { counter(page).display(both: true, "1 of 1") }, + // right column + if thumbnail != none { + move(dy: -0.25in, box(height: 0.5in, thumbnail)) + } else { + [ ] + } + ) + ] + }, + ) + + // Global text settings + set text(font: body_font, size: body_size, weight: BODY_WEIGHT, fallback: true) + set par(justify: true) + + // Heading styles + set heading(numbering: "I.A.") + show heading.where(level: 1): it => { + block( + above: SECTION_HEADING_SPACE_ABOVE, + below: SECTION_HEADING_SPACE_BELOW, + breakable: false, + [ + #text(size: SECTION_HEADING_SIZE, weight: SECTION_HEADING_WEIGHT, font: heading_font)[ + #context counter(heading).display() + #upper(it.body) + ] + #hrule(stroke: SECTION_HEADING_HRULE_STROKE) + ] + ) + } + + // Table style + set table( + stroke: none, + fill: (x, y) => { + if y == 0 { + TABLE_HEADER_COLOR + } else if calc.rem(y, 2) == 0 { + TABLE_ZEBRA_COLOR_0 + } else { + TABLE_ZEBRA_COLOR_1 + } + }, + ) + + // Main Headline + text(size: HEADLINE_NAME_SIZE, weight: HEADLINE_NAME_WEIGHT, font: heading_font)[#smallcaps(name)] + h(1fr) + text(size: TAGLINE_SIZE, style: TAGLINE_STYLE, weight: TAGLINE_WEIGHT)[#tagline] + hrule(stroke: HEADLINE_HRULE_STROKE) + + // The rest of the content + body +} + +// Alias resume to cv for non-Americans +#let cv = resume + +#let company-heading(name, start: none, end: none, icon: none, body) = { + let icon_spacing = if icon != none { COMPANY_ICON_SPACING } else { 0em } + block( + below: COMPANY_BLOCK_BELOW, + breakable: false, + + grid( + columns: (auto, auto, 1fr, auto), + column-gutter: (icon_spacing, 0.5em), + row-gutter: 0.5em, + align: (left + horizon, left + horizon, right + horizon), + + // first column, optional icon + if icon != none { box(height: COMPANY_ICON_SIZE, icon) }, + + // second column, company name + context text( + weight: COMPANY_NAME_WEIGHT, + size: COMPANY_NAME_SIZE, + font: __get("heading_font"), + name + ), + + // third column, dots + if start != none { + repeat(h(0.3em) + "." + h(0.3em)) + } else { + [] + }, + + // fourth column, optional dates + context text( + weight: COMPANY_DATE_WEIGHT, + size: COMPANY_DATE_SIZE, + font: __get("heading_font"), + + if start != none { + [#start -- #end] + } else { + [ ] + } + ), + + // second row, company content + grid.cell(colspan: 4, body) + ) + ) +} + +// Alias to school heading +#let school-heading = company-heading + +#let job-heading(title, location: none, start: none, end: none, comment: none, body) = { + block( + above: JOB_BLOCK_ABOVE, + below: JOB_BLOCK_BELOW, + breakable: false, + + // heading + grid( + columns: (auto, auto, auto, 1fr, auto), + gutter: 0.5em, + align: (left + horizon, right + horizon), + + // first column, title + context text( + style: JOB_NAME_STYLE, + weight: JOB_NAME_WEIGHT, + size: JOB_NAME_SIZE, + font: __get("heading_font"), + title + ), + + // second column, job comment ellipsis + if comment != none { [ ... ] }, + + // third column, job comment ellipsis + if comment != none { [ #comment ] }, + + // fourth column, hfill + h(1fr), + + // fifth column, optional location + context text( + style: JOB_LOCATION_STYLE, + weight: JOB_LOCATION_WEIGHT, + size: JOB_LOCATION_SIZE, + font: __get("heading_font"), + + if location != none and start != none { + [#location#[;] #h(0.25em)#start#if end != none [ -- #end]] + } else if location != none { + location + } else if start != none { + [#start#if end != none [ -- #end]] + } + ), + + grid.cell(colspan: 5, body) + ) + ) +} + +// Alias to degree heading +#let degree-heading = job-heading + diff --git a/finely-crafted-cv/0.1.0/src/state.typ b/finely-crafted-cv/0.1.0/src/state.typ new file mode 100644 index 0000000..1f57ab8 --- /dev/null +++ b/finely-crafted-cv/0.1.0/src/state.typ @@ -0,0 +1,12 @@ +#let __settings = state("__cv_settings", (:)) + +#let __set(key, value) = { + __settings.update(st => { + st.insert(key, value) + st + }) +} + +#let __get(key) = { + __settings.final().at(key, default: none) +} diff --git a/finely-crafted-cv/0.1.0/template/assets/my-qr-code.svg b/finely-crafted-cv/0.1.0/template/assets/my-qr-code.svg new file mode 100644 index 0000000..a0f91ef --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/assets/my-qr-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/coral.svg b/finely-crafted-cv/0.1.0/template/icons/coral.svg new file mode 100644 index 0000000..1575325 --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/coral.svg @@ -0,0 +1,81 @@ + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/earth.svg b/finely-crafted-cv/0.1.0/template/icons/earth.svg new file mode 100644 index 0000000..2534f82 --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/earth.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/graduation-cap.svg b/finely-crafted-cv/0.1.0/template/icons/graduation-cap.svg new file mode 100644 index 0000000..abd10ff --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/graduation-cap.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/microscope.svg b/finely-crafted-cv/0.1.0/template/icons/microscope.svg new file mode 100644 index 0000000..4310015 --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/microscope.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/palm-tree.svg b/finely-crafted-cv/0.1.0/template/icons/palm-tree.svg new file mode 100644 index 0000000..e082551 --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/palm-tree.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/icons/whale.svg b/finely-crafted-cv/0.1.0/template/icons/whale.svg new file mode 100644 index 0000000..935fde0 --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/icons/whale.svg @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/0.1.0/template/main.typ b/finely-crafted-cv/0.1.0/template/main.typ new file mode 100644 index 0000000..941bb2d --- /dev/null +++ b/finely-crafted-cv/0.1.0/template/main.typ @@ -0,0 +1,91 @@ +#import "@preview/finely-crafted-cv:0.1.0": * + +#show: resume.with( + name: "Amira Patel", + tagline: "Innovative marine biologist with 15+ years of experience in ocean conservation and research.", + keywords: "marine biology, conservation, research, education, patents", + email: "amira.patel@oceandreams.org", + phone: "+1-305-555-7890", + linkedin_username: "amirapatel", + thumbnail: image("assets/my-qr-code.svg"), +) + += Research Philosophy + +My approach to marine biology is rooted in curiosity, collaboration, and +conservation. I believe in conducting rigorous scientific research that not only +advances our understanding of marine ecosystems but also informs policy +decisions to protect our oceans. By fostering interdisciplinary partnerships and +engaging with local communities, I strive to create impactful solutions that +balance human needs with ecological preservation. + += Experience + +#company-heading("Global Ocean Institute", start: "March 2018", end: "Present", icon: image("./icons/earth.svg"))[ + #job-heading("Senior Marine Biologist", location: "Brisbane, Queensland, AU")[ + - Leading a team of 12 researchers in a long-term study on coral reef + resilience in changing climates. + - Developed an AI-powered system for monitoring fish populations, increasing + data accuracy by 40%. + - Secured \$2.5M in research grants for the institute's sustainable fishing + practices initiative. + - Mentored 20+ graduate students, with 5 going on to publish in top-tier + scientific journals. + ] +] + +#company-heading("OceanTech Solutions", start: "June 2014", end: "February 2018", icon: image("icons/whale.svg"))[ + #job-heading("Research Scientist", location: "Baltimore, Maryland")[ + - Pioneered use of autonomous underwater vehicles for deep-sea exploration, + discovering 3 new species. + - Collaborated with engineers to develop biodegradable sensors for ocean + pollution monitoring. + - Presented findings at 15+ international conferences, establishing the + company as a leader in marine tech. + ] +] + +#company-heading("Coral Conservation Alliance", start: "September 2009", end: "May 2014", icon: image("icons/coral.svg"))[ + #job-heading("Conservation Biologist", location: "Corpus Christi, Texas")[ + - Managed a team of 8 in implementing coral restoration techniques across 5 + Caribbean sites. + - Increased local community engagement in conservation efforts by 200% + through education programs. + - Co-authored a policy brief that influenced the establishment of 3 new + marine protected areas. + ] +] + +#company-heading("Pacific Marine Research Center", start: "July 2005", end: "August 2009", icon: image("icons/microscope.svg"))[ + #job-heading("Research Assistant", location: "San Diego, California", + comment: [Contributed to 7 published studies. #footnote[Visit https://amirapatel.org/publications for full list of publications.]] + )[] +] + += Patents + +#link( + "https://patents.google.com/patent/US20230123456A1", + strong("MARINE BIODIVERSITY MONITORING SYSTEM USING ENVIRONMENTAL DNA (US 20230123456A1)") +) +#quote[A novel system and method for monitoring marine biodiversity using +environmental DNA (eDNA) sampling and analysis. The invention includes an +automated collection device capable of filtering seawater at various depths, +preserving eDNA samples, and transmitting data in real-time.] + += Eligibility and Location + +- *Eligibility:* United States Permanent Resident +- *Location:* Open to remote opportunities or relocation to coastal areas. +- *Travel Availability:* Willing to travel up to 40% for field research and + conferences. + += Education + +#school-heading("University of California, San Diego", start: "Fall 2001", end: "Spring 2005", icon: image("icons/graduation-cap.svg"))[ + #degree-heading("Ph.D. in Marine Biology")[] +] + +#school-heading("University of Miami", start: "Fall 1997", end: "Spring 2001", icon: image("icons/palm-tree.svg"))[ + #degree-heading("B.S. in Marine Science, Minor in Environmental Policy")[] +] diff --git a/finely-crafted-cv/0.1.0/thumbnail.png b/finely-crafted-cv/0.1.0/thumbnail.png new file mode 100644 index 0000000..7f8fa0c Binary files /dev/null and b/finely-crafted-cv/0.1.0/thumbnail.png differ diff --git a/finely-crafted-cv/0.1.0/typst.toml b/finely-crafted-cv/0.1.0/typst.toml new file mode 100644 index 0000000..17fbf4e --- /dev/null +++ b/finely-crafted-cv/0.1.0/typst.toml @@ -0,0 +1,16 @@ +[package] +name = "finely-crafted-cv" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["Stephen Waits "] +license = "MIT" +description = "A modern résumé/curriculum vitæ template with high attention to detail." +categories = ["cv"] +disciplines = ["business", "communication"] +keywords = ["resume", "curriculum", "vitae", "cv"] +repository = "https://github.com/swaits/typst-collection" + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png"