Refine resume template for conservative audiences with grayscale styling.

Remove default ability bars, widen margins and section spacing, fix entry layout, and refresh sample PDF for government-facing delivery.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
MORRO 2026-06-25 16:22:12 +08:00
parent b8eed931ac
commit ab0f73cbd6
9 changed files with 695 additions and 746 deletions

View File

@ -1,6 +1,6 @@
# Resume · 团队简历模板
GreLin 双栏中文简历 Typst 模板HyperLabel 配色),用于融资 BP data room 附录。
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
## 照片
@ -25,16 +25,17 @@ GreLin 双栏中文简历 Typst 模板HyperLabel 配色),用于融资 BP
)
#let skills = (
abilities: (
(name: "全栈开发", level: 0.9),
),
language: (
name: "英语",
level: 0.75,
label: "读写",
),
tags: ("Rust", "Python"),
notes: (), // 可选:侧栏技能补充列表
// 可选:能力进度条(有数据时自动显示「能力」子区块)
// abilities: (
// (name: "全栈开发", level: 0.9),
// ),
// language: (
// name: "英语",
// level: 0.75,
// label: "读写",
// ),
)
#let education = (

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 294 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>

Before

Width:  |  Height:  |  Size: 285 B

After

Width:  |  Height:  |  Size: 285 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/></svg>

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 326 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>

Before

Width:  |  Height:  |  Size: 480 B

After

Width:  |  Height:  |  Size: 480 B

View File

@ -22,15 +22,6 @@
)
#let skills = (
abilities: (
(name: "全栈开发", level: 0.9),
(name: "系统架构", level: 0.75),
),
language: (
name: "英语",
level: 0.75,
label: "读写",
),
tags: (
"Rust", "Python", "Java", "React", "Tauri", "RAG", "Linux", "MySQL", "Redis",
"LLM Agent",

View File

@ -82,9 +82,15 @@
} else if sidebar {
space-none
} else {
space-block
space-main-section
}
let title-below = if below != auto {
below
} else if sidebar {
space-title-gap
} else {
space-main-title-below
}
let title-below = if below != auto { below } else { space-title-gap }
block(width: 100%, above: title-above, below: title-below)[
#text(font: heading-font, size: size-heading, weight: "bold", fill: color-ink)[#title]
#if divider [
@ -121,7 +127,7 @@
/// 教育背景条目notes 可选,一段普通正文)
#let edu-entry(degree, school, period, location, notes: "") = block(above: space-none, below: space-none)[
#text(fill: color-body, size: size-body)[#degree]
#v(space-inline)
#v(space-edu-meta-gap)
#text(fill: color-text-light, size: size-secondary)[
#school#if period != "" [ · #period]#if location != "" [ · #location]
]
@ -174,7 +180,7 @@
]
}
/// 技能进度条level: 01条与条之间仅用 above 控制间距
/// 技能进度条level: 01config 提供 abilities / language 时由 abilities-block 渲染
#let skill-bar(name, level, subtitle: none, above: space-none) = block(above: above, below: space-none)[
#if subtitle != none [
#grid(
@ -193,6 +199,41 @@
]
]
#let has-abilities-section() = {
let ability-list = skills.at("abilities", default: ())
let has-lang = skills.at("language", default: none) != none
ability-list.len() > 0 or has-lang
}
/// 「能力」进度条区块skills.abilities / skills.language 有数据时才显示)
#let abilities-block() = {
if has-abilities-section() {
sidebar-subtitle("能力", above: space-none)
block(below: space-none)[
#for (i, item) in skills.at("abilities", default: ()).enumerate() {
skill-bar(
item.name,
item.level,
above: if i == 0 { space-none } else { space-skill-gap },
)
}
#let lang = skills.at("language", default: none)
#if lang != none {
skill-bar(
lang.name,
lang.level,
subtitle: lang.at("label", default: none),
above: if skills.at("abilities", default: ()).len() == 0 {
space-none
} else {
space-skill-gap
},
)
}
]
}
}
#let tech-pill(label) = box(
fill: color-page,
stroke: stroke-pill,
@ -213,23 +254,11 @@
]
#let skills-section-block() = {
sidebar-subtitle("能力", above: space-none)
block(below: space-none)[
#for (i, item) in skills.abilities.enumerate() {
skill-bar(
item.name,
item.level,
above: if i == 0 { space-none } else { space-skill-gap },
abilities-block()
sidebar-subtitle(
"技术栈",
above: if has-abilities-section() { space-subsection-gap } else { space-none },
)
}
#skill-bar(
skills.language.name,
skills.language.level,
subtitle: skills.language.label,
above: space-skill-gap,
)
]
sidebar-subtitle("技术栈", above: space-subsection-gap)
tech-stack-block()
if skills.notes.len() > 0 {
sidebar-subtitle("补充", above: space-subsection-gap)
@ -239,6 +268,7 @@
/// 主栏经历 / 项目条目
#let timeline-entry(entry, title-key: "company", subtitle-key: "role") = block[
#block(above: space-entry-title-above, below: space-entry-title-below)[
#text(fill: color-body, size: size-body, weight: "bold")[
#if subtitle-key != none [
#entry.at(title-key) / #entry.at(subtitle-key)
@ -246,7 +276,7 @@
#entry.at(title-key)
]
]
#v(space-body)
]
#text(fill: color-text-light, size: size-body)[
#entry.location#if entry.location != "" []#entry.start - #entry.end
]
@ -282,8 +312,9 @@
/// 获奖经历条目bullets 可留空)
#let award-entry(entry) = block[
#block(above: space-entry-title-above, below: space-entry-title-below)[
#text(fill: color-body, size: size-body, weight: "bold")[#entry.title]
#v(space-body)
]
#text(fill: color-text-light, size: size-body)[#entry.meta]
#if entry.bullets.len() > 0 [
#v(space-body)

View File

@ -1,8 +1,9 @@
#import "../../brand/colors.typ": *
#let color-accent-bright = color-lime-deep
#let color-icon = color-muted
#let color-accent-bright = color-body
#let color-accent = color-muted
#let color-skill-bar = color-lime-mid
#let color-skill-bar = color-muted
#let color-divider = color-muted.lighten(68%)
#let color-text-light = color-muted.lighten(32%)
@ -35,9 +36,14 @@
#let space-body = size-body
#let space-title-gap = 12pt
#let space-edu-notes-before = space-title-gap
#let space-edu-meta-gap = 10pt
#let leading-edu-notes = size-secondary
#let space-between-entries = 12pt
#let space-between-entries = 20pt
#let space-entry-title-above = 6pt
#let space-entry-title-below = 14pt
#let space-block = 18pt
#let space-main-section = 26pt
#let space-main-title-below = 14pt
#let space-hero-to-photo = space-block
#let space-column-gap = space-title-gap
@ -86,6 +92,6 @@
#let page-margin = (
top: 2cm,
bottom: 2cm,
left: 2cm,
right: 2cm,
left: 1.5cm,
right: 1.5cm,
)

File diff suppressed because it is too large Load Diff