From b587c1bcb659e9866515fcb954b53e77178d7859 Mon Sep 17 00:00:00 2001 From: Dale Kunce Date: Fri, 3 Oct 2025 07:12:40 -0400 Subject: [PATCH 01/12] fix: Implement mobile navigation menu functionality - Add mobile-menu.js with touch/click event handling for mobile devices - Replace CSS-only hover behavior with JavaScript-based menu toggle - Add touch-friendly styling with proper cursor and tap highlight removal - Implement menu auto-close on outside click, escape key, and window resize - Ensure mobile menu works properly on devices where hover doesn't function - Mobile menu activates at screen width < 650px as per existing breakpoints --- app/assets/scripts/mobile-menu.js | 54 +++++++++++++++++++++++++++++++ app/assets/styles/_base.scss | 9 ++++-- 2 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 app/assets/scripts/mobile-menu.js diff --git a/app/assets/scripts/mobile-menu.js b/app/assets/scripts/mobile-menu.js new file mode 100644 index 000000000..8367ae5b0 --- /dev/null +++ b/app/assets/scripts/mobile-menu.js @@ -0,0 +1,54 @@ +/** + * Mobile Navigation Menu + * Handles touch/click events for mobile devices where hover doesn't work properly + */ +(function() { + 'use strict'; + + function initMobileMenu() { + // Find the mobile dropdown toggle + const mobileDropdown = document.querySelector('.resp-nav-dropdown'); + const dropdownContent = document.querySelector('.resp-dropdown-content'); + + if (!mobileDropdown || !dropdownContent) { + return; + } + + // Add click event listener to toggle mobile menu + mobileDropdown.addEventListener('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + + // Toggle the show class + dropdownContent.classList.toggle('show'); + }); + + // Close menu when clicking outside + document.addEventListener('click', function(e) { + if (!mobileDropdown.contains(e.target)) { + dropdownContent.classList.remove('show'); + } + }); + + // Close menu when pressing escape key + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape') { + dropdownContent.classList.remove('show'); + } + }); + + // Close menu when window is resized to desktop size + window.addEventListener('resize', function() { + if (window.innerWidth > 650) { + dropdownContent.classList.remove('show'); + } + }); + } + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initMobileMenu); + } else { + initMobileMenu(); + } +})(); \ No newline at end of file diff --git a/app/assets/styles/_base.scss b/app/assets/styles/_base.scss index adc5fb877..0b52c6231 100755 --- a/app/assets/styles/_base.scss +++ b/app/assets/styles/_base.scss @@ -285,6 +285,8 @@ header{ padding-left: 1em; width: 100px; cursor: pointer; + -webkit-tap-highlight-color: transparent; // Remove tap highlight on mobile + user-select: none; // Prevent text selection p{ color: $lightgrey; font-family: 'Lato'; @@ -301,8 +303,6 @@ header{ margin: 3px 0 0 0; } } - &:hover{ - } @media screen and (max-width: 650px) { display: block; } @@ -335,12 +335,15 @@ header{ .resp-nav-dropdown { display: inline-block; text-align: center; + cursor: pointer; + -webkit-tap-highlight-color: transparent; @media screen and (min-width: 651px) { display: none; } } -.resp-nav-dropdown:hover .resp-dropdown-content { +.resp-nav-dropdown:hover .resp-dropdown-content, +.resp-dropdown-content.show { opacity: 1; height: auto; } From eab96ff44ed7bfc86a162623b3233406008f0507 Mon Sep 17 00:00:00 2001 From: Dale Kunce Date: Fri, 3 Oct 2025 07:37:08 -0400 Subject: [PATCH 02/12] Remove legacy i18n code and implement Jekyll Polyglot date localization - Remove i18n_filter.rb plugin and get_locale.html include (no longer needed) - Replace all localize filter usage with Jekyll Polyglot approach - Fix blog post date localization using site.data[site.active_lang].months array - Update month data structure with null placeholder for 1-based indexing - Replace get_locale.html includes with direct locale = site.active_lang assignment - All date localization now works correctly across EN/FR/ES/CS languages - Blog posts and listings display proper localized month names - Mobile menu JavaScript functionality preserved and working --- app/.jekyll-metadata | Bin 76983 -> 78326 bytes app/404.html | 2 +- app/_data/cs.yml | 18 ++++++++++++++ app/_data/en.yml | 18 ++++++++++++++ app/_data/es.yml | 18 ++++++++++++++ app/_data/fr.yml | 18 ++++++++++++++ app/_includes/blog.html | 3 ++- app/_includes/categories.html | 3 ++- app/_includes/footer.html | 2 +- app/_includes/get_locale.html | 1 - app/_includes/tags.html | 3 ++- app/_layouts/post.html | 4 ++-- app/_plugins/i18n_filter.rb | 39 ------------------------------ app/about.html | 2 +- app/advanced.html | 2 +- app/assets/data/events.json | 2 +- app/assets/scripts/main.js | 44 +++++++++++++++++++++++++++++++++- app/beginner.html | 2 +- app/blog.html | 2 +- app/categories.html | 2 +- app/events.html | 2 +- app/field.html | 2 +- app/host.html | 2 +- app/index.html | 2 +- app/mapswipe.html | 2 +- app/statistics.html | 2 +- app/tags.html | 2 +- app/validate.html | 2 +- 28 files changed, 139 insertions(+), 62 deletions(-) delete mode 100644 app/_includes/get_locale.html delete mode 100644 app/_plugins/i18n_filter.rb diff --git a/app/.jekyll-metadata b/app/.jekyll-metadata index ea40476d2386197f5d817a3f59664424c3d6854f..8e1b2f7c569f6c9597eb3b677c96ade7a45f7798 100644 GIT binary patch delta 4251 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 post.title }} {{ post.title }} -

{{post.date | localize: "%d",locale }} {{ post.date | localize: "%B",locale }} {{ post.date | localize: "%Y",locale }}  |  by {{ post.author }}

+ {% assign month_number = post.date | date: "%-m" | plus: 0 %} +

{{ post.date | date: "%-d" }} {{ site.data[site.active_lang].months[month_number] }} {{ post.date | date: "%Y" }}  |  by {{ post.author }}

{{ post.excerpt }}

{% endif %} diff --git a/app/_includes/categories.html b/app/_includes/categories.html index f200318a0..c0b10485f 100644 --- a/app/_includes/categories.html +++ b/app/_includes/categories.html @@ -40,8 +40,9 @@

{{ this_word | capitalize}}

{{ post.title }} + {% assign month_number = post.date | date: "%-m" | plus: 0 %} - {{ post.date | localize: "%B",locale }} {{ post.date | localize: "%Y",locale }} + {{ site.data[site.active_lang].months[month_number] }} {{ post.date | date: "%Y" }}
diff --git a/app/_includes/footer.html b/app/_includes/footer.html index 266b89ebc..9e4badc34 100755 --- a/app/_includes/footer.html +++ b/app/_includes/footer.html @@ -1,4 +1,4 @@ -{% include get_locale.html %} +{% assign locale = site.active_lang %}