/* ==================== 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 '
' + icon + '

' + text + '

'; } /* Modal helpers */ function renderModal(title, content) { var div = document.createElement('div'); div.className = 'modal-overlay'; div.onclick = function (e) { if (e.target === div) closeModal(); }; div.innerHTML = '

' + title + '

' + content + '
'; document.body.appendChild(div); } function closeModal() { var o = document.querySelector('.modal-overlay'); if (o) o.remove(); } /* ==================== Bootstrap on every page ==================== */ document.addEventListener('DOMContentLoaded', function () { renderNavbar(); });