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.
Files changed (36) hide show
  1. package/.claude-plugin/plugin.json +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +21 -0
  4. package/package.json +35 -0
  5. package/skills/academic-ref-retrieval/SKILL.md +103 -0
  6. package/skills/academic-ref-retrieval/resources/arxiv-api-example.py +42 -0
  7. package/skills/academic-ref-retrieval/resources/cnki-scraper-example.py +58 -0
  8. package/skills/amlei-git-gh/SKILL.md +156 -0
  9. package/skills/amlei-resume/SKILL.md +204 -0
  10. package/skills/amlei-resume/assets/preview-shell.html +438 -0
  11. package/skills/amlei-resume/assets/sample-preview.html +361 -0
  12. package/skills/amlei-resume/assets/sample-resume.md +57 -0
  13. package/skills/amlei-resume/references/export.md +76 -0
  14. package/skills/amlei-resume/references/icons.md +35 -0
  15. package/skills/amlei-resume/references/profile-evaluator.md +44 -0
  16. package/skills/amlei-resume/references/profile.md +43 -0
  17. package/skills/amlei-resume/references/projects.md +76 -0
  18. package/skills/amlei-resume/references/resume-evaluator.md +121 -0
  19. package/skills/amlei-resume/references/revise.md +11 -0
  20. package/skills/amlei-resume/references/themes/theme-academic.md +238 -0
  21. package/skills/amlei-resume/references/themes/theme-content-green.md +138 -0
  22. package/skills/amlei-resume/references/themes/theme-english-mnc.md +127 -0
  23. package/skills/amlei-resume/references/themes/theme-index.md +46 -0
  24. package/skills/amlei-resume/references/themes/theme-sidebar-creative.md +163 -0
  25. package/skills/amlei-resume/references/themes/theme-soe-formal.md +153 -0
  26. package/skills/amlei-resume/references/themes/theme-tech-dense.md +157 -0
  27. package/skills/amlei-resume/references/write.md +14 -0
  28. package/skills/amlei-resume/scripts/boss_zhipin.py +676 -0
  29. package/skills/amlei-resume/scripts/extract_avatar.py +157 -0
  30. package/skills/amlei-resume/scripts/profile.py +465 -0
  31. package/skills/amlei-resume/scripts/validate_resume.py +195 -0
  32. package/skills/amlei-resume/scripts/wrap_preview.py +104 -0
  33. package/skills/amlei-story-generator/SKILL.md +67 -0
  34. package/skills/amlei-story-generator/resources/narrative-craft.md +74 -0
  35. package/skills/amlei-story-generator/resources/rubric.md +28 -0
  36. package/skills/amlei-story-generator/resources/source-frameworks.md +89 -0
