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.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/403.html +6 -0
  3. data/404.html +6 -0
  4. data/500.html +6 -0
  5. data/CHANGELOG.md +498 -0
  6. data/CODE_OF_CONDUCT.md +92 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +184 -0
  9. data/SECURITY.md +30 -0
  10. data/_config.sample.yml +329 -0
  11. data/_data/locales/ar.yml +85 -0
  12. data/_data/locales/de.yml +86 -0
  13. data/_data/locales/en.yml +84 -0
  14. data/_data/locales/es.yml +86 -0
  15. data/_data/locales/fr.yml +86 -0
  16. data/_data/locales/ur.yml +86 -0
  17. data/_data/social_networks.yml +83 -0
  18. data/_includes/analytics-body.html +12 -0
  19. data/_includes/analytics-head.html +36 -0
  20. data/_includes/avatar.html +84 -0
  21. data/_includes/dark-mode-toggle.html +202 -0
  22. data/_includes/data-loader.html +42 -0
  23. data/_includes/date-formatter.html +63 -0
  24. data/_includes/grouped-item-list.html +53 -0
  25. data/_includes/hreflang.html +58 -0
  26. data/_includes/language-switcher.html +72 -0
  27. data/_includes/print-social-links.html +23 -0
  28. data/_includes/resume-section.html +547 -0
  29. data/_includes/safe-url.html +21 -0
  30. data/_includes/shared-head.html +51 -0
  31. data/_includes/social-links.html +54 -0
  32. data/_includes/vendors/svg-icons/ATTRIBUTION.md +34 -0
  33. data/_includes/vendors/svg-icons/dev.svg +3 -0
  34. data/_includes/vendors/svg-icons/dribbble-symbol.svg +3 -0
  35. data/_includes/vendors/svg-icons/envelope.svg +4 -0
  36. data/_includes/vendors/svg-icons/facebook.svg +3 -0
  37. data/_includes/vendors/svg-icons/flickr.svg +4 -0
  38. data/_includes/vendors/svg-icons/github.svg +3 -0
  39. data/_includes/vendors/svg-icons/globe-1.svg +3 -0
  40. data/_includes/vendors/svg-icons/instagram.svg +4 -0
  41. data/_includes/vendors/svg-icons/linkedin.svg +3 -0
  42. data/_includes/vendors/svg-icons/medium.svg +3 -0
  43. data/_includes/vendors/svg-icons/phone.svg +13 -0
  44. data/_includes/vendors/svg-icons/pinterest.svg +3 -0
  45. data/_includes/vendors/svg-icons/postcard.svg +14 -0
  46. data/_includes/vendors/svg-icons/telegram.svg +3 -0
  47. data/_includes/vendors/svg-icons/whatsapp.svg +3 -0
  48. data/_includes/vendors/svg-icons/x.svg +3 -0
  49. data/_includes/vendors/svg-icons/youtube.svg +3 -0
  50. data/_layouts/default.html +65 -0
  51. data/_layouts/error.html +138 -0
  52. data/_layouts/profile.html +123 -0
  53. data/_layouts/resume.html +238 -0
  54. data/_plugins/error_pages_generator.rb +71 -0
  55. data/_plugins/json_resume_generator.rb +79 -0
  56. data/_plugins/resume_pages_generator.rb +71 -0
  57. data/_plugins/resume_validator.rb +40 -0
  58. data/_sass/_all-pages.scss +335 -0
  59. data/_sass/_base.scss +130 -0
  60. data/_sass/_dark-mode.scss +387 -0
  61. data/_sass/_layout.scss +116 -0
  62. data/_sass/_mixins.scss +136 -0
  63. data/_sass/_normalize.scss +379 -0
  64. data/_sass/_profile-page.scss +60 -0
  65. data/_sass/_resume-ltr.scss +436 -0
  66. data/_sass/_resume-rtl.scss +91 -0
  67. data/_sass/_variables.scss +45 -0
  68. data/assets/css/cv-ltr.scss +31 -0
  69. data/assets/css/cv-rtl.scss +36 -0
  70. data/assets/css/main.scss +8 -0
  71. data/assets/css/profile.scss +9 -0
  72. data/assets/favicon/resume/about.txt +6 -0
  73. data/assets/favicon/resume/android-chrome-192x192.png +0 -0
  74. data/assets/favicon/resume/android-chrome-512x512.png +0 -0
  75. data/assets/favicon/resume/apple-touch-icon.png +0 -0
  76. data/assets/favicon/resume/favicon-16x16.png +0 -0
  77. data/assets/favicon/resume/favicon-32x32.png +0 -0
  78. data/assets/favicon/resume/favicon.ico +0 -0
  79. data/assets/favicon/resume/site.webmanifest +1 -0
  80. data/bin/validate-resume +89 -0
  81. data/bin/verify +27 -0
  82. data/docs/README.md +89 -0
  83. data/docs/explanation/accessibility-decisions.md +27 -0
  84. data/docs/explanation/architecture.md +44 -0
  85. data/docs/explanation/dark-mode-approach.md +25 -0
  86. data/docs/explanation/data-driven-model.md +25 -0
  87. data/docs/explanation/multilingual-and-rtl-design.md +40 -0
  88. data/docs/how-to/add-a-language.md +57 -0
  89. data/docs/how-to/add-a-section.md +35 -0
  90. data/docs/how-to/add-a-social-platform.md +32 -0
  91. data/docs/how-to/add-a-test.md +34 -0
  92. data/docs/how-to/create-a-custom-layout.md +64 -0
  93. data/docs/how-to/enable-dark-mode.md +43 -0
  94. data/docs/how-to/link-translations-with-hreflang.md +25 -0
  95. data/docs/how-to/migrate-v0.9-to-v1.0.md +46 -0
  96. data/docs/how-to/override-locale-strings.md +51 -0
  97. data/docs/how-to/override-sass-partials.md +26 -0
  98. data/docs/how-to/proof-built-html.md +22 -0
  99. data/docs/how-to/publish-json-resume.md +38 -0
  100. data/docs/how-to/show-language-proficiency-in-header.md +13 -0
  101. data/docs/how-to/switch-resume-versions.md +42 -0
  102. data/docs/how-to/troubleshoot-builds.md +39 -0
  103. data/docs/how-to/validate-in-ci.md +38 -0
  104. data/docs/how-to/verify-accessibility.md +28 -0
  105. data/docs/reference/accessibility-coverage.md +39 -0
  106. data/docs/reference/config.md +378 -0
  107. data/docs/reference/data-schemas.md +529 -0
  108. data/docs/reference/glossary.md +39 -0
  109. data/docs/reference/includes.md +197 -0
  110. data/docs/reference/json-resume-fields.md +148 -0
  111. data/docs/reference/layouts.md +144 -0
  112. data/docs/reference/locale-keys.md +76 -0
  113. data/docs/reference/repository-map.md +83 -0
  114. data/docs/reference/sass-tokens.md +279 -0
  115. data/docs/reference/testing-suites.md +62 -0
  116. data/docs/reference/validator-cli.md +203 -0
  117. data/docs/tutorials/getting-started.md +173 -0
  118. data/lib/jekyll-theme-resume/json_resume_exporter.rb +334 -0
  119. data/lib/jekyll-theme-resume/resume_validator.rb +853 -0
  120. data/lib/jekyll-theme-resume/schemas/LICENSE.md +21 -0
  121. data/lib/jekyll-theme-resume/schemas/json_resume_v1.0.0.json +500 -0
  122. data/lib/jekyll-theme-resume.rb +21 -0
  123. 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,8 @@
1
+ ---
2
+ ---
3
+ // "Reset" styles and SCSS reusable components
4
+ @use "normalize";
5
+ @use "dark-mode";
6
+ @use "base";
7
+ @use "all-pages";
8
+ @use "layout";
@@ -0,0 +1,9 @@
1
+ ---
2
+ ---
3
+ // Standalone Profile Page Stylesheet
4
+ @use "normalize";
5
+ @use "dark-mode";
6
+ @use "base";
7
+ @use "all-pages";
8
+ @use "profile-page";
9
+ @use "layout";
@@ -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
@@ -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"}