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")[]
+]