UNPKG

opening_hours

Version:

Library to parse and process opening_hours tag from OpenStreetMap data

71 lines (59 loc) 2.16 kB
/* * SPDX-FileCopyrightText: © 2025 Kristjan ESPERANTO <https://github.com/KristjanESPERANTO> * * SPDX-License-Identifier: LGPL-3.0-only */ // Theme management: localStorage -> browser preference -> fallback (light) (function() { 'use strict'; const STORAGE_KEY = 'theme-preference'; function getThemePreference() { // 1. Check localStorage const stored = localStorage.getItem(STORAGE_KEY); if (stored) { return stored; } // 2. Check browser preference if (window.matchMedia('(prefers-color-scheme: dark)').matches) { return 'dark'; } if (window.matchMedia('(prefers-color-scheme: light)').matches) { return 'light'; } // 3. Fallback to light return 'light'; } function setTheme(theme) { document.body.setAttribute('data-theme', theme); localStorage.setItem(STORAGE_KEY, theme); } function toggleTheme() { const currentTheme = document.body.getAttribute('data-theme') || getThemePreference(); const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; setTheme(newTheme); } // Initialize theme immediately to avoid FOUC const theme = getThemePreference(); setTheme(theme); // Set up toggle button when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initToggleButton); } else { initToggleButton(); } function initToggleButton() { const toggleBtn = document.getElementById('theme-toggle'); if (toggleBtn) { toggleBtn.addEventListener('click', toggleTheme); } // Listen for system theme changes (only if no localStorage preference) if (!localStorage.getItem(STORAGE_KEY)) { const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)'); darkModeQuery.addEventListener('change', (e) => { if (!localStorage.getItem(STORAGE_KEY)) { setTheme(e.matches ? 'dark' : 'light'); } }); } } })();