diff options
Diffstat (limited to 'vrsite/assets/app.js')
| -rw-r--r-- | vrsite/assets/app.js | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/vrsite/assets/app.js b/vrsite/assets/app.js index 696041c..74db8d2 100644 --- a/vrsite/assets/app.js +++ b/vrsite/assets/app.js @@ -22,6 +22,26 @@ setMode(root.dataset.mode || "trace"); const typing = e => /^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName) || e.target.isContentEditable; +// The project hub is fully server-derived; filtering is deliberately local so +// choosing a project does not create another piece of server state. +const projectFind = document.getElementById("projectfind"); +if (projectFind) { + const apply = () => { + const q = projectFind.value.trim().toLowerCase(); + for (const card of document.querySelectorAll(".project-card")) + card.hidden = !!q && !(card.dataset.project || "").toLowerCase().includes(q); + }; + projectFind.addEventListener("input", apply); + projectFind.addEventListener("search", apply); + projectFind.addEventListener("keydown", e => { + if (e.key === "Escape") { projectFind.value = ""; apply(); projectFind.blur(); } + if (e.key === "Enter") { + const first = document.querySelector(".project-card:not([hidden]) a.project-action"); + if (first) first.click(); + } + }); +} + document.addEventListener("keydown", e => { if (e.metaKey || e.ctrlKey || e.altKey || typing(e)) return; if (e.key === "t") setMode(root.dataset.mode === "notes" ? "trace" : "notes"); |
