diff --git a/public/index.html b/public/index.html
index 7fb35c39..19a9db1c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -80,7 +80,7 @@
-
+
diff --git a/public/region-filter.js b/public/region-filter.js
index 25725e7f..b2c7ef98 100644
--- a/public/region-filter.js
+++ b/public/region-filter.js
@@ -65,22 +65,47 @@
return p ? '®ion=' + encodeURIComponent(p) : '';
}
- /** Render the filter bar into a container element */
- function render(container) {
- var codes = Object.keys(_regions);
- if (codes.length < 2) {
- container.innerHTML = '';
- container.style.display = 'none';
- return;
+ /** Handle a region toggle (shared logic for both pill and dropdown modes) */
+ function toggleRegion(region, codes, container) {
+ if (region === '__all__') {
+ _selected = null;
+ } else {
+ if (!_selected) {
+ _selected = new Set([region]);
+ } else if (_selected.has(region)) {
+ _selected.delete(region);
+ if (_selected.size === 0) _selected = null;
+ } else {
+ _selected.add(region);
+ }
+ if (_selected && _selected.size === codes.length) _selected = null;
}
- container.style.display = '';
+ saveToStorage();
+ render(container);
+ _listeners.forEach(function (fn) { fn(getSelected()); });
+ }
+
+ /** Build summary label for dropdown trigger */
+ function dropdownLabel(codes) {
+ if (!_selected) return 'All';
+ var sel = Array.from(_selected);
+ if (sel.length === 0) return 'All';
+ if (sel.length <= 2) return sel.map(function (c) { return _regions[c] || c; }).join(', ');
+ return sel.length + ' selected';
+ }
+
+ /** Render pill bar mode (≤4 regions) */
+ function renderPills(container, codes) {
var allSelected = !_selected;
- var html = '
';
- html += '';
+ var html = '
';
+ html += 'Region:';
+ html += '';
codes.forEach(function (code) {
var label = _regions[code] || code;
var active = allSelected || (_selected && _selected.has(code));
- html += '';
+ html += '';
});
html += '
';
container.innerHTML = html;
@@ -88,28 +113,77 @@
container.onclick = function (e) {
var btn = e.target.closest('[data-region]');
if (!btn) return;
- var region = btn.dataset.region;
- if (region === '__all__') {
- _selected = null;
- } else {
- if (!_selected) {
- // Switch from "all" to just this one
- _selected = new Set([region]);
- } else if (_selected.has(region)) {
- _selected.delete(region);
- if (_selected.size === 0) _selected = null; // back to all
- } else {
- _selected.add(region);
- }
- // If all individually selected, switch to "all" mode
- if (_selected && _selected.size === codes.length) _selected = null;
- }
- saveToStorage();
- render(container);
- _listeners.forEach(function (fn) { fn(getSelected()); });
+ toggleRegion(btn.dataset.region, codes, container);
};
}
+ /** Render dropdown mode (>4 regions) */
+ function renderDropdown(container, codes) {
+ var allSelected = !_selected;
+ var html = '
';
+ html += 'Region:';
+ html += '';
+ html += '
';
+ html += '';
+ codes.forEach(function (code) {
+ var label = _regions[code] || code;
+ var active = allSelected || (_selected && _selected.has(code));
+ html += '';
+ });
+ html += '