Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat: per-client active workspace views by Castrozan · Pull Request #5 · Castrozan/herdr · GitHub
Skip to content

feat: per-client active workspace views - #5

Draft
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace
Draft

feat: per-client active workspace views#5
Castrozan wants to merge 1 commit into
upstream-masterfrom
feat/per-client-active-workspace

Conversation

@Castrozan

Copy link
Copy Markdown
Owner

Draft preview of the upstream PR against ogulcancelik/herdr. Base branch upstream-master mirrors upstream master (4617456), so the diff is exactly the single feature commit and its fix. Makes the active workspace per-client via a ClientView context swap, so each attached terminal gets its own independent workspace view (the tmux model, no shared mirror).

Each attached app client now views its own workspace independently
instead of mirroring one shared foreground view. A ClientView bundle
holds the per-client, workspace-relative state: active and selected
workspace by stable id, mode, view geometry, the navigator, the
interaction singletons (copy mode, selection, context menu, drag,
press tracking), the modal payloads (worktree create/open/remove,
rename target, release notes, product announcement, keybind help),
the name input, and the per-view scrolls and collapse set. The bundle
is saved per ClientConnection and swapped into the single AppState
around each client's render and input boundaries, including the resize
path before a client is promoted to foreground.
Saved views are reconciled against the live workspace set whenever a
view is loaded, so workspace removal falls a client back to its
selected or the first workspace, and clients attached before the first
workspace existed adopt it once created. Server-wide truth (the
workspace tree itself, global settings and palette, terminal
appearance) stays in shared AppState and is not carried per client.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Castrozan