fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

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

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

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

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

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

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

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

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

@Tryanks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(chat): command panel crash fix and grid-native command rendering - #289

Merged
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups
Aug 26, 2026
Merged

fix(chat): command panel crash fix and grid-native command rendering#289
Tryanks merged 2 commits into
mainfrom
fix/command-panel-followups

Conversation

@Tryanks

Copy link
Copy Markdown
Owner

Two follow-ups to #287 (shipped in v0.1.45).

Crash fix

Expanding a command execution crashed the app: the adaptive-width handler called list_state.remeasure_items from inside on_prepaint, while List still holds its state borrow — a guaranteed borrow panic. The resize is now deferred past the frame with cx.defer_in.

Rendering direction correction

#287 rendered the command line as a separate StyledText element (❯ prompt, muted background) outside the terminal cell system. That direction is rejected; the command now renders inside the same GridEmulator → paint_terminal_grid pipeline as the output:

  • bash syntax highlighting (existing syntect infra) is converted to truecolor SGR sequences and fed into the command emulator — colors reach the cells the way a terminal would
  • every fed color, highlighted or default, is blended 30% toward the theme background, so the entire command line is uniformly lighter than the output below — the tone difference is what marks it as input
  • the command snapshot rebuilds on theme change since faded colors are baked into cells
  • adaptive columns and LF→CRLF output normalization from fix(chat): make command panels readable #287 are unchanged

Tests

  • command_highlight_is_faded_truecolor_in_terminal_cells — a bash keyword reaches the cells as AnsiColor::Spec with exactly the faded RGB
  • command_is_clamped_to_four_rows re-adapted to snapshot cells (SGR bytes are zero-width in column math)
  • all fix(chat): make command panels readable #287 regression tests (bare LF, split CRLF, adaptive wrap) unchanged and passing

fmt / clippy -D warnings / full workspace tests green locally.

remeasure_items from inside on_prepaint panics because List still holds
its state borrow during prepaint; defer the resize past the frame.
…hlighting
Rejected direction from #287: the command line was a separate StyledText
element outside the terminal cell system. Move it back into the
GridEmulator/paint_terminal_grid pipeline:
- bash syntax highlighting is converted to truecolor SGR sequences and
fed into the command emulator, so colors live in the cells natively
- every fed color (highlight and default foreground) is blended 30%
toward the theme background, so the whole command line reads lighter
than the output below it — that tone difference marks it as input
- the command snapshot rebuilds when the theme changes, since the faded
colors are baked into the cells
- adaptive columns and the LF normalization from #287 are unchanged
@Tryanks
Tryanks merged commit 7dc0eb1 into mainAug 26, 2026
3 checks passed
@Tryanks
Tryanks deleted the fix/command-panel-followups branch August 26, 2026 08:59
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

@Tryanks