/** * Browser history integration — handles back/forward navigation state. */ import { isEditableTarget } from '../core/app-form-utils.js'; import { resolveHost } from '../core/app-dom.js'; export function initNavHistory(root = document, options = {}) { const { backSelector = '#global-back', forwardSelector = '#global-forward', } = options; const host = resolveHost(root); const back = host.querySelector(backSelector); const forward = host.querySelector(forwardSelector); if (!back && !forward) { return { destroy: () => {} }; } const setDisabledState = (link, disabled) => { link.setAttribute('aria-disabled', disabled ? 'true' : 'false'); link.classList.toggle('is-disabled', disabled); if (disabled) { link.setAttribute('tabindex', '-1'); } else { link.removeAttribute('tabindex'); } }; const updateHistoryButtons = () => { const hasHistory = window.history.length > 1; if (back instanceof HTMLElement) { setDisabledState(back, !hasHistory); } if (forward instanceof HTMLElement) { setDisabledState(forward, !hasHistory); } }; const onKeyDown = (event) => { if (!event.altKey || event.metaKey || event.ctrlKey) { return; } if (isEditableTarget(event.target)) { return; } if (event.key === 'ArrowLeft') { if (window.history.length > 1) { event.preventDefault(); window.history.back(); } } else if (event.key === 'ArrowRight') { if (window.history.length > 1) { event.preventDefault(); window.history.forward(); } } }; document.addEventListener('keydown', onKeyDown); const onBackClick = (event) => { event.preventDefault(); if (window.history.length > 1) { window.history.back(); } }; if (back instanceof HTMLElement) { back.addEventListener('click', onBackClick); } const onForwardClick = (event) => { event.preventDefault(); if (window.history.length > 1) { window.history.forward(); } }; if (forward instanceof HTMLElement) { forward.addEventListener('click', onForwardClick); } window.addEventListener('popstate', updateHistoryButtons); updateHistoryButtons(); const destroy = () => { document.removeEventListener('keydown', onKeyDown); if (back instanceof HTMLElement) { back.removeEventListener('click', onBackClick); } if (forward instanceof HTMLElement) { forward.removeEventListener('click', onForwardClick); } window.removeEventListener('popstate', updateHistoryButtons); }; return { destroy, update: updateHistoryButtons }; }