diff --git a/packages/preview/accent-cv/0.1.0/LICENSE b/packages/preview/accent-cv/0.1.0/LICENSE new file mode 100644 index 0000000000..c703077174 --- /dev/null +++ b/packages/preview/accent-cv/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 DamienBouffort + +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/packages/preview/accent-cv/0.1.0/README.md b/packages/preview/accent-cv/0.1.0/README.md new file mode 100644 index 0000000000..92ed579b20 --- /dev/null +++ b/packages/preview/accent-cv/0.1.0/README.md @@ -0,0 +1,61 @@ +# Typst CV Template + +A clean, dark-themed single-page CV template built with [Typst](https://typst.app). +All content lives in one configuration block at the top of the file — no need to touch the layout. + +## Previews + +| Dark Yellow | Dark Orange | Light Blue | +|---|---|---| +| ![dark yellow](preview-yellow.png) | ![dark orange](preview-orange.png) | ![light blue](preview-light.png) | + +## Features + +- Single accent color variable — one line to retheme everything +- All personal data in a single config block at the top +- Skills, experience, education and hobbies driven by arrays — just add entries +- Compact single-page layout with sidebar +- Three ready-to-use color themes included + +## Requirements + +Install [Typst](https://typst.app) — via the CLI: + +```bash +cargo install typst-cli +# or with the installer: +# https://github.com/typst/typst/releases +``` + +## Usage + +1. Clone or download this repository +2. Open `cv.typ` and fill in the `CONFIGURATION` section at the top +3. Replace `photo.png` with your own photo (same folder) +4. Compile: + +```bash +typst compile cv.typ cv.pdf +``` + +## Changing the accent color + +Open `cv.typ` and edit this single line: + +```typst +#let ACCENT = rgb("#F2CF00") // ← change this value +``` + +That's it — the color propagates everywhere automatically. + +## Included themes + +| File | Theme | +|---|---| +| `cv.typ` | Dark background, yellow accent | +| `cv-orange.typ` | Dark background, orange accent | +| `cv-light.typ` | Light background, blue accent | + +## License + +MIT — use freely, attribution appreciated. diff --git a/packages/preview/accent-cv/0.1.0/preview-light.png b/packages/preview/accent-cv/0.1.0/preview-light.png new file mode 100644 index 0000000000..493abe4ccf Binary files /dev/null and b/packages/preview/accent-cv/0.1.0/preview-light.png differ diff --git a/packages/preview/accent-cv/0.1.0/preview-orange.png b/packages/preview/accent-cv/0.1.0/preview-orange.png new file mode 100644 index 0000000000..eec719e6a2 Binary files /dev/null and b/packages/preview/accent-cv/0.1.0/preview-orange.png differ diff --git a/packages/preview/accent-cv/0.1.0/preview-yellow.png b/packages/preview/accent-cv/0.1.0/preview-yellow.png new file mode 100644 index 0000000000..3973b54b11 Binary files /dev/null and b/packages/preview/accent-cv/0.1.0/preview-yellow.png differ diff --git a/packages/preview/accent-cv/0.1.0/template/cv.typ b/packages/preview/accent-cv/0.1.0/template/cv.typ new file mode 100644 index 0000000000..d201e6ff83 --- /dev/null +++ b/packages/preview/accent-cv/0.1.0/template/cv.typ @@ -0,0 +1,349 @@ +// ═══════════════════════════════════════════════════════════ +// CV — Typst Template | Dark theme + accent color +// +// Everything you need to customize is in the CONFIGURATION +// section below. The layout code starts after the separator. +// ═══════════════════════════════════════════════════════════ + + +// ─────────────────────────────────────────────────────────── +// CONFIGURATION +// ─────────────────────────────────────────────────────────── + +// Accent color — change this single line to retheme the whole CV +#let ACCENT = rgb("#F2CF00") + +// Profile photo — replace photo.png with your own image file +#let photo = "photo.png" + +// Identity +#let full_name = "First Last" +#let job_title = "JOB TITLE" + +// Contact +#let email = "email@example.com" +#let telephone = "00 00 00 00 00" +#let city = "City, Country" +#let github = "github.com/username" + +// Profile summary +#let summary = "Your profile summary goes here. Describe who you are, what drives you, and what sets you apart — keep it concise and punchy." + +// Skills — (category label, list of items) +#let skills = ( + ("Category 1", ("Skill A", "Skill B", "Skill C")), + ("Category 2", ("Skill D", "Skill E")), + ("Category 3", ("Skill F", "Skill G", "Skill H")), + ("Category 4", ("Skill I", "Skill J")), + ("Category 5", ("Skill K", "Skill L", "Skill M")), +) + +// Hobbies — (icon, label) +#let hobbies = ( + ("⌨", "Hobby 1"), + ("◎", "Hobby 2"), + ("⚙", "Hobby 3"), +) + +// Languages — (language, level, highlight) +// Set highlight to true to display the level in the accent color +#let languages = ( + ("French", "Native", true), + ("English", "Professional", false), +) + +// Work experience — most recent first +#let experiences = ( + ( + title: "Job Title", + company: "Company Name", + period: "MM.YYYY — Present", + location: "city or website", + points: ( + "Description of your main mission or achievement.", + "Second key point for this role.", + "Third point — result, impact, or technology used.", + ), + ), + ( + title: "Job Title", + company: "Company Name", + period: "MM.YYYY — MM.YYYY", + location: "city or website", + points: ( + "Description of your main mission or achievement.", + "Second key point for this role.", + ), + ), +) + +// Education — most recent first +#let education = ( + ( + degree: "Degree or Certification Name", + school: "Institution · City", + period: "YYYY — YYYY", + ), + ( + degree: "Degree or Certification Name", + school: "Institution · City", + period: "YYYY — YYYY", + ), +) + + +// ─────────────────────────────────────────────────────────── +// LAYOUT — no need to edit below unless tweaking the design +// ─────────────────────────────────────────────────────────── + +#set page( + paper: "a4", + margin: 0pt, + fill: rgb("#000000"), +) + +#set text( + font: "DejaVu Sans", + size: 9pt, + fill: rgb("#E0E0E0"), +) + +#set par(leading: 0.58em, justify: false) + +// ─── Color palette ─────────────────────────────────────────── +#let BK = rgb("#000000") +#let PANEL = rgb("#0D0D0D") +#let BORDER = rgb("#1E1E1E") +#let ADIM = rgb("#2A2400") // very dark accent (tag background) +#let AMID = rgb("#4A4100") // dark accent (decorative line) +#let WHITE = rgb("#FFFFFF") +#let LGRAY = rgb("#CCCCCC") +#let MGRAY = rgb("#888888") + +// ─── Helpers ───────────────────────────────────────────────── +#let dim(content) = text(fill: MGRAY, size: 8pt)[#content] + +#let tag(t) = box( + fill: ADIM, + radius: 3pt, + inset: (x: 5pt, y: 2.5pt), + stroke: (paint: ACCENT, thickness: 0.4pt), +)[#text(fill: ACCENT, size: 7.5pt, weight: "bold")[#t]] + +#let skillgroup(cat, items) = { + text(fill: MGRAY, size: 7pt, tracking: 1pt)[#upper(cat)] + v(2pt) + for item in items { + tag(item) + h(3pt) + } + v(4pt) +} + +#let ctact(ico, txt) = grid( + columns: (10pt, 1fr), + gutter: 6pt, + align: horizon, + text(fill: ACCENT, size: 9pt)[#ico], + text(fill: LGRAY, size: 7.8pt)[#txt], +) + +#let sec(title) = { + v(4pt) + grid( + columns: (auto, 6pt, 1fr), + align: horizon, + gutter: 0pt, + box(fill: ACCENT, width: 3pt, height: 10pt, radius: 1pt)[], + h(6pt), + text(fill: WHITE, weight: "bold", size: 9pt, tracking: 1.5pt)[#upper(title)], + ) + v(2pt) + line(length: 100%, stroke: (paint: BORDER, thickness: 0.7pt)) + v(5pt) +} + +#let xp(title, company, period, location, points) = { + grid( + columns: (1fr, auto), + align: (left, right), + text(fill: WHITE, weight: "bold", size: 8.5pt)[#title], + text(fill: MGRAY, size: 7.5pt)[#period], + ) + v(1pt) + if location != "" [#text(fill: ACCENT, size: 8pt, weight: "bold")[#company]#h(5pt)#text(fill: MGRAY, size: 7.5pt)[— #location]] else [#text(fill: ACCENT, size: 8pt, weight: "bold")[#company]] + v(3pt) + for p in points { + grid( + columns: (7pt, 1fr), + gutter: 3pt, + align: (top, top), + text(fill: ACCENT, size: 7.5pt)[▸], + text(fill: LGRAY, size: 8pt)[#p], + ) + v(1.5pt) + } + v(6pt) +} + +// ─── Sidebar ───────────────────────────────────────────────── +#let sidebar = box( + fill: PANEL, + width: 67mm, + height: 297mm, +)[ + #box(fill: ACCENT, width: 100%, height: 5pt)[] + + #box(inset: (x: 15pt, top: 14pt, bottom: 12pt), width: 100%)[ + + #v(4pt) + #align(center)[ + #box( + width: 64pt, + height: 64pt, + radius: 50%, + stroke: (paint: ACCENT, thickness: 2pt), + clip: true, + )[ + #image(photo, width: 64pt, height: 64pt, fit: "cover") + ] + ] + #v(5pt) + #align(center)[ + #text(fill: WHITE, weight: "bold", size: 12pt)[#full_name] + #linebreak() + #v(2pt) + #box( + fill: ACCENT, + inset: (x: 7pt, y: 3pt), + radius: 3pt, + )[#text(fill: BK, weight: "bold", size: 7pt, tracking: 1pt)[#job_title]] + ] + #v(6pt) + #line(length: 100%, stroke: (paint: ACCENT, thickness: 0.8pt)) + #v(6pt) + + #text(fill: ACCENT, weight: "bold", size: 7.5pt, tracking: 1.5pt)[CONTACT] + #v(4pt) + #ctact("✉", email) + #v(2pt) + #ctact("✆", telephone) + #v(2pt) + #ctact("⌂", city) + #v(2pt) + #ctact("⌥", github) + + #v(6pt) + #line(length: 100%, stroke: (paint: BORDER, thickness: 0.7pt)) + #v(6pt) + + #text(fill: ACCENT, weight: "bold", size: 7.5pt, tracking: 1.5pt)[SKILLS] + #v(4pt) + #for (cat, items) in skills { + skillgroup(cat, items) + } + + #v(6pt) + #line(length: 100%, stroke: (paint: BORDER, thickness: 0.7pt)) + #v(6pt) + + #text(fill: ACCENT, weight: "bold", size: 7.5pt, tracking: 1.5pt)[HOBBIES] + #v(4pt) + #for item in hobbies { + grid( + columns: (10pt, 1fr), + gutter: 5pt, + align: horizon, + text(fill: ACCENT, size: 9pt)[#item.at(0)], + text(fill: LGRAY, size: 8pt)[#item.at(1)], + ) + v(2pt) + } + + #v(6pt) + #line(length: 100%, stroke: (paint: BORDER, thickness: 0.7pt)) + #v(6pt) + + #text(fill: ACCENT, weight: "bold", size: 7.5pt, tracking: 1.5pt)[LANGUAGES] + #v(4pt) + #for (i, lang) in languages.enumerate() { + grid( + columns: (1fr, auto), + text(fill: WHITE, size: 8pt)[#lang.at(0)], + if lang.at(2) { + text(fill: ACCENT, size: 7.5pt, weight: "bold")[#lang.at(1)] + } else { + text(fill: MGRAY, size: 7.5pt)[#lang.at(1)] + }, + ) + if i < languages.len() - 1 { v(2pt) } + } + + ] +] + +// ─── Main content ───────────────────────────────────────────── +#let main = box( + fill: BK, + width: 143mm, + height: 297mm, + clip: true, +)[ + #box(fill: ACCENT, width: 100%, height: 5pt)[] + + #box(inset: (left: 16pt, right: 14pt, top: 10pt, bottom: 10pt), width: 100%)[ + + #grid( + columns: (1fr, auto), + align: (top, bottom), + stack( + spacing: 4pt, + text(fill: WHITE, weight: "bold", size: 22pt, tracking: -0.5pt)[#full_name], + grid( + columns: (auto, 8pt, 1fr), + align: horizon, + box(fill: ACCENT, inset: (x: 9pt, y: 4pt), radius: 3pt)[ + #text(fill: BK, weight: "bold", size: 9pt, tracking: 0.5pt)[#job_title] + ], + [], + line(length: 100%, stroke: (paint: AMID, thickness: 1pt)), + ), + ), + stack( + dir: ltr, + spacing: 4pt, + box(width: 5pt, height: 5pt, fill: ACCENT)[], + box(width: 5pt, height: 5pt, fill: AMID)[], + box(width: 5pt, height: 5pt, fill: ADIM)[], + ), + ) + + #text(fill: WHITE, size: 8.5pt)[#summary] + + #sec("Work Experience") + + #for e in experiences { + xp(e.title, e.company, e.period, e.location, e.points) + } + + #sec("Education") + + #for (i, f) in education.enumerate() { + grid( + columns: (1fr, auto), + text(fill: WHITE, weight: "bold", size: 8.5pt)[#f.degree], + dim[#f.period], + ) + text(fill: LGRAY, size: 7.5pt)[#f.school] + if i < education.len() - 1 { v(4pt) } + } + + ] +] + +// ─── Page assembly ──────────────────────────────────────────── +#grid( + columns: (67mm, 143mm), + sidebar, + main, +) diff --git a/packages/preview/accent-cv/0.1.0/template/photo.png b/packages/preview/accent-cv/0.1.0/template/photo.png new file mode 100644 index 0000000000..93ea0ed42d Binary files /dev/null and b/packages/preview/accent-cv/0.1.0/template/photo.png differ diff --git a/packages/preview/accent-cv/0.1.0/thumbnail.png b/packages/preview/accent-cv/0.1.0/thumbnail.png new file mode 100644 index 0000000000..3973b54b11 Binary files /dev/null and b/packages/preview/accent-cv/0.1.0/thumbnail.png differ diff --git a/packages/preview/accent-cv/0.1.0/typst.toml b/packages/preview/accent-cv/0.1.0/typst.toml new file mode 100644 index 0000000000..30c4cc5bc0 --- /dev/null +++ b/packages/preview/accent-cv/0.1.0/typst.toml @@ -0,0 +1,26 @@ +[package] +name = "accent-cv" +version = "0.1.0" +authors = ["DamienBouffort"] +license = "MIT" +description = "A minimal, dark-themed single-page CV template with a fully customizable accent color." +repository = "https://github.com/DamienBouffort/accent-template-typst" +keywords = ["cv", "resume", "dark", "sidebar"] +categories = ["cv"] +entrypoint = "template/cv.typ" +compiler = "0.14.0" +exclude = [ + "cv-orange.typ", + "cv-light.typ", + "cv-template-preview.pdf", + "cv-orange.pdf", + "cv-light.pdf", + "preview-yellow.png", + "preview-orange.png", + "preview-light.png", +] + +[template] +path = "template" +entrypoint = "cv.typ" +thumbnail = "thumbnail.png"