bilingual-jekyll-resume-theme 0.7.0 → 0.9.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 +4 -4
- data/CHANGELOG.md +77 -2
- data/README.md +23 -10
- data/_includes/ar-date.html +32 -21
- data/_includes/avatar.html +80 -0
- data/_includes/dark-mode-toggle.html +51 -0
- data/_includes/data-loader.html +41 -0
- data/_includes/hreflang.html +12 -0
- data/_includes/language-switcher.html +64 -0
- data/_includes/main-head.html +5 -0
- data/_includes/print-social-links.html +10 -0
- data/_includes/profile-head.html +7 -0
- data/_includes/resume-head-ar.html +10 -0
- data/_includes/resume-head-en.html +7 -0
- data/_includes/resume-section-ar.html +245 -63
- data/_includes/resume-section-en.html +242 -64
- data/_includes/shared-head.html +9 -1
- data/_includes/social-links.html +43 -57
- data/_layouts/default.html +19 -14
- data/_layouts/error.html +49 -2
- data/_layouts/profile.html +59 -6
- data/_layouts/resume-ar.html +84 -201
- data/_layouts/resume-en.html +84 -201
- data/_plugins/error_pages_generator.rb +72 -0
- data/_sass/_all-pages.scss +167 -11
- data/_sass/_base.scss +57 -8
- data/_sass/_dark-mode.scss +33 -4
- data/_sass/_layout.scss +83 -7
- data/_sass/_mixins.scss +18 -5
- data/_sass/{_profile.scss → _profile-page.scss} +3 -16
- data/_sass/_resume-rtl.scss +57 -0
- data/_sass/_resume.scss +116 -14
- data/_sass/_variables.scss +12 -0
- data/assets/css/cv-ar.scss +13 -0
- data/assets/css/cv.scss +13 -0
- data/assets/css/main.scss +2 -1
- data/assets/css/profile.scss +8 -0
- data/docs/ACCESSIBILITY_GUIDE.md +141 -0
- data/docs/COMPLETED_AUDIT.md +700 -0
- data/docs/CONFIG_GUIDE.md +404 -266
- data/docs/DATA_GUIDE.md +357 -473
- data/docs/INCLUDES_GUIDE.md +257 -403
- data/docs/LAYOUTS_GUIDE.md +207 -287
- data/docs/PROJECT_OVERVIEW.md +159 -69
- data/docs/SASS_GUIDE.md +212 -255
- data/docs/_data/_config.sample.yml +137 -81
- data/docs/_data/ar/associations.yml +30 -21
- data/docs/_data/ar/certifications.yml +47 -62
- data/docs/_data/ar/courses.yml +41 -33
- data/docs/_data/ar/education.yml +41 -39
- data/docs/_data/ar/experience.yml +56 -40
- data/docs/_data/ar/header.yml +6 -5
- data/docs/_data/ar/interests.yml +9 -7
- data/docs/_data/ar/languages.yml +21 -21
- data/docs/_data/ar/links.yml +17 -10
- data/docs/_data/ar/projects.yml +31 -22
- data/docs/_data/ar/recognitions.yml +28 -17
- data/docs/_data/ar/skills.yml +20 -9
- data/docs/_data/ar/volunteering.yml +47 -31
- data/docs/_data/en/associations.yml +31 -22
- data/docs/_data/en/certifications.yml +48 -63
- data/docs/_data/en/courses.yml +42 -34
- data/docs/_data/en/education.yml +42 -40
- data/docs/_data/en/experience.yml +57 -41
- data/docs/_data/en/header.yml +3 -2
- data/docs/_data/en/interests.yml +10 -8
- data/docs/_data/en/languages.yml +22 -22
- data/docs/_data/en/links.yml +18 -11
- data/docs/_data/en/projects.yml +32 -23
- data/docs/_data/en/recognitions.yml +29 -18
- data/docs/_data/en/skills.yml +21 -10
- data/docs/_data/en/volunteering.yml +48 -32
- data/lib/bilingual-jekyll-resume-theme.rb +18 -0
- metadata +13 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0456f04d40f87607d0b9eea63b2fabbf1256e5ca0a7e6903ac1cd4fbb8465575
|
|
4
|
+
data.tar.gz: 840d1d5addfdf72448dfd04765875ceed5c319ba8d3548b26ec89f1d82c34ec2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 570f411c947a9cb26c2806580405b3503fcd5d4d513dc083dce5dec2c1930cd37c241a289ca4526bb5d2282e0efb79659302b9a4b9018b88413e0057a8432aa7
|
|
7
|
+
data.tar.gz: e1d7b2184bdf67432c8edf765a18404c1590eae81b8e827da894aeee2e085843b3d37d3fffadf259e461d3d3f2e5bd8c5066fcb88e15cdca700b36a3187d72ed
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,78 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
## [0.9.0] - 2026-09-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
* Add accessible landmark roles, skip-links, and focus styles ([`a29c480`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/a29c48087c3933c9edb71722bbb00ea12e3c9ad4))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
* Update active feature blueprints, issue mappings, and ignore rules ([`28dd0c3`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/28dd0c317cc869f966731c1732570b7592affb3e))
|
|
15
|
+
|
|
16
|
+
* Consolidate dynamic data loader into shared include component ([`ef5cc4f`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/ef5cc4fa1e979024a0fbc8efebef5105706aa1df))
|
|
17
|
+
|
|
18
|
+
* Consolidate profile styles with shared partials and remove redundant forwarder ([`0d1fbd0`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/0d1fbd04b427c4ee334d64558d6275ec64f71e9c))
|
|
19
|
+
|
|
20
|
+
* Simplify resume section conditions with direct Liquid blank checks ([`c9a6ada`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/c9a6ada2089b9b686d510edfffe0d196dca5f051))
|
|
21
|
+
|
|
22
|
+
* Clean up legacy mixins, remove IE zoom hacks, and eliminate dead table classes ([`2800d0a`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/2800d0ab1553ee14e59c6eaae441d4de83c5b35f))
|
|
23
|
+
|
|
24
|
+
* Encapsulate dark mode activation cascade into toggle include ([`405b493`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/405b4933ea0640951fd8a24a21151574bb0ab11a))
|
|
25
|
+
|
|
26
|
+
* Implement interactive bilingual language switcher ([`c56e50f`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/c56e50fa6f7e64a58ff7930a3bfb4a7275b7e134))
|
|
27
|
+
|
|
28
|
+
* Apply living-docs framework, add code comments, browser QA verified ([`d1535b9`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/d1535b9f22d79eab1cd7f4078c0db2d86a74f7b6))
|
|
29
|
+
|
|
30
|
+
* Update release notes for version automation ([`fc9ead1`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/fc9ead129df08b3698264b9da5a07378e1543aa3))
|
|
31
|
+
|
|
32
|
+
* Preserve bump-only releases in git-cliff template ([`ba334a5`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/ba334a54fa8d63aeea1a72ad646b2bb71ff6f0a7))
|
|
33
|
+
|
|
34
|
+
* Automate gem publishing and release workflow ([`f4bd096`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/f4bd096ae44bfc42cb14c9635a0e9803e297a0ba))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
* Render language header summary on a dedicated line ([`d3352dc`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/d3352dcb6833f8bc48d2d799774757a42325a711))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
### Removed
|
|
42
|
+
* Remove redundant Gem::Specification monkey-patch ([`a78efd6`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/a78efd68e70c0848f78bb5b25ab51f848c437c1d))
|
|
43
|
+
|
|
44
|
+
## [0.8.0] - 2026-09-19
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
* Add global .sr-only utility class for accessible icons ([`f25fcb6`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/f25fcb618c399a54039b00cb56e1d09724592516))
|
|
48
|
+
|
|
49
|
+
* Add error pages generator plugin and gem autoloading ([`9238b5a`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/9238b5ace273c9c64de5c90bbd8a19fe6ac5a27b))
|
|
50
|
+
|
|
51
|
+
* Add .agents/ to ignore list ([`568b874`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/568b874c290ae1673fe6c3e44b97a4c0c8e0b553))
|
|
52
|
+
|
|
53
|
+
* Add configurable avatar URL, bilingual alt text, and reusable include ([`a17cc60`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/a17cc603a3633bb5dc67589bcc01ce7ef886d88c))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
* Improve accessibility, icon contrast, mobile responsiveness, and RTL typography ([`add2625`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/add2625599027eb1f88ca6e1ec66c3bf2b334757))
|
|
58
|
+
|
|
59
|
+
* Populate comprehensive bilingual example data across all sections ([`1555d41`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/1555d41efef50cd9010d4bf08223fb81060bc8f3))
|
|
60
|
+
|
|
61
|
+
* Standardize recognition section toggle to plural with fallback ([`dccee09`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/dccee09c65e95a140281633342a09d58b236b888))
|
|
62
|
+
|
|
63
|
+
* Modernize all guides and master sample configuration ([`08f8823`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/08f8823f91984891e55dff0dcc8488601c185aea))
|
|
64
|
+
|
|
65
|
+
* Establish master feature roadmap and archive completed audit ([`f6d28a3`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/f6d28a354115fa6a0ce5e29250cd1b40be0c4dfd))
|
|
66
|
+
|
|
67
|
+
* Establish AGENTS.md master manual and refactor pointers ([`24ecf7e`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/24ecf7e751eebff79ac9e805d7a7de8696c52b43))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
* Render section detail bullets conditionally with proper spacing ([`e4564cc`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/e4564cc43b5e5cec31ed704918cddbc124ec76ca))
|
|
72
|
+
|
|
73
|
+
* Enhance error layout usability, add sr-only styles, and maintain LTR/RTL parity ([`18a9b5b`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/18a9b5bbd18c52456a5a0dfd958d09187686a003))
|
|
74
|
+
|
|
75
|
+
* Restore standalone profile layout and eliminate icon underline artifacts ([`5bed5dd`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/5bed5ddc9b59bbfcb820df7793c2098ee0762d69))
|
|
76
|
+
|
|
77
|
+
* Resolve Liquid truthiness, unclosed tags, and Arabic date parsing ([`90a0750`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/90a075077c812bc56d31ac9622abdf2f3278dc98))
|
|
78
|
+
|
|
7
79
|
## [0.7.0] - 2026-09-12
|
|
8
80
|
|
|
9
81
|
### Added
|
|
@@ -38,8 +110,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
38
110
|
## [0.6.1] - 2026-08-21
|
|
39
111
|
|
|
40
112
|
### Changed
|
|
41
|
-
* Version bump
|
|
42
|
-
|
|
113
|
+
* Version bump release with no structural code changes.
|
|
43
114
|
## [0.6.0] - 2026-08-21
|
|
44
115
|
|
|
45
116
|
### Added
|
|
@@ -194,6 +265,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
194
265
|
|
|
195
266
|
* Initial commit (New Theme Template) ([`00af662`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/00af6628dfec7aefe0ef7d7083bf98c9713a5ffd))
|
|
196
267
|
|
|
268
|
+
[0.9.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.8.0...v0.9.0
|
|
269
|
+
[0.8.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.7.0...v0.8.0
|
|
270
|
+
[0.7.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.6.1...v0.7.0
|
|
271
|
+
[0.6.1]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.6.0...v0.6.1
|
|
197
272
|
[0.6.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.5.2...v0.6.0
|
|
198
273
|
[0.5.2]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.5.1...v0.5.2
|
|
199
274
|
[0.5.1]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.5.0...v0.5.1
|
data/README.md
CHANGED
|
@@ -80,14 +80,22 @@ Understanding the theme's include system, how sections render, and how to add ne
|
|
|
80
80
|
### 🎨 [SASS/SCSS Guide](docs/SASS_GUIDE.md)
|
|
81
81
|
Complete guide to the theme's styling system, how to customize colors/fonts, and how to override styles without forking the theme.
|
|
82
82
|
|
|
83
|
+
### 🗺️ [Project Overview](docs/PROJECT_OVERVIEW.md)
|
|
84
|
+
High-level architecture summary, repository conventions, layout hierarchy, and design philosophy.
|
|
85
|
+
|
|
86
|
+
### 📜 [Completed Historical Audit](docs/COMPLETED_AUDIT.md)
|
|
87
|
+
Permanent engineering record of historical bug fixes, security hardening, and architectural upgrades.
|
|
88
|
+
|
|
83
89
|
## Project Structure
|
|
84
90
|
|
|
85
|
-
```
|
|
91
|
+
```text
|
|
86
92
|
bilingual-jekyll-resume-theme/
|
|
87
|
-
├── _layouts/ # HTML templates (default, resume-en, resume-ar, profile)
|
|
88
|
-
├── _includes/
|
|
89
|
-
├── _sass/ # SCSS stylesheets (RTL support, print styles)
|
|
90
|
-
├──
|
|
93
|
+
├── _layouts/ # HTML templates (default, resume-en, resume-ar, profile, error)
|
|
94
|
+
├── _includes/ # Reusable components (sections, headers, analytics, avatar, toggle)
|
|
95
|
+
├── _sass/ # SCSS stylesheets (RTL support, dark mode tokens, print styles)
|
|
96
|
+
├── _plugins/ # Dynamic generators (error_pages_generator.rb)
|
|
97
|
+
├── lib/ # Gem entrypoint and runtime extensions
|
|
98
|
+
├── _data/ # Theme data (includes ar/months.yml, error_pages.yml)
|
|
91
99
|
├── assets/ # CSS, images, favicons
|
|
92
100
|
└── docs/ # Documentation and sample files
|
|
93
101
|
├── _data/ # Sample data files (copy to your site's _data/)
|
|
@@ -106,7 +114,7 @@ active_resume_path_ar: "ar" # Uses _data/ar/* (recommended)
|
|
|
106
114
|
|
|
107
115
|
This is the recommended approach even if you're only using one language, as it keeps your data organized and makes it easy to add more languages later. **Advanced users:** You can place files directly in `_data/` (root) by setting these to empty strings, but this is not recommended for beginners.
|
|
108
116
|
|
|
109
|
-
See the [Configuration Guide](docs/CONFIG_GUIDE.md#
|
|
117
|
+
See the [Configuration Guide](docs/CONFIG_GUIDE.md#7-resume-display--behavior-controls) for details.
|
|
110
118
|
|
|
111
119
|
### Sample Files
|
|
112
120
|
|
|
@@ -127,8 +135,11 @@ To develop this theme locally:
|
|
|
127
135
|
# Install dependencies
|
|
128
136
|
bundle install
|
|
129
137
|
|
|
130
|
-
# Run development server
|
|
131
|
-
bundle exec jekyll serve
|
|
138
|
+
# Run development server in this repo (uses sample config to activate required plugins)
|
|
139
|
+
bundle exec jekyll serve --config docs/_data/_config.sample.yml
|
|
140
|
+
|
|
141
|
+
# Build static output
|
|
142
|
+
bundle exec jekyll build --config docs/_data/_config.sample.yml
|
|
132
143
|
|
|
133
144
|
# Build the gem
|
|
134
145
|
gem build bilingual-jekyll-resume-theme.gemspec
|
|
@@ -157,8 +168,10 @@ The theme is available as open source under the terms of the [MIT License](LICEN
|
|
|
157
168
|
|
|
158
169
|
- 📖 Check the [documentation guides](docs/) for detailed information
|
|
159
170
|
- 🐛 Report issues on [GitHub Issues](https://github.com/kmutahar/bilingual-jekyll-resume-theme/issues)
|
|
160
|
-
- 💡 See [
|
|
171
|
+
- 💡 See [PROJECT_OVERVIEW.md](docs/PROJECT_OVERVIEW.md) for a high-level architecture overview
|
|
172
|
+
- 📜 See [COMPLETED_AUDIT.md](docs/COMPLETED_AUDIT.md) for historical remediations and architectural decisions
|
|
161
173
|
|
|
162
174
|
---
|
|
163
175
|
|
|
164
|
-
**Created by Khaldoon Mutahar** | Version 0.
|
|
176
|
+
**Created by Khaldoon Mutahar** | Version 0.8.0 | MIT License
|
|
177
|
+
|
data/_includes/ar-date.html
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{
|
|
1
|
+
{%- comment -%}
|
|
2
2
|
Arabic Date Formatter Include
|
|
3
3
|
This include file formats a date in Arabic format by looking up the Arabic month name
|
|
4
4
|
from the site data and formatting it according to the specified style.
|
|
@@ -8,34 +8,45 @@
|
|
|
8
8
|
{% include ar-date.html date=page.date %}
|
|
9
9
|
|
|
10
10
|
Parameters:
|
|
11
|
-
- date: The date to format (required)
|
|
11
|
+
- date: The date to format (required). Accepts ISO 8601 strings (YYYY-MM-DD, YYYY-MM), Jekyll date objects, or Ruby Time instances.
|
|
12
12
|
- style: "MDY" for "Month Day, Year" format, or any other value for "Month Year" format (optional)
|
|
13
|
-
{% endcomment %}
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
Architecture & Portability Notes:
|
|
15
|
+
- Pure Liquid Implementation: Standard Jekyll on GitHub Pages runs in safe mode without custom Ruby plugins or system locale C-extensions. This pure Liquid dictionary lookup provides 100% portable Arabic month translation without external dependencies.
|
|
16
|
+
- Ongoing Roles & Date Ranges: This component formats single discrete timestamps. Date ranges (e.g. start date to end date) are composed in caller templates like `_includes/resume-section-ar.html`. Ongoing positions (where `present: true` or `enddate: "Present"`) are handled by callers which emit the localized phrase "حتى الآن" rather than passing non-date strings here.
|
|
17
|
+
{%- endcomment -%}
|
|
18
|
+
|
|
19
|
+
{%- comment -%}
|
|
16
20
|
Extract date components from the provided date using Jekyll date filters:
|
|
17
|
-
- "%-m": Month as a number (1-12) without leading zeros
|
|
21
|
+
- "%-m": Month as a number (1-12) without leading zeros. Stripping the leading zero is essential because `_data/ar/months.yml` keys are formatted as "1", "2", ... "12".
|
|
18
22
|
- "%-d": Day as a number (1-31) without leading zeros
|
|
19
23
|
- "%Y": Year as a 4-digit number
|
|
20
|
-
{
|
|
21
|
-
{
|
|
22
|
-
{
|
|
23
|
-
{
|
|
24
|
+
{%- endcomment -%}
|
|
25
|
+
{%- if include.date and include.date != "" -%}
|
|
26
|
+
{%- assign m = include.date | date: "%-m" -%}
|
|
27
|
+
{%- assign d = include.date | date: "%-d" -%}
|
|
28
|
+
{%- assign y = include.date | date: "%Y" -%}
|
|
24
29
|
|
|
25
|
-
{
|
|
30
|
+
{%- comment -%}
|
|
26
31
|
Look up the Arabic month name from the site data file:
|
|
27
32
|
- site.data.ar.months is a YAML file containing month names in Arabic
|
|
28
33
|
- The month number (m) is used as the key to retrieve the corresponding Arabic month name
|
|
29
|
-
|
|
30
|
-
{
|
|
34
|
+
- Resilience: If the date cannot be parsed or month key is not found, fallback logic outputs raw `include.date` to prevent build failures.
|
|
35
|
+
{%- endcomment -%}
|
|
36
|
+
{%- assign month_name = site.data.ar.months[m] -%}
|
|
31
37
|
|
|
32
|
-
{
|
|
38
|
+
{%- comment -%}
|
|
33
39
|
Format the date output based on the style parameter:
|
|
34
|
-
- If style is "MDY": Output "Month Day, Year" (e.g., "يناير 15, 2024")
|
|
35
|
-
- Otherwise: Output "Month Year" (e.g., "يناير 2024")
|
|
36
|
-
{
|
|
37
|
-
{
|
|
38
|
-
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
{
|
|
40
|
+
- If style is "MDY": Output "Month Day, Year" (e.g., "يناير 15, 2024") - used for certifications, awards, and birthdates.
|
|
41
|
+
- Otherwise: Output "Month Year" (e.g., "يناير 2024") - used for employment roles, education, and volunteering.
|
|
42
|
+
{%- endcomment -%}
|
|
43
|
+
{%- if month_name -%}
|
|
44
|
+
{%- if include.style == "MDY" -%}
|
|
45
|
+
{{ month_name }} {{ d }}, {{ y }}
|
|
46
|
+
{%- else -%}
|
|
47
|
+
{{ month_name }} {{ y }}
|
|
48
|
+
{%- endif -%}
|
|
49
|
+
{%- else -%}
|
|
50
|
+
{{ include.date }}
|
|
51
|
+
{%- endif -%}
|
|
52
|
+
{%- endif -%}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Include: Reusable Avatar Component
|
|
3
|
+
- Purpose: Render accessible, configurable profile picture.
|
|
4
|
+
- Parameters:
|
|
5
|
+
- lang: Optional language code ('en' | 'ar'). Defaults to page.lang or site.lang or 'en'.
|
|
6
|
+
- link: Optional boolean to override link rendering.
|
|
7
|
+
- class: Optional extra CSS classes.
|
|
8
|
+
{%- endcomment -%}
|
|
9
|
+
|
|
10
|
+
{%- comment -%}
|
|
11
|
+
Language Detection Cascade:
|
|
12
|
+
Resolves language in order of specificity: explicit include parameter -> page front matter -> site default -> 'en'.
|
|
13
|
+
{%- endcomment -%}
|
|
14
|
+
{% assign current_lang = include.lang | default: page.lang | default: site.lang | default: 'en' %}
|
|
15
|
+
|
|
16
|
+
{%- comment -%}
|
|
17
|
+
Image Source Resolution Hierarchy & Subpath Safety:
|
|
18
|
+
1. Priority: site.avatar_url (modern explicit configuration) -> site.avatar (legacy option) -> '/assets/images/Profile-min.jpg' (bundled default).
|
|
19
|
+
2. Subpath Safety: If the avatar path contains '://', it is treated as an absolute external CDN URL and preserved as-is.
|
|
20
|
+
Otherwise, it is piped through Liquid's `relative_url` filter to ensure correct resolution on GitHub Pages sites
|
|
21
|
+
hosted under repository subpaths (e.g. username.github.io/project-name/).
|
|
22
|
+
{%- endcomment -%}
|
|
23
|
+
{% assign avatar_raw = site.avatar_url | default: site.avatar | default: '/assets/images/Profile-min.jpg' %}
|
|
24
|
+
{% if avatar_raw contains "://" %}
|
|
25
|
+
{% assign avatar_src = avatar_raw %}
|
|
26
|
+
{% else %}
|
|
27
|
+
{% assign avatar_src = avatar_raw | relative_url %}
|
|
28
|
+
{% endif %}
|
|
29
|
+
|
|
30
|
+
{%- comment -%}
|
|
31
|
+
Localized Alt Text & Title Resolution:
|
|
32
|
+
Generates meaningful alt text to satisfy WCAG 2.2 non-empty alt text requirements.
|
|
33
|
+
- For Arabic (ar): Constructs full name from `site.name_ar` fields.
|
|
34
|
+
Alt text cascade: site.avatar_alt_ar -> site.avatar_alt -> name_ar -> fallback 'الصورة الشخصية'.
|
|
35
|
+
- For English / Other (en): Constructs full name from `site.name` fields.
|
|
36
|
+
Alt text cascade: site.avatar_alt_en -> site.avatar_alt -> name_en -> fallback 'Profile photo'.
|
|
37
|
+
{%- endcomment -%}
|
|
38
|
+
{% if current_lang == 'ar' %}
|
|
39
|
+
{% capture name_ar %}{{ site.name_ar.first }}{% if site.name_ar.middle %} {{ site.name_ar.middle }}{% endif %}{% if site.name_ar.last %} {{ site.name_ar.last }}{% endif %}{% endcapture %}
|
|
40
|
+
{% assign name_ar = name_ar | strip %}
|
|
41
|
+
{% assign avatar_alt = site.avatar_alt_ar | default: site.avatar_alt | default: name_ar | default: 'الصورة الشخصية' %}
|
|
42
|
+
{% assign link_title = site.title | default: 'الصفحة الرئيسية' %}
|
|
43
|
+
{% else %}
|
|
44
|
+
{% capture name_en %}{{ site.name.first }}{% if site.name.middle %} {{ site.name.middle }}{% endif %}{% if site.name.last %} {{ site.name.last }}{% endif %}{% endcapture %}
|
|
45
|
+
{% assign name_en = name_en | strip %}
|
|
46
|
+
{% assign avatar_alt = site.avatar_alt_en | default: site.avatar_alt | default: name_en | default: 'Profile photo' %}
|
|
47
|
+
{% assign link_title = site.title | default: 'Homepage' %}
|
|
48
|
+
{% endif %}
|
|
49
|
+
|
|
50
|
+
{%- comment -%}
|
|
51
|
+
Hyperlink Wrapping Toggle:
|
|
52
|
+
Defaults to true. Disabling can occur globally via `site.avatar_link: false` or locally via `include.link: false`.
|
|
53
|
+
{%- endcomment -%}
|
|
54
|
+
{% assign render_link = true %}
|
|
55
|
+
{% if site.avatar_link == false or include.link == false %}
|
|
56
|
+
{% assign render_link = false %}
|
|
57
|
+
{% endif %}
|
|
58
|
+
|
|
59
|
+
{%- comment -%}
|
|
60
|
+
Avatar Markup Rendering:
|
|
61
|
+
- If linked: Wraps <img> in <a> with subpath-safe href and tab-nabbing security (rel="noopener" if target != '_self').
|
|
62
|
+
- If unlinked: Renders standalone <img>.
|
|
63
|
+
Both branches include class="no-print" and itemprop="image".
|
|
64
|
+
{%- endcomment -%}
|
|
65
|
+
{% if render_link %}
|
|
66
|
+
{% assign avatar_link_raw = site.avatar_link | default: '/' %}
|
|
67
|
+
{% if avatar_link_raw contains "://" %}
|
|
68
|
+
{% assign avatar_href = avatar_link_raw %}
|
|
69
|
+
{% else %}
|
|
70
|
+
{% assign avatar_href = avatar_link_raw | relative_url %}
|
|
71
|
+
{% endif %}
|
|
72
|
+
{% assign avatar_target = site.avatar_link_target | default: '_self' %}
|
|
73
|
+
|
|
74
|
+
<a href="{{ avatar_href }}" title="{{ link_title }}" class="avatar-link no-print"{% if avatar_target != '_self' %} target="{{ avatar_target }}" rel="noopener"{% endif %}>
|
|
75
|
+
<img src="{{ avatar_src }}" alt="{{ avatar_alt }}" class="avatar no-print{% if include.class %} {{ include.class }}{% endif %}" itemprop="image">
|
|
76
|
+
</a>
|
|
77
|
+
{% else %}
|
|
78
|
+
<img src="{{ avatar_src }}" alt="{{ avatar_alt }}" class="avatar no-print{% if include.class %} {{ include.class }}{% endif %}" itemprop="image">
|
|
79
|
+
{% endif %}
|
|
80
|
+
|
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Component: Dark Mode Toggle Widget
|
|
3
|
+
- Purpose: Provides an accessible, persistent floating toggle button for switching between Light and Dark color themes.
|
|
4
|
+
- Activation Cascade:
|
|
5
|
+
1. Evaluates site-level switches: `site.dark_mode` or `site.resume_dark_mode` (boolean or "enabled").
|
|
6
|
+
2. Applies page-level override if specified in front matter (`page.dark_mode: true/false/enabled`).
|
|
7
|
+
3. Renders button markup and client controller only when enabled.
|
|
8
|
+
- Visual Design: Floating circular action button fixed in the viewport.
|
|
9
|
+
- Print Media: Decorated with `class="no-print"` to ensure it is excluded from printed resumes or PDF generation.
|
|
10
|
+
- CSS Integration: Operates with CSS custom properties defined in `_sass/_dark-mode.scss`.
|
|
11
|
+
{%- endcomment -%}
|
|
12
|
+
|
|
13
|
+
{% assign dark_mode_enabled = false %}
|
|
14
|
+
{% if site.dark_mode == "enabled" or site.dark_mode == true or site.resume_dark_mode == "enabled" or site.resume_dark_mode == true %}
|
|
15
|
+
{% assign dark_mode_enabled = true %}
|
|
16
|
+
{% endif %}
|
|
17
|
+
{% if page.dark_mode == false %}
|
|
18
|
+
{% assign dark_mode_enabled = false %}
|
|
19
|
+
{% elsif page.dark_mode == true or page.dark_mode == "enabled" %}
|
|
20
|
+
{% assign dark_mode_enabled = true %}
|
|
21
|
+
{% endif %}
|
|
22
|
+
|
|
23
|
+
{% if dark_mode_enabled %}
|
|
1
24
|
<!-- Dark Mode Toggle Button (Two-state: System Default vs Pinned Override) -->
|
|
2
25
|
<button
|
|
3
26
|
id="dark-mode-toggle"
|
|
@@ -8,6 +31,12 @@
|
|
|
8
31
|
aria-pressed="false"
|
|
9
32
|
data-pinned="false"
|
|
10
33
|
>
|
|
34
|
+
{%- comment -%}
|
|
35
|
+
Inline SVG Icons:
|
|
36
|
+
- Both icons have `aria-hidden="true"` and `focusable="false"` to prevent assistive technologies
|
|
37
|
+
from announcing raw vector graphics and to keep keyboard focus solely on the parent <button>.
|
|
38
|
+
- Visibility is toggled via CSS selectors based on `data-theme` or system color-scheme preference.
|
|
39
|
+
{%- endcomment -%}
|
|
11
40
|
<!-- Sun Icon: Visible in dark mode / indicates switching to light mode -->
|
|
12
41
|
<svg
|
|
13
42
|
class="dark-mode-icon dark-mode-icon-sun"
|
|
@@ -54,12 +83,23 @@
|
|
|
54
83
|
</button>
|
|
55
84
|
|
|
56
85
|
<script>
|
|
86
|
+
/**
|
|
87
|
+
* Dark Mode Client Controller
|
|
88
|
+
* Encapsulated in an IIFE to prevent polluting the global window namespace.
|
|
89
|
+
*
|
|
90
|
+
* Two-State Logic Architecture:
|
|
91
|
+
* 1. Unpinned (System Default): Follows the OS `prefers-color-scheme`. `localStorage` contains no value.
|
|
92
|
+
* Listens dynamically to OS dark/light mode switches.
|
|
93
|
+
* 2. Pinned (User Override): Explicit user choice saved in `localStorage.setItem('color-scheme', ...)`.
|
|
94
|
+
* Clicking the button when pinned resets the theme back to the system default (clearing localStorage).
|
|
95
|
+
*/
|
|
57
96
|
(function () {
|
|
58
97
|
var toggleBtn = document.getElementById('dark-mode-toggle');
|
|
59
98
|
if (!toggleBtn) return;
|
|
60
99
|
|
|
61
100
|
var metaTheme = document.querySelector('meta[name="color-scheme"]');
|
|
62
101
|
|
|
102
|
+
// Detects user's operating system level theme preference
|
|
63
103
|
function getSystemTheme() {
|
|
64
104
|
if (window.matchMedia) {
|
|
65
105
|
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
@@ -67,6 +107,8 @@
|
|
|
67
107
|
return 'light';
|
|
68
108
|
}
|
|
69
109
|
|
|
110
|
+
// Storage Error Boundary: Accesses localStorage inside try/catch to safely handle
|
|
111
|
+
// private browsing modes (e.g. Safari Private Browsing) or restricted cookie security settings.
|
|
70
112
|
function getSavedTheme() {
|
|
71
113
|
try {
|
|
72
114
|
var val = localStorage.getItem('color-scheme');
|
|
@@ -79,6 +121,7 @@
|
|
|
79
121
|
}
|
|
80
122
|
}
|
|
81
123
|
|
|
124
|
+
// Determines if current page layout is Arabic / Right-to-Left
|
|
82
125
|
function isArabicRTL() {
|
|
83
126
|
var docEl = document.documentElement;
|
|
84
127
|
var dir = docEl.getAttribute('dir');
|
|
@@ -86,6 +129,7 @@
|
|
|
86
129
|
return dir === 'rtl' || lang === 'ar';
|
|
87
130
|
}
|
|
88
131
|
|
|
132
|
+
// Synchronizes data attributes on <html> and <meta name="color-scheme">
|
|
89
133
|
function syncState() {
|
|
90
134
|
var saved = getSavedTheme();
|
|
91
135
|
if (saved !== null) {
|
|
@@ -103,6 +147,7 @@
|
|
|
103
147
|
}
|
|
104
148
|
}
|
|
105
149
|
|
|
150
|
+
// Updates ARIA accessibility attributes, data-pinned status, and localized tooltips
|
|
106
151
|
function updateUI() {
|
|
107
152
|
var saved = getSavedTheme();
|
|
108
153
|
var isPinned = (saved !== null);
|
|
@@ -114,6 +159,7 @@
|
|
|
114
159
|
toggleBtn.setAttribute('aria-pressed', isPinned ? 'true' : 'false');
|
|
115
160
|
toggleBtn.setAttribute('data-current-theme', effectiveTheme);
|
|
116
161
|
|
|
162
|
+
// Localized screen-reader announcements and tooltip titles
|
|
117
163
|
if (isPinned) {
|
|
118
164
|
label = isRTL
|
|
119
165
|
? 'إعادة ضبط المظهر إلى الوضع التلقائي للنظام'
|
|
@@ -135,6 +181,7 @@
|
|
|
135
181
|
toggleBtn.setAttribute('title', label);
|
|
136
182
|
}
|
|
137
183
|
|
|
184
|
+
// Toggles theme state: cycles between user-pinned override and system default
|
|
138
185
|
function toggleTheme() {
|
|
139
186
|
var saved = getSavedTheme();
|
|
140
187
|
if (saved !== null) {
|
|
@@ -157,6 +204,7 @@
|
|
|
157
204
|
|
|
158
205
|
toggleBtn.addEventListener('click', toggleTheme);
|
|
159
206
|
|
|
207
|
+
// Reactive System Theme Listener: Adapts UI in real-time when OS theme changes (if unpinned)
|
|
160
208
|
if (window.matchMedia) {
|
|
161
209
|
var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
162
210
|
var mqListener = function () {
|
|
@@ -171,7 +219,10 @@
|
|
|
171
219
|
}
|
|
172
220
|
}
|
|
173
221
|
|
|
222
|
+
// Initial hydration on page load
|
|
174
223
|
syncState();
|
|
175
224
|
updateUI();
|
|
176
225
|
})();
|
|
177
226
|
</script>
|
|
227
|
+
{% endif %}
|
|
228
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
================================================================================
|
|
3
|
+
DYNAMIC DATA LOADER HELPER (_includes/data-loader.html)
|
|
4
|
+
================================================================================
|
|
5
|
+
PURPOSE:
|
|
6
|
+
Dynamically resolves the root data object (`resume_data`) for the current layout
|
|
7
|
+
by traversing nested YAML folders in `_data/` based on a dot-separated path.
|
|
8
|
+
|
|
9
|
+
HOW IT WORKS:
|
|
10
|
+
1. Default Assignment:
|
|
11
|
+
Starts with top-level `site.data`. If no custom subpath is configured,
|
|
12
|
+
the template reads directly from root YAML files (e.g. `_data/experience.yml`).
|
|
13
|
+
|
|
14
|
+
2. Subpath Splitting (`split: '.'`):
|
|
15
|
+
Breaks dot-separated strings into array segments.
|
|
16
|
+
Example: "2025-06.20250621-PM" -> ["2025-06", "20250621-PM"]
|
|
17
|
+
Example: "en" -> ["en"]
|
|
18
|
+
|
|
19
|
+
3. Recursive Bracket Notation (`resume_data[part]`):
|
|
20
|
+
Liquid dot notation (site.data.2025-06) breaks on numbers and hyphens.
|
|
21
|
+
Bracket notation safely accesses arbitrary string keys at any nesting depth:
|
|
22
|
+
- Level 1: site.data["2025-06"]
|
|
23
|
+
- Level 2: site.data["2025-06"]["20250621-PM"]
|
|
24
|
+
|
|
25
|
+
PARAMETERS:
|
|
26
|
+
- `path` (String, Optional): The dot-path string to resolve (e.g. "en", "ar", "2025-06.v1").
|
|
27
|
+
Defaults to `site.active_resume_path_en` if omitted.
|
|
28
|
+
|
|
29
|
+
OUTPUT:
|
|
30
|
+
- Sets the global template variable `resume_data` in the calling layout context.
|
|
31
|
+
================================================================================
|
|
32
|
+
{%- endcomment -%}
|
|
33
|
+
{%- assign data_path = include.path | default: site.active_resume_path_en -%}
|
|
34
|
+
{%- assign resume_data = site.data -%}
|
|
35
|
+
|
|
36
|
+
{%- if data_path != blank -%}
|
|
37
|
+
{%- assign path_parts = data_path | split: '.' -%}
|
|
38
|
+
{%- for part in path_parts -%}
|
|
39
|
+
{%- assign resume_data = resume_data[part] -%}
|
|
40
|
+
{%- endfor -%}
|
|
41
|
+
{%- endif -%}
|
data/_includes/hreflang.html
CHANGED
|
@@ -4,6 +4,18 @@ START: HREFLANG TAGS FOR MULTILINGUAL SEO
|
|
|
4
4
|
This logic generates the <link rel="alternate"> tags that tell
|
|
5
5
|
search engines about the different language versions of this page.
|
|
6
6
|
It only runs if a 't_id' (Translation ID) is set in the page's front matter.
|
|
7
|
+
|
|
8
|
+
WHY THIS MATTERS:
|
|
9
|
+
Search engines (Google, Bing, Yandex) require bidirectional hreflang links across
|
|
10
|
+
all localized versions of equivalent content to prevent duplicate content penalties
|
|
11
|
+
and to direct international visitors to the correct regional/language variant.
|
|
12
|
+
|
|
13
|
+
HOW IT WORKS:
|
|
14
|
+
- Pages representing the same document in different languages (e.g. English and Arabic CVs)
|
|
15
|
+
share an identical `t_id` identifier in front matter.
|
|
16
|
+
- site.pages is queried to locate all translation peers.
|
|
17
|
+
- Absolute URLs are required by RFC 8288 and Google Search Console standards.
|
|
18
|
+
- The 'x-default' fallback is explicitly mapped to the English edition for unmatched locales.
|
|
7
19
|
==================================================================
|
|
8
20
|
{% endcomment %}
|
|
9
21
|
{% if page.t_id %}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Include: Reusable Bilingual Language Switcher Component (Feature 1.2)
|
|
3
|
+
- Purpose: Floating pill button that toggles between the English and Arabic resume.
|
|
4
|
+
- Positioning: Fixed top-left (LTR layouts) / top-right (RTL layouts); mirrors the dark-mode toggle.
|
|
5
|
+
- Link Resolution (two-tier):
|
|
6
|
+
1. Discovers the counterpart page via page.t_id + lang match (site.pages).
|
|
7
|
+
2. Falls back to site.resume_en_url / site.resume_ar_url from _config.yml.
|
|
8
|
+
- Accessibility: Localized aria-label + title, visible focus ring (WCAG 2.2 AA).
|
|
9
|
+
- Print Safety: Decorated with class="no-print" — hidden on printed resume sheets.
|
|
10
|
+
- Toggle: Disabled via site.resume_language_switcher: false in _config.yml.
|
|
11
|
+
{%- endcomment -%}
|
|
12
|
+
|
|
13
|
+
{% if site.resume_language_switcher != false and page.language_switcher != false and page.layout != 'error' %}
|
|
14
|
+
{%- comment -%} Determine the current and target language {%- endcomment -%}
|
|
15
|
+
{% assign current_lang = page.lang | default: site.lang | default: 'en' %}
|
|
16
|
+
{% assign target_lang = 'ar' %}
|
|
17
|
+
{% if current_lang == 'ar' %}
|
|
18
|
+
{% assign target_lang = 'en' %}
|
|
19
|
+
{% endif %}
|
|
20
|
+
|
|
21
|
+
{%- comment -%}
|
|
22
|
+
TIER 1: Auto-discover counterpart page by matching page.t_id + target language.
|
|
23
|
+
Both pages must have the same t_id value in their front matter (e.g., t_id: cv-main).
|
|
24
|
+
{%- endcomment -%}
|
|
25
|
+
{% assign target_url = nil %}
|
|
26
|
+
{% if page.t_id %}
|
|
27
|
+
{% assign matched_page = site.pages | where: "t_id", page.t_id | where: "lang", target_lang | first %}
|
|
28
|
+
{% if matched_page %}
|
|
29
|
+
{% assign target_url = matched_page.url | relative_url %}
|
|
30
|
+
{% endif %}
|
|
31
|
+
{% endif %}
|
|
32
|
+
|
|
33
|
+
{%- comment -%}
|
|
34
|
+
TIER 2: Fall back to config-defined URLs if t_id match was not found.
|
|
35
|
+
{%- endcomment -%}
|
|
36
|
+
{% unless target_url %}
|
|
37
|
+
{% if current_lang == 'ar' %}
|
|
38
|
+
{% assign target_url = site.resume_en_url | default: '/en/cv/' | relative_url %}
|
|
39
|
+
{% else %}
|
|
40
|
+
{% assign target_url = site.resume_ar_url | default: '/ar/cv/' | relative_url %}
|
|
41
|
+
{% endif %}
|
|
42
|
+
{% endunless %}
|
|
43
|
+
|
|
44
|
+
{%- comment -%} Derive accessible labels and visible text based on direction {%- endcomment -%}
|
|
45
|
+
{% if current_lang == 'ar' %}
|
|
46
|
+
{% assign switcher_label = 'Switch language to English' %}
|
|
47
|
+
{% assign switcher_title = 'English' %}
|
|
48
|
+
{% assign switcher_short_text = 'EN' %}
|
|
49
|
+
{% else %}
|
|
50
|
+
{% assign switcher_label = 'التحويل إلى اللغة العربية' %}
|
|
51
|
+
{% assign switcher_title = 'العربية' %}
|
|
52
|
+
{% assign switcher_short_text = 'عربي' %}
|
|
53
|
+
{% endif %}
|
|
54
|
+
|
|
55
|
+
<div class="language-switcher no-print" role="navigation" aria-label="Language Selector">
|
|
56
|
+
<a href="{{ target_url }}"
|
|
57
|
+
class="lang-switch-btn"
|
|
58
|
+
aria-label="{{ switcher_label }}"
|
|
59
|
+
title="{{ switcher_title }}">
|
|
60
|
+
<span class="lang-icon" aria-hidden="true">🌐</span>
|
|
61
|
+
<span class="lang-label-target">{{ switcher_short_text }}</span>
|
|
62
|
+
</a>
|
|
63
|
+
</div>
|
|
64
|
+
{% endif %}
|
data/_includes/main-head.html
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Main Site Head Include
|
|
3
|
+
- Loaded by: `_layouts/default.html` and `_layouts/error.html`.
|
|
4
|
+
- Stylesheet: Links the compiled generic site and error page stylesheet `assets/css/main.css`.
|
|
5
|
+
{%- endcomment -%}
|
|
1
6
|
<!--Stylesheet-->
|
|
2
7
|
<link rel="stylesheet" type="text/css" href="{{ 'assets/css/main.css' | relative_url }}">
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Component: Print-Only Social & Contact Links
|
|
3
|
+
- Purpose: Renders full plaintext URLs for physical paper printouts and PDF exports
|
|
4
|
+
where clickable icon-only links cannot be followed.
|
|
5
|
+
- Direction & Localization: Detects Arabic context via layout or lang variables and
|
|
6
|
+
renders bilingual platform labels.
|
|
7
|
+
- Bidi Protection: Every URL is wrapped in `<span dir="ltr">` to ensure web addresses,
|
|
8
|
+
slashes, and domain names are never reversed or scrambled in an RTL reading context.
|
|
9
|
+
{%- endcomment -%}
|
|
1
10
|
<!-- and guess where these are defined? Yup, you guessed it: the _config.yml file -->
|
|
2
11
|
{% if site.resume_print_social_links %}
|
|
12
|
+
{%- comment -%} Determine whether current page context is Arabic to localize platform labels {%- endcomment -%}
|
|
3
13
|
{% assign is_ar = false %}
|
|
4
14
|
{% if page.layout == "resume-ar" or page.lang == "ar" or page.language == "ar" or layout.lang == "ar" %}
|
|
5
15
|
{% assign is_ar = true %}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Profile Landing Page Head Include
|
|
3
|
+
- Loaded by: `_layouts/profile.html`.
|
|
4
|
+
- Stylesheet: Links the compiled profile portfolio stylesheet `assets/css/profile.css`.
|
|
5
|
+
{%- endcomment -%}
|
|
6
|
+
<!-- Profile Stylesheet -->
|
|
7
|
+
<link rel="stylesheet" type="text/css" href="{{ 'assets/css/profile.css' | relative_url }}">
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
Arabic Resume Head Include
|
|
3
|
+
- Loaded by: `_layouts/resume-ar.html` inside the HTML <head>.
|
|
4
|
+
- Typography Resolution:
|
|
5
|
+
1. Custom Font: If `site.font_ar_url` is defined, links the custom font stylesheet.
|
|
6
|
+
2. Google Fonts (Cairo): Unless disabled via `site.disable_google_fonts` or `site.resume_theme == 'no-custom-fonts'`,
|
|
7
|
+
links the Cairo Arabic typeface with `preconnect` resource hints for faster DNS resolution and TLS handshake.
|
|
8
|
+
- Stylesheet: Links the compiled Arabic RTL stylesheet `assets/css/cv-ar.css` via `relative_url`.
|
|
9
|
+
- Multilingual SEO: Includes `_includes/hreflang.html` for bidirectional search engine indexing.
|
|
10
|
+
{%- endcomment -%}
|
|
1
11
|
{% if site.font_ar_url %}
|
|
2
12
|
<!-- Custom Arabic Font Stylesheet -->
|
|
3
13
|
<link rel="stylesheet" href="{{ site.font_ar_url | relative_url }}">
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
English Resume Head Include
|
|
3
|
+
- Loaded by: `_layouts/resume-en.html` inside the HTML <head>.
|
|
4
|
+
- Typography: Injects Google Web Fonts for Lora (serif headings) and Open Sans (sans-serif body).
|
|
5
|
+
- Stylesheet: Links the compiled English LTR stylesheet `assets/css/cv.css` using `relative_url` for subpath safety.
|
|
6
|
+
- Multilingual SEO: Includes `_includes/hreflang.html` to output alternate language annotations for search engines.
|
|
7
|
+
{%- endcomment -%}
|
|
1
8
|
<!-- Google font typography settings - defined in _config.yml -->
|
|
2
9
|
<link href='https://fonts.googleapis.com/css?family=Lora:400,700%7COpen+Sans:400,300,800,700' rel='stylesheet' type='text/css'>
|
|
3
10
|
|