@@ -218,7 +222,7 @@ export default Vue.component(name, getVueOptions(name));
width: @picture-size;
border-radius: 50%;
border: 5px solid @accent-color;
- content: url('../../resume/id.jpg');
+ content: url('~resume-profile-photo');
z-index: 2;
}
diff --git a/src/resumes/cool.vue b/src/resumes/cool.vue
index c9d7e93..6f24a51 100644
--- a/src/resumes/cool.vue
+++ b/src/resumes/cool.vue
@@ -3,7 +3,10 @@
{{ person.name.first }} {{ person.name.middle }} {{ person.name.last }}
{{ person.position }}
-
{{ lang.born }} {{person.birth.year}} {{ lang.bornIn }} {{person.birth.location}}
+
+ {{ lang.born }} {{ person.birth.year }} {{ lang.bornIn }} {{ person.birth.location }}
+ {{ lang.basedIn }} {{ person.birth.location }}
+
@@ -230,7 +233,7 @@ export default Vue.component(name, getVueOptions(name));
width: @picture-size;
border-radius: 50%;
border: 5px solid @accent-color;
- content: url('../../resume/id.jpg');
+ content: url('~resume-profile-photo');
z-index: 2;
}
diff --git a/src/resumes/green.vue b/src/resumes/green.vue
index d94771c..dc5f147 100644
--- a/src/resumes/green.vue
+++ b/src/resumes/green.vue
@@ -135,6 +135,16 @@
{{education.degree}} | {{education.timeperiod}}
+
{{ lang.skills }}
@@ -183,6 +193,12 @@ export default Vue.component(name, Object.assign({}, baseOptions, {
},
stripLeadingBullet (line) {
return String(line).replace(/^[•*-]\s*/, '').trim();
+ },
+ certificationLabel (c) {
+ if (c === undefined || c === null) return '';
+ if (typeof c === 'string') return String(c).trim();
+ const n = c.name;
+ return (n !== undefined && n !== null && String(n).trim()) ? String(n).trim() : '';
}
})
}));
@@ -273,7 +289,7 @@ export default Vue.component(name, Object.assign({}, baseOptions, {
#headshot {
width: 100%;
height: 100%;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
}
@@ -320,7 +336,7 @@ export default Vue.component(name, Object.assign({}, baseOptions, {
padding: 6px @pad-x 6px;
background: white;
- #experience-title, #education-title, #skills-title, #projects-title {
+ #experience-title, #education-title, #certifications-title, #skills-title, #projects-title {
font-size:22px;
text-transform:uppercase;
}
@@ -640,6 +656,34 @@ export default Vue.component(name, Object.assign({}, baseOptions, {
}
}
+ #certifications-container {
+ margin-top: 5px;
+ padding-left: 12px;
+ padding-right: 12px;
+ box-sizing: border-box;
+ #certifications-title {
+ margin-bottom: 4px;
+ }
+ }
+
+ .certifications-list {
+ margin: 0;
+ padding-left: 1.15em;
+ list-style-position: outside;
+ list-style-type: disc;
+ li {
+ font-size: 11px;
+ line-height: 1.3;
+ margin: 0 0 1px 0;
+ padding-left: 2px;
+ overflow-wrap: anywhere;
+ word-break: break-word;
+ }
+ li::marker {
+ color: @text-green;
+ }
+ }
+
}
}
diff --git a/src/resumes/left-right-projects.vue b/src/resumes/left-right-projects.vue
index 75ff345..fe8871e 100755
--- a/src/resumes/left-right-projects.vue
+++ b/src/resumes/left-right-projects.vue
@@ -158,7 +158,7 @@ export default Vue.component(name, getVueOptions(name));
width: 100%;
height: 100%;
border-radius: 50%;
- background-image: url("../../resume/id.jpg");
+ background-image: url("~resume-profile-photo");
background-repeat: none;
background-position: center;
background-size: cover;
diff --git a/src/resumes/left-right-rtl.vue b/src/resumes/left-right-rtl.vue
index f38e4a3..d8e9df8 100755
--- a/src/resumes/left-right-rtl.vue
+++ b/src/resumes/left-right-rtl.vue
@@ -144,7 +144,7 @@ export default Vue.component(name, getVueOptions(name));
width:100%;
height:100%;
border-radius:50%;
- background-image:url('../../resume/id.jpg');
+ background-image:url('~resume-profile-photo');
background-repeat:none;
background-position:center;
background-size:cover;
diff --git a/src/resumes/left-right.vue b/src/resumes/left-right.vue
index ab748ff..76bf356 100755
--- a/src/resumes/left-right.vue
+++ b/src/resumes/left-right.vue
@@ -144,7 +144,7 @@ export default Vue.component(name, getVueOptions(name));
width:100%;
height:100%;
border-radius:50%;
- background-image:url('../../resume/id.jpg');
+ background-image:url('~resume-profile-photo');
background-repeat:none;
background-position:center;
background-size:cover;
diff --git a/src/resumes/material-dark-projects.vue b/src/resumes/material-dark-projects.vue
index 548d839..0f07483 100755
--- a/src/resumes/material-dark-projects.vue
+++ b/src/resumes/material-dark-projects.vue
@@ -7,13 +7,16 @@
{{ lang.contact }}
-
+
account_circle
- - {{lang.born}} {{person.birth.year}} {{lang.bornIn}} {{person.birth.location}}
+ -
+ {{ lang.born }} {{ person.birth.year }} {{ lang.bornIn }} {{ person.birth.location }}
+ {{ lang.basedIn }} {{ person.birth.location }}
+
@@ -537,7 +540,7 @@ h4 {
}
}
#myselfpic {
- background-image: url('../../resume/id.jpg');
+ background-image: url('~resume-profile-photo');
color: black;
}
#githubIcon {
diff --git a/src/resumes/material-dark.vue b/src/resumes/material-dark.vue
index a141f4c..260875d 100755
--- a/src/resumes/material-dark.vue
+++ b/src/resumes/material-dark.vue
@@ -7,13 +7,16 @@
{{ lang.contact }}
-
+
account_circle
- - {{ lang.born }} {{person.birth.year}} {{ lang.bornIn }} {{person.birth.location}}
+ -
+ {{ lang.born }} {{ person.birth.year }} {{ lang.bornIn }} {{ person.birth.location }}
+ {{ lang.basedIn }} {{ person.birth.location }}
+
@@ -488,7 +491,7 @@ h4 {
}
}
#myselfpic {
- background-image:url('../../resume/id.jpg');
+ background-image:url('~resume-profile-photo');
color:black;
}
#githubIcon {
diff --git a/src/resumes/oblique-projects.vue b/src/resumes/oblique-projects.vue
index c0c43c2..25de51a 100755
--- a/src/resumes/oblique-projects.vue
+++ b/src/resumes/oblique-projects.vue
@@ -137,7 +137,7 @@ export default Vue.component(name, getVueOptions(name));
position: absolute;
top: 0;
right: 0;
- background: url('../../resume/id.jpg');
+ background: url('~resume-profile-photo');
background-position: center;
background-size: cover;
}
diff --git a/src/resumes/oblique-rtl.vue b/src/resumes/oblique-rtl.vue
index a41624f..cc1d9b7 100644
--- a/src/resumes/oblique-rtl.vue
+++ b/src/resumes/oblique-rtl.vue
@@ -121,7 +121,7 @@ export default Vue.component(name, getVueOptions(name));
position: absolute;
top: 0;
right: 0;
- background: url("../../resume/id.jpg");
+ background: url("~resume-profile-photo");
background-position: center;
background-size: cover;
}
diff --git a/src/resumes/oblique.vue b/src/resumes/oblique.vue
index b3108a1..62a22b9 100755
--- a/src/resumes/oblique.vue
+++ b/src/resumes/oblique.vue
@@ -122,7 +122,7 @@ export default Vue.component(name, getVueOptions(name));
position:absolute;
top:0;
right:0;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
}
diff --git a/src/resumes/options.js b/src/resumes/options.js
index 66616a3..d329dcf 100755
--- a/src/resumes/options.js
+++ b/src/resumes/options.js
@@ -1,7 +1,7 @@
import yaml from 'js-yaml';
import {
PERSON
-} from '../../resume/data.yml';
+} from 'resume-person-data';
import {
terms
} from '../terms';
diff --git a/src/resumes/purple.vue b/src/resumes/purple.vue
index d28cbad..4a836c6 100755
--- a/src/resumes/purple.vue
+++ b/src/resumes/purple.vue
@@ -76,6 +76,16 @@
{{education.degree}} | {{education.timeperiod}}
+
+
{{ lang.certifications }}
+
+
+ - {{ certificationLabel(c) }}
+
+
{{ lang.skills }}
@@ -105,7 +115,17 @@ import Vue from 'vue';
import { getVueOptions } from './options';
const name = 'purple';
-export default Vue.component(name, getVueOptions(name));
+const baseOptions = getVueOptions(name);
+export default Vue.component(name, Object.assign({}, baseOptions, {
+ methods: Object.assign({}, baseOptions.methods || {}, {
+ certificationLabel (c) {
+ if (c === undefined || c === null) return '';
+ if (typeof c === 'string') return String(c).trim();
+ const n = c.name;
+ return (n !== undefined && n !== null && String(n).trim()) ? String(n).trim() : '';
+ }
+ })
+}));
@@ -185,7 +205,7 @@ export default Vue.component(name, getVueOptions(name));
#headshot {
width: 100%;
height: 100%;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
}
@@ -195,7 +215,7 @@ export default Vue.component(name, getVueOptions(name));
#resume-body {
padding: 40px 100px;
- #experience-title, #education-title, #skills-title {
+ #experience-title, #education-title, #certifications-title, #skills-title {
font-size:26px;
text-transform:uppercase;
}
@@ -351,9 +371,26 @@ export default Vue.component(name, getVueOptions(name));
}
}
- #education-container, #skills-container {
+ #education-container, #certifications-container, #skills-container {
margin-top: 20px;
}
+
+ .certifications-list {
+ margin: 0 0 0 50px;
+ padding-left: 1.15em;
+ list-style-position: outside;
+ list-style-type: disc;
+ li {
+ font-size: 14px;
+ line-height: 1.35;
+ margin: 0 0 4px 0;
+ overflow-wrap: anywhere;
+ word-break: break-word;
+ }
+ li::marker {
+ color: @text-purple;
+ }
+ }
}
#resume-footer {
padding: 20px 100px;
diff --git a/src/resumes/resumes.js b/src/resumes/resumes.js
index 75285fd..42ae51d 100755
--- a/src/resumes/resumes.js
+++ b/src/resumes/resumes.js
@@ -12,6 +12,7 @@ import './cool.vue';
import './cool-rtl.vue';
import './cool-rtl2.vue';
import './green.vue';
+import './ai-bw.vue';
import './left-right-projects.vue';
import './material-dark-projects.vue';
import './oblique-projects.vue';
diff --git a/src/resumes/side-bar-projects.vue b/src/resumes/side-bar-projects.vue
index 6701e6f..e528dc7 100755
--- a/src/resumes/side-bar-projects.vue
+++ b/src/resumes/side-bar-projects.vue
@@ -151,7 +151,7 @@ export default Vue.component(name, getVueOptions(name));
overflow:hidden;
.img {
flex:none;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
height:250px;
diff --git a/src/resumes/side-bar-rtl.vue b/src/resumes/side-bar-rtl.vue
index 59f03eb..285fd92 100755
--- a/src/resumes/side-bar-rtl.vue
+++ b/src/resumes/side-bar-rtl.vue
@@ -143,7 +143,7 @@ export default Vue.component(name, getVueOptions(name));
overflow:hidden;
.img {
flex:none;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
height:250px;
diff --git a/src/resumes/side-bar.vue b/src/resumes/side-bar.vue
index 14bd6d5..7647ca7 100755
--- a/src/resumes/side-bar.vue
+++ b/src/resumes/side-bar.vue
@@ -141,7 +141,7 @@ export default Vue.component(name, getVueOptions(name));
overflow:hidden;
.img {
flex:none;
- background:url('../../resume/id.jpg');
+ background:url('~resume-profile-photo');
background-position:center;
background-size:cover;
height:250px;
diff --git a/test/scripts/export.js b/test/scripts/export.js
index 2e951a1..c276fe0 100755
--- a/test/scripts/export.js
+++ b/test/scripts/export.js
@@ -5,12 +5,14 @@ const fs = require('fs');
const describe = mocha.describe;
const it = mocha.it;
const allResumes = require('./allResumes');
+const { getResumeSlug } = require('../../scripts/resumeSlug');
describe('npm run export', () => {
it('should have generated the pdf files', () => {
+ const slug = getResumeSlug();
const resumes = allResumes();
resumes.forEach(resume => {
- const p = path.join(__dirname, '../../pdf/' + resume.path + '.pdf');
+ const p = path.join(__dirname, '../../pdf/' + resume.path + '-' + slug + '.pdf');
assert.ok(fs.existsSync(p));
});
});
diff --git a/test/scripts/preview.js b/test/scripts/preview.js
index 9ace94c..5e39048 100755
--- a/test/scripts/preview.js
+++ b/test/scripts/preview.js
@@ -5,12 +5,14 @@ const fs = require('fs');
const describe = mocha.describe;
const it = mocha.it;
const allResumes = require('./allResumes');
+const { getResumeSlug } = require('../../scripts/resumeSlug');
describe('npm run preview', () => {
it('should have generated the png files', () => {
+ const slug = getResumeSlug();
const resumes = allResumes();
resumes.forEach(resume => {
- const p = path.join(__dirname, '../../src/assets/preview/resume-' + resume.path + '.png');
+ const p = path.join(__dirname, '../../src/assets/preview/resume-' + resume.path + '-' + slug + '.png');
assert.ok(fs.existsSync(p));
});
});