knowme-careerforge-skill 0.0.1

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 (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/README.zh-CN.md +231 -0
  4. package/SKILL.md +179 -0
  5. package/agents/claude/knowme-careerforge.md +16 -0
  6. package/agents/codex/knowme-careerforge.yaml +15 -0
  7. package/agents/cursor/knowme-careerforge.mdc +12 -0
  8. package/agents/gemini/knowme-careerforge.json +6 -0
  9. package/agents/opencode/skill.yaml +11 -0
  10. package/agents/windsurf/knowme-careerforge.rules +10 -0
  11. package/bin/knowme.js +32 -0
  12. package/dist/cli/src/commands/init.d.ts +10 -0
  13. package/dist/cli/src/commands/init.js +130 -0
  14. package/dist/cli/src/commands/list.d.ts +5 -0
  15. package/dist/cli/src/commands/list.js +92 -0
  16. package/dist/cli/src/index.d.ts +6 -0
  17. package/dist/cli/src/index.js +149 -0
  18. package/dist/scripts/render-pdf.d.ts +11 -0
  19. package/dist/scripts/render-pdf.js +105 -0
  20. package/dist/scripts/validate-ats.d.ts +23 -0
  21. package/dist/scripts/validate-ats.js +169 -0
  22. package/dist/scripts/validate-layout.d.ts +24 -0
  23. package/dist/scripts/validate-layout.js +161 -0
  24. package/package.json +58 -0
  25. package/scripts/analyze-jd.py +108 -0
  26. package/scripts/build-gallery.py +233 -0
  27. package/scripts/build-knowledge.py +81 -0
  28. package/scripts/instantiate-resume.py +83 -0
  29. package/scripts/release.py +101 -0
  30. package/scripts/render-pdf.ts +86 -0
  31. package/scripts/run-all-tests.py +41 -0
  32. package/scripts/search-template.py +147 -0
  33. package/scripts/sync-version.py +57 -0
  34. package/scripts/validate-ats.ts +173 -0
  35. package/scripts/validate-layout.ts +161 -0
  36. package/scripts/validate-resume.py +139 -0
  37. package/skill.json +47 -0
  38. package/src/knowledge/ats-rules.json +37 -0
  39. package/src/knowledge/career/seniority-signals.json +24 -0
  40. package/src/knowledge/index.json +734 -0
  41. package/src/knowledge/industries/enterprise-saas.json +21 -0
  42. package/src/knowledge/industries/fintech.json +21 -0
  43. package/src/knowledge/industries/tech-ai.json +21 -0
  44. package/src/knowledge/layouts.json +59 -0
  45. package/src/knowledge/resume/action-verbs.json +20 -0
  46. package/src/knowledge/resume/fab-model.json +22 -0
  47. package/src/knowledge/roles/ai-agent-engineer.json +52 -0
  48. package/src/knowledge/roles/android-engineer.json +45 -0
  49. package/src/knowledge/roles/architect.json +48 -0
  50. package/src/knowledge/roles/cpp-systems.json +47 -0
  51. package/src/knowledge/roles/frontend.json +49 -0
  52. package/src/knowledge/roles/ios-engineer.json +45 -0
  53. package/src/knowledge/roles/java-backend.json +49 -0
  54. package/src/knowledge/roles/node-fullstack.json +49 -0
  55. package/src/knowledge/roles/product-manager.json +48 -0
  56. package/src/knowledge/skills/skill-matrix.json +29 -0
  57. package/src/knowledge/styles.json +73 -0
  58. package/src/knowledge/templates.json +255 -0
  59. package/src/references/ats.md +17 -0
  60. package/src/references/evidence-first.md +22 -0
  61. package/src/references/pdf.md +40 -0
  62. package/src/references/resume-writing.md +25 -0
  63. package/src/references/template-design.md +57 -0
  64. package/src/templates/classic/README.md +12 -0
  65. package/src/templates/classic/metadata.json +34 -0
  66. package/src/templates/classic/style.css +164 -0
  67. package/src/templates/classic/template.html +133 -0
  68. package/src/templates/common/resume-contract.md +69 -0
  69. package/src/templates/executive/README.md +12 -0
  70. package/src/templates/executive/metadata.json +37 -0
  71. package/src/templates/executive/style.css +235 -0
  72. package/src/templates/executive/template.html +101 -0
  73. package/src/templates/minimal/README.md +12 -0
  74. package/src/templates/minimal/metadata.json +37 -0
  75. package/src/templates/minimal/style.css +219 -0
  76. package/src/templates/minimal/template.html +114 -0
  77. package/src/templates/modern/README.md +12 -0
  78. package/src/templates/modern/metadata.json +38 -0
  79. package/src/templates/modern/style.css +277 -0
  80. package/src/templates/modern/template.html +139 -0
  81. package/src/workflows/analyze-job.md +16 -0
  82. package/src/workflows/define-goal.md +16 -0
  83. package/src/workflows/forge-resume.md +25 -0
  84. package/src/workflows/know-me.md +21 -0
  85. package/src/workflows/position.md +19 -0
  86. package/src/workflows/review.md +31 -0
@@ -0,0 +1,164 @@
1
+ :root {
2
+ /* A4 绝对几何尺寸 */
3
+ --resume-page-width: 210mm;
4
+ --resume-page-min-height: 297mm;
5
+ --resume-page-padding: 12mm 14mm;
6
+
7
+ /* 配色系统 */
8
+ --resume-color-primary: #0f172a; /* Slate 900 */
9
+ --resume-color-secondary: #334155; /* Slate 700 */
10
+ --resume-color-muted: #64748b; /* Slate 500 */
11
+ --resume-color-accent: #1d4ed8; /* Blue 700 */
12
+ --resume-color-border: #cbd5e1; /* Slate 300 稳重边框 */
13
+ --resume-color-header-bg: #f8fafc; /* Slate 50 */
14
+ --resume-color-label-bg: #f1f5f9; /* Slate 100 */
15
+
16
+ /* 字阶系统 */
17
+ --resume-font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
18
+ --resume-font-size-title: 18pt;
19
+ --resume-font-size-body: 9pt;
20
+ --resume-font-size-meta: 8.5pt;
21
+ --resume-line-height-body: 1.4;
22
+
23
+ /* 单元格内边距 */
24
+ --resume-cell-padding: 4.5pt 7pt;
25
+ }
26
+
27
+ * { box-sizing: border-box; margin: 0; padding: 0; }
28
+
29
+ body {
30
+ background-color: #e2e8f0;
31
+ font-family: var(--resume-font-body);
32
+ display: flex;
33
+ justify-content: center;
34
+ padding: 24px 0;
35
+ color: var(--resume-color-primary);
36
+ -webkit-font-smoothing: antialiased;
37
+ }
38
+
39
+ .resume-page {
40
+ width: var(--resume-page-width);
41
+ min-height: var(--resume-page-min-height);
42
+ background: #ffffff;
43
+ padding: var(--resume-page-padding);
44
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
45
+ box-sizing: border-box;
46
+ }
47
+
48
+ .resume-header {
49
+ text-align: center;
50
+ margin-bottom: 8pt;
51
+ }
52
+
53
+ .resume-main-title {
54
+ font-size: var(--resume-font-size-title);
55
+ font-weight: 800;
56
+ letter-spacing: 4px;
57
+ color: var(--resume-color-primary);
58
+ }
59
+
60
+ .resume-sub-title {
61
+ font-size: 8pt;
62
+ letter-spacing: 2px;
63
+ color: var(--resume-color-muted);
64
+ margin-top: 1pt;
65
+ }
66
+
67
+ /* 结构化表格 */
68
+ .resume-grid-table {
69
+ width: 100%;
70
+ border-collapse: collapse;
71
+ font-size: var(--resume-font-size-body);
72
+ border: 1px solid var(--resume-color-border);
73
+ }
74
+
75
+ .resume-grid-table td {
76
+ border: 1px solid var(--resume-color-border);
77
+ padding: var(--resume-cell-padding);
78
+ vertical-align: middle;
79
+ line-height: var(--resume-line-height-body);
80
+ }
81
+
82
+ .cell-label {
83
+ background-color: var(--resume-color-label-bg);
84
+ font-weight: 600;
85
+ color: var(--resume-color-secondary);
86
+ text-align: center;
87
+ width: 58pt;
88
+ }
89
+
90
+ .cell-value {
91
+ color: var(--resume-color-primary);
92
+ }
93
+
94
+ .cell-highlight-bg {
95
+ background-color: #eff6ff; /* Blue 50 */
96
+ color: var(--resume-color-accent);
97
+ }
98
+
99
+ .date-col {
100
+ width: 82pt;
101
+ font-size: var(--resume-font-size-meta);
102
+ color: var(--resume-color-muted);
103
+ }
104
+
105
+ .section-header-cell {
106
+ background-color: var(--resume-color-header-bg);
107
+ border-left: 3.5px solid var(--resume-color-accent) !important;
108
+ padding: 3.5pt 8pt;
109
+ }
110
+
111
+ .section-title {
112
+ font-size: 10pt;
113
+ font-weight: 700;
114
+ color: var(--resume-color-accent);
115
+ margin: 0;
116
+ display: flex;
117
+ align-items: center;
118
+ }
119
+
120
+ .section-icon {
121
+ color: var(--resume-color-accent);
122
+ font-size: 8pt;
123
+ margin-right: 4pt;
124
+ }
125
+
126
+ .cell-content {
127
+ color: var(--resume-color-secondary);
128
+ }
129
+
130
+ .exp-header {
131
+ margin-bottom: 2pt;
132
+ color: var(--resume-color-primary);
133
+ }
134
+
135
+ .exp-bullets {
136
+ margin-left: 12pt;
137
+ margin-top: 2pt;
138
+ }
139
+
140
+ .exp-bullets li {
141
+ margin-bottom: 2pt;
142
+ }
143
+
144
+ .project-desc {
145
+ font-size: 8.5pt;
146
+ color: var(--resume-color-secondary);
147
+ line-height: 1.38;
148
+ }
149
+
150
+ @media print {
151
+ body { background: transparent; padding: 0; }
152
+ .resume-page {
153
+ box-shadow: none;
154
+ margin: 0;
155
+ width: var(--resume-page-width);
156
+ min-height: var(--resume-page-min-height);
157
+ page-break-after: always;
158
+ page-break-inside: avoid;
159
+ }
160
+ @page {
161
+ size: A4 portrait;
162
+ margin: 0;
163
+ }
164
+ }
@@ -0,0 +1,133 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>候选人 - 结构化表格简历</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ </head>
9
+ <body>
10
+ <div class="resume-page" id="page-1">
11
+ <header class="resume-header">
12
+ <h1 class="resume-main-title">个人求职简历</h1>
13
+ <p class="resume-sub-title">PERSONAL RESUME</p>
14
+ </header>
15
+
16
+ <!-- 现代结构化表格 -->
17
+ <table class="resume-grid-table">
18
+ <!-- 求职意向高亮行 -->
19
+ <tr>
20
+ <td class="cell-label cell-highlight-bg">求职意向</td>
21
+ <td colspan="5" class="cell-value cell-highlight-bg"><strong>AI Agent 研发工程师 / 资深后端架构师</strong></td>
22
+ </tr>
23
+
24
+ <!-- 基本信息 6 列矩阵 -->
25
+ <tr>
26
+ <td class="cell-label">姓 名</td>
27
+ <td class="cell-value candidate-name">鹿小笙</td>
28
+ <td class="cell-label">出生年月</td>
29
+ <td class="cell-value">1995.06 (29岁)</td>
30
+ <td class="cell-label">政治面貌</td>
31
+ <td class="cell-value">中共党员</td>
32
+ </tr>
33
+ <tr>
34
+ <td class="cell-label">联系电话</td>
35
+ <td class="cell-value">138-0000-0000</td>
36
+ <td class="cell-label">电子邮箱</td>
37
+ <td class="cell-value">luxiaosheng@example.com</td>
38
+ <td class="cell-label">最高学历</td>
39
+ <td class="cell-value">硕士研究生</td>
40
+ </tr>
41
+ <tr>
42
+ <td class="cell-label">毕业院校</td>
43
+ <td class="cell-value">北京航空航天大学</td>
44
+ <td class="cell-label">所学专业</td>
45
+ <td class="cell-value">计算机科学与技术</td>
46
+ <td class="cell-label">求职城市</td>
47
+ <td class="cell-value">北京 / 远程</td>
48
+ </tr>
49
+
50
+ <!-- 专业技能模块 -->
51
+ <tr>
52
+ <td colspan="6" class="section-header-cell" id="skills">
53
+ <h2 class="section-title"><span class="section-icon">■</span> 专业技能</h2>
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <td class="cell-label">AI / 大模型</td>
58
+ <td colspan="5" class="cell-content">
59
+ 精通 RAG 知识检索、多 Agent 协作工作流 (LangGraph / LlamaIndex)、Prompt 优化与模型评测微调。
60
+ </td>
61
+ </tr>
62
+ <tr>
63
+ <td class="cell-label">后端工程</td>
64
+ <td colspan="5" class="cell-content">
65
+ 熟练掌握 Python / Go / TypeScript,精通 FastAPI、微服务架构、Docker / K8s 与可观测性体系。
66
+ </td>
67
+ </tr>
68
+
69
+ <!-- 工作经历模块 -->
70
+ <tr>
71
+ <td colspan="6" class="section-header-cell" id="experience">
72
+ <h2 class="section-title"><span class="section-icon">■</span> 工作经历</h2>
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <td class="cell-label date-col">2023.03 - 至今</td>
77
+ <td colspan="5" class="cell-content">
78
+ <div class="exp-header">
79
+ <strong>智元未来人工智能实验室</strong> · 资深 AI 应用工程师
80
+ </div>
81
+ <ul class="exp-bullets">
82
+ <li>主导研发企业级多 Agent 工作流系统,单日调度调用量超 <strong>500 万次</strong>,工作流成功率达 <strong>99.2%</strong>。</li>
83
+ <li>设计高吞吐多路召回 RAG 检索管线,问答匹配命中率提升 <strong>38%</strong>,端到端延迟压测低于 <strong>650ms</strong>。</li>
84
+ </ul>
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <td class="cell-label date-col">2020.07 - 2023.02</td>
89
+ <td colspan="5" class="cell-content">
90
+ <div class="exp-header">
91
+ <strong>极光互联科技有限公司</strong> · 高级后端开发工程师
92
+ </div>
93
+ <ul class="exp-bullets">
94
+ <li>负责核心 API 网关重构,平稳支撑双十一 <strong>80,000 QPS</strong> 峰值,核心接口 P99 延迟降低 <strong>45%</strong>。</li>
95
+ <li>落地微服务链路追踪与自动化巡检探针,线上平均故障自愈恢复时间(MTTR)缩短 <strong>60%</strong>。</li>
96
+ </ul>
97
+ </td>
98
+ </tr>
99
+
100
+ <!-- 核心项目模块 -->
101
+ <tr>
102
+ <td colspan="6" class="section-header-cell" id="projects">
103
+ <h2 class="section-title"><span class="section-icon">■</span> 核心项目</h2>
104
+ </td>
105
+ </tr>
106
+ <tr>
107
+ <td class="cell-label date-col">2024.01 - 2024.08</td>
108
+ <td colspan="5" class="cell-content">
109
+ <div class="exp-header">
110
+ <strong>OpenAgent: 自适应代码审查与重构 Agent</strong> (GitHub 2,400+ Stars)
111
+ </div>
112
+ <p class="project-desc">
113
+ 基于 AST 语义解析与 AST-Grep 上下文感知引擎,结合 LLM 实现工业级代码重构建议生成;设计 Prompt 动态剪枝算法,在保障重构精度的同时降低 42% 的 API Token 成本。
114
+ </p>
115
+ </td>
116
+ </tr>
117
+
118
+ <!-- 教育背景与荣誉 -->
119
+ <tr>
120
+ <td colspan="6" class="section-header-cell" id="education">
121
+ <h2 class="section-title"><span class="section-icon">■</span> 教育背景与荣誉</h2>
122
+ </td>
123
+ </tr>
124
+ <tr>
125
+ <td class="cell-label date-col">2017.09 - 2020.06</td>
126
+ <td colspan="5" class="cell-content">
127
+ <strong>北京航空航天大学</strong> · 计算机科学与技术 (硕士) · GPA: 3.8/4.0 · 国家奖学金 · CCF-B 论文发表
128
+ </td>
129
+ </tr>
130
+ </table>
131
+ </div>
132
+ </body>
133
+ </html>
@@ -0,0 +1,69 @@
1
+ # Resume Universal HTML Contract & A4 Specification (标准通用结构与约束规范)
2
+
3
+ 本文档定义所有简历 HTML 模板必须遵守的**通用 DOM 层次、A4 物理几何约束与数据字段标准**。
4
+
5
+ ---
6
+
7
+ ## 1. A4 物理几何与打印分页约束
8
+
9
+ 所有的简历模板根容器必须严格遵守标准的 A4 页面模型(210mm × 297mm):
10
+
11
+ ```html
12
+ <!DOCTYPE html>
13
+ <html lang="zh-CN">
14
+ <head>
15
+ <meta charset="UTF-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
17
+ <title>候选人姓名 - 目标岗位 简历</title>
18
+ <link rel="stylesheet" href="style.css">
19
+ </head>
20
+ <body>
21
+ <!-- 每一个 .resume-page 代表一页标准的 A4 页面 -->
22
+ <div class="resume-page" id="page-1">
23
+ <!-- 模板内部组件 -->
24
+ </div>
25
+ </body>
26
+ </html>
27
+ ```
28
+
29
+ ### 打印样式必须包含:
30
+ ```css
31
+ @page {
32
+ size: A4 portrait;
33
+ margin: 0; /* 禁用打印机默认边距,完全由 .resume-page 的 padding 接管 */
34
+ }
35
+
36
+ @media print {
37
+ body {
38
+ background: transparent;
39
+ padding: 0;
40
+ }
41
+ .resume-page {
42
+ box-shadow: none;
43
+ margin: 0;
44
+ width: 210mm;
45
+ min-height: 297mm;
46
+ page-break-after: always;
47
+ page-break-inside: avoid;
48
+ }
49
+ .avoid-break {
50
+ break-inside: avoid;
51
+ page-break-inside: avoid;
52
+ }
53
+ }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 2. 通用数据字段与语义化组件层级
59
+
60
+ 所有模板(单栏、双栏、表格)必须使用以下标准语义化类名:
61
+ * **姓名**:`h1.candidate-name`
62
+ * **求职目标**:`p.job-target`
63
+ * **联系信息**:`ul.contact-list` 或 `div.contact-grid`
64
+ * **功能模块**:`section.resume-section`
65
+ * **模块标题**:`h2.section-title`
66
+ * **工作条目**:`div.experience-item`
67
+ * **项目条目**:`div.project-item`
68
+ * **技能容器**:`div.skills-container`
69
+ * **教育条目**:`div.education-item`
@@ -0,0 +1,12 @@
1
+ # Executive Modern Split Template (`executive`)
2
+
3
+ > **定位:面向技术总监、首席架构师、研发负责人及资深管理者的沉稳大气双栏模板。**
4
+
5
+ - **版式风格**:顶部深色 Banner + 下方 33:67 双栏 (Hero Banner + Executive Split)
6
+ - **视觉色系**:深空板岩灰 (`#1e293b`) + 沉稳松石绿 (`#0f766e`) + 科技天蓝 (`#38bdf8`)
7
+ - **ATS 评级**:Tier 1 (Optimal)
8
+ - **目标页数**:1~2 页
9
+ - **核心 Tokens**:
10
+ - `--resume-left-col-width`: `33%` (默认)
11
+ - `--resume-space-section`: `12pt` (默认)
12
+ - `--resume-space-item`: `9pt` (默认)
@@ -0,0 +1,37 @@
1
+ {
2
+ "id": "executive",
3
+ "name": "Executive Modern Split",
4
+ "version": "1.0.0",
5
+ "style": "two-column-split",
6
+ "roleCategory": "management-product",
7
+ "layout": {
8
+ "type": "two-column-split",
9
+ "targetPages": 1,
10
+ "maxPages": 2,
11
+ "leftRatio": "33:67",
12
+ "density": "balanced"
13
+ },
14
+ "visualStyle": {
15
+ "tone": "executive-formal",
16
+ "bannerBg": "#1e293b",
17
+ "accentColor": "#0f766e",
18
+ "fontFamily": "System Sans-Serif"
19
+ },
20
+ "atsScoreTier": "tier-1-optimal",
21
+ "supportedRoles": [
22
+ "architect",
23
+ "tech-director",
24
+ "product-manager",
25
+ "engineering-lead",
26
+ "cto"
27
+ ],
28
+ "languages": ["zh-CN", "en-US"],
29
+ "customizableTokens": [
30
+ "--resume-font-size-body",
31
+ "--resume-space-section",
32
+ "--resume-space-item",
33
+ "--resume-left-col-width",
34
+ "--resume-color-accent",
35
+ "--resume-color-banner-bg"
36
+ ]
37
+ }
@@ -0,0 +1,235 @@
1
+ :root {
2
+ /* A4 绝对几何尺寸 */
3
+ --resume-page-width: 210mm;
4
+ --resume-page-min-height: 297mm;
5
+
6
+ /* 配色体系 */
7
+ --resume-color-banner-bg: #1e293b; /* Slate 800 */
8
+ --resume-color-banner-text: #f8fafc;
9
+ --resume-color-banner-muted: #94a3b8;
10
+ --resume-color-primary: #0f172a; /* Slate 900 */
11
+ --resume-color-secondary: #334155; /* Slate 700 */
12
+ --resume-color-muted: #64748b; /* Slate 500 */
13
+ --resume-color-accent: #0f766e; /* Teal 700 沉稳高管色 */
14
+ --resume-color-tag-bg: #f0fdfa; /* Teal 50 */
15
+ --resume-color-border: #e2e8f0;
16
+
17
+ /* 字阶系统 */
18
+ --resume-font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
19
+ --resume-font-size-name: 22pt;
20
+ --resume-font-size-title: 11pt;
21
+ --resume-font-size-body: 9.2pt;
22
+ --resume-font-size-meta: 8.5pt;
23
+ --resume-line-height-body: 1.45;
24
+
25
+ /* 间距 Tokens (Agent 自愈参数) */
26
+ --resume-space-section: 12pt;
27
+ --resume-space-item: 9pt;
28
+ --resume-space-bullet: 3pt;
29
+ --resume-left-col-width: 33%;
30
+ }
31
+
32
+ * { box-sizing: border-box; margin: 0; padding: 0; }
33
+
34
+ body {
35
+ background-color: #e2e8f0;
36
+ font-family: var(--resume-font-body);
37
+ display: flex;
38
+ justify-content: center;
39
+ padding: 24px 0;
40
+ color: var(--resume-color-primary);
41
+ -webkit-font-smoothing: antialiased;
42
+ }
43
+
44
+ .resume-page {
45
+ width: var(--resume-page-width);
46
+ min-height: var(--resume-page-min-height);
47
+ background: #ffffff;
48
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.15), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
49
+ overflow: hidden;
50
+ display: flex;
51
+ flex-direction: column;
52
+ }
53
+
54
+ /* 顶部 Executive Hero Banner */
55
+ .executive-banner {
56
+ background-color: var(--resume-color-banner-bg);
57
+ color: var(--resume-color-banner-text);
58
+ padding: 12mm 16mm 10mm 16mm;
59
+ display: flex;
60
+ justify-content: space-between;
61
+ align-items: center;
62
+ border-bottom: 3.5px solid var(--resume-color-accent);
63
+ }
64
+
65
+ .banner-left {
66
+ flex: 1;
67
+ }
68
+
69
+ .candidate-name {
70
+ font-size: var(--resume-font-size-name);
71
+ font-weight: 800;
72
+ letter-spacing: 1px;
73
+ }
74
+
75
+ .candidate-title {
76
+ font-size: var(--resume-font-size-title);
77
+ color: #38bdf8; /* Sky 400 */
78
+ font-weight: 600;
79
+ margin-top: 2pt;
80
+ }
81
+
82
+ .value-prop {
83
+ font-size: 8.5pt;
84
+ color: var(--resume-color-banner-muted);
85
+ margin-top: 4pt;
86
+ max-width: 480pt;
87
+ line-height: 1.4;
88
+ }
89
+
90
+ .banner-right {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 3.5pt;
94
+ font-size: 8pt;
95
+ color: var(--resume-color-banner-text);
96
+ background: rgba(255, 255, 255, 0.08);
97
+ padding: 6pt 10pt;
98
+ border-radius: 4pt;
99
+ border: 1px solid rgba(255, 255, 255, 0.15);
100
+ }
101
+
102
+ /* 下方 3:7 双栏主体 */
103
+ .executive-body {
104
+ display: grid;
105
+ grid-template-columns: var(--resume-left-col-width) 1fr;
106
+ flex: 1;
107
+ padding: 12mm 16mm;
108
+ gap: 16pt;
109
+ }
110
+
111
+ .left-col {
112
+ border-right: 1px solid var(--resume-color-border);
113
+ padding-right: 14pt;
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: var(--resume-space-section);
117
+ }
118
+
119
+ .right-col {
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: var(--resume-space-section);
123
+ }
124
+
125
+ .sub-title, .main-title {
126
+ font-size: 11pt;
127
+ font-weight: 700;
128
+ color: var(--resume-color-accent);
129
+ border-bottom: 1.5px solid var(--resume-color-accent);
130
+ padding-bottom: 3pt;
131
+ margin-bottom: 6pt;
132
+ }
133
+
134
+ .comp-list {
135
+ list-style: none;
136
+ font-size: 8.5pt;
137
+ color: var(--resume-color-secondary);
138
+ line-height: 1.45;
139
+ display: flex;
140
+ flex-direction: column;
141
+ gap: 5pt;
142
+ }
143
+
144
+ .tag-cloud {
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ gap: 4pt;
148
+ }
149
+
150
+ .tag {
151
+ font-size: 8pt;
152
+ background: var(--resume-color-tag-bg);
153
+ color: var(--resume-color-accent);
154
+ padding: 2.5pt 6pt;
155
+ border-radius: 3pt;
156
+ border: 1px solid rgba(15, 118, 110, 0.2);
157
+ }
158
+
159
+ .edu-block {
160
+ font-size: 8.5pt;
161
+ color: var(--resume-color-secondary);
162
+ line-height: 1.4;
163
+ }
164
+
165
+ .edu-school {
166
+ font-weight: 700;
167
+ color: var(--resume-color-primary);
168
+ }
169
+
170
+ .milestone-item {
171
+ margin-bottom: var(--resume-space-item);
172
+ }
173
+
174
+ .item-header {
175
+ display: flex;
176
+ justify-content: space-between;
177
+ align-items: baseline;
178
+ margin-bottom: 3pt;
179
+ }
180
+
181
+ .header-left {
182
+ display: flex;
183
+ align-items: baseline;
184
+ gap: 6pt;
185
+ }
186
+
187
+ .org-name {
188
+ font-size: 10pt;
189
+ font-weight: 700;
190
+ color: var(--resume-color-primary);
191
+ }
192
+
193
+ .role-name {
194
+ font-size: 9pt;
195
+ font-weight: 600;
196
+ color: var(--resume-color-accent);
197
+ }
198
+
199
+ .date-range {
200
+ font-size: var(--resume-font-size-meta);
201
+ color: var(--resume-color-muted);
202
+ font-variant-numeric: tabular-nums;
203
+ }
204
+
205
+ .bullet-list {
206
+ margin-left: 14pt;
207
+ font-size: var(--resume-font-size-body);
208
+ color: var(--resume-color-secondary);
209
+ line-height: var(--resume-line-height-body);
210
+ }
211
+
212
+ .bullet-list li {
213
+ margin-bottom: var(--resume-space-bullet);
214
+ }
215
+
216
+ .bullet-list strong {
217
+ color: var(--resume-color-primary);
218
+ font-weight: 600;
219
+ }
220
+
221
+ @media print {
222
+ body { background: transparent; padding: 0; }
223
+ .resume-page {
224
+ box-shadow: none;
225
+ margin: 0;
226
+ width: var(--resume-page-width);
227
+ min-height: var(--resume-page-min-height);
228
+ page-break-after: always;
229
+ page-break-inside: avoid;
230
+ }
231
+ @page {
232
+ size: A4 portrait;
233
+ margin: 0;
234
+ }
235
+ }