Boost page navigation with htmx
Links and GET forms to wiki pages swap the next page into .shell instead of loading a new document: the server answers boosted requests and history restores with a partial (title, page actions out-of-band, shell content). The header stays, browsers without cross-document view transitions (Firefox) no longer flash between pages, and the swap runs as a same-document view transition. Files, the editor, internal endpoints and POST forms still navigate normally. Back/Forward refetch pages (no snapshots that could predate a move or delete); the tree rail keeps its scroll position and the content column returns to where it was. Mutation redirects swap their result in the same way. Page scripts that assumed a fresh document now also run after a swap (toc, contents, companion, scroll-sync, search actions) or register once (fitness). The e2e suite now also runs in Firefox. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+21
-12
@@ -52,19 +52,19 @@ function createSearchPage(name) {
|
||||
});
|
||||
}
|
||||
|
||||
// The "create page" link on results pages; delegated, since boosted
|
||||
// navigation swaps the results in without a new DOMContentLoaded.
|
||||
document.addEventListener('click', function (e) {
|
||||
var createLink = e.target.closest && e.target.closest('[data-create-page]');
|
||||
if (!createLink) return;
|
||||
e.preventDefault();
|
||||
createSearchPage(createLink.getAttribute('data-create-page'));
|
||||
});
|
||||
|
||||
// Focus the search input on results pages so Tab steps directly into the
|
||||
// first match — the input sits immediately before the results in DOM order,
|
||||
// so the natural tab sequence is input → first result → next, …
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
|
||||
var createLink = document.querySelector('[data-create-page]');
|
||||
if (createLink) {
|
||||
createLink.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
createSearchPage(createLink.getAttribute('data-create-page'));
|
||||
});
|
||||
}
|
||||
|
||||
// Focus the search input on results pages so Tab steps directly into the
|
||||
// first match — the input sits immediately before the results in DOM
|
||||
// order, so the natural tab sequence is input → first result → next, …
|
||||
var input = document.querySelector('.search-input');
|
||||
if (input && input.value) {
|
||||
input.focus();
|
||||
@@ -72,3 +72,12 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
try { input.setSelectionRange(end, end); } catch (e) {}
|
||||
}
|
||||
});
|
||||
|
||||
// The header (and its search box) survives boosted navigation: show the
|
||||
// current page's query, as a full load would.
|
||||
document.addEventListener('page:swapped', function () {
|
||||
var input = document.querySelector('.search-input');
|
||||
if (input && document.activeElement !== input) {
|
||||
input.value = new URLSearchParams(location.search).get('q') || '';
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user