amlei-skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +16 -0
- package/LICENSE +21 -0
- package/README.md +21 -0
- package/package.json +35 -0
- package/skills/academic-ref-retrieval/SKILL.md +103 -0
- package/skills/academic-ref-retrieval/resources/arxiv-api-example.py +42 -0
- package/skills/academic-ref-retrieval/resources/cnki-scraper-example.py +58 -0
- package/skills/amlei-git-gh/SKILL.md +156 -0
- package/skills/amlei-resume/SKILL.md +204 -0
- package/skills/amlei-resume/assets/preview-shell.html +438 -0
- package/skills/amlei-resume/assets/sample-preview.html +361 -0
- package/skills/amlei-resume/assets/sample-resume.md +57 -0
- package/skills/amlei-resume/references/export.md +76 -0
- package/skills/amlei-resume/references/icons.md +35 -0
- package/skills/amlei-resume/references/profile-evaluator.md +44 -0
- package/skills/amlei-resume/references/profile.md +43 -0
- package/skills/amlei-resume/references/projects.md +76 -0
- package/skills/amlei-resume/references/resume-evaluator.md +121 -0
- package/skills/amlei-resume/references/revise.md +11 -0
- package/skills/amlei-resume/references/themes/theme-academic.md +238 -0
- package/skills/amlei-resume/references/themes/theme-content-green.md +138 -0
- package/skills/amlei-resume/references/themes/theme-english-mnc.md +127 -0
- package/skills/amlei-resume/references/themes/theme-index.md +46 -0
- package/skills/amlei-resume/references/themes/theme-sidebar-creative.md +163 -0
- package/skills/amlei-resume/references/themes/theme-soe-formal.md +153 -0
- package/skills/amlei-resume/references/themes/theme-tech-dense.md +157 -0
- package/skills/amlei-resume/references/write.md +14 -0
- package/skills/amlei-resume/scripts/boss_zhipin.py +676 -0
- package/skills/amlei-resume/scripts/extract_avatar.py +157 -0
- package/skills/amlei-resume/scripts/profile.py +465 -0
- package/skills/amlei-resume/scripts/validate_resume.py +195 -0
- package/skills/amlei-resume/scripts/wrap_preview.py +104 -0
- package/skills/amlei-story-generator/SKILL.md +67 -0
- package/skills/amlei-story-generator/resources/narrative-craft.md +74 -0
- package/skills/amlei-story-generator/resources/rubric.md +28 -0
- package/skills/amlei-story-generator/resources/source-frameworks.md +89 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 项目讨论(通用)
|
|
2
|
+
|
|
3
|
+
写简历和改简历都需要挖掘项目经历。本文件定义通用的项目讨论流程,写/改时共用。
|
|
4
|
+
|
|
5
|
+
## 项目类型
|
|
6
|
+
|
|
7
|
+
先帮用户区分项目类型,不同类型处理方式不同:
|
|
8
|
+
|
|
9
|
+
| 类型 | 说明 | 素材获取方式 |
|
|
10
|
+
|------|------|-------------|
|
|
11
|
+
| **公司项目** | 在职期间参与的工作项目 | 优先让用户给相关文档/材料;没有就跟用户聊 |
|
|
12
|
+
| **个人项目** | 业余自建、个人作品 | 优先看作品链接/作品集;没有就跟用户聊 |
|
|
13
|
+
|
|
14
|
+
素材来源不限形式:文档、PPT、报表、设计稿、代码仓库、运营数据、分析报告、作品链接等都可以。用户给到什么就读什么。
|
|
15
|
+
|
|
16
|
+
## 获取项目素材
|
|
17
|
+
|
|
18
|
+
**优先让用户提供项目相关材料**(网页链接、本地文件路径、文档、PPT、报表、设计稿、运营数据、分析报告等)。拿到后像探索一个系统一样深入梳理整条链路,不遗漏。
|
|
19
|
+
|
|
20
|
+
### 探索式梳理
|
|
21
|
+
|
|
22
|
+
目标不是"提取简历可用的部分"——而是**彻底理解用户做了什么**。像接手一个陌生系统一样,顺藤摸瓜,追问每一个疑点:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
网页链接/文件 ──→ 访问/读取 ──→ 提取关键信息
|
|
26
|
+
│
|
|
27
|
+
├── 发现了什么?跟我预期一样吗?
|
|
28
|
+
├── 这个项目为什么存在?解决了什么问题?
|
|
29
|
+
├── 和哪些系统/团队相关?上下游是什么?
|
|
30
|
+
├── 有没有提到的链接、引用、依赖没看过?
|
|
31
|
+
├── 有哪些数字、指标、成果值得深挖?
|
|
32
|
+
└── 哪里看不懂?需要问用户补全?
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**操作方式:**
|
|
36
|
+
|
|
37
|
+
- 网页链接 → 访问浏览,提取页面所有关键信息,追踪页面中提到的相关链接/上下文
|
|
38
|
+
- 本地文件(单个或目录)→ markitdown 读取转 Markdown,保持完整内容:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
markitdown <文件路径> -o <输出路径.md>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- 目录结构 → 浏览文件列表,判断哪些需要看、哪些是辅助材料
|
|
45
|
+
|
|
46
|
+
**原则:先完整梳理、再取舍。** 摸清背景、流程、关联项目、上下游依赖,把理解写进 `materials.md`,后续写简历时再从中提取要点。
|
|
47
|
+
|
|
48
|
+
如果用户表示没有材料可以给,那就跟用户一起聊这个项目,围绕以下几点挖掘:
|
|
49
|
+
|
|
50
|
+
1. **项目背景**:这个项目是做什么的?解决了什么问题?
|
|
51
|
+
2. **你的角色**:你负责了什么?是主导、核心参与还是协助?
|
|
52
|
+
3. **方法/过程**:用了什么方法或工具?为什么选它?
|
|
53
|
+
4. **难点与解决**:遇到最大的困难是什么?怎么解决的?
|
|
54
|
+
5. **量化成果**:带来了什么可量化的结果?(效率提升、用户增长、收入提升、覆盖率等)
|
|
55
|
+
|
|
56
|
+
## 素材结构
|
|
57
|
+
|
|
58
|
+
聊项目、查文件、访问项目地址过程中获取的内容,总结提炼后保存到对应简历目录,不丢失:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
resume/{姓名}/{求职岗位}/
|
|
62
|
+
├── 简历.md
|
|
63
|
+
├── jd.md
|
|
64
|
+
├── materials.md # 项目讨论 / 文件提炼 / 地址访问结果
|
|
65
|
+
└── files/ # 用户给的原始素材文件(可选)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- 用户给了文件(.docx/.pdf/.pptx/.xlsx)→ markitdown 读取 → 摘要写入 `materials.md`,原始文件可选保存到 `files/`
|
|
69
|
+
- 用户给了项目地址 → 访问核实 → 关键信息写入 `materials.md`
|
|
70
|
+
- 聊项目聊出的 STAR 素材 → 整理写入 `materials.md`
|
|
71
|
+
|
|
72
|
+
`materials.md` 可在下次改简历时作为素材源回溯,避免重复追问。
|
|
73
|
+
|
|
74
|
+
### 迭代更新
|
|
75
|
+
|
|
76
|
+
`materials.md` 不是写一次就定稿的。讨论过程中素材逐步清晰——用户补充了细节、纠正了说法、给出了量化数字——都应更新到 `materials.md` 对应条目,保持素材始终是最新、最准确的状态。
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# resume 评估 agent
|
|
2
|
+
|
|
3
|
+
> 完整评估一份简历内容质量的检查者。**只评估、给建议、不直接改**。Agent 根据评估结果自主迭代简历,直到所有维度通过。
|
|
4
|
+
|
|
5
|
+
## 角色
|
|
6
|
+
|
|
7
|
+
你是**简历质量评估者**。对一份写好的简历,从 6 个维度逐条检查,给出通过/不通过和具体改进建议。Agent 根据你的评估结果反复修改,直到全部通过。
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
1. **简历全文**(`resume/{姓名}/{求职岗位}/简历.md`)
|
|
12
|
+
2. **目标岗位 JD**(`resume/{姓名}/{求职岗位}/jd.md`)
|
|
13
|
+
3. **求职偏好**(profile 中的 preferences)
|
|
14
|
+
|
|
15
|
+
## 评估维度
|
|
16
|
+
|
|
17
|
+
### 1. 基础规范(权重 15%)
|
|
18
|
+
|
|
19
|
+
| 检查项 | 要求 |
|
|
20
|
+
|--------|------|
|
|
21
|
+
| 联系方式 | name / phone / email 齐全,格式正确 |
|
|
22
|
+
| self-intro | 个人简介 + 学历学校在同一模块 |
|
|
23
|
+
| 时间线 | 教育/工作经历无断层,日期格式统一 |
|
|
24
|
+
| 排版 | 无错别字、无语法错误、标点统一 |
|
|
25
|
+
| 链接限制 | 仅 self-intro 模块可含外部链接,其他模块无链接 |
|
|
26
|
+
| 一致性 | 日期格式、标点符号、缩进风格全文统一 |
|
|
27
|
+
| 脱敏 | 无公司内部项目原文名称,均已替换为业务功能或规模描述(如"核心交易链路""支撑日均百万订单的订单系统"),无"某"式占位表述 |
|
|
28
|
+
|
|
29
|
+
### 2. JD 匹配(权重 25%)
|
|
30
|
+
|
|
31
|
+
| 检查项 | 要求 |
|
|
32
|
+
|--------|------|
|
|
33
|
+
| 关键词命中 | JD 中的硬技能关键词出现在简历中 |
|
|
34
|
+
| 能力对齐 | 简历技能与 JD 要求的技能重叠度 ≥60% |
|
|
35
|
+
| 经验排序 | 与岗位最相关的经历前置,不相关的靠后或删减 |
|
|
36
|
+
| 隐性需求 | JD 未明说但行业普遍要求的能力有体现 |
|
|
37
|
+
| 个人简介 | `self-intro` 的 role/标签与目标岗位方向一致 |
|
|
38
|
+
|
|
39
|
+
### 3. 成果量化(权重 25%)
|
|
40
|
+
|
|
41
|
+
| 检查项 | 要求 |
|
|
42
|
+
|--------|------|
|
|
43
|
+
| STAR 完整性 | 每条经历有情境/任务/行动/结果完整链条 |
|
|
44
|
+
| 量化指标 | 至少 1 个可验证数字指标(增长率/规模/效率/营收) |
|
|
45
|
+
| 量化可信度 | 数字合理可解释,来源可追溯(非凭空编造) |
|
|
46
|
+
| 强动词开头 | 每条 bullet 以"主导/设计/优化/实现/推动"等强动词开头 |
|
|
47
|
+
| 无职责罗列 | 没有纯描述职责("负责 XX")的句子,均为成果句 |
|
|
48
|
+
|
|
49
|
+
### 4. 结构清晰(权重 10%)
|
|
50
|
+
|
|
51
|
+
| 检查项 | 要求 |
|
|
52
|
+
|--------|------|
|
|
53
|
+
| 模块顺序 | 顺序合理,模块之间有逻辑衔接感 |
|
|
54
|
+
| 信息层级 | `#`/`##` 层级正确,无越级 |
|
|
55
|
+
| 无冗余 | 没有重复内容、没有不相关的经历。**同一段描述不重复出现**(无论在同一条目内还是跨条目) |
|
|
56
|
+
| 可读性 | 每段经历 3-5 条 bullet,每条 1-2 行 |
|
|
57
|
+
|
|
58
|
+
### 5. 差异化(权重 15%)
|
|
59
|
+
|
|
60
|
+
| 检查项 | 要求 |
|
|
61
|
+
|--------|------|
|
|
62
|
+
| 独特亮点 | 有区别于普通候选人的亮点(特殊成果/复杂场景/影响力) |
|
|
63
|
+
| 加分项 | 作品链接、GitHub、专利、论文、开源贡献等(如有) |
|
|
64
|
+
| 层级适配 | 初级突出执行力/潜力;高级突出战略/决策/领导力 |
|
|
65
|
+
| 可迁移能力 | 转岗场景下通用能力有体现(分析/沟通/协调等) |
|
|
66
|
+
|
|
67
|
+
### 6. 语言表达(权重 10%)
|
|
68
|
+
|
|
69
|
+
| 检查项 | 要求 |
|
|
70
|
+
|--------|------|
|
|
71
|
+
| 简洁 | 无废话、无套话("吃苦耐劳"、"团队精神"等),每条 bullet 1-2 行 |
|
|
72
|
+
| 客观 | 基于事实和数据,非主观评价 |
|
|
73
|
+
| 具体 | 描述具体行为而非概括总结——**禁止抽象的帽子描述**(如"制定优先级矩阵");读者读完能脑补出执行画面。**不解释常识**:标准技术名词是领域常识,简历中出现解释性内容(如"Skill 是什么")标记不通过;包装话(如"跨角色协调资源")标记不通过 |
|
|
74
|
+
| 主语明确 | 使用"我"而非"我们",HR 能看清个人贡献 |
|
|
75
|
+
|
|
76
|
+
## 评估流程
|
|
77
|
+
|
|
78
|
+
逐维度检查,每个检查项标记为:
|
|
79
|
+
|
|
80
|
+
- ✅ 通过:符合要求
|
|
81
|
+
- ❌ 不通过:需要改进
|
|
82
|
+
- ⚠️ 部分通过:有但不充分
|
|
83
|
+
|
|
84
|
+
## 输出格式
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
## 评估结果
|
|
88
|
+
|
|
89
|
+
总分:<各维度加权得分>/100
|
|
90
|
+
|
|
91
|
+
### 1. 基础规范 (15%)
|
|
92
|
+
✅ 联系方式:完整
|
|
93
|
+
❌ 时间线:缺少最近一段工作的结束日期
|
|
94
|
+
→ 建议:补充"2026.03 — 至今"
|
|
95
|
+
|
|
96
|
+
### 2. JD 匹配 (25%)
|
|
97
|
+
✅ 关键词命中:React/TypeScript/微服务 均已覆盖
|
|
98
|
+
⚠️ 经验排序:第二段经历与目标岗位关联较弱
|
|
99
|
+
→ 建议:将"XX 项目"提到第二段,或删减后保留 2 条关键成果
|
|
100
|
+
|
|
101
|
+
...
|
|
102
|
+
|
|
103
|
+
### 总结
|
|
104
|
+
**通过项**: 基础规范、结构清晰
|
|
105
|
+
**需迭代**: JD 匹配、成果量化、差异化、语言表达
|
|
106
|
+
|
|
107
|
+
**优先级改进列表**:
|
|
108
|
+
1. [高] 为每段经历补充量化指标
|
|
109
|
+
2. [高] 调整经历顺序,突出岗位相关
|
|
110
|
+
3. [中] 将职责描述改为成果句
|
|
111
|
+
4. [低] 补充加分项链接
|
|
112
|
+
|
|
113
|
+
Agent 按优先级列表修改后,再次提交评估,直到❌为 0。
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 迭代规则
|
|
117
|
+
|
|
118
|
+
- Agent 每次修改后重新运行本评估
|
|
119
|
+
- 每轮迭代至少修复 1 个 ❌ 项
|
|
120
|
+
- 所有维度 ❌ 为 0 才算通过
|
|
121
|
+
- 用户确认通过后,进入导出流程
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# 改简历
|
|
2
|
+
|
|
3
|
+
通过聊项目、聊做事方式、聊自我认知来挖掘补充,而非直接问"你想改哪"。
|
|
4
|
+
|
|
5
|
+
**先保存 JD + 岗位调研**:改简历前,如果用户有新的 JD 或提供了目标岗位信息,**立即将 JD 全文写入 `resume/{姓名}/{求职岗位}/jd.md`**,然后联网搜索该岗位的人才定位,带着行业普遍期望的眼光来审视现有简历。
|
|
6
|
+
|
|
7
|
+
- **挖出更多细节**:看到已有的 bullet,追问"这个项目你具体负责了什么"、"有没有遇到意外情况"、"结果能用数字说明吗"——帮用户把已有经历写得更具体、更量化。按 [projects.md](projects.md) 的流程聊项目(含素材持久化:区分公司/个人项目、让用户给文件补充细节、没有就聊、STAR 素材写入 `materials.md`)。
|
|
8
|
+
- **找出沉默亮点**:聊完一段经历后问"还有没有类似的项目"、"实习之前还做过什么相关的吗"——用户往往忘了提重要的东西。
|
|
9
|
+
- **换岗重定向**:读现岗简历 + 新岗位 JD → 重排模块、换关键词、从个人资料换更贴的项目 → 写到新 `{求职岗位}/` 目录。
|
|
10
|
+
- **通用规则**见 SKILL.md(脱敏 / 平实表述 / 经历结构),改时逐条对照。
|
|
11
|
+
- **迭代**:按聊出的新素材改,每版经用户明确认可后再写入 `resume/{姓名}/{求职岗位}/简历.md`。用户没说"可以/就这样"之前,绝不修改简历文件。
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# 主题 · 学术 / 科研 CV(`academic`)
|
|
2
|
+
|
|
3
|
+
> 单栏 · 墨蓝单点缀色 · 证件照 · 描边 SVG 图标 · `•` 列表符 · 论文列表 · 奖项网格。
|
|
4
|
+
> 适用于升学 / PhD 申请 / 科研岗。
|
|
5
|
+
>
|
|
6
|
+
> **用法**:渲染时把下面"完整 `<style>`"整段作为产物开头,再按"简历骨架"用各组件(带 `{{占位符}}`)装配正文原子。HTML 一律从本文件取,不要凭记忆手写。
|
|
7
|
+
|
|
8
|
+
## 设计变量速查表
|
|
9
|
+
|
|
10
|
+
| 变量 | 值 | 用途 |
|
|
11
|
+
|------|-----|------|
|
|
12
|
+
| `--bg` | `oklch(94% .003 255)` | 视口舞台底色 |
|
|
13
|
+
| `--paper` | `oklch(99.4% .002 255)` | A4 纸张面 |
|
|
14
|
+
| `--ink` (`--fg`) | `oklch(19% .015 255)` | 正文 / 姓名 |
|
|
15
|
+
| `--muted` | `oklch(43% .012 255)` | 次要文字(联系方式 / meta) |
|
|
16
|
+
| `--faint` | `oklch(55% .010 255)` | 日期 / 英文标签 |
|
|
17
|
+
| `--border` | `oklch(87% .008 255)` | 证件照边框 / 标签边框 |
|
|
18
|
+
| `--hair` | `oklch(90% .006 255)` | 发丝分割线 / 虚线 |
|
|
19
|
+
| `--accent` | `oklch(33% .05 258)` | **唯一**点缀色(墨蓝) |
|
|
20
|
+
| `--accent-ink` | `oklch(26% .05 258)` | 强调字色(role / 数字 / 斜体) |
|
|
21
|
+
| `--font-sans` | 苹方系 | 正文 |
|
|
22
|
+
| `--font-mono` | JetBrains Mono / SF Mono | 日期 / 数字 / 联系方式 |
|
|
23
|
+
|
|
24
|
+
> 想换配色只改 `--accent` / `--accent-ink`,其余保持。
|
|
25
|
+
|
|
26
|
+
## 完整 `<style>`(渲染时整段贴在产物最前)
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<style>
|
|
30
|
+
:root{
|
|
31
|
+
--bg:oklch(94% .003 255);--paper:oklch(99.4% .002 255);--ink:oklch(19% .015 255);--muted:oklch(43% .012 255);
|
|
32
|
+
--faint:oklch(55% .010 255);--border:oklch(87% .008 255);--hair:oklch(90% .006 255);
|
|
33
|
+
--accent:oklch(33% .05 258);--accent-ink:oklch(26% .05 258);
|
|
34
|
+
--font-sans:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei','Hiragino Sans GB',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
|
|
35
|
+
--font-mono:'JetBrains Mono','SF Mono',ui-monospace,Menlo,Consolas,monospace;
|
|
36
|
+
}
|
|
37
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
38
|
+
body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:14px;line-height:1.58;-webkit-font-smoothing:antialiased;font-feature-settings:'tnum' on;text-rendering:optimizeLegibility}
|
|
39
|
+
/* Header */
|
|
40
|
+
.resume-header{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;padding-bottom:12px;border-bottom:1.5px solid var(--ink)}
|
|
41
|
+
.name-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
|
|
42
|
+
.name-row .name{font-weight:700;font-size:26px;letter-spacing:.04em}
|
|
43
|
+
.name-row .role{font-size:13px;font-weight:600;color:var(--accent-ink)}
|
|
44
|
+
.contact{margin-top:8px;font-family:var(--font-mono);font-size:11px;color:var(--muted)}
|
|
45
|
+
.contact .sep{color:var(--accent);margin:0 6px}
|
|
46
|
+
.contact a{color:var(--accent-ink);text-decoration:none}
|
|
47
|
+
.edu-line{margin-top:5px;font-family:var(--font-sans);font-size:12px;color:var(--accent-ink);font-weight:500}
|
|
48
|
+
.photo{width:26mm;height:36mm;border:1px solid var(--border);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--faint);overflow:hidden}
|
|
49
|
+
.photo img{width:100%;height:100%;object-fit:cover;display:block}
|
|
50
|
+
.photo svg{width:26px;height:26px;opacity:.45}
|
|
51
|
+
.photo span{font-size:10px;letter-spacing:.1em}
|
|
52
|
+
/* SectionHead */
|
|
53
|
+
.sec-head{display:flex;align-items:center;gap:9px;margin-top:15px;margin-bottom:8px}
|
|
54
|
+
.sec-head .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
|
|
55
|
+
.sec-head h2{font-weight:700;font-size:14px;color:var(--ink);letter-spacing:.1em}
|
|
56
|
+
.sec-head h2 .en{font-weight:400;font-size:11px;color:var(--faint);letter-spacing:.12em;margin-left:6px}
|
|
57
|
+
.sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
|
|
58
|
+
/* Summary / Interests */
|
|
59
|
+
.summary p{font-size:13px;line-height:1.75;text-align:justify;text-wrap:pretty}
|
|
60
|
+
.summary p b,.summary p strong{color:var(--accent-ink);font-weight:600}
|
|
61
|
+
.interests{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
|
|
62
|
+
.interests .it{font-size:12.5px;color:var(--accent-ink);background:oklch(95% .01 258);border:1px solid var(--border);padding:2px 8px}
|
|
63
|
+
/* Entry */
|
|
64
|
+
.entry{margin-bottom:8px}
|
|
65
|
+
.entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
|
|
66
|
+
.entry-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
|
|
67
|
+
.entry-title .org,.entry-title .proj{font-weight:700;font-size:14px}
|
|
68
|
+
.entry-title .role{font-size:13px;color:var(--accent-ink)}
|
|
69
|
+
.entry-date{font-family:var(--font-mono);font-size:11px;color:var(--faint);white-space:nowrap}
|
|
70
|
+
.entry-meta{margin-top:2px;font-size:11.5px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap}
|
|
71
|
+
.entry-meta b{color:var(--ink);font-weight:600}
|
|
72
|
+
.entry-list{list-style:none;margin-top:4px}
|
|
73
|
+
.entry-list li{position:relative;padding-left:13px;font-size:12.5px;line-height:1.62;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
74
|
+
.entry-list li::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
75
|
+
.entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
76
|
+
/* Bullet(独立原子,自由换页) */
|
|
77
|
+
.bullet{position:relative;padding-left:13px;font-size:12.5px;line-height:1.62;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
78
|
+
.bullet::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
79
|
+
.bullet .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
80
|
+
/* Pubs */
|
|
81
|
+
.pubs{list-style:none}
|
|
82
|
+
.pubs li{font-size:12.5px;line-height:1.6;padding:5px 0 5px 26px;border-bottom:1px dashed var(--hair);position:relative;text-align:justify;text-wrap:pretty}
|
|
83
|
+
.pubs li .tag{position:absolute;left:0;top:6px;font-family:var(--font-mono);font-size:10.5px;color:var(--accent-ink);font-weight:600}
|
|
84
|
+
.pubs li .ven{font-style:italic;color:var(--accent-ink)}
|
|
85
|
+
.pubs li .yr{font-family:var(--font-mono);color:var(--faint)}
|
|
86
|
+
.pubs li .me{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:2px}
|
|
87
|
+
/* Awards */
|
|
88
|
+
.awards{display:grid;grid-template-columns:1fr 1fr;gap:2px 22px}
|
|
89
|
+
.award{display:grid;grid-template-columns:42px 1fr auto;gap:8px;align-items:baseline;font-size:12.5px;padding:3px 0;border-bottom:1px dashed var(--hair)}
|
|
90
|
+
.award .yr{font-family:var(--font-mono);font-size:10.5px;color:var(--accent)}
|
|
91
|
+
.award .lvl{font-size:11px;color:var(--accent-ink);font-weight:600}
|
|
92
|
+
/* Skills */
|
|
93
|
+
.skills-row{display:grid;grid-template-columns:84px 1fr;gap:12px;padding:4px 0;border-bottom:1px dashed var(--hair)}
|
|
94
|
+
.skills-row .cat{font-size:12.5px;font-weight:600;color:var(--muted)}
|
|
95
|
+
.skills-row .tags{font-size:12.5px;color:var(--ink)}
|
|
96
|
+
.skills-row .tags b{color:var(--accent-ink)}
|
|
97
|
+
</style>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
> 上面**不含** `.viewport / .page / #source / @media print`——那些归预览外壳 `assets/preview-shell.html`,`wrap_preview.py` 会把本 `<style>` 注入到 `<head>`。
|
|
101
|
+
|
|
102
|
+
## 组件库(带 `{{占位符}}`,class 与上面 `<style>` 对应)
|
|
103
|
+
|
|
104
|
+
### 1. Header(姓名 / 方向 / 教育 / 联系方式 / 证件照)—— `self-intro` 模块用它
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<header class="resume-header">
|
|
108
|
+
<div class="ident">
|
|
109
|
+
<div class="name-row"><span class="name">{{name}}</span><span class="role">{{role}}</span></div>
|
|
110
|
+
<div class="edu-line">{{education}}</div>
|
|
111
|
+
<div class="contact">{{gender}}<span class="sep">·</span>{{location}}<span class="sep">·</span>{{phone}}<span class="sep">·</span>{{email}}<span class="sep">·</span><a href="{{site-url}}">{{site}}</a></div>
|
|
112
|
+
</div>
|
|
113
|
+
{{photo}}
|
|
114
|
+
</header>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- `{{role}}` = 求职/申请方向(如"申请方向 · 计算机科学 直博"),无则连同 `<span class="role">` 一起删。
|
|
118
|
+
- `{{education}}` 单独一行(如"学校 · 专业 · 学历 · 届"),来自 `education:` 字段,无则删整行。
|
|
119
|
+
- `{{photo}}`:有真实头像用 `<div class="photo"><img src="{{avatar}}" alt="证件照"></div>`;没有用 [icons.md](icons.md) 里的证件照占位。
|
|
120
|
+
- 联系方式字段**按 `self-intro` 里实际有的拼**,字段之间用 `<span class="sep">·</span>` 分隔;没有的字段(如无 site)连同它的 `sep` 一起删,不要留空段。
|
|
121
|
+
|
|
122
|
+
### 2. SectionHead(模块标题:图标 + 中文 + 可选英文 + 发丝线)
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<div class="sec-head" data-stick="1">{{icon}}<h2>{{title}}<span class="en">{{en}}</span></h2></div>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- `data-stick="1"` **必带**——让分页 JS 不把标题和它下一条目拆到两页。
|
|
129
|
+
- `{{icon}}`:按模块语义从 [icons.md](icons.md) 选一个 `<svg class="ico" …>…</svg>`。
|
|
130
|
+
- `{{en}}`:英文小标签(可选),无则连 `<span class="en">` 一起删。
|
|
131
|
+
|
|
132
|
+
### 3. Summary(个人简介段落)
|
|
133
|
+
|
|
134
|
+
```html
|
|
135
|
+
<div class="summary"><p>{{text}}</p></div>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
段落里 1–3 个最关键短语用 `<b>…</b>` 加重(转成强调字色);`{{text}}` 是 `self-intro` 之后的"个人简介"模块正文。
|
|
139
|
+
|
|
140
|
+
### 4. Interests(研究兴趣 / 方向标签,可选)
|
|
141
|
+
|
|
142
|
+
```html
|
|
143
|
+
<div class="interests"><span class="it">{{tag1}}</span><span class="it">{{tag2}}</span><span class="it">{{tag3}}</span></div>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
(每个标签一个 `<span class="it">`,按 MD 里给的标签数量增减。)
|
|
147
|
+
|
|
148
|
+
### 5. Entry header(教育 / 科研 / 实习 / 工作头)—— `##` 子标题用它
|
|
149
|
+
|
|
150
|
+
```html
|
|
151
|
+
<div class="entry" data-stick="1">
|
|
152
|
+
<div class="entry-main">
|
|
153
|
+
<div class="entry-title"><span class="org">{{org}}</span><span class="role">{{role}}</span></div>
|
|
154
|
+
<span class="entry-date">{{date}}</span>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="entry-meta"><span>{{meta-item-1}}</span><span>{{meta-item-2}}</span></div>
|
|
157
|
+
</div>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `{{org}}` = `##` 标题里 `|` 左侧(机构/公司/学校);`{{role}}` = `|` 右侧(岗位/方向/学位)。`##` 不含 `|` 时 `{{role}}` 连 `<span class="role">` 删除。
|
|
161
|
+
- `{{date}}` 来自 `##` 下的 `date:` 行;没有则删 `.entry-date`。
|
|
162
|
+
- `.entry-meta`:来自 `meta:` 行或 GPA/排名等;关键数字用 `<b>`,无 meta 整个 div 删。
|
|
163
|
+
- `data-stick="1"` 让 header 和第一条 bullet 同页不分家。
|
|
164
|
+
|
|
165
|
+
### 6. Bullet(单条经历要点 — 独立原子,自由换页)
|
|
166
|
+
|
|
167
|
+
```html
|
|
168
|
+
<div class="bullet">{{text}}</div>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
每条 `- bullet` 拆一个独立原子。STAR 法则、量化结果,关键数字/术语用 `<span class="num">…</span>` 加重(等宽 + 强调色)。
|
|
172
|
+
|
|
173
|
+
### 7. Pubs(论文发表,可选)—— 论文模块用
|
|
174
|
+
|
|
175
|
+
```html
|
|
176
|
+
<ul class="pubs">
|
|
177
|
+
<li><span class="tag">[C]</span> {{authors}} <b>{{title}}</b> <span class="ven">{{venue}}</span>, <span class="yr">{{year}}.</span></li>
|
|
178
|
+
</ul>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- `{{tag}}` 类型标:`[C]` 会议 / `[J]` 期刊 / `[W]` Workshop / `[P]` 专利。
|
|
182
|
+
- 本人名字用 `<span class="me">…</span>` 加下划线;共一/一作用括注。
|
|
183
|
+
- 每篇一个 `<li>`。
|
|
184
|
+
|
|
185
|
+
### 8. Awards(荣誉奖项网格,可选)—— 获奖模块用
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<div class="awards">
|
|
189
|
+
<div class="award"><span class="yr">{{year}}</span><span>{{name}}</span><span class="lvl">{{level}}</span></div>
|
|
190
|
+
</div>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
每项一个 `.award`;`{{level}}` = 国家级/省级/校级/金牌 等,无则删 `.lvl`。
|
|
194
|
+
|
|
195
|
+
### 9. Skills(技能 / 英语,类别 + 标签)
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<div class="skills">
|
|
199
|
+
<div class="skills-row"><span class="cat">{{category}}</span><span class="tags">{{tags}}</span></div>
|
|
200
|
+
</div>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
每类一个 `.skills-row`;`{{tags}}` 里最熟的几项用 `<b>` 加重(如 `<b>PyTorch</b> · JAX · …`)。
|
|
204
|
+
|
|
205
|
+
## 简历骨架(装配顺序)
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
<header class="resume-header"> … </header> ← 由 self-intro 装配(姓名/方向/联系方式/证件照)
|
|
209
|
+
(按简历 MD 里 # 模块的顺序,每个模块依次:)
|
|
210
|
+
<div class="sec-head" data-stick="1"> … </div> ← SectionHead(icon 按模块语义选)
|
|
211
|
+
<该模块的正文组件> ← Summary / Interests / Entry×N / Bullet×N / Pubs / Awards / Skills
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- **模块顺序 = MD 里 `#` 出现的顺序**(self-intro 永远第一,且不渲染成 SectionHead,而是渲染成 Header)。
|
|
215
|
+
- 每个 `# 模块` 都先出 SectionHead,再出该模块的正文组件。
|
|
216
|
+
- `## 子标题`:header(`.entry`)一条,`- bullet` 每条独立 `.bullet` 原子。
|
|
217
|
+
|
|
218
|
+
## Markdown → 组件映射规则表
|
|
219
|
+
|
|
220
|
+
| 简历 MD 元素 | 组件 | 备注 |
|
|
221
|
+
|------|------|------|
|
|
222
|
+
| `# self-intro`(首个,key:value) | Header(1.) | `name/role/gender/location/phone/email/site/avatar` → Header 各槽位;不渲染 SectionHead |
|
|
223
|
+
| `# 其它模块标题` | SectionHead(2.) | icon 按模块语义从 icons.md 选;英文标签可选 |
|
|
224
|
+
| 模块下纯文本段 | Summary(3.) | 关键短语 `<b>` |
|
|
225
|
+
| 模块下"标签, 标签, 标签"单行 | Interests(4.) | 研究兴趣/方向 |
|
|
226
|
+
| `## org \| role` | Entry header(5.)的 org/role | `|` 分割;无 `|` 则只有 org |
|
|
227
|
+
| `##` 下 `date: …` | Entry 的 `.entry-date` | |
|
|
228
|
+
| `##` 下 `meta: …` | Entry 的 `.entry-meta` | 关键数字 `<b>` |
|
|
229
|
+
| `##` 下 `- bullet` | 独立 Bullet(6.) | 每条一条;STAR + 量化;数字 `<span class="num">` |
|
|
230
|
+
| 论文模块条目 | Pubs(7.) | 类型标/venue/年份/本人下划线 |
|
|
231
|
+
| 获奖模块条目 | Awards(8.) | 年/名/级别 |
|
|
232
|
+
| `- 类别: 值`(技能) | Skills(9.)的 `.skills-row` | cat + tags |
|
|
233
|
+
|
|
234
|
+
## 配色约束(本主题已遵守,换色时保持)
|
|
235
|
+
|
|
236
|
+
- **唯一点缀色** `--accent` 墨蓝;强调字 `--accent-ink` 同色系更深。**不引第二个彩色**。
|
|
237
|
+
- 姓名 25px(正常简历字号,**不是报头巨标题**);无首字下沉、无杂志编号、无 masthead。
|
|
238
|
+
- 单栏;分割线只用 1px 发丝 / 虚线,不堆色块。
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# 主题 · 内容 / 媒体风(`content-green`)
|
|
2
|
+
|
|
3
|
+
> 单栏 · 深森林绿单点缀色 · 证件照 · 描边 SVG 图标 · `•` 列表符 · 技能用浅底标签。
|
|
4
|
+
> 适用于内容 / 运营 / 增长 / 新媒体 / 产品(内容向)。
|
|
5
|
+
>
|
|
6
|
+
> **用法**:渲染时把"完整 `<style>`"整段作为产物开头,再按骨架用组件装配。HTML 一律从本文件取。
|
|
7
|
+
|
|
8
|
+
## 设计变量速查表
|
|
9
|
+
|
|
10
|
+
| 变量 | 值 | 用途 |
|
|
11
|
+
|------|-----|------|
|
|
12
|
+
| `--bg` | `oklch(94% .003 155)` | 舞台底色 |
|
|
13
|
+
| `--paper` | `oklch(99.3% .003 90)` | A4 纸张(微暖) |
|
|
14
|
+
| `--ink` | `oklch(20% .012 155)` | 正文 |
|
|
15
|
+
| `--muted` / `--faint` | `oklch(44% .012 155)` / `oklch(55% .010 155)` | 次要 / 日期 |
|
|
16
|
+
| `--border` / `--hair` | `oklch(88% .008 155)` / `oklch(91% .006 155)` | 边框 / 发丝线 |
|
|
17
|
+
| `--accent` | `oklch(40% .06 155)` | **唯一**点缀色(深森林绿) |
|
|
18
|
+
| `--accent-ink` / `--accent-soft` | `oklch(30% .05 155)` / `oklch(95% .022 155)` | 强调字色 / 浅底 |
|
|
19
|
+
|
|
20
|
+
## 完整 `<style>`(渲染时整段贴在产物最前)
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<style>
|
|
24
|
+
:root{
|
|
25
|
+
--bg:oklch(94% .003 155);--paper:oklch(99.3% .003 90);--ink:oklch(20% .012 155);
|
|
26
|
+
--muted:oklch(44% .012 155);--faint:oklch(55% .010 155);--border:oklch(88% .008 155);--hair:oklch(91% .006 155);
|
|
27
|
+
--accent:oklch(40% .06 155);--accent-ink:oklch(30% .05 155);--accent-soft:oklch(95% .022 155);
|
|
28
|
+
--font-sans:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei','Hiragino Sans GB',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
|
|
29
|
+
--font-mono:'JetBrains Mono','SF Mono',ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
|
|
30
|
+
}
|
|
31
|
+
body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;font-feature-settings:'tnum' on;text-rendering:optimizeLegibility}
|
|
32
|
+
.page{background:var(--paper)}
|
|
33
|
+
.resume-header{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;padding-bottom:13px;border-bottom:1.5px solid var(--ink)}
|
|
34
|
+
.name-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
|
|
35
|
+
.name-row .name{font-weight:700;font-size:28px;letter-spacing:.04em}
|
|
36
|
+
.name-row .role{font-size:13px;font-weight:600;color:var(--accent-ink)}
|
|
37
|
+
.contact{margin-top:8px;font-family:var(--font-mono);font-size:11px;color:var(--muted)}
|
|
38
|
+
.contact .sep{color:var(--accent);margin:0 6px}
|
|
39
|
+
.edu-line{margin-top:5px;font-family:var(--font-sans);font-size:12px;color:var(--accent-ink);font-weight:500}
|
|
40
|
+
.photo{width:26mm;height:36mm;border:1px solid var(--border);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--faint);overflow:hidden}
|
|
41
|
+
.photo img{width:100%;height:100%;object-fit:cover;display:block}
|
|
42
|
+
.photo svg{width:26px;height:26px;opacity:.45}
|
|
43
|
+
.photo span{font-size:10px;letter-spacing:.1em}
|
|
44
|
+
.sec-head{display:flex;align-items:center;gap:8px;margin-top:16px;margin-bottom:9px}
|
|
45
|
+
.sec-head .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
|
|
46
|
+
.sec-head h2{font-size:14px;font-weight:700;letter-spacing:.12em;color:var(--ink)}
|
|
47
|
+
.sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
|
|
48
|
+
.summary p{font-size:13px;line-height:1.8;text-align:justify;text-wrap:pretty}
|
|
49
|
+
.summary p strong{color:var(--accent-ink);font-weight:600}
|
|
50
|
+
.entry{margin-bottom:11px}
|
|
51
|
+
.entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
|
|
52
|
+
.entry-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
|
|
53
|
+
.entry-title .org,.entry-title .proj{font-size:14px;font-weight:700}
|
|
54
|
+
.entry-title .role{font-size:13px;font-weight:500;color:var(--accent-ink)}
|
|
55
|
+
.entry-title .badge{font-size:11px;font-weight:600;color:var(--accent-ink);background:var(--accent-soft);padding:2px 7px}
|
|
56
|
+
.entry-date{font-family:var(--font-mono);font-size:11px;color:var(--faint);white-space:nowrap}
|
|
57
|
+
.entry-meta{margin-top:3px;font-size:11.5px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap}
|
|
58
|
+
.entry-meta b{color:var(--ink);font-weight:600}
|
|
59
|
+
.entry-list{list-style:none;margin-top:5px}
|
|
60
|
+
.entry-list li{position:relative;padding-left:13px;font-size:12.5px;line-height:1.58;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
61
|
+
.entry-list li::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
62
|
+
.entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
63
|
+
/* Bullet(独立原子,自由换页) */
|
|
64
|
+
.bullet{position:relative;padding-left:13px;font-size:12.5px;line-height:1.58;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
|
|
65
|
+
.bullet::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
|
|
66
|
+
.bullet .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
|
|
67
|
+
.awards{display:grid;grid-template-columns:1fr 1fr;gap:3px 24px}
|
|
68
|
+
.award{display:grid;grid-template-columns:38px 1fr auto;gap:8px;align-items:baseline;font-size:12.5px;padding:4px 0;border-bottom:1px dashed var(--hair)}
|
|
69
|
+
.award .yr{font-family:var(--font-mono);font-size:10.5px;color:var(--accent)}
|
|
70
|
+
.award .lvl{font-size:11px;color:var(--accent-ink);font-weight:600}
|
|
71
|
+
.skills{display:flex;flex-direction:column;gap:6px}
|
|
72
|
+
.skill-row{display:grid;grid-template-columns:78px 1fr;gap:12px;align-items:start}
|
|
73
|
+
.skill-row .cat{font-size:12.5px;font-weight:600;color:var(--muted);padding-top:2px}
|
|
74
|
+
.skill-row .tags{display:flex;flex-wrap:wrap;gap:5px}
|
|
75
|
+
.skill-row .tag{font-size:12.5px;color:var(--ink);border:1px solid var(--border);padding:2px 8px}
|
|
76
|
+
.skill-row .tag.strong{color:var(--accent-ink);background:var(--accent-soft);border-color:var(--accent-soft);font-weight:600}
|
|
77
|
+
</style>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 组件库(带 `{{占位符}}`)
|
|
81
|
+
|
|
82
|
+
### 1. Header
|
|
83
|
+
```html
|
|
84
|
+
<header class="resume-header">
|
|
85
|
+
<div class="ident">
|
|
86
|
+
<div class="name-row"><span class="name">{{name}}</span><span class="role">{{role}}</span></div>
|
|
87
|
+
<div class="edu-line">{{education}}</div>
|
|
88
|
+
<div class="contact">{{location}}<span class="sep">·</span>{{phone}}<span class="sep">·</span>{{email}}<span class="sep">·</span>{{platform}}<span class="sep">·</span>{{age}} 岁<span class="sep">·</span>{{political}}</div>
|
|
89
|
+
</div>
|
|
90
|
+
{{photo}}
|
|
91
|
+
</header>
|
|
92
|
+
```
|
|
93
|
+
`{{education}}` 单独一行(来自 `education:` 字段),无则删整行。按实际字段拼;`{{platform}}` 可放小红书/公众号等,`{{political}}` 政治面貌(中共党员等,没有就删)。
|
|
94
|
+
|
|
95
|
+
### 2. SectionHead(无英文标签)
|
|
96
|
+
```html
|
|
97
|
+
<div class="sec-head" data-stick="1">{{icon}}<h2>{{title}}</h2></div>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 3. Summary
|
|
101
|
+
```html
|
|
102
|
+
<div class="summary"><p>{{text}}</p></div>
|
|
103
|
+
```
|
|
104
|
+
关键短语用 `<strong>`。
|
|
105
|
+
|
|
106
|
+
### 4. Entry header(教育 / 实习 / 项目头;项目用 `.proj`,可加 `.badge`)
|
|
107
|
+
```html
|
|
108
|
+
<div class="entry" data-stick="1">
|
|
109
|
+
<div class="entry-main"><div class="entry-title"><span class="org">{{org}}</span><span class="role">{{role}}</span><span class="badge">{{badge}}</span></div><span class="entry-date">{{date}}</span></div>
|
|
110
|
+
<div class="entry-meta"><span>{{meta}}</span></div>
|
|
111
|
+
</div>
|
|
112
|
+
```
|
|
113
|
+
项目用 `<span class="proj">{{项目名}}</span>`;`.badge`(如「辅修 交互设计」「产品负责人」)可加可不加。`data-stick="1"` 让 header 和第一条 bullet 同页。
|
|
114
|
+
|
|
115
|
+
### 5. Bullet(单条经历要点 — 独立原子,自由换页)
|
|
116
|
+
```html
|
|
117
|
+
<div class="bullet">{{text}}</div>
|
|
118
|
+
```
|
|
119
|
+
每条 `- bullet` 拆一个独立原子。数字用 `<span class="num">`。
|
|
120
|
+
|
|
121
|
+
### 6. Awards(获奖与证书,按年份)
|
|
122
|
+
```html
|
|
123
|
+
<div class="awards"><div class="award"><span class="yr">{{year}}</span><span>{{name}}</span><span class="lvl">{{level}}</span></div></div>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 7. Skills(相关技能,浅底标签)
|
|
127
|
+
```html
|
|
128
|
+
<div class="skills">
|
|
129
|
+
<div class="skill-row"><span class="cat">{{category}}</span><div class="tags"><span class="tag strong">{{skill}}</span><span class="tag">{{skill}}</span></div></div>
|
|
130
|
+
</div>
|
|
131
|
+
```
|
|
132
|
+
最熟的加 `class="tag strong"`。
|
|
133
|
+
|
|
134
|
+
## 简历骨架
|
|
135
|
+
Header → 个人简介 → 教育背景 → 实习经历 → 项目经历 → 获奖与证书 → 相关技能(按 MD 模块顺序)。
|
|
136
|
+
|
|
137
|
+
## MD → 组件映射
|
|
138
|
+
`# self-intro`→Header;`# 个人简介`→Summary;`## org|role`→Entry header(`data-stick="1"`,项目用 proj+badge);`- bullet`→每条独立 `.bullet`;`年份 | name | level`→`.award`;`类别: A, B`→`.skill-row`(最熟标 strong)。
|