diff --git a/cv.typ b/cv.typ index 6a8c469..36b8158 100644 --- a/cv.typ +++ b/cv.typ @@ -1,35 +1,99 @@ -#import "@preview/fontawesome:0.1.0" +#import "@preview/fontawesome:0.1.0": * -#let process_colors(colors) = { - if colors.at("base", none) == none { - colors.insert("base", rgb(#b00b69)) +#let process_colors(colors: (:)) = { + if colors.at("base", default: none) == none { + colors.insert("base", rgb("#b00b69")) } - if colors.at("light", none) == none { + if colors.at("light", default: none) == none { colors.insert("light", colors.base.lighten(35%)) } - if colors.at("lighter", none) == none { + if colors.at("lighter", default: none) == none { colors.insert("lighter", colors.base.lighten(70%)) } - if colors.at("dark", none) == none { + if colors.at("dark", default: none) == none { colors.insert("dark", colors.base.darken(35%)) } - if colors.at("darker", none) == none { + if colors.at("darker", default: none) == none { colors.insert("darker", colors.base.darken(70%)) } + + return colors +} + +#let _default_colors() = { + let c = process_colors() + let textc = rgb("#281f24") + c.insert("text", textc) + c.insert("heading", textc.darken(50%)) + c.insert("text_lighter", textc.lighten(25%)) + return c } -#let cv( - colors: {}, - self, - left_col, - right_col, - +#let default_style = ( + left_col_size: 33%, + col_gap: 8mm, + line_height: 0.5mm, + page: ( + paper: "a4", + margin: 1cm, + ), + size: ( + h1: 36pt, + h2: 12pt, + base: 10pt, + small: 9pt, + ), + colors: _default_colors(), +) + +#let lenk(to, where) = [ + #link(to)[#fa-link() #where] +] + +#let base_layout( + style, + header, + left, + right, ) = { - process_colors(colors) - set page("a4", margin: 1cm) - set text( - font: "Inter", - size: 10pt + [#header] + grid( + columns: (style.left_col_size, 1fr), + gutter: style.col_gap, + [#left], [#right] ) - +} + +#let work_item( + style: default_style, + ref: none, + time: none, + location: none, + title: none, +) = { + stack( + dir: ltr, + spacing: 2mm, + [=== #title], + text(fill: style.colors.text_lighter, size: style.size.small)[#time, #location] + ) + if ref != none { + v(-2mm) + ref + } +} + +#let machine_reading_keyword_dump = [ // the future we live in... this actually does help and i hate that + // based in part on the stackoverflow dev survey + Rust, Python, Nix, JS, CSS, HTML, Web, Desktop, Embedded, Scalable, Server, Service, SAAS, Network, Administration, + Java, Backend, High performance Async, Serverless, React, NextJS, Scala, Erlang, Haskell, COBOL, Kubernetes, K8s, k3s, + Docker, Podman, Ansible, Terraform, Container, .NET, C\#, PHP, MySQL, Nginx, Apache, Database, SQLite, SQL, NoSQL, + MongoDB, npm, yarn, Unity, Unreal, Elixir, Clojure, TypeScript, Go, Kotlin, Swift, Dart, Bash, Ruby, C++, Lua, + Fortran, Assembly, Redis, Elasticsearch, Firebase, AWS, OVH, GCP, OpenStack, OpenShift, Phoenix, Svelte, Deno, + ASP.NET, FastAPI, Node.js, Django, Laravel, Flask, jQuery, Flutter, Keras, NumPy, Spring, React Native, Electron, + Git, CI/CD, DevOps, Observability, Grafana, Prometheus, OpenTelemetry, OTel, Microservice, debugging, gdb +] + +#let put_keyword_dump_in_there() = { + place(top + left, hide([#machine_reading_keyword_dump])) } \ No newline at end of file diff --git a/meow.pdf b/meow.pdf new file mode 100644 index 0000000..5e8899a Binary files /dev/null and b/meow.pdf differ diff --git a/meow.typ b/meow.typ new file mode 100644 index 0000000..fb2ddd6 --- /dev/null +++ b/meow.typ @@ -0,0 +1,22 @@ +#import "xenua_cv.typ": xenua_cv, xenua_style +#import "cv.typ": work_item, lenk +#import "self.typ" + +#xenua_cv( + self, + [ + == left content + foo bar meow + ], + [ + == right content + hellfire r9x missile doesn't know where it is, someone sabotaged it + + #work_item(style: xenua_style, + title: "Software Engineer", + time: "2020 - 2021", + location: "Remote", + ref: lenk("https://rami.io")[rami.io], + ) + ], +) \ No newline at end of file diff --git a/old.pdf b/old.pdf index 35bec98..01c5b45 100644 Binary files a/old.pdf and b/old.pdf differ diff --git a/old.typ b/old.typ index d539b07..e8ba013 100644 --- a/old.typ +++ b/old.typ @@ -3,144 +3,144 @@ #set page("a4", margin: 1cm) #set text( - font: ("Inter", "Noto Color Emoji"), - size: 10pt) + font: ("Inter", "Noto Color Emoji"), + size: 10pt) #let accent_color = rgb("#B00B69") #let colors = ( - accent: rgb("#b00b69"), - muted: rgb("#af4682"), - dark: rgb("#353133"), - mid: rgb("#635e61"), - light: rgb("#d8d0d4"), + accent: rgb("#b00b69"), + muted: rgb("#af4682"), + dark: rgb("#353133"), + mid: rgb("#635e61"), + light: rgb("#d8d0d4"), ) #set text(fill: colors.dark) #show heading: it => { - set text(fill: black) - it + set text(fill: black) + it } #show heading.where(level: 2): it => { - it - v(-8pt) - line(length: 100%, stroke: 2pt + colors.muted) + it + v(-8pt) + line(length: 100%, stroke: 2pt + colors.muted) } #let accent(body, fill: accent_color) = { - text(fill)[#body] + text(fill)[#body] } #let skillbox(percent) = { - v(-2pt) - rect(width: 100%, fill: colors.light, inset: 0pt, height: 10pt, radius: 3pt)[#rect(width: percent, fill: accent_color, radius: 3pt)] + v(-2pt) + rect(width: 100%, fill: colors.light, inset: 0pt, height: 10pt, radius: 3pt)[#rect(width: percent, fill: accent_color, radius: 3pt)] } #let skill(desc: none, name, percent) = { - grid( - columns: (1fr, 2cm), - [*#name*], - skillbox(percent) - ) - if desc != none { - v(-8pt) - text(size: 8pt)[#desc] - } + grid( + columns: (1fr, 2cm), + [*#name*], + skillbox(percent) + ) + if desc != none { + v(-8pt) + text(size: 8pt)[#desc] + } } #let work_item( - ref: none, - time: none, - location: none, - title: none, + ref: none, + time: none, + location: none, + title: none, ) = { - [=== #title] - if ref != none { - - } - grid( - columns: (1fr, auto), - [=== #title], - ref - ) - grid( - columns: (1fr, 1fr), - { - if time != none [ - #fa-calendar-alt() #time - ] - }, - { - if location != none [ - #fa-map-marker-alt() #location - ] - } - ) + [=== #title] + if ref != none { + + } + grid( + columns: (1fr, auto), + [=== #title], + ref + ) + grid( + columns: (1fr, 1fr), + { + if time != none [ + #fa-calendar-alt() #time + ] + }, + { + if location != none [ + #fa-map-marker-alt() #location + ] + } + ) } #let meta_item(icon, body) = { - accent()[#icon] - h(5pt) - text(size: 9pt, baseline: -2pt, fill: colors.mid)[*#body*] + accent()[#icon] + h(5pt) + text(size: 9pt, baseline: -2pt, fill: colors.mid)[*#body*] } #let meta_items = ( - (fa-at(), self.email), - (fa-id-card(), [they/them]), - (fa-map-marker-alt(), [Germany]) + (fa-at(), self.email), + (fa-id-card(), [they/them]), + (fa-map-marker-alt(), [Germany]) ) #let machine_reading_keyword_dump = [ // the future we live in... this actually does help and i hate that - // based in part on the stackoverflow dev survey - Rust, Python, Nix, JS, CSS, HTML, Web, Desktop, Embedded, Scalable, Server, Service, SAAS, Network, Administration, - Java, Backend, High performance Async, Serverless, React, NextJS, Scala, Erlang, Haskell, COBOL, Kubernetes, K8s, k3s, - Docker, Podman, Ansible, Terraform, Container, .NET, C\#, PHP, MySQL, Nginx, Apache, Database, SQLite, SQL, NoSQL, - MongoDB, npm, yarn, Unity, Unreal, Elixir, Clojure, TypeScript, Go, Kotlin, Swift, Dart, Bash, Ruby, C++, Lua, - Fortran, Assembly, Redis, Elasticsearch, Firebase, AWS, OVH, GCP, OpenStack, OpenShift, Phoenix, Svelte, Deno, - ASP.NET, FastAPI, Node.js, Django, Laravel, Flask, jQuery, Flutter, Keras, NumPy, Spring, React Native, Electron, - Git, CI/CD, DevOps, Observability, Grafana, Prometheus, OpenTelemetry, OTel, Microservice, debugging, gdb + // based in part on the stackoverflow dev survey + Rust, Python, Nix, JS, CSS, HTML, Web, Desktop, Embedded, Scalable, Server, Service, SAAS, Network, Administration, + Java, Backend, High performance Async, Serverless, React, NextJS, Scala, Erlang, Haskell, COBOL, Kubernetes, K8s, k3s, + Docker, Podman, Ansible, Terraform, Container, .NET, C\#, PHP, MySQL, Nginx, Apache, Database, SQLite, SQL, NoSQL, + MongoDB, npm, yarn, Unity, Unreal, Elixir, Clojure, TypeScript, Go, Kotlin, Swift, Dart, Bash, Ruby, C++, Lua, + Fortran, Assembly, Redis, Elasticsearch, Firebase, AWS, OVH, GCP, OpenStack, OpenShift, Phoenix, Svelte, Deno, + ASP.NET, FastAPI, Node.js, Django, Laravel, Flask, jQuery, Flutter, Keras, NumPy, Spring, React Native, Electron, + Git, CI/CD, DevOps, Observability, Grafana, Prometheus, OpenTelemetry, OTel, Microservice, debugging, gdb ] #let section_skills = [ - #set text(size: 9pt) - == Skills - //I am confident in my skills with: \ - //- *Rust*—my current favorite language, which I picked up in 2020 and used for anything from embedded development to web backends or network proxies - //- *Python*—my first major language which i've used since 2012, sometimes interleaving with C (and recently Rust) for performance critical code - //- *PCB EDA tools*—designing digital circuits from component choice to finished boards, specifically using kicad - //- *Hardware design*—primarily using 3d printing and other maker accessible techniques - - //Additionally, I have used and am somewhat fluent with: \ - //- *Programming languages:* C, Java - //- *Web languages:* HTML, CSS, JS, Sass - + #set text(size: 9pt) + == Skills + //I am confident in my skills with: \ + //- *Rust*—my current favorite language, which I picked up in 2020 and used for anything from embedded development to web backends or network proxies + //- *Python*—my first major language which i've used since 2012, sometimes interleaving with C (and recently Rust) for performance critical code + //- *PCB EDA tools*—designing digital circuits from component choice to finished boards, specifically using kicad + //- *Hardware design*—primarily using 3d printing and other maker accessible techniques + + //Additionally, I have used and am somewhat fluent with: \ + //- *Programming languages:* C, Java + //- *Web languages:* HTML, CSS, JS, Sass + ] #let section_natlang = [ - == Natural Languages - #skill("English", 100%, desc: [Native Language]) - #skill("German", 100%, desc: [Native Language]) - #skill("Spanish", 20%, desc: [ - Studied in school \ - Self assessment: *A2* - ]) + == Natural Languages + #skill("English", 100%, desc: [Native Language]) + #skill("German", 100%, desc: [Native Language]) + #skill("Spanish", 20%, desc: [ + Studied in school \ + Self assessment: *A2* + ]) ] #let section_competitions = [ - == Competitions - #accent[#link("https://codingcontest.org")[*codingcontest.org*]] + == Competitions + #accent[#link("https://codingcontest.org")[*codingcontest.org*]] - #fa-calendar-alt() 2019-11-08 + #fa-calendar-alt() 2019-11-08 - #set text(size: 9pt) - Worldwide level-based coding game. - - University of Salzburg: *1#super[st]* place - - Worldwide: *47#super[th]* place + #set text(size: 9pt) + Worldwide level-based coding game. + - University of Salzburg: *1#super[st]* place + - Worldwide: *47#super[th]* place ] #let section_work = [ - == Work - #work_item( - ref: accent[#link("https://rami.io")[rami.io]], - title: "Software Engineer", - time: "2020 - 2021", - location: "Remote" - ) - + == Work + #work_item( + ref: accent[#link("https://rami.io")[rami.io]], + title: "Software Engineer", + time: "2020 - 2021", + location: "Remote" + ) + ] #let section_exp = [] @@ -154,29 +154,29 @@ #accent()[*#self.tagline*] #meta_items.map( - ((icon, body)) => meta_item(icon)[#body] + ((icon, body)) => meta_item(icon)[#body] ).join(h(1cm)) #show link: it => [ - #fa-link() #it + #fa-link() #it ] #grid( - columns: (58mm, 1fr), - rows: auto, - gutter: 16pt, - [ - #section_skills - - - #section_natlang - - #section_competitions - ], - [ - #section_work - - #section_exp - ] + columns: (58mm, 1fr), + rows: auto, + gutter: 16pt, + [ + #section_skills + + + #section_natlang + + #section_competitions + ], + [ + #section_work + + #section_exp + ] ) diff --git a/self.typ b/self.typ index d468670..a5905b9 100644 --- a/self.typ +++ b/self.typ @@ -1,5 +1,14 @@ +#import "@preview/fontawesome:0.1.0": * + #let name = [Julia Luna] #let tagline = [Software engineer, embedded developer] #let email = link("mailto:me@julialuna.dev") + +#let meta = ( + (fa-at(), email), + (fa-id-card(), [they/them]), + (fa-map-marker-alt(), [Germany]), + ([*\[#h(-1pt)m#h(-1pt)\]*], link("https://matrix.to/#/@julialuna:finallycoffee.eu")[\@julialuna:finallycoffee.eu]) +) diff --git a/test.pdf b/test.pdf index 0a3c468..54944bb 100644 Binary files a/test.pdf and b/test.pdf differ diff --git a/test.typ b/test.typ index bd2ea34..0a55b78 100644 --- a/test.typ +++ b/test.typ @@ -6,28 +6,70 @@ #let bc_lighter = base_color.lighten(70%) #let vis(color) = { - rect(width: 3cm, height: 3cm, fill: color, stroke: 8pt + white, radius: 8pt) + rect(width: 2cm, height: 2cm, fill: color, stroke: 8pt + white, radius: 8pt) } #let process_colors(colors) = { - if colors.at("base", none) == none { + if colors.at("base", default: none) == none { colors.insert("base", rgb("#b00b69")) } - if colors.at("light", none) == none { + if colors.at("light", default: none) == none { colors.insert("light", colors.base.lighten(35%)) } - if colors.at("lighter", none) == none { + if colors.at("lighter", default: none) == none { colors.insert("lighter", colors.base.lighten(70%)) } - if colors.at("dark", none) == none { + if colors.at("dark", default: none) == none { colors.insert("dark", colors.base.darken(35%)) } - if colors.at("darker", none) == none { + if colors.at("darker", default: none) == none { colors.insert("darker", colors.base.darken(70%)) } + + return colors } -#let colors = (:) -#process_colors(colors) +#let variations = ( + "#b00b69", + "#b0690b", + "#69b00b", + "#690bb0", + "#0b69b0", + "#0bb069", + "#c0ffee", + "#c0eeff", + "#ffc0ee", + "#ffeec0", + "#eeffc0", + "#eec0ff", + "#69c0ff", + "#69ffc0", + "#c0693e", +) + +#let owo(colors) = [ + #vis(colors.at("lighter")) + #vis(colors.at("light")) + #vis(colors.at("base")) + #vis(colors.at("dark")) + #vis(colors.at("darker")) +] + +#let meowmeow = () + +#for var in variations { + meowmeow.push([ + = #var + #owo(process_colors(("base": rgb(var)))) +])} + +#set page( + width: 60cm, + height: 18cm, +) +#stack( + dir: ltr, + ..meowmeow +) diff --git a/xenua_cv.typ b/xenua_cv.typ new file mode 100644 index 0000000..94345f6 --- /dev/null +++ b/xenua_cv.typ @@ -0,0 +1,79 @@ +#import "@preview/fontawesome:0.1.0": * + +#import "cv.typ": base_layout, put_keyword_dump_in_there, default_style, lenk + +#let xenua_style = default_style +#xenua_style.insert("confidential", true) + +#let xenua_cv( + style: xenua_style, + self, + lcol, rcol, +) = { + set page( + style.page.paper, + margin: style.page.margin, + background: if style.confidential { + rotate(60deg, text(112pt, fill: rgb("FFDCD5"))[ + *CONFIDENTIAL* + ])} else {none} + ) + set text( + font: "Inter", + size: style.size.base, + fill: style.colors.text + ) + show heading: it => { + set text(fill: style.colors.heading) + it + } + show heading.where(level: 1): it => { + set text(size: style.size.h1) + it + } + show heading.where(level: 2): it => { + set text(size: style.size.h2) + upper(it) + v(-4mm) + line(length: 100%, stroke: style.line_height + style.colors.light) + } + + put_keyword_dump_in_there() + + let header = { + grid( + columns: (1fr, auto), + [ + = #self.name + #v(-2mm) + #text(fill: style.colors.base)[*#self.tagline*] + ], + [ + #table( + columns: 2, + stroke: none, + inset: 0pt, + align: (center, left), + row-gutter: 5pt, + column-gutter: 4pt, + ..self.meta.map( + ((icon, content)) => ( + [#text(fill: style.colors.base)[#icon]], + [*#content*] + ) + ).flatten() + ) + ] + ) + line(length: 100%, stroke: style.line_height + style.colors.light) + } + + + + + base_layout( + style, + header, + lcol, rcol + ) +}