diff --git a/finely-crafted-cv/.gitignore b/finely-crafted-cv/.gitignore new file mode 100644 index 0000000..f1ca904 --- /dev/null +++ b/finely-crafted-cv/.gitignore @@ -0,0 +1,2 @@ +tests/**/out/ +tests/**/diff/ diff --git a/finely-crafted-cv/README.md b/finely-crafted-cv/README.md index 49396b3..9421788 100644 --- a/finely-crafted-cv/README.md +++ b/finely-crafted-cv/README.md @@ -21,9 +21,11 @@ To use this template, import it with the version number and utilize the `resume` 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", + icon-contact-header: ( + (image("icons/email.svg"), link("mailto:amira.patel@oceandreams.org", "amira.patel@oceandreams.org")), + (image("icons/phone.svg"), link("tel:+13055557890", "+1-305-555-7890")), + (image("icons/linkedin.svg"), link("https://www.linkedin.com/in/amirapatel/", "amirapatel")), + ), thumbnail: image("assets/my-qr-code.svg"), ) @@ -75,9 +77,8 @@ This is the main function to create a CV document. - `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. + - `icon-contact-header`: (Array of Tuples) Array of (icon, content) pairs + which will make up the contact header (top of first page). - `keywords`: (String) Keywords for searchability. - `thumbnail`: (Image) Thumbnail or QR code image, optional. - `body`: (Block) The main content of your CV. diff --git a/finely-crafted-cv/src/helpers.typ b/finely-crafted-cv/src/helpers.typ index 3b0eada..f13301e 100644 --- a/finely-crafted-cv/src/helpers.typ +++ b/finely-crafted-cv/src/helpers.typ @@ -1,18 +1,32 @@ #import "constants.typ":* #let icon_and_contact(icon, content) = { - grid( - columns: 2, - align: center+horizon, - gutter: COMPANY_ICON_SPACING, + if icon != none and content != none { + grid( + columns: 2, + align: center+horizon, + gutter: COMPANY_ICON_SPACING, + box( + height: HEADER_ICON_HEIGHT, + width: auto, + icon + ), + content + ) + } +} + +#let make-icon-header(icon-tuples) = { + // what we put between elements + let icon-joiner = box(baseline: -0.15em, [#h(0.5em)#sym.divides#h(0.5em)]) + + // map them into formatted content, and join + icon-tuples.map(((icon, content)) => { box( - height: HEADER_ICON_HEIGHT, - width: auto, - image(icon) - ), - content - ) + icon_and_contact(icon, content) + ) + }).join(icon-joiner) } #let hrule(stroke: 1pt + black) = { diff --git a/finely-crafted-cv/src/resume.typ b/finely-crafted-cv/src/resume.typ index 6bdfec8..ef80af1 100644 --- a/finely-crafted-cv/src/resume.typ +++ b/finely-crafted-cv/src/resume.typ @@ -10,9 +10,7 @@ heading-font: HEADING_FONT, body-font: BODY_FONT, body-size: BODY_SIZE, - email: none, - phone: none, - linkedin-username: none, + icon-contact-header: none, keywords: "", thumbnail: none, // check out https://qrframe.kylezhe.ng/ for QR code generation body @@ -30,19 +28,13 @@ 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)) + if here().page() == 1 and icon-contact-header != none { + grid( + columns: (1fr, auto), + [], + text( + size: HEADER_SIZE, + make-icon-header(icon-contact-header) ) ) } diff --git a/finely-crafted-cv/src/icons/email.svg b/finely-crafted-cv/template/icons/email.svg similarity index 100% rename from finely-crafted-cv/src/icons/email.svg rename to finely-crafted-cv/template/icons/email.svg diff --git a/finely-crafted-cv/src/icons/linkedin.svg b/finely-crafted-cv/template/icons/linkedin.svg similarity index 100% rename from finely-crafted-cv/src/icons/linkedin.svg rename to finely-crafted-cv/template/icons/linkedin.svg diff --git a/finely-crafted-cv/src/icons/phone.svg b/finely-crafted-cv/template/icons/phone.svg similarity index 100% rename from finely-crafted-cv/src/icons/phone.svg rename to finely-crafted-cv/template/icons/phone.svg diff --git a/finely-crafted-cv/template/main.typ b/finely-crafted-cv/template/main.typ index 11852bc..8f6e1a3 100644 --- a/finely-crafted-cv/template/main.typ +++ b/finely-crafted-cv/template/main.typ @@ -4,9 +4,11 @@ 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", + icon-contact-header: ( + (image("icons/email.svg"), link("mailto:amira.patel@oceandreams.org", "amira.patel@oceandreams.org")), + (image("icons/phone.svg"), link("tel:+13055557890", "+1-305-555-7890")), + (image("icons/linkedin.svg"), link("https://www.linkedin.com/in/amirapatel/", "amirapatel")), + ), thumbnail: image("assets/my-qr-code.svg"), ) diff --git a/finely-crafted-cv/tests/example/icons/email.svg b/finely-crafted-cv/tests/example/icons/email.svg new file mode 100644 index 0000000..ee04080 --- /dev/null +++ b/finely-crafted-cv/tests/example/icons/email.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/example/icons/linkedin.svg b/finely-crafted-cv/tests/example/icons/linkedin.svg new file mode 100644 index 0000000..edc5fc6 --- /dev/null +++ b/finely-crafted-cv/tests/example/icons/linkedin.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/example/icons/phone.svg b/finely-crafted-cv/tests/example/icons/phone.svg new file mode 100644 index 0000000..778648a --- /dev/null +++ b/finely-crafted-cv/tests/example/icons/phone.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/example/out/1.png b/finely-crafted-cv/tests/example/out/1.png deleted file mode 100644 index bd79f59..0000000 Binary files a/finely-crafted-cv/tests/example/out/1.png and /dev/null differ diff --git a/finely-crafted-cv/tests/example/ref/1.png b/finely-crafted-cv/tests/example/ref/1.png new file mode 100644 index 0000000..cee9438 Binary files /dev/null and b/finely-crafted-cv/tests/example/ref/1.png differ diff --git a/finely-crafted-cv/tests/example/test.typ b/finely-crafted-cv/tests/example/test.typ index 11852bc..3a533c6 100644 --- a/finely-crafted-cv/tests/example/test.typ +++ b/finely-crafted-cv/tests/example/test.typ @@ -1,12 +1,14 @@ -#import "@preview/finely-crafted-cv:0.1.0": * +#import "/lib.typ": * #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", + icon-contact-header: ( + (image("icons/email.svg"), link("mailto:amira.patel@oceandreams.org", "amira.patel@oceandreams.org")), + (image("icons/phone.svg"), link("tel:+13055557890", "+1-305-555-7890")), + (image("icons/linkedin.svg"), link("https://www.linkedin.com/in/amirapatel/", "amirapatel")), + ), thumbnail: image("assets/my-qr-code.svg"), ) diff --git a/finely-crafted-cv/tests/linkedin-none/assets/my-qr-code.svg b/finely-crafted-cv/tests/linkedin-none/assets/my-qr-code.svg new file mode 100644 index 0000000..a0f91ef --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/assets/my-qr-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/coral.svg b/finely-crafted-cv/tests/linkedin-none/icons/coral.svg new file mode 100644 index 0000000..1575325 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/coral.svg @@ -0,0 +1,81 @@ + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/earth.svg b/finely-crafted-cv/tests/linkedin-none/icons/earth.svg new file mode 100644 index 0000000..2534f82 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/earth.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/graduation-cap.svg b/finely-crafted-cv/tests/linkedin-none/icons/graduation-cap.svg new file mode 100644 index 0000000..abd10ff --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/graduation-cap.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/microscope.svg b/finely-crafted-cv/tests/linkedin-none/icons/microscope.svg new file mode 100644 index 0000000..4310015 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/microscope.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/palm-tree.svg b/finely-crafted-cv/tests/linkedin-none/icons/palm-tree.svg new file mode 100644 index 0000000..e082551 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/palm-tree.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/icons/whale.svg b/finely-crafted-cv/tests/linkedin-none/icons/whale.svg new file mode 100644 index 0000000..935fde0 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/icons/whale.svg @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file diff --git a/finely-crafted-cv/tests/linkedin-none/ref/1.png b/finely-crafted-cv/tests/linkedin-none/ref/1.png new file mode 100644 index 0000000..f4198cd Binary files /dev/null and b/finely-crafted-cv/tests/linkedin-none/ref/1.png differ diff --git a/finely-crafted-cv/tests/linkedin-none/test.typ b/finely-crafted-cv/tests/linkedin-none/test.typ new file mode 100644 index 0000000..bb86fb8 --- /dev/null +++ b/finely-crafted-cv/tests/linkedin-none/test.typ @@ -0,0 +1,88 @@ +#import "/lib.typ": * + +#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", + 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")[] +]