@@ -0,0 +1,127 @@
1
+ # 主题 · English / MNC 外企风(`english-mnc`)
2
+
3
+ > 单栏 · 英文 · 酒红(burgundy)单点缀色 · UPPERCASE 章节标题 · 斜体 role · `•` bullets · key:value skill lines。
4
+ > 适用于外企管培 / BA / 咨询 / 英文简历。
5
+ >
6
+ > **语言**:本主题正文用**英文**。`.sec-head h2` 自动 `text-transform:uppercase`——直接写正常大小写(如 `Education`)即可,不要自己全大写。
7
+ >
8
+ > **用法**:渲染时把"完整 `<style>`"整段作为产物开头,再按骨架用组件装配。HTML 一律从本文件取。
9
+
10
+ ## 设计变量速查表
11
+
12
+ | 变量 | 值 | 用途 |
13
+ |------|-----|------|
14
+ | `--bg` | `oklch(93% .004 30)` | 舞台底色 |
15
+ | `--paper` | `oklch(99.5% .002 40)` | A4 纸张 |
16
+ | `--ink` | `oklch(20% .014 30)` | 正文 |
17
+ | `--muted` / `--faint` | `oklch(44% .012 30)` / `oklch(55% .010 30)` | 次要 / 日期 |
18
+ | `--border` / `--hair` | `oklch(88% .010 30)` / `oklch(91% .008 30)` | 边框 / 发丝线 |
19
+ | `--accent` | `oklch(40% .13 25)` | **唯一**点缀色(酒红) |
20
+ | `--accent-ink` / `--accent-soft` | `oklch(33% .12 25)` / `oklch(95% .022 25)` | 强调字色 / 浅底 |
21
+
22
+ ## 完整 `<style>`(渲染时整段贴在产物最前)
23
+
24
+ ```html
25
+ <style>
26
+ :root{
27
+ --bg:oklch(93% .004 30);--paper:oklch(99.5% .002 40);--ink:oklch(20% .014 30);--muted:oklch(44% .012 30);
28
+ --faint:oklch(55% .010 30);--border:oklch(88% .010 30);--hair:oklch(91% .008 30);
29
+ --accent:oklch(40% .13 25);--accent-ink:oklch(33% .12 25);--accent-soft:oklch(95% .022 25);
30
+ --font-sans:'PingFang SC','HarmonyOS Sans SC',-apple-system,BlinkMacSystemFont,'Segoe UI','Helvetica Neue','Roboto',system-ui,sans-serif;
31
+ --font-mono:'JetBrains Mono','SF Mono',ui-monospace,Menlo,Consolas,monospace;
32
+ }
33
+ body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased;font-feature-settings:'tnum' on;text-rendering:optimizeLegibility}
34
+ .page{background:var(--paper)}
35
+ .resume-header{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;padding-bottom:13px;border-bottom:2px solid var(--ink)}
36
+ .name-row{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
37
+ .name-row .name{font-weight:700;font-size:28px;letter-spacing:.01em}
38
+ .name-row .role{font-size:13px;font-weight:600;color:var(--accent-ink)}
39
+ .contact{margin-top:8px;font-family:var(--font-mono);font-size:11px;color:var(--muted)}
40
+ .contact .sep{color:var(--accent);margin:0 6px}
41
+ .edu-line{margin-top:5px;font-family:var(--font-sans);font-size:12px;color:var(--accent-ink);font-weight:500}
42
+ .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}
43
+ .photo img{width:100%;height:100%;object-fit:cover;display:block}
44
+ .photo svg{width:26px;height:26px;opacity:.45}
45
+ .photo span{font-size:10px;letter-spacing:.1em}
46
+ .sec-head{display:flex;align-items:center;gap:9px;margin-top:16px;margin-bottom:8px}
47
+ .sec-head .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
48
+ .sec-head h2{font-size:13px;font-weight:700;letter-spacing:.22em;text-transform:uppercase;color:var(--ink)}
49
+ .sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
50
+ .summary p{font-size:13px;line-height:1.7;text-align:justify;text-wrap:pretty}
51
+ .summary p strong{color:var(--accent-ink);font-weight:600}
52
+ .entry{margin-bottom:11px}
53
+ .entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
54
+ .entry-title{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
55
+ .entry-title .org{font-size:14px;font-weight:700}
56
+ .entry-title .role{font-size:13px;color:var(--accent-ink);font-style:italic}
57
+ .entry-date{font-family:var(--font-mono);font-size:10.5px;color:var(--faint);white-space:nowrap;letter-spacing:.04em}
58
+ .entry-list{list-style:none;margin-top:4px}
59
+ .entry-list li{position:relative;padding-left:13px;font-size:12.5px;line-height:1.48;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
60
+ .entry-list li::before{content:"•";position:absolute;left:1px;top:4px;color:var(--accent);font-size:10px;line-height:1}
61
+ .entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
62
+ .entry-list b{color:var(--ink);font-weight:600}
63
+ /* Bullet(独立原子,自由换页) */
64
+ .bullet{position:relative;padding-left:13px;font-size:12.5px;line-height:1.48;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
65
+ .bullet::before{content:"•";position:absolute;left:1px;top:4px;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
+ .bullet b{color:var(--ink);font-weight:600}
68
+ .grid2{display:grid;grid-template-columns:1fr 1fr;gap:3px 22px}
69
+ .skill-line{display:grid;grid-template-columns:96px 1fr;gap:10px;padding:3px 0;border-bottom:1px dashed var(--hair);font-size:12.5px}
70
+ .skill-line .k{font-weight:600;color:var(--accent-ink)}
71
+ </style>
72
+ ```
73
+
74
+ ## 组件库(带 `{{占位符}}`,内容写英文)
75
+
76
+ ### 1. Header
77
+ ```html
78
+ <header class="resume-header">
79
+ <div class="ident">
80
+ <div class="name-row"><span class="name">{{Name}} · {{中文名}}</span><span class="role">{{Target Role}}</span></div>
81
+ <div class="edu-line">{{education}}</div>
82
+ <div class="contact">{{City}}<span class="sep">·</span>{{Phone}}<span class="sep">·</span>{{email}}<span class="sep">·</span><a href="{{linkedin-url}}">{{linkedin}}</a><span class="sep">·</span>{{Open to relocation}}</div>
83
+ </div>
84
+ {{photo}}
85
+ </header>
86
+ ```
87
+ `{{education}}` on its own line (school · degree · class year from `education:` field), remove the whole line if absent.
88
+ `{{photo}}` 占位 span 写 `PHOTO`(大写)。
89
+
90
+ ### 2. SectionHead(写正常大小写,CSS 自动全大写)
91
+ ```html
92
+ <div class="sec-head" data-stick="1">{{icon}}<h2>{{Education}}</h2></div>
93
+ ```
94
+
95
+ ### 3. Summary
96
+ ```html
97
+ <div class="summary"><p>{{text}}</p></div>
98
+ ```
99
+ 关键短语用 `<strong>`。
100
+
101
+ ### 4. Entry header(Education / Experience / Leadership;role 斜体)
102
+ ```html
103
+ <div class="entry" data-stick="1">
104
+ <div class="entry-main"><div class="entry-title"><span class="org">{{Org}}</span><span class="role">{{Role — detail}}</span></div><span class="entry-date">{{Sep 2024 — Dec 2024}}</span></div>
105
+ </div>
106
+ ```
107
+ 日期写英文月份(`Sep 2024 — Dec 2024`)。无 `meta` 行组件(本主题把 GPA 等放进首条 bullet,用 `<b>`)。`data-stick="1"` 让 header 和第一条 bullet 同页。
108
+
109
+ ### 5. Bullet(single achievement — independent atom)
110
+ ```html
111
+ <div class="bullet">{{bullet with <span class="num">metrics</span> and <b>key terms</b>}}</div>
112
+ ```
113
+ Each `- bullet` becomes one `.bullet` atom. Numbers → `<span class="num">`, key terms → `<b>`.
114
+
115
+ ### 6. Skills(双列 key:value 行)
116
+ ```html
117
+ <div class="grid2">
118
+ <div class="skill-line"><span class="k">{{Analytics}}</span><span>{{Excel · SQL · Tableau}}</span></div>
119
+ </div>
120
+ ```
121
+ 每行一个 `.skill-line`,`.grid2` 自动两列排布。
122
+
123
+ ## 简历骨架
124
+ Header → Profile → Education → Experience → Leadership & Projects → Skills & Languages(按 MD 模块顺序;无单独 Awards 模块时并入 Experience/Skills)。
125
+
126
+ ## MD → 组件映射
127
+ `# self-intro`→Header(内容译成英文);`# Profile/个人简介`→Summary;`## Org | Role`→Entry header(`data-stick="1"`,role 斜体);`- bullet`→每条独立 `.bullet`(数字 `<span class="num">`,关键术语 `<b>`);`# Skills`下`Key: value`→`.skill-line`(放 `.grid2` 内)。
@@ -0,0 +1,46 @@
1
+ # 简历主题索引(theme-index)
2
+
3
+ > **主题信息的单一来源**。每个"主题"= 一套完整组件库(设计令牌 + 各组件 HTML + 简历骨架 + MD→组件映射),文件在 `references/theme-{标识}.md`。选题、登记、回归都以本表为准。
4
+ >
5
+ > 每个主题是一套**自包含**的组件库(设计令牌 + `<style>` + 组件 + 骨架 + MD→组件映射),不依赖外部源文件。**想看某主题效果**:用 `assets/sample-resume.md` 渲染该主题(→ `validate_resume.py` → `wrap_preview.py`)生成预览 HTML 即可。
6
+
7
+ ## 主题清单
8
+
9
+ | 主题 | 标识 | 主色 | 适用场景 | 组件库文件 |
10
+ |------|------|------|----------|-----------|
11
+ | 学术 / 科研 CV | `academic` | 墨蓝 `oklch(33% .05 258)` | 升学 / PhD 申请 / 科研岗;含论文、奖项、研究兴趣;单栏、证件照 | [theme-academic.md](theme-academic.md) |
12
+ | 技术密排 | `tech-dense` | 工程蓝 `oklch(46% .17 242)` | 互联网技术 / 算法 / 后端 / 基础架构岗;技术栈前置 chips、项目数据导向 | [theme-tech-dense.md](theme-tech-dense.md) |
13
+ | 内容运营·绿 | `content-green` | 深森林绿 `oklch(40% .06 155)` | 内容 / 运营 / 增长 / 新媒体 / 内容产品岗 | [theme-content-green.md](theme-content-green.md) |
14
+ | 外企 / 英文 MNC | `english-mnc` | 酒红 `oklch(40% .13 25)` | 外企管培 / BA / 咨询;**英文**、UPPERCASE 标题 | [theme-english-mnc.md](theme-english-mnc.md) |
15
+ | 侧栏创意 | `sidebar-creative` | 暖珊瑚 `oklch(56% .15 38)` | 创意 / UI·UX / 视觉 / 设计岗;**双栏单页**(特殊结构,见主题文件) | [theme-sidebar-creative.md](theme-sidebar-creative.md) |
16
+ | 国企 / 正式 | `soe-formal` | 藏青 `oklch(31% .058 258)` | 国企 / 银行 / 央企 / 公职;含政治面貌/籍贯/民族基本信息表 | [theme-soe-formal.md](theme-soe-formal.md) |
17
+
18
+ ## 选题规则(据目标岗位 / 行业)
19
+
20
+ - **用户已指定主题** → 直接用,不问。
21
+ - **升学 / 科研 / PhD / 有论文奖项** → `academic`
22
+ - **互联网技术 / 算法 / 后端 / 数据** → `tech-dense`
23
+ - **内容 / 运营 / 增长 / 新媒体** → `content-green`
24
+ - **外企 / 英文岗 / 跨国公司** → `english-mnc`
25
+ - **创意 / 设计 / 品牌** → `sidebar-creative`
26
+ - **国企 / 银行 / 公职 / 央企** → `soe-formal`
27
+ - **无明显倾向** → 默认 `academic`(单栏、克制、最通用)。
28
+ - **`sidebar-creative` 是特殊的单页双栏主题**:正文只有一个 `.two-col` 原子、内容必须进一页 A4;内容多、要分页的简历不要选它(详见其主题文件)。其余 5 个都是单栏多页、自动分页。
29
+
30
+ > 主题切换 = 换组件库文件,**不改**预览外壳 / 脚本。换主题时整篇只用该主题那一套组件,不跨主题混用。
31
+
32
+ ## 添加 / 转换新主题的规范
33
+
34
+ 新主题以 `references/theme-{英文标识}.md` 命名,必须包含:
35
+
36
+ 1. **设计变量速查表**(主色 / 浅底 / 深字 / 正文色 / 发丝线色 / 字体)
37
+ 2. **完整 `<style>` 块**(设计令牌 `:root` + 各组件 class 样式;**不含** `.viewport/.page/#source/@media print`——那些归预览外壳)
38
+ 3. **各组件完整 HTML**(带 `{{占位符}}`,class 与 `<style>` 对应)
39
+ 4. **简历骨架**(组件装配顺序:Header → 按 MD 模块顺序的各 Section)
40
+ 5. **Markdown → 组件映射规则表**
41
+
42
+ 新主题可直接编写,或从一份参考简历 HTML 转换而来(把它的 `<style>` 里 `:root` + 组件 class 抽成主题 `<style>`——剔除外壳负责的舞台/分页/打印规则;把各原子抽成带 `{{占位符}}` 的组件;记录骨架顺序与 MD→组件映射)。无论哪种方式:
43
+
44
+ 1. 写成 `references/theme-{标识}.md`,含上面 5 个部分。
45
+ 2. 在本表登记一行(主题 / 标识 / 主色 / 适用场景 / 文件)。
46
+ 3. **查看效果 = 用 `assets/sample-resume.md` 渲染该主题 → `validate_resume.py` → `wrap_preview.py` → 浏览器打开预览**,确认可用。
@@ -0,0 +1,163 @@
1
+ # 主题 · 双栏侧边栏创意风(`sidebar-creative`)
2
+
3
+ > **双栏(64mm 侧栏 + 主体)· 暖珊瑚单点缀色 · 固定单页 · 仅建议创意岗**。
4
+ > 适用于 UI/UX / 视觉 / 交互 / 工业设计 / 创意岗。
5
+ >
6
+ > ⚠️ **本主题是特殊的"单页双栏"结构**,与其余单栏多页主题不同:
7
+ > - 正文原子是**唯一一个** `<div class="two-col">`(包住整页:左 `<aside class="sidebar">` + 右 `<main class="main">`)。**不要再放第二个原子**。
8
+ > - 内容**必须能放进一页 A4**(创意简历本就精简)。超出会被裁切(`.page{overflow:hidden}`),不会自动分页。
9
+ > - 章节标题用 `.sec-h`(不是 `.sec-head`),姓名区用 `.head`(不是 `.resume-header`)。
10
+ >
11
+ > **用法**:渲染时把"完整 `<style>`"整段作为产物开头,正文只放一个 `.two-col`。HTML 一律从本文件取。
12
+
13
+ ## 设计变量速查表
14
+
15
+ | 变量 | 值 | 用途 |
16
+ |------|-----|------|
17
+ | `--bg` | `oklch(93% .004 40)` | 舞台底色 |
18
+ | `--paper` / `--sidebar` | `oklch(99.5% .002 60)` / `oklch(96.5% .012 40)` | 纸张 / 侧栏底色 |
19
+ | `--ink` | `oklch(22% .012 40)` | 正文 |
20
+ | `--muted` / `--faint` | `oklch(45% .012 40)` / `oklch(55% .010 40)` | 次要 / 弱 |
21
+ | `--border` / `--hair` | `oklch(88% .010 40)` / `oklch(90% .008 40)` | 边框 / 发丝线 |
22
+ | `--accent` | `oklch(56% .15 38)` | **唯一**点缀色(暖珊瑚) |
23
+ | `--accent-ink` / `--accent-soft` | `oklch(44% .14 38)` / `oklch(94% .03 40)` | 强调字色 / 浅底 |
24
+
25
+ ## 完整 `<style>`(渲染时整段贴在产物最前)
26
+
27
+ ```html
28
+ <style>
29
+ :root{
30
+ --bg:oklch(93% .004 40);--paper:oklch(99.5% .002 60);--sidebar:oklch(96.5% .012 40);
31
+ --ink:oklch(22% .012 40);--muted:oklch(45% .012 40);--faint:oklch(55% .010 40);--border:oklch(88% .010 40);--hair:oklch(90% .008 40);
32
+ --accent:oklch(56% .15 38);--accent-ink:oklch(44% .14 38);--accent-soft:oklch(94% .03 40);
33
+ --font-sans:'PingFang SC','HarmonyOS Sans SC','Microsoft YaHei','Hiragino Sans GB',-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
34
+ --font-mono:'JetBrains Mono','SF Mono',ui-monospace,Menlo,Consolas,monospace;
35
+ }
36
+ body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
37
+ .page{background:var(--paper)}
38
+ .page-content{padding:0 !important} /* 覆写外壳内边距,让 two-col 满铺整页 */
39
+ .two-col{position:absolute;inset:0;display:grid;grid-template-columns:64mm 1fr}
40
+ .sidebar{background:var(--sidebar);padding:15mm 9mm 15mm;border-right:1px solid var(--border);display:flex;flex-direction:column;gap:16px}
41
+ .photo{width:100%;aspect-ratio:3/4;border:1px solid var(--border);background:var(--paper);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--faint);overflow:hidden}
42
+ .photo img{width:100%;height:100%;object-fit:cover;display:block}
43
+ .photo svg{width:34px;height:34px;opacity:.4}
44
+ .photo span{font-size:10px;letter-spacing:.1em}
45
+ .side-block h3{font-size:12px;font-weight:700;letter-spacing:.2em;color:var(--accent-ink);margin-bottom:9px}
46
+ .side-block .row{font-size:13px;color:var(--ink);line-height:1.8}
47
+ .side-block .row .k{color:var(--faint);font-size:12px;margin-right:5px}
48
+ .side-block .row a{color:var(--accent-ink);text-decoration:none}
49
+ .tools{display:flex;flex-wrap:wrap;gap:5px}
50
+ .tools .t{font-size:12.5px;color:var(--ink);background:var(--paper);border:1px solid var(--border);padding:3px 8px}
51
+ .main{padding:15mm 14mm 15mm}
52
+ .head{padding-bottom:13px;border-bottom:2px solid var(--ink);margin-bottom:14px}
53
+ .head .name{font-size:29px;font-weight:700;letter-spacing:.04em}
54
+ .head .role{font-size:14px;font-weight:600;color:var(--accent-ink);margin-top:4px}
55
+ .head .one{font-size:13px;color:var(--muted);margin-top:6px}
56
+ .head .edu-line{font-size:13px;color:var(--accent-ink);font-weight:500;margin-top:4px}
57
+ .sec-h{display:flex;align-items:center;gap:9px;margin-top:17px;margin-bottom:9px}
58
+ .sec-h .ico{width:15px;height:15px;color:var(--accent);flex-shrink:0}
59
+ .sec-h h2{font-size:14px;font-weight:700;letter-spacing:.14em;color:var(--ink)}
60
+ .sec-h::after{content:"";flex:1;height:1px;background:var(--hair)}
61
+ .summary{font-size:13px;line-height:1.8;text-align:justify;text-wrap:pretty}
62
+ .summary b{color:var(--accent-ink)}
63
+ .entry{margin-bottom:13px}
64
+ .entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:10px}
65
+ .entry-title{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
66
+ .entry-title .org,.entry-title .proj{font-size:14px;font-weight:700}
67
+ .entry-title .role{font-size:13px;color:var(--accent-ink)}
68
+ .entry-date{font-family:var(--font-mono);font-size:11px;color:var(--faint);white-space:nowrap}
69
+ .entry-meta{font-size:12px;color:var(--muted);margin-top:2px}
70
+ .entry-meta b{color:var(--ink)}
71
+ .entry-list{list-style:none;margin-top:4px}
72
+ .entry-list li{position:relative;padding-left:13px;font-size:12.5px;line-height:1.7;margin-bottom:2px;text-align:justify;text-wrap:pretty}
73
+ .entry-list li::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
74
+ .entry-list .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
75
+ /* Bullet(此主题不原子化——保留以供引用;实际渲染不拆分) */
76
+ .bullet{position:relative;padding-left:13px;font-size:12.5px;line-height:1.7;margin-bottom:2px;text-align:justify;text-wrap:pretty}
77
+ .bullet::before{content:"•";position:absolute;left:1px;top:5px;color:var(--accent);font-size:10px;line-height:1}
78
+ .bullet .num{font-family:var(--font-mono);color:var(--accent-ink);font-weight:600}
79
+ </style>
80
+ ```
81
+
82
+ ## 组件库(带 `{{占位符}}`)—— 全部包在唯一一个 `.two-col` 里
83
+
84
+ ### 0. Two-col 整页骨架(正文只有这一个原子)
85
+ ```html
86
+ <div class="two-col">
87
+ <aside class="sidebar">
88
+ {{photo-full}}
89
+ <div class="side-block">…</div> <!-- 联系方式 -->
90
+ <div class="side-block">…</div> <!-- 设计工具 -->
91
+ <div class="side-block">…</div> <!-- 设计理念 / 语言 / 基本信息,按需 -->
92
+ </aside>
93
+ <main class="main">
94
+ <div class="head">…</div>
95
+ <div class="sec-h">…</div><div class="summary">…</div>
96
+ <!-- 教育 / 实习 / 项目 / 获奖,每个先 .sec-h 再内容 -->
97
+ </main>
98
+ </div>
99
+ ```
100
+
101
+ ### 侧栏 · photo(满宽 3:4)
102
+ ```html
103
+ <div class="photo">{{有头像: <img src="{{avatar}}" alt="证件照"> / 无: <svg …>占位</svg> + <span>证件照</span>}}</div>
104
+ ```
105
+
106
+ ### 侧栏 · side-block(标题 + 若干 row)
107
+ ```html
108
+ <div class="side-block">
109
+ <h3>{{联系方式}}</h3>
110
+ <div class="row"><span class="k">{{城市}}</span>{{value}}</div>
111
+ <div class="row"><span class="k">{{电话}}</span>{{phone}}</div>
112
+ <div class="row"><a href="{{url}}">{{link}}</a></div>
113
+ </div>
114
+ ```
115
+
116
+ ### 侧栏 · tools(工具标签)
117
+ ```html
118
+ <div class="side-block"><h3>{{设计工具}}</h3><div class="tools"><span class="t">{{Figma}}</span><span class="t">{{Sketch}}</span></div></div>
119
+ ```
120
+
121
+ ### 主体 · head(姓名 / 方向 / 教育 / 一句话)
122
+ ```html
123
+ <div class="head">
124
+ <div class="name">{{name}}</div>
125
+ <div class="role">{{求职意向 · UI/UX 交互设计师}}</div>
126
+ <div class="edu-line">{{education}}</div>
127
+ <div class="one">{{学校 · 专业 · 一两句亮点}}</div>
128
+ </div>
129
+ ```
130
+ `{{education}}` 可选单独行(来自 `education:` 字段),无则删整行。
131
+
132
+ ### 主体 · sec-h(章节标题,注意是 `.sec-h`)
133
+ ```html
134
+ <div class="sec-h">{{icon}}<h2>{{title}}</h2></div>
135
+ ```
136
+
137
+ ### 主体 · summary(直接文本,非 `<p>`)
138
+ ```html
139
+ <div class="summary">{{text,关键短语用 <b>}}</div>
140
+ ```
141
+
142
+ ### 主体 · entry / entry-list(同单栏结构;项目用 `.proj`)
143
+ ```html
144
+ <div class="entry">
145
+ <div class="entry-main"><div class="entry-title"><span class="org">{{org}}</span><span class="role">{{role}}</span></div><span class="entry-date">{{date}}</span></div>
146
+ <ul class="entry-list"><li>{{bullet,数字用 <span class="num">}}</li></ul>
147
+ </div>
148
+ ```
149
+
150
+ ### 获奖(本主题用 `.entry-list` 列表,不用网格)
151
+ ```html
152
+ <ul class="entry-list" style="margin-top:2px">
153
+ <li>{{红点设计概念奖}} · <span class="num">{{2024}}</span></li>
154
+ </ul>
155
+ ```
156
+
157
+ ## 简历骨架(单页!精简)
158
+ 侧栏:photo → 联系方式 → 设计工具 → 设计理念 → 语言 → 基本信息。
159
+ 主体:head → 个人简介 → 教育背景 → 实习经历 → 项目作品 → 获奖与荣誉。
160
+ **控制总量在一页 A4 内**;放不下就删次要模块或精简 bullet。
161
+
162
+ ## MD → 组件映射
163
+ `# self-intro`→侧栏 photo + 联系方式 side-block + 基本信息 side-block;`name/role`→主体 `.head`;`# 模块`→主体 `.sec-h` + 内容;`## org|role`→`.entry`;`- bullet`→`.entry-list li`;设计工具/技能→侧栏 `.tools`;获奖→主体 `.entry-list`。
@@ -0,0 +1,153 @@
1
+ # 主题 · 国企 / 银行正式风(`soe-formal`)
2
+
3
+ > 单栏 · 藏青(navy)单色 · 证件照 · **基本信息表(含政治面貌 / 籍贯 / 民族 / 出生年月)** · 描边 SVG 图标 · `•` 列表符 · 简介带左竖条。
4
+ > 适用于国企 / 银行 / 央企 / 公职 / 体制内。
5
+ >
6
+ > **用法**:渲染时把"完整 `<style>`"整段作为产物开头,再按骨架用组件装配。HTML 一律从本文件取。
7
+
8
+ ## 设计变量速查表
9
+
10
+ | 变量 | 值 | 用途 |
11
+ |------|-----|------|
12
+ | `--bg` | `oklch(93% .003 250)` | 舞台底色 |
13
+ | `--paper` | `oklch(100% 0 0)` | A4 纸张(纯白) |
14
+ | `--ink` | `oklch(20% .018 255)` | 正文 |
15
+ | `--muted` / `--faint` | `oklch(45% .018 255)` / `oklch(55% .014 255)` | 次要 / 弱 |
16
+ | `--rule` / `--hair` / `--border` | `oklch(84% .012 255)` / `oklch(90% .008 255)` / `oklch(88% .01 255)` | 表格线 / 发丝 / 边框 |
17
+ | `--navy` | `oklch(31% .058 258)` | **唯一**点缀色(藏青,本主题用 navy 而非 accent) |
18
+ | `--navy-deep` / `--navy-soft` | `oklch(24% .06 258)` / `oklch(95% .012 258)` | 深藏青字色 / 浅藏青底 |
19
+
20
+ ## 完整 `<style>`(渲染时整段贴在产物最前)
21
+
22
+ ```html
23
+ <style>
24
+ :root{
25
+ --bg:oklch(93% .003 250);--paper:oklch(100% 0 0);--ink:oklch(20% .018 255);--muted:oklch(45% .018 255);
26
+ --faint:oklch(55% .014 255);--rule:oklch(84% .012 255);--hair:oklch(90% .008 255);--border:oklch(88% .01 255);
27
+ --navy:oklch(31% .058 258);--navy-deep:oklch(24% .06 258);--navy-soft:oklch(95% .012 258);
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,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:22px;align-items:start;padding-bottom:12px;border-bottom:2.5px solid var(--navy)}
34
+ .name-block .cn{font-weight:900;font-size:32px;color:var(--navy-deep);letter-spacing:.14em;line-height:1}
35
+ .name-block .en{font-weight:500;font-size:11px;color:var(--faint);letter-spacing:.32em;margin-top:6px}
36
+ .name-block .intent{margin-top:11px;font-size:13px;color:var(--ink)}
37
+ .name-block .edu-line{margin-top:6px;font-family:var(--font-sans);font-size:12px;color:var(--navy-deep);font-weight:500}
38
+ .name-block .intent b{color:var(--navy-deep);font-weight:700}
39
+ .name-block .intent .sep{color:var(--faint);margin:0 8px}
40
+ .photo{width:27mm;height:38mm;border:1px solid var(--rule);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:.5}
43
+ .photo span{font-size:10px;letter-spacing:.1em}
44
+ .bio-form{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--rule);border-right:0;border-bottom:0;margin-top:12px}
45
+ .bio-form>div{display:flex;gap:6px;padding:6px 11px;border-right:1px solid var(--rule);border-bottom:1px solid var(--rule);font-size:12.5px;align-items:baseline}
46
+ .bio-form .k{color:var(--faint);font-size:11px;flex-shrink:0;letter-spacing:.04em}
47
+ .bio-form .v{color:var(--ink);font-weight:500}
48
+ .sec-head{display:flex;align-items:center;gap:9px;margin-top:18px;margin-bottom:10px}
49
+ .sec-head .ico{width:15px;height:15px;color:var(--navy);flex-shrink:0}
50
+ .sec-head h2{font-weight:700;font-size:15px;color:var(--navy-deep);letter-spacing:.1em}
51
+ .sec-head h2 .en{font-weight:400;font-size:10px;color:var(--faint);letter-spacing:.22em;text-transform:uppercase;margin-left:7px}
52
+ .sec-head::after{content:"";flex:1;height:1px;background:var(--hair)}
53
+ .entry{margin-bottom:11px}
54
+ .entry-main{display:grid;grid-template-columns:1fr auto;align-items:baseline;gap:14px}
55
+ .entry-title{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
56
+ .entry-title .org,.entry-title .proj{font-weight:700;font-size:14px}
57
+ .entry-title .role{font-size:13px;color:var(--navy-deep)}
58
+ .entry-title .badge{font-size:10.5px;color:var(--navy-deep);background:var(--navy-soft);padding:1.5px 7px;letter-spacing:.04em}
59
+ .entry-date{font-family:var(--font-mono);font-size:11px;color:var(--faint);white-space:nowrap}
60
+ .entry-meta{margin-top:2px;font-size:11.5px;color:var(--muted);display:flex;gap:14px;flex-wrap:wrap}
61
+ .entry-meta b{color:var(--ink);font-weight:600}
62
+ .entry-list{list-style:none;margin-top:5px}
63
+ .entry-list li{position:relative;padding-left:13px;font-size:12.5px;line-height:1.72;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
64
+ .entry-list li::before{content:"•";position:absolute;left:1px;top:6px;color:var(--navy);font-size:10px;line-height:1}
65
+ .entry-list .num{font-family:var(--font-mono);color:var(--navy-deep);font-weight:600}
66
+ /* Bullet(独立原子,自由换页) */
67
+ .bullet{position:relative;padding-left:13px;font-size:12.5px;line-height:1.72;color:var(--ink);margin-bottom:2px;text-align:justify;text-wrap:pretty}
68
+ .bullet::before{content:"•";position:absolute;left:1px;top:6px;color:var(--navy);font-size:10px;line-height:1}
69
+ .bullet .num{font-family:var(--font-mono);color:var(--navy-deep);font-weight:600}
70
+ .awards{display:grid;grid-template-columns:1fr 1fr;gap:3px 24px}
71
+ .award{display:grid;grid-template-columns:40px 1fr auto;gap:8px;align-items:baseline;font-size:12.5px;padding:4px 0;border-bottom:1px dashed var(--hair)}
72
+ .award .yr{font-family:var(--font-mono);font-size:11px;color:var(--navy)}
73
+ .award .lvl{font-size:11px;color:var(--navy-deep);font-weight:600}
74
+ .skills{display:flex;flex-direction:column}
75
+ .skills .row{display:grid;grid-template-columns:78px 1fr;gap:12px;padding:5px 0;border-bottom:1px dashed var(--hair)}
76
+ .skills .cat{font-weight:700;font-size:12.5px;color:var(--navy-deep);letter-spacing:.04em}
77
+ .skills .tags{font-size:12.5px;color:var(--ink)}
78
+ .skills .tags b{color:var(--navy-deep);font-weight:600}
79
+ .summary p{font-size:13px;line-height:1.82;color:var(--ink);text-align:justify;text-wrap:pretty;border-left:3px solid var(--navy-soft);padding-left:11px}
80
+ .summary p b{color:var(--navy-deep)}
81
+ </style>
82
+ ```
83
+
84
+ ## 组件库(带 `{{占位符}}`)
85
+
86
+ ### 1. Header(姓名块 + 证件照 + 基本信息表,**含政治面貌/籍贯**)
87
+ ```html
88
+ <header class="resume-header">
89
+ <div class="name-block">
90
+ <div class="cn">{{name}}</div>
91
+ <div class="en">{{CHEN SIYUAN}} · {{学位}}</div>
92
+ <div class="edu-line">{{education}}</div>
93
+ <div class="intent">求职意向:<b>{{银行管培生 / 央企储备干部}}</b><span class="sep">·</span>期望地 {{city}}<span class="sep">·</span>到岗 {{time}}</div>
94
+ </div>
95
+ {{photo}}
96
+ <div class="bio-form" style="grid-column:1 / -1">
97
+ <div><span class="k">性别</span><span class="v">{{gender}}</span></div>
98
+ <div><span class="k">出生年月</span><span class="v">{{birth}}</span></div>
99
+ <div><span class="k">政治面貌</span><span class="v">{{political}}</span></div>
100
+ <div><span class="k">籍贯</span><span class="v">{{hometown}}</span></div>
101
+ <div><span class="k">民族</span><span class="v">{{ethnicity}}</span></div>
102
+ <div><span class="k">学历</span><span class="v">{{education-level}}</span></div>
103
+ <div><span class="k">电话</span><span class="v">{{phone}}</span></div>
104
+ <div><span class="k">邮箱</span><span class="v">{{email}}</span></div>
105
+ </div>
106
+ </header>
107
+ ```
108
+ `bio-form` **8 格两行**(`grid-column:1 / -1` 满宽)。self-intro 里给政治面貌/籍贯/民族/出生年月就填,没给就留占位提示用户补——**国企风这些字段通常必备**。
109
+
110
+ ### 2. SectionHead(中文 + 可选英文小标签)
111
+ ```html
112
+ <div class="sec-head" data-stick="1">{{icon}}<h2>{{title}}<span class="en">{{EDUCATION}}</span></h2></div>
113
+ ```
114
+
115
+ ### 3. Entry header(教育 / 实习 / 课题 / 校园头;项目/课题用 `.proj` + `.badge`)
116
+ ```html
117
+ <div class="entry" data-stick="1">
118
+ <div class="entry-main"><div class="entry-title"><span class="org">{{org}}</span><span class="role">{{role}}</span></div><span class="entry-date">{{date}}</span></div>
119
+ <div class="entry-meta"><span>{{meta,关键 <b>}}</span></div>
120
+ </div>
121
+ ```
122
+ 课题/学生工作用 `<span class="proj">{{项目/组织}}</span>` + 可选 `<span class="badge">{{课题主笔 / 党支部书记}}</span>`。`data-stick="1"` 让 header 和第一条 bullet 同页。
123
+
124
+ ### 4. Bullet(单条经历要点 — 独立原子,自由换页)
125
+ ```html
126
+ <div class="bullet">{{text,数字 <span class="num">}}</div>
127
+ ```
128
+ 每条 `- bullet` 拆一个独立原子。
129
+
130
+ ### 5. Awards(荣誉奖项,按年份;含「优秀共产党员」等)
131
+ ```html
132
+ <div class="awards"><div class="award"><span class="yr">{{year}}</span><span>{{name}}</span><span class="lvl">{{level}}</span></div></div>
133
+ ```
134
+
135
+ ### 6. Skills(技能与证书,类别 + 标签)
136
+ ```html
137
+ <div class="skills">
138
+ <div class="row"><span class="cat">{{专业技能}}</span><span class="tags"><b>{{财务建模}}</b> · {{估值分析}} · …</span></div>
139
+ <div class="row"><span class="cat">{{资格证书}}</span><span class="tags"><b>{{证券从业}}</b> · <b>{{基金从业}}</b> · …</span></div>
140
+ </div>
141
+ ```
142
+ 资格证书单独一行,已取得的用 `<b>`。
143
+
144
+ ### 7. Summary(自我评价,左竖条引用块,**放末尾**)
145
+ ```html
146
+ <div class="summary"><p>{{自我评价,关键 <b>}}</p></div>
147
+ ```
148
+
149
+ ## 简历骨架
150
+ Header(含基本信息表)→ 教育背景 → 实习经历 → 课题与研究项目 → 校园经历与学生工作 → 荣誉奖项 → 技能与证书 → 自我评价(末尾)。
151
+
152
+ ## MD → 组件映射
153
+ `# self-intro`→Header(`political/birth/hometown/ethnicity` 等填进 `bio-form`);`# 教育背景`等→SectionHead;`## org|role`→Entry header(`data-stick="1"`);`date:/meta:`→Entry 内;`- bullet`→每条独立 `.bullet`;`年份|name|level`→`.award`;`类别: 值`→`.skills .row`;`# 自我评价`→末尾 Summary 引用块。