Skip to content

Commit 8972459

Browse files
committed
cover letter added
1 parent 2717351 commit 8972459

File tree

11 files changed

+140
-68
lines changed

11 files changed

+140
-68
lines changed

docs/cv-maker/assets/index-Hi6j_poh.js renamed to docs/cv-maker/assets/index-C8cJAPg2.js

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/cv-maker/assets/index-CpA7MgDL.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/cv-maker/assets/index-yRNwTtQE.css

Lines changed: 0 additions & 1 deletion
This file was deleted.

docs/cv-maker/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<script defer src="https://cdn.jsdelivr.net/npm/@monaco-editor/[email protected]/lib/umd/monaco-loader.min.js"></script>
1313
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>✍️</text></svg>">
1414
<title>CV Maker</title>
15-
<script type="module" crossorigin src="./assets/index-Hi6j_poh.js"></script>
16-
<link rel="stylesheet" crossorigin href="./assets/index-yRNwTtQE.css">
15+
<script type="module" crossorigin src="./assets/index-C8cJAPg2.js"></script>
16+
<link rel="stylesheet" crossorigin href="./assets/index-CpA7MgDL.css">
1717
</head>
1818

1919
<body x-data style="display: flex; flex-direction: column;">

docs/cv-maker/john-doe.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
"expertise": [
99
"Frontend", "UI/UX"
1010
],
11+
"coverLetter": {
12+
"position": "React developer",
13+
"content": [
14+
"I'm really good at fronted and I will be <b>great asset</b> at your company",
15+
"Your company needs a developer who can work remotely. I've experience working experience in distibuted teams"
16+
]
17+
},
1118
"expertSummary": [
1219
"Skillful frontend developer with UX/UI practical experience"
1320
],

