commit 325c78396761c5b0d5accbe02da058f98a1d285f Author: Paul T Date: Mon Mar 25 10:26:10 2024 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f08278d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pdf \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..23c8c8a --- /dev/null +++ b/LICENSE @@ -0,0 +1,189 @@ +MIT License + +Copyright (c) 2024 Paul Tsouchlos + +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. + +-------------------------------------------------------------------------------- + +Fonticons, Inc. (https://fontawesome.com) + +-------------------------------------------------------------------------------- + +Font Awesome Free License + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +-------------------------------------------------------------------------------- + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) + +The Font Awesome Free download is licensed under a Creative Commons +Attribution 4.0 International License and applies to all icons packaged +as SVG and JS file types. + +-------------------------------------------------------------------------------- + +# Fonts: SIL OFL 1.1 License + +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +Copyright (c) 2023 Fonticons, Inc. (https://fontawesome.com) +with Reserved Font Name: "Font Awesome". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +-------------------------------------------------------------------------------- + +# Code: MIT License (https://opensource.org/licenses/MIT) + +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +Copyright 2023 Fonticons, Inc. + +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. + +-------------------------------------------------------------------------------- + +# Attribution + +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +-------------------------------------------------------------------------------- + +# Brand Icons + +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/README.md b/README.md new file mode 100644 index 0000000..64e86c1 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Modern CV + +A port of the [Awesome-CV](https://github.com/posquit0/Awesome-CV) Latex resume template in [typst](https://github.com/typst/typst). + +## Requirements + +You will need the `Robot` and `Source Sans Pro` fonts installed on your system or available somewhere. You can download them from the following links: + +- [Roboto](https://fonts.google.com/specimen/Roboto) +- [Source Sans Pro](https://github.com/adobe-fonts/source-sans-pro) + +See `typst fonts --help` for more information on configuring fonts for `typst` that are not installed on your system. + +### Usage + +:construction: diff --git a/assets/icons/LICENSE.txt b/assets/icons/LICENSE.txt new file mode 100644 index 0000000..39e18e3 --- /dev/null +++ b/assets/icons/LICENSE.txt @@ -0,0 +1,165 @@ +Fonticons, Inc. (https://fontawesome.com) + +-------------------------------------------------------------------------------- + +Font Awesome Free License + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +-------------------------------------------------------------------------------- + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) + +The Font Awesome Free download is licensed under a Creative Commons +Attribution 4.0 International License and applies to all icons packaged +as SVG and JS file types. + +-------------------------------------------------------------------------------- + +# Fonts: SIL OFL 1.1 License + +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +Copyright (c) 2023 Fonticons, Inc. (https://fontawesome.com) +with Reserved Font Name: "Font Awesome". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +-------------------------------------------------------------------------------- + +# Code: MIT License (https://opensource.org/licenses/MIT) + +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +Copyright 2023 Fonticons, Inc. + +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. + +-------------------------------------------------------------------------------- + +# Attribution + +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +-------------------------------------------------------------------------------- + +# Brand Icons + +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/assets/icons/square-phone-solid.svg b/assets/icons/square-phone-solid.svg new file mode 100644 index 0000000..13fd107 --- /dev/null +++ b/assets/icons/square-phone-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib.typ b/lib.typ new file mode 100644 index 0000000..d825a8c --- /dev/null +++ b/lib.typ @@ -0,0 +1,546 @@ +#import "@preview/fontawesome:0.1.0": * + +// const color +#let color_darknight = rgb("131A28") +#let color_darkgray = rgb("414141") +#let color_gray = rgb("5d5d5d") +#let default_accent_color = rgb("333ECC") + +// const icons +#let linkedin_icon = box(fa-icon("linkedin", fa-set: "Brands", fill: color_darknight)) +#let github_icon = box(fa-icon("github", fa-set: "Brands", fill: color_darknight)) +// for some reason this icon doesn't work with fa-icon, so we use the local version +#let phone_icon = box(image("assets/icons/square-phone-solid.svg")) +#let email_icon = box(fa-icon("envelope", fill: color_darknight)) + +/// Helpers + +// layout utility +#let __justify_align(left_body, right_body) = { + block[ + #left_body + #box(width: 1fr)[ + #align(right)[ + #right_body + ] + ] + ] +} + +#let __justify_align_3(left_body, mid_body, right_body) = { + block[ + #box(width: 1fr)[ + #align(left)[ + #left_body + ] + ] + #box(width: 1fr)[ + #align(center)[ + #mid_body + ] + ] + #box(width: 1fr)[ + #align(right)[ + #right_body + ] + ] + ] +} + +/// Show a link with an icon, specifically for Github projects +/// *Example* +/// #example(`resume.github_link("DeveloperPaul123/awesome-resume")`) +/// - github_path (string): The path to the Github project (e.g. "DeveloperPaul123/awesome-resume") +/// -> none +#let github_link(github_path) = { + set box(height: 11pt) + + align(right + horizon)[ + #fa-icon("github", fa-set: "Brands", fill: color_darkgray) #link("https://github.com/" + github_path, github_path) + ] +} + +/// Right section for the justified headers +/// - body (content): The body of the right header +/// - accent_color (color): The accent color to color the text with. This defaults to the default_accent_color +#let secondary_right_header(body, accent_color: default_accent_color) = { + set text(accent_color, size: 11pt, style: "italic", weight: "light") + body +} + +/// Right section of a tertiaty headers. +/// - body (content): The body of the right header +#let tertiary_right_header(body) = { + set text(weight: "light", style: "italic", size: 9pt) + body +} + +/// Justified header that takes a primary section and a secondary section. The primary section is on the left and the secondary section is on the right. +/// - primary (content): The primary section of the header +/// - secondary (content): The secondary section of the header +#let justified_header(primary, secondary) = { + set block(above: 0.7em, below: 0.7em) + pad[ + #__justify_align[ + == #primary + ][ + #secondary_right_header[#secondary] + ] + ] +} + +/// Justified header that takes a primary section and a secondary section. The primary section is on the left and the secondary section is on the right. This is a smaller header compared to the `justified_header`. +/// - primary (content): The primary section of the header +/// - secondary (content): The secondary section of the header +#let secondary_justified_header(primary, secondary) = { + __justify_align[ + === #primary + ][ + #tertiary_right_header[#secondary] + ] +} +/// --- End of Helpers + +/// ---- Resume Template ---- + +/// Resume template that is inspired by the Awesome CV Latex template by posquit0. This template can loosely be considered a port of the original Latex template. +/// +/// The original template: https://github.com/posquit0/Awesome-CV +/// +/// - author (content): Structure that takes in all the author's information +/// - date (string): The date the resume was created +/// - accent_color (color): The accent color of the resume +/// - body (content): The body of the resume +/// -> none +#let resume( + author: (:), + date: datetime.today().display("[month repr:long] [day], [year]"), + accent_color: default_accent_color, + body) = { + set document( + author: author.firstname + " " + author.lastname, + title: "resume", + ) + + set text( + font: ("Source Sans Pro"), + lang: "en", + size: 11pt, + fill: color_darkgray, + fallback: false + ) + + set page( + paper: "a4", + margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm), + footer: [ + #set text(fill: gray, size: 8pt) + #__justify_align_3[ + #smallcaps[#date] + ][ + #smallcaps[ + #author.firstname + #author.lastname + #sym.dot.c + #"Résumé" + ] + ][ + #counter(page).display() + ] + ], + footer-descent: 0pt, + ) + + // set paragraph spacing + show par: set block(above: 0.75em, below: 0.75em) + set par(justify: true) + + set heading( + numbering: none, + outlined: false, + ) + + show heading.where(level:1): it => [ + #set block(above: 1em, below: 1em) + #set text( + size: 16pt, + weight: "regular" + ) + + #align(left)[ + #text[#strong[#text(accent_color)[#it.body.text.slice(0, 3)]]]#strong[#text[#it.body.text.slice(3)]] + #box(width: 1fr, line(length: 100%)) + ] + ] + + show heading.where(level: 2): it => { + set text(color_darkgray, size: 12pt, style: "normal", weight: "bold") + it.body + } + + show heading.where(level: 3): it => { + set text(size: 10pt, weight: "regular") + smallcaps[#it.body] + } + + let name = { + align(center)[ + #pad(bottom: 5pt)[ + #block[ + #set text(size: 32pt, style: "normal", font: ("Roboto")) + #text(accent_color, weight: "thin")[#author.firstname] + #text(weight: "bold")[#author.lastname] + ] + ] + ] + } + + let positions = { + set text( + accent_color, + size: 9pt, + weight: "regular" + ) + align(center)[ + #smallcaps[ + #author.positions.join( + text[#" "#sym.dot.c#" "] + ) + ] + ] + } + + let address = { + set text( + size: 9pt, + weight: "bold", + style: "italic", + ) + align(center)[ + #author.address + ] + } + + let contacts = { + set box(height: 9pt) + + let separator = box(width: 5pt) + + align(center)[ + #set text(size: 9pt, weight: "regular", style: "normal") + #block[ + #align(horizon)[ + #phone_icon + #box[#text(author.phone)] + #separator + #email_icon + #box[#link("mailto:" + author.email)[#author.email]] + #separator + #github_icon + #box[#link("https://github.com/" + author.github)[#author.github]] + #separator + #linkedin_icon + #box[ + #link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname] + ] + ] + ] + ] + } + + name + positions + address + contacts + body +} + +/// The base item for resume entries. +/// This formats the item for the resume entries. Typically your body would be a bullet list of items. Could be your responsibilities at a company or your academic achievements in an educational background section. +/// - body (content): The body of the resume entry +#let resume_item(body) = { + set text(size: 10pt, style: "normal", weight: "light") + set par(leading: 0.65em) + body +} + +/// The base item for resume entries. This formats the item for the resume entries. Typically your body would be a bullet list of items. Could be your responsibilities at a company or your academic achievements in an educational background section. +/// - title (string): The title of the resume entry +/// - location (string): The location of the resume entry +/// - date (string): The date of the resume entry, this can be a range (e.g. "Jan 2020 - Dec 2020") +/// - description (content): The body of the resume entry +#let resume_entry( + title: none, + location: "", + date: "", + description: "" +) = { + pad[ + #justified_header(title, location) + #secondary_justified_header(description, date) + ] +} + +/// Show cumulative GPA. +/// *Example:* +/// #example(`resume.resume_gpa("3.5", "4.0")`) +#let resume_gpa(numerator, denominator) = { + set text(size: 12pt, style: "italic", weight: "light") + text[Cumulative GPA: #box[#strong[#numerator] / #denominator]] +} + +/// Show a certification in the resume. +/// *Example:* +/// #example(`resume.resume_certification("AWS Certified Solutions Architect - Associate", "Jan 2020")`) +/// - certification (content): The certification +/// - date (content): The date the certification was achieved +#let resume_certification(certification, date) = { + justified_header(certification, date) +} + +/// Show a list of skills in the resume under a given category. +/// - category (string): The category of the skills +/// - items (list): The list of skills. This can be a list of strings but you can also emphasize certain skills by using the `strong` function. +#let resume_skill_item(category, items) = { + set block(below: 0.65em) + set pad(top: 2pt) + + pad[ + #grid( + columns: (20fr, 80fr), + gutter: 10pt, + align(right)[ + #set text(hyphenate: false) + == #category + ], + align(left)[ + #set text(size: 11pt, style: "normal", weight: "light") + #items.join(", ") + ], + ) + ] +} + +/// ---- End of Resume Template ---- + +/// ---- Coverletter ---- + +/// Cover letter template that is inspired by the Awesome CV Latex template by posquit0. This template can loosely be considered a port of the original Latex template. +/// This coverletter template is designed to be used with the resume template. +/// - author (content): Structure that takes in all the author's information +/// - profile_picture (image): The profile picture of the author. This will be cropped to a circle and should be square in nature. +/// - date (date): The date the cover letter was created +/// - accent_color (color): The accent color of the cover letter +/// - body (content): The body of the cover letter +#let coverletter( + author: (:), + profile_picture: image, + date: datetime.today().display("[month repr:long] [day], [year]"), + accent_color: default_accent_color, + body +) = { + set document( + author: author.firstname + " " + author.lastname, + title: "resume", + ) + + set text( + font: ("Source Sans Pro"), + lang: "en", + size: 11pt, + fill: color_darkgray, + fallback: false + ) + + set page( + paper: "a4", + margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm), + footer: [ + #set text(fill: gray, size: 8pt) + #__justify_align_3[ + #smallcaps[#date] + ][ + #smallcaps[ + #author.firstname + #author.lastname + #sym.dot.c + #"Cover Letter" + ] + ][ + #counter(page).display() + ] + ], + footer-descent: 0pt, + ) + + // set paragraph spacing + show par: set block(above: 0.75em, below: 0.75em) + set par(justify: true) + + set heading( + numbering: none, + outlined: false, + ) + + show heading: it => [ + #set block(above: 1em, below: 1em) + #set text( + size: 16pt, + weight: "regular" + ) + + #align(left)[ + #text[#strong[#text(accent_color)[#it.body.text.slice(0, 3)]]]#strong[#text[#it.body.text.slice(3)]] + #box(width: 1fr, line(length: 100%)) + ] + ] + + let name = { + align(right)[ + #pad(bottom: 5pt)[ + #block[ + #set text(size: 32pt, style: "normal", font: ("Roboto")) + #text(accent_color, weight: "thin")[#author.firstname] + #text(weight: "bold")[#author.lastname] + ] + ] + ] + } + + let positions = { + set text( + accent_color, + size: 9pt, + weight: "regular" + ) + align(right)[ + #smallcaps[ + #author.positions.join( + text[#" "#sym.dot.c#" "] + ) + ] + ] + } + + let address = { + set text( + size: 9pt, + weight: "regular", + style: "italic", + fill: color_gray + ) + align(right)[ + #author.address + ] + } + + let contacts = { + set box(height: 9pt) + + let separator = [#box(sym.bar.v)] + + align(right)[ + #set text(size: 8pt, weight: "light", style: "normal") + #block[ + #align(horizon)[ + #stack(dir: ltr, spacing: 0.5em, + phone_icon, + box[#text(author.phone)], + separator, + email_icon, + box[#link("mailto:" + author.email)[#author.email]], + separator, + github_icon, + box[#link("https://github.com/" + author.github)[#author.github]], + separator, + linkedin_icon, + box[ + #link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname] + ] + ) + ] + ] + ] + } + + let letter_heading = { + grid(columns: (1fr, 2fr), + rows: (100pt), + align(left+horizon)[ + #block(clip: true, stroke: 0pt, radius: 2cm, + width: 4cm, height: 4cm, profile_picture) + ], + [ + #name + #positions + #address + #contacts + ] + ) + } + + let letter_conclusion = { + align(bottom)[ + #pad(bottom: 2em)[ + #text(weight: "light")[Sincerely,] \ + #text(weight: "bold")[#author.firstname #author.lastname] \ \ + #text(weight: "light", style: "italic")[Attached: Curriculum Vitae] + ] + ] + } + + // actual content + letter_heading + body + linebreak() + letter_conclusion +} + +/// Cover letter heading that takes in the information for the hiring company and formats it properly. +/// - entity_info (content): The information of the hiring entity including the company name, the target (who's attention to), street address, and city +/// - date (date): The date the letter was written (defaults to the current date) +#let hiring_entity_info(entity_info: (:), date: datetime.today().display("[month repr:long] [day], [year]")) = { + set par(leading: 1em) + pad(top: 1.5em, bottom: 1.5em)[ + #__justify_align[ + #text(weight: "bold", size: 12pt)[#entity_info.target] + ][ + #text(weight: "light", style: "italic", size: 9pt)[#date] + ] + + #pad(top: 0.65em, bottom: 0.65em)[ + #text(weight: "regular", fill: color_gray, size: 9pt)[ + #smallcaps[#entity_info.name] \ + #entity_info.street_address \ + #entity_info.city \ + ] + ] + ] +} + +/// Letter heading for a given job position and addressee. +/// - job_position (string): The job position you are applying for +/// - addressee (string): The person you are addressing the letter to +#let letter_heading(job_position: "", addressee: "") = { + // TODO: Make this adaptable to content + underline(evade: false, stroke: 0.5pt, offset: 0.3em)[ + #text(weight: "bold", size: 12pt)[Job Application for #job_position] + ] + pad(top: 1em, bottom: 1em)[ + #text(weight: "light", fill: color_gray)[ + Dear #addressee, + ] + ] +} + +/// Cover letter content paragraph. This is the main content of the cover letter. +/// - content (content): The content of the cover letter +#let coverletter_content(content) = { + pad(top: 1em, bottom: 1em)[ + #set par(first-line-indent: 3em) + #set text(weight: "light") + #content + ] +} + +/// ---- End of Coverletter ---- diff --git a/resume-documentation.typ b/resume-documentation.typ new file mode 100644 index 0000000..8249a8f --- /dev/null +++ b/resume-documentation.typ @@ -0,0 +1,9 @@ +#import "lib.typ" +#import "@preview/tidy:0.2.0" + +#let docs = tidy.parse-module( + read("lib.typ"), + name: "Modern CV", + scope: (resume: lib) +) +#tidy.show-module(docs) diff --git a/resume.png b/resume.png new file mode 100644 index 0000000..90cfccd Binary files /dev/null and b/resume.png differ diff --git a/scripts/install_package_locally.ps1 b/scripts/install_package_locally.ps1 new file mode 100644 index 0000000..fc7cdbf --- /dev/null +++ b/scripts/install_package_locally.ps1 @@ -0,0 +1,3 @@ +$Source = "$PSScriptRoot/../*" +$Destination = "$env:LOCALAPPDATA/typst/packages/local/modern-cv/0.1.0" +Copy-Item -Path $Source -Destination $Destination -Recurse -Force diff --git a/template/coverletter.typ b/template/coverletter.typ new file mode 100644 index 0000000..e3d5c41 --- /dev/null +++ b/template/coverletter.typ @@ -0,0 +1,47 @@ +#import "@local/modern-cv:0.1.0":* + +#show: coverletter.with( + author: ( + firstname: "John", + lastname: "Smith", + email: "js@gmail.com", + phone: "(+1) 111-111-1111", + github: "DeveloperPaul123", + linkedin: "John Smith", + address: "111 Example St. Apt. 111, Example City, EX 11111", + positions: ( + "Software Engineer", + "Full Stack Developer" + ) + ), + profile_picture: image("./profile.png") +) + +#hiring_entity_info( + entity_info: ( + target: "Company Recruitement Team", + name: "Google, Inc.", + street_address: "1600 AMPHITHEATRE PARKWAY", + city: "MOUNTAIN VIEW, CA 94043" + ) +) + +#letter_heading( + job_position: "Software Engineer", + addressee: "Sir or Madame" +) + += About Me +#coverletter_content[ + #lorem(80) +] + += Why Google? +#coverletter_content[ + #lorem(90) +] + += Why Me? +#coverletter_content[ + #lorem(100) +] \ No newline at end of file diff --git a/template/profile.png b/template/profile.png new file mode 100644 index 0000000..1a9ceb8 Binary files /dev/null and b/template/profile.png differ diff --git a/template/resume.typ b/template/resume.typ new file mode 100644 index 0000000..8928ff7 --- /dev/null +++ b/template/resume.typ @@ -0,0 +1,93 @@ +#import "@local/modern-cv:0.1.0": * + +#show: resume.with( + author: ( + firstname: "John", + lastname: "Smith", + email: "js@example.com", + phone: "(+1) 111-111-1111", + github: "DeveloperPaul123", + linkedin: "Example", + address: "111 Example St. Example City, EX 11111", + positions: ( + "Software Engineer", + "Software Architect" + ) + ), + date: datetime.today().display() +) + += Education + +#resume_entry( + title: "Example University", + location: "B.S. in Computer Science", + date: "August 2014 - May 2019", + description: "Example" +) + +#resume_item[ + - #lorem(20) + - #lorem(15) + - #lorem(25) +] + += Experience + +#resume_entry( + title: "Example, Inc.", + location: "Example City, EX", + date: "2019 - Present", + description: "Senior Software Engineer" +) + +#resume_item[ + - #lorem(20) + - #lorem(15) + - #lorem(25) +] + +#resume_entry( + title: "Previous Company, Inc.", + location: "Example City, EX", + date: "2011 - 2019", + description: "Software Engineer" +) + +#resume_item[ + - #lorem(20) + - #lorem(15) + - #lorem(25) +] + += Projects + +#resume_entry( + title: "Thread Pool C++ Library", + location: [#github_link("DeveloperPaul123/thread-pool")], + date: "May 2021 - Present", + description: "Designer/Developer" +) + +#resume_item[ + - Designed and implemented a thread pool library in C++ using the latest C++20 and C++23 features. + - Wrote extensive documentation and unit tests for the library and published it on Github. +] + +#resume_entry( + title: " Event Bus C++ Library", + location: github_link("DeveloperPaul123/eventbus"), + date: "Sep. 2019 - Present", + description: "Designer/Developer" +) + +#resume_item[ + - Designed and implemented an event bus library using C++17. + - Wrote detailed documentation and unit tests for the library and published it on Github. +] + += Skills + +#resume_skill_item("Programming Languages", (strong("C++"), "Python", "Java", "C#", "JavaScript", "TypeScript")) +#resume_skill_item("Spoken Languages", (strong("English"), "Spanish")) +#resume_skill_item("Programs", (strong("Excel"),"Word")) diff --git a/typst.toml b/typst.toml new file mode 100644 index 0000000..f7eebaa --- /dev/null +++ b/typst.toml @@ -0,0 +1,17 @@ +[package] +name = "modern-cv" +version = "0.1.0" +compiler = "0.11.0" +entrypoint = "lib.typ" +authors = ["Paul Tsouchlos "] +license = "MIT" +description = "A modern resume based on the Awesome-CV Latex template." +keywords = ["CV", "Resume", "Minimalistic", "Professional", "Modern"] +categories = ["cv"] +disciplines = [] +exclude = ["resume-documentation*", "scripts*"] + +[template] +path = "template" +entrypoint = "resume.typ" +thumbnail = "resume.png" \ No newline at end of file