From 716c681f17f2ea71c10ea80263896585c8dc0f2f Mon Sep 17 00:00:00 2001 From: TheFlow Date: Fri, 17 Oct 2025 09:07:42 +1300 Subject: [PATCH] refactor(i18n): simplify language selector to icons-only for all devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UX Simplification: - Remove dropdown selector completely (was causing rendering conflicts) - Use icon-only buttons on ALL devices (mobile and desktop) - Show all 4 languages: 🇬🇧 English, 🇩🇪 Deutsch, 🇫🇷 Français, 🇳🇿 Te Reo Māori - Māori button shows as disabled with "Planned" tooltip Technical Changes: - Eliminate all responsive breakpoint logic (md:hidden, md:block, md:flex) - Single unified rendering path for all screen sizes - Removed desktop dropdown and associated event handlers - Simplified to one flex container with 4 icon buttons - Active state management works across all buttons including disabled Fixes: - Resolves persistent issue where both dropdown and icons appeared on desktop - Eliminates Tailwind responsive class conflicts - Consistent UX across all devices - Better touch targets (44x44px) on all platforms 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- public/js/components/language-selector.js | 83 +++++++---------------- 1 file changed, 24 insertions(+), 59 deletions(-) diff --git a/public/js/components/language-selector.js b/public/js/components/language-selector.js index da18537e..434426df 100644 --- a/public/js/components/language-selector.js +++ b/public/js/components/language-selector.js @@ -1,6 +1,6 @@ /** * Language Selector Component - * Mobile-friendly: Icons on mobile, dropdown on desktop + * Simple icon-based selector for all devices */ (function() { @@ -18,51 +18,23 @@ const currentLang = (window.I18n && window.I18n.currentLang) || 'en'; const selectorHTML = ` - - - - -
-
- ${supportedLanguages.filter(lang => !lang.disabled).map(lang => ` - - `).join('')} -
+ ${lang.flag} + + `).join('')}
`; @@ -73,17 +45,8 @@ } function attachEventListeners(currentLang) { - // Desktop dropdown - const desktopSelector = document.getElementById('language-selector-desktop'); - if (desktopSelector && window.I18n) { - desktopSelector.addEventListener('change', function(e) { - const selectedLang = e.target.value; - window.I18n.setLanguage(selectedLang); - }); - } - - // Mobile icon buttons - const iconButtons = document.querySelectorAll('.language-icon-btn'); + // Icon buttons + const iconButtons = document.querySelectorAll('.language-icon-btn:not([disabled])'); iconButtons.forEach(button => { button.addEventListener('click', function() { const selectedLang = this.getAttribute('data-lang'); @@ -92,9 +55,11 @@ } // Update active state - iconButtons.forEach(btn => { - btn.classList.remove('border-blue-600', 'bg-blue-50'); - btn.classList.add('border-gray-300', 'bg-white'); + document.querySelectorAll('.language-icon-btn').forEach(btn => { + if (!btn.disabled) { + btn.classList.remove('border-blue-600', 'bg-blue-50'); + btn.classList.add('border-gray-300', 'bg-white'); + } }); this.classList.remove('border-gray-300', 'bg-white'); this.classList.add('border-blue-600', 'bg-blue-50');