docs/cv-maker/resume-schema.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,26 @@
5151
"name": {
5252
"$ref": "#/$defs/NonEmptyString"
5353
},
54+
"coverLetter": {
55+
"type": "object",
56+
"required": [
57+
"position",
58+
"content"
59+
],
60+
"properties": {
61+
"position": {
62+
"$ref": "#/$defs/NonEmptyString"
63+
},
64+
"content": {
65+
"type": "array",
66+
"minItems": 1,
67+
"items": {
68+
"$ref": "#/$defs/NonEmptyString"
69+
}
70+
}
71+
},
72+
"additionalProperties": false
73+
},
5474
"expertise": {
5575
"type": "array",
5676
"minItems": 1,

src/cv-maker/core/schema.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ export class EmploymentRecord
6363
export class Me
6464
extends S.Class<Me>("Me")({
6565
name: S.NonEmptyString,
66+
coverLetter:
67+
S.Struct({
68+
position: S.NonEmptyString,
69+
content: S.NonEmptyString.pipe(S.NonEmptyArray)
70+
}).pipe(S.optional),
6671
expertise: S.NonEmptyString.pipe(S.NonEmptyArray),
6772
location: S.NonEmptyString.pipe(S.optional),
6873
phone: S.NonEmptyString.pipe(S.optional),
@@ -86,5 +91,5 @@ export class ResumeObject
8691
$schema: S.NonEmptyString.pipe(S.optional),
8792
me: Me,
8893
technologies: ProjectTechnology.pipe(S.NonEmptyArray),
89-
employmentHistory: EmploymentRecord.pipe(S.NonEmptyArray)
94+
employmentHistory: EmploymentRecord.pipe(S.NonEmptyArray),
9095
}) { };

src/cv-maker/core/template.tsx

Lines changed: 68 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,63 @@ import { EmploymentRecord, ProjectDetails, ProjectTechnology, ResumeObject } fro
22
import { DateTime, pipe, Array } from "effect";
33

44
export function Resume(resume: ResumeObject) {
5+
const coverLetter = resume.me.coverLetter;
56
return (
67
<div id="resume">
78

8-
{ResumeHead(resume)}
9+
{ResumeHead(resume)}
910

10-
<div className="section-header">
11-
<span id="label">Summary</span>
12-
</div>
13-
14-
<div id="summary">
15-
{resume.me.expertSummary.map(s =>
16-
<p dangerouslySetInnerHTML={{ __html: s }}></p>
17-
)}
18-
</div>
19-
20-
<div className="section-header">
21-
<span id="label">Skills</span>
22-
</div>
23-
24-
<div id="skills">
25-
26-
{Object.entries(getSkills(resume)).map(([ category, group ]) =>
27-
<div className="skill-group">
28-
<span>{category}</span>
29-
<div className="group-list">
30-
{group.map(t =>
31-
<span className="stack-item">{t.technology.name}</span>
32-
)}
11+
{coverLetter ? (
12+
<div>
13+
<div className="section-header">
14+
<span id="label">Why I'm the Right Choice for "{coverLetter.position}"</span>
15+
</div>
16+
<div id="summary">
17+
{coverLetter.content.map(line => <p dangerouslySetInnerHTML={{ __html: line }}></p>)}
18+
</div>
19+
3320
</div>
21+
): null}
22+
23+
<div className="section-header">
24+
<span id="label">Summary</span>
25+
</div>
26+
27+
<div id="summary">
28+
{resume.me.expertSummary.map(s =>
29+
<p dangerouslySetInnerHTML={{ __html: s }}></p>
30+
)}
31+
</div>
32+
33+
<div className="section-header">
34+
<span id="label">Skills</span>
35+
</div>
36+
37+
<div id="skills">
38+
39+
{Object.entries(getSkills(resume)).map(([category, group]) =>
40+
<div className="skill-group">
41+
<span>{category}</span>
42+
<div className="group-list">
43+
{group.map(t =>
44+
<span className="stack-item">{t.technology.name}</span>
45+
)}
46+
</div>
47+
</div>
48+
)}
49+
50+
</div>
51+
52+
<div className="section-header">
53+
<span id="label">Employment</span>
54+
</div>
55+
56+
<div id="employment">
57+
{EmploymentHistory(resume)}
3458
</div>
35-
)}
36-
37-
</div>
3859

39-
<div className="section-header">
40-
<span id="label">Employment</span>
41-
</div>
42-
43-
<div id="employment">
44-
{EmploymentHistory(resume)}
45-
</div>
46-
4760
</div>
48-
61+
4962
)
5063
}
5164

@@ -120,27 +133,27 @@ function ResumeHead(resume: ResumeObject) {
120133
function CompanyProject(project: ProjectDetails) {
121134
return (
122135
<div className="project">
123-
<div style={{ display: "flex" }}>
124-
<div style={{ marginBottom: "3px" }}>
125-
<b>Project: </b>
126-
<span>{project.title}</span>
127-
</div>
128-
<div style={{ marginLeft: "auto" }}>
129-
<b>Roles: </b>
130-
<span>{project.roles.join('/')}</span>
136+
<div style={{ display: "flex" }}>
137+
<div style={{ marginBottom: "3px" }}>
138+
<b>Project: </b>
139+
<span>{project.title}</span>
140+
</div>
141+
<div style={{ marginLeft: "auto" }}>
142+
<b>Roles: </b>
143+
<span>{project.roles.join('/')}</span>
144+
</div>
131145
</div>
146+
<span
147+
style={{ display: "block" }}
148+
><b>Stack: </b>{ProjectStack(project)}</span>
149+
<ul>
150+
{project.achivements.map(achivement =>
151+
<div>
152+
<li>{achivement.human ?? achivement.technical}</li>
153+
</div>
154+
)}
155+
</ul>
132156
</div>
133-
<span
134-
style={{display: "block"}}
135-
><b>Stack: </b>{ProjectStack(project)}</span>
136-
<ul>
137-
{project.achivements.map(achivement =>
138-
<div>
139-
<li>{achivement.human ?? achivement.technical}</li>
140-
</div>
141-
)}
142-
</ul>
143-
</div>
144157
)
145158
}
146159

src/cv-maker/static/john-doe.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
"expertise": [
99
"Frontend", "UI/UX"
1010
],
11+
"coverLetter": {
12+
"position": "React developer",
13+
"content": [
14+
"I'm really good at fronted and I will be <b>great asset</b> at your company",
15+
"Your company needs a developer who can work remotely. I've experience working experience in distibuted teams"
16+
]
17+
},
1118
"expertSummary": [
1219
"Skillful frontend developer with UX/UI practical experience"
1320
],

src/cv-maker/static/resume-schema.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,26 @@
5151
"name": {
5252
"$ref": "#/$defs/NonEmptyString"
5353
},
54+
"coverLetter": {
55+
"type": "object",
56+
"required": [
57+
"position",
58+
"content"
59+
],
60+
"properties": {
61+
"position": {
62+
"$ref": "#/$defs/NonEmptyString"
63+
},
64+
"content": {
65+
"type": "array",
66+
"minItems": 1,
67+
"items": {
68+
"$ref": "#/$defs/NonEmptyString"
69+
}
70+
}
71+
},
72+
"additionalProperties": false
73+
},
5474
"expertise": {
5575
"type": "array",
5676
"minItems": 1,

0 commit comments

Comments
 (0)