|
354 | 354 | })(), |
355 | 355 | motion: normalizeBoolean(getParam('motion') ?? getParam('mapmotion') ?? getParam('mapMotion'), false), |
356 | 356 | autoStart: normalizeBoolean(getParam('autostart') ?? getParam('autoStart'), true), |
357 | | - autoFitMarkers: normalizeBoolean(getParam('autofit') ?? getParam('autoFit') ?? getParam('autofitmarkers') ?? getParam('autoFitMarkers') ?? getParam('mapautofit') ?? getParam('mapAutoFit'), false) |
| 357 | + autoFitMarkers: normalizeBoolean(getParam('autofit') ?? getParam('autoFit') ?? getParam('autofitmarkers') ?? getParam('autoFitMarkers') ?? getParam('mapautofit') ?? getParam('mapAutoFit'), false), |
| 358 | + hideNumbers: normalizeBoolean(getParam('hidenumbers') ?? getParam('hideNumbers') ?? getParam('maphidenumbers') ?? getParam('mapHideNumbers'), false), |
| 359 | + colorIntensity: normalizeBoolean(getParam('colorintensity') ?? getParam('colorIntensity') ?? getParam('mapcolorintensity') ?? getParam('mapColorIntensity'), false), |
| 360 | + mapScale: parseFloat(getParam('mapscale') ?? getParam('mapScale') ?? '100') / 100 || 1 |
358 | 361 | }; |
359 | 362 |
|
360 | 363 | const VALID_MAP_TYPES = new Set(['country', 'state', 'city']); |
|
369 | 372 | const locationLabelEl = document.getElementById('location-label'); |
370 | 373 | const topListEl = document.getElementById('top-list'); |
371 | 374 | const hudEl = document.getElementById('hud'); |
| 375 | + // Apply initial map scale after hudEl is defined |
| 376 | + if (settings.mapScale !== 1) { |
| 377 | + hudEl.style.transform = `scale(${settings.mapScale})`; |
| 378 | + hudEl.style.transformOrigin = 'bottom right'; |
| 379 | + } |
372 | 380 | const svg = d3.select('#world-map'); |
373 | 381 | const mapLayer = svg.append('g'); |
374 | 382 | const markerLayer = svg.append('g'); |
|
768 | 776 | } |
769 | 777 | applyStylePreset(settings.mapStyle); |
770 | 778 | applyMotionPreference(settings.motion); |
| 779 | + // Apply map scale is called after hudEl is defined |
| 780 | + |
771 | 781 | if (settings.accent) document.documentElement.style.setProperty('--accent', settings.accent); |
772 | 782 | if (settings.accentAlt) document.documentElement.style.setProperty('--accent-2', settings.accentAlt); |
773 | 783 |
|
|
1729 | 1739 | applyMotionPreference(settings.motion); |
1730 | 1740 | } |
1731 | 1741 |
|
| 1742 | + function applyMapScale() { |
| 1743 | + // Apply scale to the HUD element |
| 1744 | + if (hudEl) { |
| 1745 | + const scale = settings.mapScale || 1; |
| 1746 | + hudEl.style.transform = scale !== 1 ? `scale(${scale})` : ''; |
| 1747 | + hudEl.style.transformOrigin = 'bottom right'; |
| 1748 | + } |
| 1749 | + } |
| 1750 | + |
1732 | 1751 | function setMultiVote(value) { |
1733 | 1752 | const next = !!value; |
1734 | 1753 | if (settings.multiVote === next) return; |
|
1805 | 1824 | enter.append('text') |
1806 | 1825 | .attr('text-anchor', 'middle') |
1807 | 1826 | .attr('y', 4) |
1808 | | - .text(d => d.count); |
| 1827 | + .text(d => settings.hideNumbers ? '' : d.count) |
| 1828 | + .style('display', settings.hideNumbers ? 'none' : null); |
| 1829 | + |
| 1830 | + // Calculate color based on settings |
| 1831 | + function getMarkerColor(count, maxCount) { |
| 1832 | + if (settings.colorIntensity) { |
| 1833 | + // Red gradient: light pink (few votes) to intense red (many votes) |
| 1834 | + const ratio = maxCount > 0 ? count / maxCount : 0; |
| 1835 | + const minLightness = 35; // intense red |
| 1836 | + const maxLightness = 85; // light pink |
| 1837 | + const lightness = maxLightness - (ratio * (maxLightness - minLightness)); |
| 1838 | + const saturation = 70 + (ratio * 30); // 70-100% saturation |
| 1839 | + return `hsl(0, ${saturation}%, ${lightness}%)`; |
| 1840 | + } |
| 1841 | + return null; // use default CSS accent color |
| 1842 | + } |
1809 | 1843 |
|
1810 | 1844 | markers.merge(enter) |
1811 | 1845 | .attr('transform', d => { |
|
1815 | 1849 | .select('circle') |
1816 | 1850 | .transition().duration(400) |
1817 | 1851 | .attr('r', d => 8 + Math.log(d.count + 1) * 6) |
1818 | | - .style('opacity', d => 0.4 + 0.6 * (d.count / (maxCount || 1))); |
| 1852 | + .style('opacity', d => settings.colorIntensity ? 0.85 : (0.4 + 0.6 * (d.count / (maxCount || 1)))) |
| 1853 | + .style('fill', d => getMarkerColor(d.count, maxCount)) |
| 1854 | + .style('stroke', d => getMarkerColor(d.count, maxCount)); |
1819 | 1855 |
|
1820 | 1856 | markers.merge(enter) |
1821 | 1857 | .select('text') |
1822 | | - .text(d => d.count); |
| 1858 | + .text(d => settings.hideNumbers ? '' : d.count) |
| 1859 | + .style('display', settings.hideNumbers ? 'none' : null); |
1823 | 1860 | } |
1824 | 1861 |
|
1825 | 1862 | function triggerPulse(feature) { |
|
1969 | 2006 | } |
1970 | 2007 | } |
1971 | 2008 | } |
| 2009 | + // Handle hide numbers setting |
| 2010 | + if (payload.mapHideNumbers && Object.prototype.hasOwnProperty.call(payload.mapHideNumbers, 'setting')) { |
| 2011 | + settings.hideNumbers = normalizeBoolean(payload.mapHideNumbers.setting, settings.hideNumbers); |
| 2012 | + if (ready) updateMarkers(); |
| 2013 | + } |
| 2014 | + if (payload.maphidenumbers && Object.prototype.hasOwnProperty.call(payload.maphidenumbers, 'setting')) { |
| 2015 | + settings.hideNumbers = normalizeBoolean(payload.maphidenumbers.setting, settings.hideNumbers); |
| 2016 | + if (ready) updateMarkers(); |
| 2017 | + } |
| 2018 | + // Handle color intensity setting |
| 2019 | + if (payload.mapColorIntensity && Object.prototype.hasOwnProperty.call(payload.mapColorIntensity, 'setting')) { |
| 2020 | + settings.colorIntensity = normalizeBoolean(payload.mapColorIntensity.setting, settings.colorIntensity); |
| 2021 | + if (ready) updateMarkers(); |
| 2022 | + } |
| 2023 | + if (payload.mapcolorintensity && Object.prototype.hasOwnProperty.call(payload.mapcolorintensity, 'setting')) { |
| 2024 | + settings.colorIntensity = normalizeBoolean(payload.mapcolorintensity.setting, settings.colorIntensity); |
| 2025 | + if (ready) updateMarkers(); |
| 2026 | + } |
| 2027 | + // Handle map scale setting |
| 2028 | + if (payload.mapScale && (payload.mapScale.setting !== undefined || payload.mapScale.numbersetting !== undefined)) { |
| 2029 | + const rawScale = payload.mapScale.numbersetting ?? payload.mapScale.setting; |
| 2030 | + const newScale = parseFloat(rawScale) / 100 || 1; |
| 2031 | + if (newScale !== settings.mapScale) { |
| 2032 | + settings.mapScale = newScale; |
| 2033 | + applyMapScale(); |
| 2034 | + } |
| 2035 | + } |
| 2036 | + if (payload.mapscale && (payload.mapscale.setting !== undefined || payload.mapscale.numbersetting !== undefined)) { |
| 2037 | + const rawScale = payload.mapscale.numbersetting ?? payload.mapscale.setting; |
| 2038 | + const newScale = parseFloat(rawScale) / 100 || 1; |
| 2039 | + if (newScale !== settings.mapScale) { |
| 2040 | + settings.mapScale = newScale; |
| 2041 | + applyMapScale(); |
| 2042 | + } |
| 2043 | + } |
1972 | 2044 | hudEl.classList.toggle('hidden', !settings.showList && !settings.showTotals); |
1973 | 2045 | updateStatusBanner(); |
1974 | 2046 | } |
|
1988 | 2060 | return; |
1989 | 2061 | } |
1990 | 2062 |
|
| 2063 | + // Handle individual setting updates from popup (saveSetting format) |
| 2064 | + if (data.setting && data.value !== undefined) { |
| 2065 | + debugLog('individual setting update received', { setting: data.setting, value: data.value }); |
| 2066 | + const payload = {}; |
| 2067 | + payload[data.setting] = { setting: data.value }; |
| 2068 | + applySettingsFromPayload(payload); |
| 2069 | + updateStats(); |
| 2070 | + updateTopList(); |
| 2071 | + return; |
| 2072 | + } |
| 2073 | + |
1991 | 2074 | if (data.chatmessage) { |
1992 | 2075 | if (!ready) { |
1993 | 2076 | pendingMessages.push(data); |
|
0 commit comments