/* ==================== Shared Utilities ==================== */ /* URL parameter helper */ function getUrlParam(name) { const url = new URL(window.location.href); return url.searchParams.get(name); } /* Toast notification */ function showToast(msg, type) { type = type || 'info'; var icons = { success: '✅', error: '❌', info: 'ℹ️' }; var container = document.getElementById('toastContainer'); if (!container) { container = document.createElement('div'); container.id = 'toastContainer'; container.className = 'toast-container'; document.body.appendChild(container); } var t = document.createElement('div'); t.className = 'toast toast-' + type; t.innerHTML = '' + (icons[type] || '') + ' ' + msg; container.appendChild(t); setTimeout(function () { t.remove(); }, 3000); } /* Render shared navbar */ function renderNavbar() { var nav = document.getElementById('navbarActions'); if (!nav) return; nav.innerHTML = '🏠 首页' + '⚙️ 后台管理' + '✍️ 注册' + '🔑 登录'; } /* Category badge helper */ function categoryBadge(cat) { if (!cat) return ''; return '' + cat.icon + ' ' + cat.name + ''; } /* Empty state helper */ function emptyState(icon, text) { return '
' + text + '