Files
breadcrumb-the-shire/web/js/components/app-nav-history.js

82 lines
2.2 KiB
JavaScript
Raw Normal View History

/**
* Browser history integration handles back/forward navigation state.
*/
2026-02-04 23:31:53 +01:00
const updateHistoryButtons = () => {
const back = document.querySelector('#global-back');
const forward = document.querySelector('#global-forward');
if (!back && !forward) {return;}
2026-02-04 23:31:53 +01:00
const hasHistory = window.history.length > 1;
2026-03-05 12:51:53 +01:00
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');
}
};
2026-02-04 23:31:53 +01:00
if (back) {
2026-03-05 12:51:53 +01:00
setDisabledState(back, !hasHistory);
2026-02-04 23:31:53 +01:00
}
if (forward) {
2026-03-05 12:51:53 +01:00
setDisabledState(forward, !hasHistory);
2026-02-04 23:31:53 +01:00
}
};
const initHistoryButtons = () => {
const back = document.querySelector('#global-back');
const forward = document.querySelector('#global-forward');
2026-02-11 19:28:12 +01:00
const isEditableTarget = (target) => {
if (!target) {return false;}
if (target.isContentEditable) {return true;}
2026-02-11 19:28:12 +01:00
const tag = target.tagName;
return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';
};
document.addEventListener('keydown', (event) => {
if (!event.altKey || event.metaKey || event.ctrlKey) {return;}
if (isEditableTarget(event.target)) {return;}
2026-02-11 19:28:12 +01:00
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();
}
}
});
2026-02-04 23:31:53 +01:00
if (back) {
back.addEventListener('click', (event) => {
2026-03-05 12:51:53 +01:00
event.preventDefault();
2026-02-04 23:31:53 +01:00
if (window.history.length > 1) {
window.history.back();
}
});
}
if (forward) {
forward.addEventListener('click', (event) => {
2026-03-05 12:51:53 +01:00
event.preventDefault();
2026-02-04 23:31:53 +01:00
if (window.history.length > 1) {
window.history.forward();
}
});
}
updateHistoryButtons();
window.addEventListener('popstate', updateHistoryButtons);
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initHistoryButtons);
} else {
initHistoryButtons();
}