SORTING: "\n function loadMore() {\n const prevCount = visibleCount;\n visibleCount += PAGE_SIZE;\n updateURL();\n renderPage();\n const cards = document.querySelectorAll('.article-card');\n if (cards[prevCount]) {\n const link = cards[prevCount].querySelector('a');\n if (link) link.focus();\n }\n }\n\n function updateURL() {\n const typeFilter = document.getElementById('filter-type').value;\n const topicFilter = document.getElementById('filter-topic').value;\n const sortFilter = document.getElementById('filter-sort').value;\n const searchInput = document.getElementById('search-input').value.trim();\n const params = new URLSearchParams();\n if (typeFilter !== 'all') params.set('type', typeFilter);\n if (topicFilter !== 'all') params.set('topic', topicFilter);\n if (sortFilter !== 'date-desc') params.set('sort', sortFilter);\n if (searchInput) params.set('q', searchInput);\n const effectiveVisible = Math.min(visibleCount, filteredArticles.length);\n const page = Math.ceil(effectiveVisible / PAGE_SIZE);\n if (page > 1 && filteredArticles.length > PAGE_SIZE) {\n params.set('page', String(page));\n }\n const newURL = params.toString() ? '?' + params.toString() : window.location.pathname;\n if (window.history && window.history.replaceState) {\n window.history.replaceState(null, '', newURL);\n }\n }\n\n function localizeType(type) {\n return typeLabels[type] || type;\n }\n\n function formatDate(dateStr) {\n const date = new Date(dateStr);\n return date.toLocaleDateString(LOCALE_CODE, { year: 'numeric', month: 'long', day: 'numeric' });\n }\n" = ...
Pagination cursor + URL state writer + per-row label helpers.