bilingual-jekyll-resume-theme 1.0.0 → 1.0.1
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.
Potentially problematic release.
This version of bilingual-jekyll-resume-theme might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/_includes/language-switcher.html +55 -44
- data/_sass/_dark-mode.scss +0 -8
- data/_sass/_layout.scss +53 -14
- data/_sass/_resume-rtl.scss +0 -14
- data/docs/ACCESSIBILITY_GUIDE.md +1 -1
- data/docs/INCLUDES_GUIDE.md +2 -2
- data/docs/PROJECT_OVERVIEW.md +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e8fb9be1096f1c150e9d04dade9091453ad65aee770b47550fa2fd234e4f4960
|
|
4
|
+
data.tar.gz: 3e2b21e42d72f16e81d6a066a24834f031acf548a0b96edd744131d255a2abcb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57375b0522accc404a40ca9082d836b4accb27c73b36890a97cbb9e4c5647da2e7d55942da194adc3bb35be30f77443148d34944ea9dbbe3e455402e6f21a595
|
|
7
|
+
data.tar.gz: 25c4703f7327853e8c011505837f714ac5f88d5070af3375bff2a509b2cbeee044b31877def62b503db70b6ea6486262da356600e6b92a8cc28e25561c5bb4ce
|
data/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@ 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
|
+
## [1.0.1] - 2026-09-24
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
* Replace language-switcher button row with a dropdown ([`f37c6f6`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/f37c6f6b410f5de4841ed36115db60408c805293))
|
|
11
|
+
|
|
12
|
+
* Pin language-switcher/dark-mode-toggle to fixed corners ([`305408c`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/305408c8885c194ad71d88831179b287d4a10ec3))
|
|
13
|
+
|
|
7
14
|
## [1.0.0] - 2026-09-24
|
|
8
15
|
|
|
9
16
|
### Added
|
|
@@ -350,6 +357,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
350
357
|
|
|
351
358
|
* Initial commit (New Theme Template) ([`00af662`](https://github.com/kmutahar/bilingual-jekyll-resume-theme/commit/00af6628dfec7aefe0ef7d7083bf98c9713a5ffd))
|
|
352
359
|
|
|
360
|
+
[1.0.1]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v1.0.0...v1.0.1
|
|
353
361
|
[1.0.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.9.0...v1.0.0
|
|
354
362
|
[0.9.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.8.0...v0.9.0
|
|
355
363
|
[0.8.0]: https://github.com/kmutahar/bilingual-jekyll-resume-theme/compare/v0.7.0...v0.8.0
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
{%- comment -%}
|
|
2
|
-
Include: Reusable Multilingual Language Switcher Component (Feature 1.2)
|
|
3
|
-
- Purpose: Floating
|
|
4
|
-
- Positioning: Fixed top-left
|
|
2
|
+
Include: Reusable Multilingual Language Switcher Component (Feature 1.2; dropdown redesign Feature 2.12)
|
|
3
|
+
- Purpose: Floating dropdown listing links to every other configured language's resume.
|
|
4
|
+
- Positioning: Fixed top-left viewport corner (see _sass/_layout.scss).
|
|
5
|
+
- Markup: Native <details>/<summary> disclosure — zero JavaScript, full keyboard support
|
|
6
|
+
(Enter/Space toggles the panel open and closed; browsers do not natively close it on Esc
|
|
7
|
+
or outside click, matching plain <details> behavior everywhere else). Scales to any number
|
|
8
|
+
of configured languages without growing a row of buttons.
|
|
5
9
|
- Link Resolution (two-tier), per target language:
|
|
6
10
|
1. Discovers the counterpart page via page.t_id + lang match (site.pages).
|
|
7
11
|
2. Falls back to languages.<lang>.url from _config.yml.
|
|
8
|
-
- Accessibility:
|
|
9
|
-
|
|
12
|
+
- Accessibility: The trigger's visible text is the current locale's ui.language_switcher
|
|
13
|
+
string. The panel is a <nav> landmark labelled with the same string. Each link is labelled
|
|
14
|
+
with its own locale's ui.language_name.
|
|
10
15
|
- Print Safety: Decorated with class="no-print" — hidden on printed resume sheets.
|
|
11
16
|
- Toggle: Disabled via site.resume_language_switcher: false in _config.yml.
|
|
12
17
|
{%- endcomment -%}
|
|
@@ -15,47 +20,53 @@ Include: Reusable Multilingual Language Switcher Component (Feature 1.2)
|
|
|
15
20
|
{%- assign current_lang = page.lang | default: site.default_lang | default: 'en' -%}
|
|
16
21
|
{%- assign current_locale = site.data.locales[current_lang] | default: site.data.locales[site.default_lang] -%}
|
|
17
22
|
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
<details class="language-switcher no-print">
|
|
24
|
+
<summary class="language-switcher-trigger">
|
|
25
|
+
<span class="lang-icon" aria-hidden="true">🌐</span>
|
|
26
|
+
<span class="language-switcher-label">{{ current_locale.ui.language_switcher }}</span>
|
|
27
|
+
</summary>
|
|
28
|
+
<nav class="language-switcher-panel" aria-label="{{ current_locale.ui.language_switcher }}">
|
|
29
|
+
{%- comment -%}
|
|
30
|
+
IMPORTANT: {% include %} shares Liquid variable scope with its caller (resume.html),
|
|
31
|
+
so every variable assigned in this loop body must use a switch_-prefixed name that
|
|
32
|
+
cannot collide with resume.html's own lang/locale/lang_cfg - otherwise the last loop
|
|
33
|
+
iteration's values would silently leak out and corrupt the rest of the caller's render.
|
|
34
|
+
{%- endcomment -%}
|
|
35
|
+
{% for switch_entry in site.languages %}
|
|
36
|
+
{%- assign switch_lang = switch_entry[0] -%}
|
|
37
|
+
{%- assign switch_lang_cfg = switch_entry[1] -%}
|
|
38
|
+
{%- if switch_lang != current_lang -%}
|
|
39
|
+
{%- assign switch_locale = site.data.locales[switch_lang] -%}
|
|
30
40
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
{%- comment -%}
|
|
42
|
+
TIER 1: Auto-discover counterpart page by matching page.t_id + target language.
|
|
43
|
+
Both pages must have the same t_id value in their front matter (e.g., t_id: cv-main).
|
|
44
|
+
{%- endcomment -%}
|
|
45
|
+
{%- assign switch_url = nil -%}
|
|
46
|
+
{%- if page.t_id -%}
|
|
47
|
+
{%- assign switch_matched_page = site.pages | where: "t_id", page.t_id | where: "lang", switch_lang | first -%}
|
|
48
|
+
{%- if switch_matched_page -%}
|
|
49
|
+
{%- assign switch_url = switch_matched_page.url | relative_url -%}
|
|
50
|
+
{%- endif -%}
|
|
40
51
|
{%- endif -%}
|
|
41
|
-
{%- endif -%}
|
|
42
52
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
{%- comment -%}
|
|
54
|
+
TIER 2: Fall back to languages.<lang>.url from _config.yml.
|
|
55
|
+
{%- endcomment -%}
|
|
56
|
+
{%- unless switch_url -%}
|
|
57
|
+
{%- assign switch_url = switch_lang_cfg.url | relative_url -%}
|
|
58
|
+
{%- endunless -%}
|
|
49
59
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
<a href="{{ switch_url }}"
|
|
61
|
+
class="lang-switch-btn"
|
|
62
|
+
aria-label="{{ switch_locale.ui.language_name }}"
|
|
63
|
+
title="{{ switch_locale.ui.language_name }}"
|
|
64
|
+
dir="{{ switch_locale.direction }}">
|
|
65
|
+
<span class="lang-icon" aria-hidden="true">🌐</span>
|
|
66
|
+
<span class="lang-label-target">{{ switch_locale.ui.language_name }}</span>
|
|
67
|
+
</a>
|
|
68
|
+
{%- endif -%}
|
|
69
|
+
{% endfor %}
|
|
70
|
+
</nav>
|
|
71
|
+
</details>
|
|
61
72
|
{% endif %}
|
data/_sass/_dark-mode.scss
CHANGED
data/_sass/_layout.scss
CHANGED
|
@@ -84,12 +84,12 @@
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
// --------------------------------------------------------------------------
|
|
87
|
-
// Language Switcher Component (Feature 1.2)
|
|
87
|
+
// Language Switcher Component (Feature 1.2; dropdown redesign Feature 2.12)
|
|
88
88
|
// --------------------------------------------------------------------------
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
89
|
+
// <details>/<summary> disclosure fixed to the top-left viewport corner.
|
|
90
|
+
// The trigger (.language-switcher-trigger) mirrors the visual language of
|
|
91
|
+
// .dark-mode-toggle (same pill shape, shadow, and transition); the opened
|
|
92
|
+
// panel (.language-switcher-panel) lists every other configured language.
|
|
93
93
|
// --------------------------------------------------------------------------
|
|
94
94
|
|
|
95
95
|
.language-switcher {
|
|
@@ -98,7 +98,9 @@
|
|
|
98
98
|
left: 1.25rem;
|
|
99
99
|
z-index: 1000;
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
// <summary> gets a default disclosure marker in most browsers; suppress it since the
|
|
102
|
+
// trigger already renders its own icon + label.
|
|
103
|
+
.language-switcher-trigger {
|
|
102
104
|
display: inline-flex;
|
|
103
105
|
align-items: center;
|
|
104
106
|
justify-content: center;
|
|
@@ -109,12 +111,18 @@
|
|
|
109
111
|
color: var(--text-color, #333333);
|
|
110
112
|
border: 1px solid var(--toggle-btn-border, #e0e0e0);
|
|
111
113
|
border-radius: 9999px;
|
|
114
|
+
cursor: pointer;
|
|
115
|
+
list-style: none;
|
|
112
116
|
text-decoration: none;
|
|
113
117
|
font-size: 0.85rem;
|
|
114
118
|
font-weight: 700;
|
|
115
119
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
116
120
|
transition: background-color 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
|
|
117
121
|
|
|
122
|
+
&::-webkit-details-marker {
|
|
123
|
+
display: none;
|
|
124
|
+
}
|
|
125
|
+
|
|
118
126
|
&:hover {
|
|
119
127
|
background-color: var(--toggle-btn-hover-bg, #f5f5f5);
|
|
120
128
|
border-color: var(--accent-color, #007acc);
|
|
@@ -127,6 +135,45 @@
|
|
|
127
135
|
}
|
|
128
136
|
}
|
|
129
137
|
|
|
138
|
+
&[open] .language-switcher-trigger {
|
|
139
|
+
border-color: var(--accent-color, #007acc);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.language-switcher-panel {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
gap: 0.25rem;
|
|
146
|
+
min-width: 10rem;
|
|
147
|
+
margin-top: 0.5rem;
|
|
148
|
+
padding: 0.5rem;
|
|
149
|
+
background: var(--bg-color, #ffffff);
|
|
150
|
+
border: 1px solid var(--toggle-btn-border, #e0e0e0);
|
|
151
|
+
border-radius: 0.75rem;
|
|
152
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.lang-switch-btn {
|
|
156
|
+
display: inline-flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
gap: 0.5rem;
|
|
159
|
+
padding: 0.5rem 0.75rem;
|
|
160
|
+
color: var(--text-color, #333333);
|
|
161
|
+
text-decoration: none;
|
|
162
|
+
font-size: 0.85rem;
|
|
163
|
+
font-weight: 600;
|
|
164
|
+
border-radius: 0.5rem;
|
|
165
|
+
transition: background-color 0.2s ease;
|
|
166
|
+
|
|
167
|
+
&:hover {
|
|
168
|
+
background-color: var(--toggle-btn-hover-bg, #f5f5f5);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
&:focus-visible {
|
|
172
|
+
outline: 2px solid var(--accent-color, #007acc);
|
|
173
|
+
outline-offset: 2px;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
130
177
|
.lang-icon {
|
|
131
178
|
font-size: 1rem;
|
|
132
179
|
line-height: 1;
|
|
@@ -137,14 +184,6 @@
|
|
|
137
184
|
}
|
|
138
185
|
}
|
|
139
186
|
|
|
140
|
-
// RTL: mirror switcher to top-right (dark-mode toggle auto-mirrors to top-left)
|
|
141
|
-
html[dir="rtl"] {
|
|
142
|
-
.language-switcher {
|
|
143
|
-
left: auto;
|
|
144
|
-
right: 1.25rem;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
187
|
// Print: explicit safety net — .no-print on the element already handles most cases
|
|
149
188
|
@media print {
|
|
150
189
|
.language-switcher {
|
data/_sass/_resume-rtl.scss
CHANGED
|
@@ -91,18 +91,4 @@ html[dir="rtl"] {
|
|
|
91
91
|
.page-footer {
|
|
92
92
|
text-align: center; // keep centered
|
|
93
93
|
}
|
|
94
|
-
|
|
95
|
-
// Dark mode toggle positioning for RTL
|
|
96
|
-
// Mirrors the floating theme switcher from top-right to top-left (left: 1.25rem; right: auto)
|
|
97
|
-
// to avoid colliding with right-aligned Arabic header titles.
|
|
98
|
-
.dark-mode-toggle {
|
|
99
|
-
right: auto;
|
|
100
|
-
left: 1.25rem;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Language switcher positioning for RTL
|
|
104
|
-
.language-switcher {
|
|
105
|
-
left: auto;
|
|
106
|
-
right: 1.25rem;
|
|
107
|
-
}
|
|
108
94
|
}
|
data/docs/ACCESSIBILITY_GUIDE.md
CHANGED
|
@@ -37,7 +37,7 @@ All theme layouts define explicit ARIA landmark roles alongside semantic HTML5 e
|
|
|
37
37
|
| `<header class="page-header">` | `role="banner"` | Page Header | Houses candidate name, title, avatar, and contact bar |
|
|
38
38
|
| `<main class="main-content">` | `role="main"` | `id="main-content"` `tabindex="-1"` | Primary content container target of skip-to-content links |
|
|
39
39
|
| `<footer class="page-footer">` | `role="contentinfo"` | Page Footer | Generation timestamp, copyright, and permalink |
|
|
40
|
-
| `<nav class="language-switcher"
|
|
40
|
+
| `<details class="language-switcher">` → `<nav class="language-switcher-panel">` | native disclosure + `role="navigation"` (implicit on `<nav>`) | Language Switcher | Floating dropdown language selector, zero JavaScript |
|
|
41
41
|
| `<form class="error-search">` | `role="search"` | Search Form | Search interface on error pages |
|
|
42
42
|
|
|
43
43
|
---
|
data/docs/INCLUDES_GUIDE.md
CHANGED
|
@@ -91,9 +91,9 @@ _layouts/resume.html
|
|
|
91
91
|
### 5. `language-switcher.html`
|
|
92
92
|
|
|
93
93
|
- **Consumed by:** `resume.html`, `default.html`, `profile.html`. Hidden on `layout: error` pages, when `site.resume_language_switcher: false`, or when front matter sets `language_switcher: false`.
|
|
94
|
-
- Renders one link for every entry in `site.languages` except the current one, labelled with the target locale's `ui.language_name`.
|
|
94
|
+
- Renders as a `<details class="language-switcher">`/`<summary class="language-switcher-trigger">` disclosure — zero JavaScript. The trigger's visible label is the current locale's `ui.language_switcher`; opening it reveals a `<nav class="language-switcher-panel">` with one link for every entry in `site.languages` except the current one, each labelled with the target locale's `ui.language_name`.
|
|
95
95
|
- **Link resolution per target language:** the page in `site.pages` with the same `t_id` and the target `lang`; otherwise `languages.<lang>.url`.
|
|
96
|
-
-
|
|
96
|
+
- Fixed top-left in every locale, LTR and RTL alike (the dark mode toggle is fixed top-right); positions no longer mirror by direction. Hidden in print.
|
|
97
97
|
- Loop variables are prefixed `switch_` because includes share the caller's Liquid scope; unprefixed names would overwrite `resume.html`'s `lang` and `locale`.
|
|
98
98
|
|
|
99
99
|
### 6. `date-formatter.html`
|
data/docs/PROJECT_OVERVIEW.md
CHANGED
|
@@ -87,7 +87,7 @@ bilingual-jekyll-resume-theme/
|
|
|
87
87
|
│ ├── profile-head.html # Stylesheet for the profile page (profile.css)
|
|
88
88
|
│ ├── avatar.html # Profile picture
|
|
89
89
|
│ ├── dark-mode-toggle.html # Floating theme toggle
|
|
90
|
-
│ ├── language-switcher.html # Floating
|
|
90
|
+
│ ├── language-switcher.html # Floating dropdown linking to every other configured language
|
|
91
91
|
│ ├── social-links.html # Social icons (email + 14 platforms)
|
|
92
92
|
│ ├── print-social-links.html # Print-only social links text list
|
|
93
93
|
│ ├── hreflang.html # Alternate-language SEO links
|