diff --git a/turnstone/ui/static/app.js b/turnstone/ui/static/app.js
index eb04bbd1..1cca77e9 100644
--- a/turnstone/ui/static/app.js
+++ b/turnstone/ui/static/app.js
@@ -4494,9 +4494,17 @@ document
});
document.addEventListener("keydown", function (e) {
- // Defer to modal's own keydown handler when new-ws modal is open
- var nwsOverlay = document.getElementById("new-ws-overlay");
- if (nwsOverlay && nwsOverlay.style.display !== "none") return;
+ // Defer to modal's own keydown handler when any modal is open
+ var modalIds = [
+ "new-ws-overlay",
+ "edit-title-overlay",
+ "delete-ws-overlay",
+ "ws-delete-overlay",
+ ];
+ for (var mi = 0; mi < modalIds.length; mi++) {
+ var modal = document.getElementById(modalIds[mi]);
+ if (modal && modal.style.display !== "none") return;
+ }
if (e.key === "Escape" && dashboardVisible) {
e.preventDefault();
@@ -4542,6 +4550,34 @@ document.addEventListener("keydown", function (e) {
}
return;
}
+ // Workstream action shortcuts — only preventDefault when a workstream
+ // is active, so native browser shortcuts (e.g. Ctrl+Shift+R hard reload)
+ // still work when no workstream is focused.
+ if (e.ctrlKey && e.shiftKey) {
+ var wsActionKey = e.key.toLowerCase();
+ var activeWsId = !dashboardVisible && getCurrentWsId();
+ if (wsActionKey === "r" && activeWsId) {
+ e.preventDefault();
+ refreshWorkstreamTitle();
+ return;
+ }
+ if (wsActionKey === "e" && activeWsId) {
+ e.preventDefault();
+ editWorkstreamTitle();
+ return;
+ }
+ if (wsActionKey === "f" && activeWsId) {
+ e.preventDefault();
+ forkWorkstream();
+ return;
+ }
+ // X not D — D conflicts with Chrome DevTools
+ if (wsActionKey === "x" && activeWsId) {
+ e.preventDefault();
+ confirmDeleteWorkstream();
+ return;
+ }
+ }
// Ctrl+W: close current workstream tab
if (e.ctrlKey && !e.shiftKey && e.key === "w") {
if (Object.keys(workstreams).length > 1) {
diff --git a/turnstone/ui/static/index.html b/turnstone/ui/static/index.html
index 0286d641..8294eead 100644
--- a/turnstone/ui/static/index.html
+++ b/turnstone/ui/static/index.html
@@ -153,7 +153,11 @@ window.TURNSTONE_KB_SHORTCUTS = [
{ desc: "Toggle dashboard", badge: 'Ctrl+D' },
{ desc: "New workstream", badge: 'Ctrl+T' },
{ desc: "Close workstream", badge: 'Ctrl+W' },
- { desc: "Switch to tab 1\u20139", badge: 'Ctrl+1\u20269' }
+ { desc: "Switch to tab 1\u20139", badge: 'Ctrl+1\u20269' },
+ { desc: "Refresh title", badge: 'Ctrl+Shift+R' },
+ { desc: "Edit title", badge: 'Ctrl+Shift+E' },
+ { desc: "Fork workstream", badge: 'Ctrl+Shift+F' },
+ { desc: "Delete workstream", badge: 'Ctrl+Shift+X' }
]},
{ title: "Split panes", keys: [
{ desc: "Split right", badge: 'Ctrl+\\' },