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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00d980490bbad955afa894d864e4379a65a6f39f371d97a6db9d1808785ccaed
4
- data.tar.gz: b5c302a20cb5d88382151575fdb376b870969a4067d401da907cb2608f76ed3b
3
+ metadata.gz: e8fb9be1096f1c150e9d04dade9091453ad65aee770b47550fa2fd234e4f4960
4
+ data.tar.gz: 3e2b21e42d72f16e81d6a066a24834f031acf548a0b96edd744131d255a2abcb
5
5
  SHA512:
6
- metadata.gz: 35046ae1202cd6e65a03d90313cb6dbf2ebecff360f4d1f4183a413b02b7b0da17df223b8066133ea90f3e44d5596dfb9ea2f6834ab981afa73d2165c53f480d
7
- data.tar.gz: ab8eb568a6ca00d51c040c2282efdfddb2dc3a29634f706e6b7d9cf96e08f49b069ceddb9c83d11f2582a5fcea9ca2d978674521aa866c9ed14281630c196135
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 list of links to every other configured language's resume.
4
- - Positioning: Fixed top-left (LTR layouts) / top-right (RTL layouts); mirrors the dark-mode toggle.
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: Each link is labelled with its own locale's ui.language_name; the group
9
- wrapper is labelled with the current page's own locale ui.language_switcher string.
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
- <div class="language-switcher no-print" role="navigation" aria-label="{{ current_locale.ui.language_switcher }}">
19
- {%- comment -%}
20
- IMPORTANT: {% include %} shares Liquid variable scope with its caller (resume.html),
21
- so every variable assigned in this loop body must use a switch_-prefixed name that
22
- cannot collide with resume.html's own lang/locale/lang_cfg - otherwise the last loop
23
- iteration's values would silently leak out and corrupt the rest of the caller's render.
24
- {%- endcomment -%}
25
- {% for switch_entry in site.languages %}
26
- {%- assign switch_lang = switch_entry[0] -%}
27
- {%- assign switch_lang_cfg = switch_entry[1] -%}
28
- {%- if switch_lang != current_lang -%}
29
- {%- assign switch_locale = site.data.locales[switch_lang] -%}
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
- {%- comment -%}
32
- TIER 1: Auto-discover counterpart page by matching page.t_id + target language.
33
- Both pages must have the same t_id value in their front matter (e.g., t_id: cv-main).
34
- {%- endcomment -%}
35
- {%- assign switch_url = nil -%}
36
- {%- if page.t_id -%}
37
- {%- assign switch_matched_page = site.pages | where: "t_id", page.t_id | where: "lang", switch_lang | first -%}
38
- {%- if switch_matched_page -%}
39
- {%- assign switch_url = switch_matched_page.url | relative_url -%}
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
- {%- comment -%}
44
- TIER 2: Fall back to languages.<lang>.url from _config.yml.
45
- {%- endcomment -%}
46
- {%- unless switch_url -%}
47
- {%- assign switch_url = switch_lang_cfg.url | relative_url -%}
48
- {%- endunless -%}
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
- <a href="{{ switch_url }}"
51
- class="lang-switch-btn"
52
- aria-label="{{ switch_locale.ui.language_name }}"
53
- title="{{ switch_locale.ui.language_name }}"
54
- dir="{{ switch_locale.direction }}">
55
- <span class="lang-icon" aria-hidden="true">🌐</span>
56
- <span class="lang-label-target">{{ switch_locale.ui.language_name }}</span>
57
- </a>
58
- {%- endif -%}
59
- {% endfor %}
60
- </div>
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 %}
@@ -385,11 +385,3 @@ html.light {
385
385
  }
386
386
  }
387
387
 
388
- // RTL layout positioning
389
- // Repositions the toggle button to the top-left corner in Arabic layouts.
390
- html[dir="rtl"] {
391
- .dark-mode-toggle {
392
- right: auto;
393
- left: 1.25rem;
394
- }
395
- }
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
- // Floating pill button fixed to the top-left viewport corner in LTR layouts.
90
- // RTL coordinate flip is handled in _resume-rtl.scss for resume pages and
91
- // the html[dir="rtl"] block below for other layouts.
92
- // Mirrors the visual language of .dark-mode-toggle (same shadow and transition).
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
- .lang-switch-btn {
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 {
@@ -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
  }
@@ -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">`| `role="navigation"` | Language Switcher | Floating bilingual language selector |
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
  ---
@@ -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`. The group's `aria-label` is the current locale's `ui.language_switcher`.
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
- - Positioned opposite the dark mode toggle and mirrored in RTL. Hidden in print.
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`
@@ -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 links to every other configured language
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bilingual-jekyll-resume-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Khaldoon Mutahar