jekyll-theme-resume 1.3.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.
- checksums.yaml +7 -0
- data/403.html +6 -0
- data/404.html +6 -0
- data/500.html +6 -0
- data/CHANGELOG.md +498 -0
- data/CODE_OF_CONDUCT.md +92 -0
- data/LICENSE.txt +22 -0
- data/README.md +184 -0
- data/SECURITY.md +30 -0
- data/_config.sample.yml +329 -0
- data/_data/locales/ar.yml +85 -0
- data/_data/locales/de.yml +86 -0
- data/_data/locales/en.yml +84 -0
- data/_data/locales/es.yml +86 -0
- data/_data/locales/fr.yml +86 -0
- data/_data/locales/ur.yml +86 -0
- data/_data/social_networks.yml +83 -0
- data/_includes/analytics-body.html +12 -0
- data/_includes/analytics-head.html +36 -0
- data/_includes/avatar.html +84 -0
- data/_includes/dark-mode-toggle.html +202 -0
- data/_includes/data-loader.html +42 -0
- data/_includes/date-formatter.html +63 -0
- data/_includes/grouped-item-list.html +53 -0
- data/_includes/hreflang.html +58 -0
- data/_includes/language-switcher.html +72 -0
- data/_includes/print-social-links.html +23 -0
- data/_includes/resume-section.html +547 -0
- data/_includes/safe-url.html +21 -0
- data/_includes/shared-head.html +51 -0
- data/_includes/social-links.html +54 -0
- data/_includes/vendors/svg-icons/ATTRIBUTION.md +34 -0
- data/_includes/vendors/svg-icons/dev.svg +3 -0
- data/_includes/vendors/svg-icons/dribbble-symbol.svg +3 -0
- data/_includes/vendors/svg-icons/envelope.svg +4 -0
- data/_includes/vendors/svg-icons/facebook.svg +3 -0
- data/_includes/vendors/svg-icons/flickr.svg +4 -0
- data/_includes/vendors/svg-icons/github.svg +3 -0
- data/_includes/vendors/svg-icons/globe-1.svg +3 -0
- data/_includes/vendors/svg-icons/instagram.svg +4 -0
- data/_includes/vendors/svg-icons/linkedin.svg +3 -0
- data/_includes/vendors/svg-icons/medium.svg +3 -0
- data/_includes/vendors/svg-icons/phone.svg +13 -0
- data/_includes/vendors/svg-icons/pinterest.svg +3 -0
- data/_includes/vendors/svg-icons/postcard.svg +14 -0
- data/_includes/vendors/svg-icons/telegram.svg +3 -0
- data/_includes/vendors/svg-icons/whatsapp.svg +3 -0
- data/_includes/vendors/svg-icons/x.svg +3 -0
- data/_includes/vendors/svg-icons/youtube.svg +3 -0
- data/_layouts/default.html +65 -0
- data/_layouts/error.html +138 -0
- data/_layouts/profile.html +123 -0
- data/_layouts/resume.html +238 -0
- data/_plugins/error_pages_generator.rb +71 -0
- data/_plugins/json_resume_generator.rb +79 -0
- data/_plugins/resume_pages_generator.rb +71 -0
- data/_plugins/resume_validator.rb +40 -0
- data/_sass/_all-pages.scss +335 -0
- data/_sass/_base.scss +130 -0
- data/_sass/_dark-mode.scss +387 -0
- data/_sass/_layout.scss +116 -0
- data/_sass/_mixins.scss +136 -0
- data/_sass/_normalize.scss +379 -0
- data/_sass/_profile-page.scss +60 -0
- data/_sass/_resume-ltr.scss +436 -0
- data/_sass/_resume-rtl.scss +91 -0
- data/_sass/_variables.scss +45 -0
- data/assets/css/cv-ltr.scss +31 -0
- data/assets/css/cv-rtl.scss +36 -0
- data/assets/css/main.scss +8 -0
- data/assets/css/profile.scss +9 -0
- data/assets/favicon/resume/about.txt +6 -0
- data/assets/favicon/resume/android-chrome-192x192.png +0 -0
- data/assets/favicon/resume/android-chrome-512x512.png +0 -0
- data/assets/favicon/resume/apple-touch-icon.png +0 -0
- data/assets/favicon/resume/favicon-16x16.png +0 -0
- data/assets/favicon/resume/favicon-32x32.png +0 -0
- data/assets/favicon/resume/favicon.ico +0 -0
- data/assets/favicon/resume/site.webmanifest +1 -0
- data/bin/validate-resume +89 -0
- data/bin/verify +27 -0
- data/docs/README.md +89 -0
- data/docs/explanation/accessibility-decisions.md +27 -0
- data/docs/explanation/architecture.md +44 -0
- data/docs/explanation/dark-mode-approach.md +25 -0
- data/docs/explanation/data-driven-model.md +25 -0
- data/docs/explanation/multilingual-and-rtl-design.md +40 -0
- data/docs/how-to/add-a-language.md +57 -0
- data/docs/how-to/add-a-section.md +35 -0
- data/docs/how-to/add-a-social-platform.md +32 -0
- data/docs/how-to/add-a-test.md +34 -0
- data/docs/how-to/create-a-custom-layout.md +64 -0
- data/docs/how-to/enable-dark-mode.md +43 -0
- data/docs/how-to/link-translations-with-hreflang.md +25 -0
- data/docs/how-to/migrate-v0.9-to-v1.0.md +46 -0
- data/docs/how-to/override-locale-strings.md +51 -0
- data/docs/how-to/override-sass-partials.md +26 -0
- data/docs/how-to/proof-built-html.md +22 -0
- data/docs/how-to/publish-json-resume.md +38 -0
- data/docs/how-to/show-language-proficiency-in-header.md +13 -0
- data/docs/how-to/switch-resume-versions.md +42 -0
- data/docs/how-to/troubleshoot-builds.md +39 -0
- data/docs/how-to/validate-in-ci.md +38 -0
- data/docs/how-to/verify-accessibility.md +28 -0
- data/docs/reference/accessibility-coverage.md +39 -0
- data/docs/reference/config.md +378 -0
- data/docs/reference/data-schemas.md +529 -0
- data/docs/reference/glossary.md +39 -0
- data/docs/reference/includes.md +197 -0
- data/docs/reference/json-resume-fields.md +148 -0
- data/docs/reference/layouts.md +144 -0
- data/docs/reference/locale-keys.md +76 -0
- data/docs/reference/repository-map.md +83 -0
- data/docs/reference/sass-tokens.md +279 -0
- data/docs/reference/testing-suites.md +62 -0
- data/docs/reference/validator-cli.md +203 -0
- data/docs/tutorials/getting-started.md +173 -0
- data/lib/jekyll-theme-resume/json_resume_exporter.rb +334 -0
- data/lib/jekyll-theme-resume/resume_validator.rb +853 -0
- data/lib/jekyll-theme-resume/schemas/LICENSE.md +21 -0
- data/lib/jekyll-theme-resume/schemas/json_resume_v1.0.0.json +500 -0
- data/lib/jekyll-theme-resume.rb +21 -0
- metadata +371 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
// Resume styles
|
|
2
|
+
// ---------------------------------------/
|
|
3
|
+
// jekyll-theme-resume
|
|
4
|
+
// Core stylesheet shared by every locale (_layouts/resume.html, and
|
|
5
|
+
// portfolio landing pages). Provides the default LTR positioning; _resume-rtl.scss layers
|
|
6
|
+
// mirrored positioning on top for right-to-left locales. Manages header typography, section
|
|
7
|
+
// dividers, unboxed card items, responsive tables, social icons, and print media optimizations.
|
|
8
|
+
// Text typography (font-family, line-height) reads from the --font-locale / --line-height-locale
|
|
9
|
+
// CSS custom properties, set per language from _data/locales/<lang>.yml (see IMPLEMENTATION_PLAN.md
|
|
10
|
+
// Section 4.1); the values below are the fallbacks used when a locale does not set them.
|
|
11
|
+
// ---------------------------------------/
|
|
12
|
+
|
|
13
|
+
// util
|
|
14
|
+
// Modular Dart Sass imports: encapsulate mixins and design variables without global pollution.
|
|
15
|
+
@use "mixins";
|
|
16
|
+
@use "variables";
|
|
17
|
+
|
|
18
|
+
// Locale-driven body typography: font-family and line-height are supplied per-language via
|
|
19
|
+
// --font-locale / --line-height-locale (falls back to the current English/Lora values when unset).
|
|
20
|
+
body {
|
|
21
|
+
font-family: var(--font-locale, "Lora", "Minion Pro", Palatino, Georgia, serif);
|
|
22
|
+
line-height: var(--line-height-locale, 1.5);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ==========================================================================
|
|
26
|
+
// Section Header Component
|
|
27
|
+
// ==========================================================================
|
|
28
|
+
// Visually anchors each major resume section (Experience, Education, Skills, etc.)
|
|
29
|
+
// using double-line borders (4px top, 2px bottom) to establish distinct vertical hierarchy.
|
|
30
|
+
.section-header {
|
|
31
|
+
@include mixins.section_border;
|
|
32
|
+
margin-bottom: 1.5rem;
|
|
33
|
+
|
|
34
|
+
// Primary section title: heavy sans-serif weight (900) with slightly tightened
|
|
35
|
+
// letter-spacing (-.05rem) to deliver a modern, authoritative editorial aesthetic.
|
|
36
|
+
h2 {
|
|
37
|
+
font-family: var(--font-locale, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif);
|
|
38
|
+
font-weight: 900;
|
|
39
|
+
font-size: 1.75rem;
|
|
40
|
+
letter-spacing: -.05rem;
|
|
41
|
+
margin: 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// page header styles
|
|
46
|
+
// ==========================================================================
|
|
47
|
+
// Page Header: Avatar, Candidate Headline, Contact Information, and Title Bar
|
|
48
|
+
// ==========================================================================
|
|
49
|
+
.page-header {
|
|
50
|
+
padding: 1.5rem 0;
|
|
51
|
+
|
|
52
|
+
// Profile picture: centered circular badge with fixed 95px dimensions.
|
|
53
|
+
// Uses overflow hidden and high border-radius to ensure non-square images crop cleanly.
|
|
54
|
+
.avatar {
|
|
55
|
+
width: 95px;
|
|
56
|
+
max-width: 100%;
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
border-radius: 100px;
|
|
59
|
+
margin: 0 auto;
|
|
60
|
+
display: block;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Candidate Name: utilizes CSS clamp() for fluid, viewport-responsive typography.
|
|
64
|
+
// Scales dynamically between 2rem (mobile minimum) and 3rem (desktop maximum) based on 8vw,
|
|
65
|
+
// preventing awkward word wrapping on smaller mobile screens without discrete breakpoint jumps.
|
|
66
|
+
.header-name {
|
|
67
|
+
font-family: var(--font-locale, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif);
|
|
68
|
+
font-size: clamp(2rem, 8vw, 3rem);
|
|
69
|
+
font-weight: 900;
|
|
70
|
+
text-align: center;
|
|
71
|
+
letter-spacing: -.15rem;
|
|
72
|
+
line-height: var(--line-height-locale, 1);
|
|
73
|
+
margin: 1rem 0 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Sub-header contact info list (email, phone, location): centered typography.
|
|
77
|
+
.header-contact-info {
|
|
78
|
+
@include mixins.sans;
|
|
79
|
+
text-align: center;
|
|
80
|
+
|
|
81
|
+
p {
|
|
82
|
+
margin: 0.35rem 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.header-languages {
|
|
86
|
+
margin-top: 0.25rem;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Contact links inherit parent text color to avoid default browser hyperlink blue.
|
|
91
|
+
.header-contact-info p a {
|
|
92
|
+
color: inherit;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Title bar: bordered horizontal ribbon separating candidate headline from resume body.
|
|
96
|
+
// Contains professional job title and social media links in a responsive floated layout.
|
|
97
|
+
.title-bar {
|
|
98
|
+
@include mixins.section_border;
|
|
99
|
+
margin-top: 2rem;
|
|
100
|
+
padding: .4rem 0;
|
|
101
|
+
@include mixins.clearfix;
|
|
102
|
+
|
|
103
|
+
// Professional subtitle: centered on mobile viewports; floats left on desktop screens.
|
|
104
|
+
.header-title {
|
|
105
|
+
font-family: var(--font-locale, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif);
|
|
106
|
+
font-weight: 300;
|
|
107
|
+
font-size: 1.75rem;
|
|
108
|
+
line-height: var(--line-height-locale, 2rem);
|
|
109
|
+
letter-spacing: -.05rem;
|
|
110
|
+
text-align: center;
|
|
111
|
+
margin: 0 0 .5rem;
|
|
112
|
+
|
|
113
|
+
@include mixins.media_larger_than_mobile {
|
|
114
|
+
float: left;
|
|
115
|
+
margin: 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Brief introductory summary: standard 1rem font on desktop viewports.
|
|
121
|
+
.executive-summary {
|
|
122
|
+
@include mixins.media_larger_than_mobile {
|
|
123
|
+
font-size: 1rem;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ==========================================================================
|
|
129
|
+
// Social Media Icon Links
|
|
130
|
+
// ==========================================================================
|
|
131
|
+
// Interactive SVG icon bar. On mobile, rendered centered with a subtle top border;
|
|
132
|
+
// on viewports larger than 600px, floats to the right side of the title bar.
|
|
133
|
+
.social-links {
|
|
134
|
+
margin: 0;
|
|
135
|
+
padding: 0;
|
|
136
|
+
list-style: none;
|
|
137
|
+
position: relative;
|
|
138
|
+
top: 4px; // Fine-tunes optical vertical alignment against the 1.75rem header title text baseline
|
|
139
|
+
text-align: center;
|
|
140
|
+
border-top: 2px solid var(--border-color, #c7c7c7);
|
|
141
|
+
padding-top: .4rem;
|
|
142
|
+
|
|
143
|
+
@include mixins.media_larger_than_mobile {
|
|
144
|
+
float: right;
|
|
145
|
+
border-top: none;
|
|
146
|
+
padding-top: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Individual icon list item: horizontal inline-block layout with 5px left margin in LTR.
|
|
150
|
+
.icon-link-item {
|
|
151
|
+
display: inline-block;
|
|
152
|
+
margin-left: 5px;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Base layout/hover properties for .icon-link, .social-links a, .social-links li a
|
|
156
|
+
// are declared once, globally, in _all-pages.scss.
|
|
157
|
+
|
|
158
|
+
// Vector fill cascading: ensures multi-path SVG icons inherit parent fill colors.
|
|
159
|
+
.icon-link svg path,
|
|
160
|
+
.social-links svg path {
|
|
161
|
+
fill: inherit;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Smooth 0.2s color transition on hover/focus using CSS custom property tokens.
|
|
165
|
+
.icon-link {
|
|
166
|
+
&:hover .icon path,
|
|
167
|
+
&:focus .icon path {
|
|
168
|
+
fill: var(--icon-fill, var(--icon-fill-dark, #333));
|
|
169
|
+
transition: all .2s ease;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.icon {
|
|
174
|
+
height: 28px;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ==========================================================================
|
|
179
|
+
// Contact & Status Call-to-Action (CTA) Buttons
|
|
180
|
+
// ==========================================================================
|
|
181
|
+
// Interactive pill button (.contact-button) for job inquiries and resume actions.
|
|
182
|
+
// Shares its base skin with .cv-button (profile page) via mixins.cv-button-base.
|
|
183
|
+
.contact-button {
|
|
184
|
+
@include mixins.cv-button-base;
|
|
185
|
+
max-width: 100%;
|
|
186
|
+
box-sizing: border-box;
|
|
187
|
+
@include mixins.sans_light;
|
|
188
|
+
|
|
189
|
+
// Modifier for extended status messages (e.g. "Currently not open to new roles").
|
|
190
|
+
// Expands width to 400px to prevent multi-line text wrapping.
|
|
191
|
+
&.not-looking {
|
|
192
|
+
width: 400px;
|
|
193
|
+
max-width: 100%;
|
|
194
|
+
box-sizing: border-box;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// resume content styles
|
|
199
|
+
// ==========================================================================
|
|
200
|
+
// Resume Content Sections & Unboxed Card Layouts
|
|
201
|
+
// ==========================================================================
|
|
202
|
+
.content-section {
|
|
203
|
+
margin: 0 0 3rem;
|
|
204
|
+
|
|
205
|
+
// Core content unit: semantic unboxed card representing an individual job role,
|
|
206
|
+
// degree, project, or certificate, spaced with 2rem vertical separation.
|
|
207
|
+
// Acts as the foundational component for roadmap timeline visualizations.
|
|
208
|
+
.resume-item {
|
|
209
|
+
margin-bottom: 2rem;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Role/Job/Degree Title: authoritative bold sans typography (1.5rem).
|
|
213
|
+
.resume-item-title {
|
|
214
|
+
font-family: var(--font-locale, "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif);
|
|
215
|
+
font-weight: 700;
|
|
216
|
+
margin: 0 0 .75rem;
|
|
217
|
+
font-size: 1.5rem;
|
|
218
|
+
letter-spacing: -.05rem;
|
|
219
|
+
line-height: var(--line-height-locale, 1);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Organization, dates, and subtitle details: 1.125rem font size.
|
|
223
|
+
.resume-item-details {
|
|
224
|
+
font-size: 1.125rem;
|
|
225
|
+
margin: 0 0 .75rem;
|
|
226
|
+
line-height: var(--line-height-locale, 1);
|
|
227
|
+
|
|
228
|
+
&.award-title {
|
|
229
|
+
font-size: 1rem;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Subtle interactive link underline: renders a discrete 1px solid bottom border
|
|
234
|
+
// in place of standard text-decoration, removing the border on hover for clean feedback.
|
|
235
|
+
.resume-item-title,
|
|
236
|
+
.resume-item-details,
|
|
237
|
+
.resume-item-copy,
|
|
238
|
+
.resume-item-list {
|
|
239
|
+
a {
|
|
240
|
+
color: var(--link-color, #333);
|
|
241
|
+
text-decoration: none;
|
|
242
|
+
border-bottom: 1px solid;
|
|
243
|
+
|
|
244
|
+
&:hover {
|
|
245
|
+
border-bottom: none;
|
|
246
|
+
color: var(--link-hover, #9c9c9c);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Role description copy: spacing above descriptive body paragraphs.
|
|
252
|
+
.resume-item-copy {
|
|
253
|
+
margin: .75rem 0 0;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// References: logical border-inline-start mirrors automatically in RTL.
|
|
257
|
+
.resume-item blockquote {
|
|
258
|
+
margin: 0;
|
|
259
|
+
padding-block: .25rem;
|
|
260
|
+
padding-inline-start: 1rem;
|
|
261
|
+
border-inline-start: 3px solid var(--accent-color, #3064a9);
|
|
262
|
+
|
|
263
|
+
p {
|
|
264
|
+
margin: 0 0 .5rem;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
cite {
|
|
268
|
+
display: block;
|
|
269
|
+
font-size: .9em;
|
|
270
|
+
color: var(--text-light, #646464);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Normal weight styling for certification IDs and license numbers.
|
|
275
|
+
.resume-item-copy-license-cert-id {
|
|
276
|
+
font-weight: normal;
|
|
277
|
+
}
|
|
278
|
+
/* Languages table (responsive, flexible spacing) */
|
|
279
|
+
.languages-table {
|
|
280
|
+
width: 100%;
|
|
281
|
+
/* use separate border spacing to create visible gaps between TDs */
|
|
282
|
+
border-collapse: separate;
|
|
283
|
+
border-spacing: 1rem 0.5rem; /* horizontal gap, vertical gap */
|
|
284
|
+
table-layout: fixed; /* let columns share available width */
|
|
285
|
+
margin: 0 0 0.5rem 0;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.languages-table tbody {
|
|
289
|
+
width: 100%;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.languages-table .lang-cell {
|
|
293
|
+
padding: 0.5rem 1rem;
|
|
294
|
+
vertical-align: top;
|
|
295
|
+
word-break: break-word;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.lang-entry {
|
|
299
|
+
margin: 0;
|
|
300
|
+
line-height: 1.25;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/* move typography here so markup stays clean */
|
|
304
|
+
.languages-table .resume-item-details {
|
|
305
|
+
font-weight: 700;
|
|
306
|
+
font-size: 14px;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* Make the table stack into single-column blocks on narrow viewports */
|
|
310
|
+
@include mixins.media_mobile {
|
|
311
|
+
.languages-table,
|
|
312
|
+
.languages-table tbody,
|
|
313
|
+
.languages-table tr,
|
|
314
|
+
.languages-table td {
|
|
315
|
+
display: block;
|
|
316
|
+
width: 100%;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.languages-table tr { margin-bottom: 0.5rem; }
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* Print-specific: keep two columns side-by-side (do not stack) */
|
|
323
|
+
@media print {
|
|
324
|
+
.languages-table {
|
|
325
|
+
display: table;
|
|
326
|
+
table-layout: fixed;
|
|
327
|
+
border-collapse: separate;
|
|
328
|
+
border-spacing: 1rem 0.5rem;
|
|
329
|
+
width: 100%;
|
|
330
|
+
page-break-inside: avoid;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.languages-table tbody { display: table-row-group; }
|
|
334
|
+
|
|
335
|
+
.languages-table tr { display: table-row; }
|
|
336
|
+
|
|
337
|
+
.languages-table td {
|
|
338
|
+
display: table-cell !important;
|
|
339
|
+
width: 50%;
|
|
340
|
+
vertical-align: top;
|
|
341
|
+
padding: 0.4rem 0.8rem;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// footer styles
|
|
347
|
+
// ==========================================================================
|
|
348
|
+
// Page Footer: Dividers and Copyright Information
|
|
349
|
+
// ==========================================================================
|
|
350
|
+
// Base padding/text-align/margin-bottom/.footer-line styling for .page-footer is
|
|
351
|
+
// declared once, globally, in _all-pages.scss; only the resume-specific divider lives here.
|
|
352
|
+
.page-footer {
|
|
353
|
+
border-top: 4px solid var(--border-color, #c7c7c7);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ==========================================================================
|
|
357
|
+
// Print Visibility Utility Classes
|
|
358
|
+
// ==========================================================================
|
|
359
|
+
// Hidden by default on digital screens; revealed during physical printing / PDF generation.
|
|
360
|
+
.print-only,
|
|
361
|
+
.print-only-inline {
|
|
362
|
+
display: none !important
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// ==========================================================================
|
|
366
|
+
// Print Media Overrides (@media print)
|
|
367
|
+
// ==========================================================================
|
|
368
|
+
// Tightens spacing and downscales typography to fit CV content cleanly onto A4 / US Letter paper.
|
|
369
|
+
@media print {
|
|
370
|
+
// Suppress interactive elements and digital-only buttons.
|
|
371
|
+
.no-print {
|
|
372
|
+
display: none !important
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Reveal plaintext contact data and printable URLs.
|
|
376
|
+
.print-only {
|
|
377
|
+
display: block !important
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.print-only-inline {
|
|
381
|
+
display: inline !important
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Base print typography: scales down to 12px for compact multi-column printable density.
|
|
385
|
+
body {
|
|
386
|
+
font-size: 12px;
|
|
387
|
+
line-height: 1rem;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Reduced padding on page header to conserve physical page budget.
|
|
391
|
+
.page-header {
|
|
392
|
+
padding: 1rem 0 .2rem;
|
|
393
|
+
|
|
394
|
+
.header-name {
|
|
395
|
+
@include mixins.sans_bold;
|
|
396
|
+
font-size: 2rem;
|
|
397
|
+
margin: 0 0 .2rem;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Switch thick decorative borders to 1px hairline rules.
|
|
402
|
+
.section-header {
|
|
403
|
+
@include mixins.section_border_thin;
|
|
404
|
+
margin-bottom: 1rem;
|
|
405
|
+
|
|
406
|
+
h2 {
|
|
407
|
+
font-size: 1.2rem;
|
|
408
|
+
line-height: 1.5rem;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Tighten margins across items and scale down titles.
|
|
413
|
+
.content-section {
|
|
414
|
+
margin: 0 0 1rem;
|
|
415
|
+
|
|
416
|
+
.resume-item {
|
|
417
|
+
margin-bottom: 1rem;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.resume-item-title {
|
|
421
|
+
font-size: 16px;
|
|
422
|
+
line-height: .7em;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.resume-item-details {
|
|
426
|
+
font-size: 12px;
|
|
427
|
+
margin: 0 0 .75rem;
|
|
428
|
+
line-height: .7em;
|
|
429
|
+
font-style: italic;
|
|
430
|
+
|
|
431
|
+
&.award-title {
|
|
432
|
+
font-size: 11px;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// RTL positioning overrides for the resume layout
|
|
2
|
+
// ---------------------------------------/
|
|
3
|
+
// jekyll-theme-resume
|
|
4
|
+
// Language-neutral RTL overrides loaded last via assets/css/cv-rtl.scss, on top of
|
|
5
|
+
// _resume-ltr.scss. Scoped strictly under html[dir="rtl"] to ensure complete style
|
|
6
|
+
// isolation from LTR layouts. Handles horizontal mirroring and RTL element repositioning
|
|
7
|
+
// only; font-family and line-height are locale-driven (--font-locale / --line-height-locale,
|
|
8
|
+
// set per language in the page head from _data/locales/<lang>.yml) so Arabic, Urdu, and any
|
|
9
|
+
// future RTL locale each get their own typeface and line spacing without editing this file.
|
|
10
|
+
// ---------------------------------------/
|
|
11
|
+
|
|
12
|
+
@use "mixins";
|
|
13
|
+
|
|
14
|
+
// Scoped root selector: activates automatically when the page sets <html dir="rtl">.
|
|
15
|
+
html[dir="rtl"] {
|
|
16
|
+
body {
|
|
17
|
+
direction: rtl;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Cursive ligature stabilization
|
|
21
|
+
// ==========================================================================
|
|
22
|
+
// WHY: Arabic and Urdu are intrinsically cursive scripts where letters within words must
|
|
23
|
+
// connect seamlessly via contextual ligatures. Latin headlines often apply negative
|
|
24
|
+
// letter-spacing (e.g., -.05rem). If applied to a cursive RTL script, negative or positive
|
|
25
|
+
// tracking causes glyph connection failure, detaching letters into broken, isolated forms.
|
|
26
|
+
// letter-spacing: normal restores natural cursive ligature rendering, and applies equally
|
|
27
|
+
// to every RTL locale regardless of its specific font or line-height.
|
|
28
|
+
// ==========================================================================
|
|
29
|
+
.section-header h2,
|
|
30
|
+
.page-header .header-name,
|
|
31
|
+
.page-header .header-title,
|
|
32
|
+
.resume-item-title,
|
|
33
|
+
.resume-item-details,
|
|
34
|
+
.content-section .resume-item-title,
|
|
35
|
+
.content-section .resume-item-details {
|
|
36
|
+
letter-spacing: normal;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Global alignment defaults
|
|
40
|
+
// Enforces right-alignment across resume item headers, dates, and descriptive paragraphs.
|
|
41
|
+
.content-section,
|
|
42
|
+
.content-section .resume-item-title,
|
|
43
|
+
.content-section .resume-item-details,
|
|
44
|
+
.content-section .resume-item-copy {
|
|
45
|
+
text-align: right;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Header tweaks
|
|
49
|
+
// Horizontally mirrors the title bar: floats the candidate title to the right on desktop.
|
|
50
|
+
.page-header {
|
|
51
|
+
.title-bar {
|
|
52
|
+
.header-title {
|
|
53
|
+
@include mixins.media_larger_than_mobile {
|
|
54
|
+
float: right;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Social links on the opposite side in wide viewports
|
|
61
|
+
// Mirrored positioning: floats social icons to the left side on screens wider than 600px.
|
|
62
|
+
.social-links {
|
|
63
|
+
@include mixins.media_larger_than_mobile {
|
|
64
|
+
float: left;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.icon-link-item {
|
|
68
|
+
// flip spacing for RTL
|
|
69
|
+
// Inverts icon margins: applies spacing on the trailing left side (margin-right: 5px; margin-left: 0).
|
|
70
|
+
margin-right: 5px;
|
|
71
|
+
margin-left: 0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Lists
|
|
76
|
+
// Inverts list bullet indentation: in RTL, bullets appear on the right side of the text block.
|
|
77
|
+
// Padding must be placed on the right (1.2rem) and cleared on the left (0).
|
|
78
|
+
// Also serves as the architectural model for right-aligned timeline markers in Feature 4.2.
|
|
79
|
+
.resume-item-list {
|
|
80
|
+
padding-right: 1.2rem;
|
|
81
|
+
padding-left: 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Languages table tweaks
|
|
85
|
+
// Enforces right-to-left column progression for the two-column language proficiency grid.
|
|
86
|
+
.languages-table {
|
|
87
|
+
direction: rtl;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Footer: text-align: center already cascades from _all-pages.scss; no RTL override needed.
|
|
91
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Variables
|
|
2
|
+
// ---------------------------------------/
|
|
3
|
+
// jekyll-theme-resume
|
|
4
|
+
// SCSS design tokens and compile-time defaults.
|
|
5
|
+
// Variables are flagged with `!default` to allow consuming Jekyll sites to override
|
|
6
|
+
// layout dimensions, gutters, and font stacks without modifying gem theme source.
|
|
7
|
+
// Color variables bind to CSS custom properties to seamlessly support dynamic dark mode.
|
|
8
|
+
// ---------------------------------------/
|
|
9
|
+
|
|
10
|
+
// Layout Dimensions
|
|
11
|
+
// Standard 980px container width and 10px gutter spacing (total 20px column gap).
|
|
12
|
+
$container-width: 980px !default;
|
|
13
|
+
$grid-gutter: 10px !default;
|
|
14
|
+
|
|
15
|
+
// Colors
|
|
16
|
+
// Legacy SCSS color variables bound to CSS custom property design tokens
|
|
17
|
+
// defined in _dark-mode.scss, enabling reactive theme switching without SCSS re-compilation.
|
|
18
|
+
$white: var(--bg-color, #fff);
|
|
19
|
+
$black: var(--text-color, #333);
|
|
20
|
+
|
|
21
|
+
// Styles
|
|
22
|
+
$text_color: var(--text-color, #333);
|
|
23
|
+
|
|
24
|
+
// Font stack
|
|
25
|
+
// Cross-platform sans-serif system fallback stack with emoji symbol support.
|
|
26
|
+
$body-font: Helvetica,
|
|
27
|
+
arial,
|
|
28
|
+
nimbussansl,
|
|
29
|
+
liberationsans,
|
|
30
|
+
freesans,
|
|
31
|
+
clean,
|
|
32
|
+
sans-serif,
|
|
33
|
+
"Segoe UI Emoji",
|
|
34
|
+
"Segoe UI Symbol" !default;
|
|
35
|
+
|
|
36
|
+
// The base body size
|
|
37
|
+
$body-font-size: 13px !default;
|
|
38
|
+
|
|
39
|
+
// Monospace font stack
|
|
40
|
+
// Cross-platform developer monospace font stack for code snippets, IDs, and preformatted blocks.
|
|
41
|
+
$mono-font: Consolas,
|
|
42
|
+
"Liberation Mono",
|
|
43
|
+
Menlo,
|
|
44
|
+
Courier,
|
|
45
|
+
monospace !default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
|
|
4
|
+
// ==========================================================================
|
|
5
|
+
// LTR Resume Stylesheet Entrypoint
|
|
6
|
+
// jekyll-theme-resume
|
|
7
|
+
//
|
|
8
|
+
// Primary SCSS compilation entrypoint for every left-to-right resume locale
|
|
9
|
+
// (_layouts/resume.html for English and any other LTR locale). Compiles into
|
|
10
|
+
// assets/css/cv-ltr.css via Jekyll SASS processing.
|
|
11
|
+
// Cascade order:
|
|
12
|
+
// 1. Resets & Tokens: normalize, mixins, variables, dark-mode custom properties
|
|
13
|
+
// 2. Base & Grid: universal box-sizing, typography, 980px Primer grid
|
|
14
|
+
// 3. Resume Sections: header fluid typography, cards, tables, print rules
|
|
15
|
+
// 4. Shared Utilities: SVG icons, screen-reader helpers, universal footer
|
|
16
|
+
// ==========================================================================
|
|
17
|
+
|
|
18
|
+
// "Reset" styles and SCSS reusable components
|
|
19
|
+
@use "normalize";
|
|
20
|
+
@use "mixins";
|
|
21
|
+
@use "variables";
|
|
22
|
+
@use "dark-mode";
|
|
23
|
+
|
|
24
|
+
// Generic site base & layout styles
|
|
25
|
+
@use "base";
|
|
26
|
+
@use "layout";
|
|
27
|
+
|
|
28
|
+
// Layouts
|
|
29
|
+
@use "resume-ltr";
|
|
30
|
+
|
|
31
|
+
@use "all-pages";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
|
|
4
|
+
// ==========================================================================
|
|
5
|
+
// RTL Resume Stylesheet Entrypoint
|
|
6
|
+
// jekyll-theme-resume
|
|
7
|
+
//
|
|
8
|
+
// Primary SCSS compilation entrypoint for every right-to-left resume locale
|
|
9
|
+
// (_layouts/resume.html for Arabic, Urdu, and any other RTL locale). Compiles into
|
|
10
|
+
// assets/css/cv-rtl.css via Jekyll SASS processing.
|
|
11
|
+
// Strict Bilingual Parity (Rule 1):
|
|
12
|
+
// Compiles identical base foundations as cv-ltr.scss, followed by @use "resume-rtl"
|
|
13
|
+
// at the very end of the cascade. This ensures that RTL ligature stability
|
|
14
|
+
// (letter-spacing: normal) and mirrored horizontal alignment override preceding LTR
|
|
15
|
+
// positioning cleanly. Typography (font-family, line-height) is not set here; it is
|
|
16
|
+
// locale-driven via --font-locale / --line-height-locale, emitted per language in the
|
|
17
|
+
// page head from _data/locales/<lang>.yml.
|
|
18
|
+
// ==========================================================================
|
|
19
|
+
|
|
20
|
+
// "Reset" styles and SCSS reusable components
|
|
21
|
+
// RTL CV entrypoint: load base styles then RTL overrides
|
|
22
|
+
@use "normalize";
|
|
23
|
+
@use "mixins";
|
|
24
|
+
@use "variables";
|
|
25
|
+
@use "dark-mode";
|
|
26
|
+
|
|
27
|
+
// Generic site base & layout styles
|
|
28
|
+
@use "base";
|
|
29
|
+
@use "layout";
|
|
30
|
+
|
|
31
|
+
// Layouts
|
|
32
|
+
@use "resume-ltr";
|
|
33
|
+
@use "all-pages";
|
|
34
|
+
|
|
35
|
+
// RTL-specific positioning overrides
|
|
36
|
+
@use "resume-rtl";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
This favicon was generated using the following graphics from Twitter Twemoji:
|
|
2
|
+
|
|
3
|
+
- Graphics Title: 1f4bc.svg
|
|
4
|
+
- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji)
|
|
5
|
+
- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f4bc.svg
|
|
6
|
+
- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"","short_name":"","icons":[{"src":"/assets/favicon/resume/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/assets/favicon/resume/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|