Skip to content

feat(desktop): reference graph visual polish — Shiki highlighting & original styling#148

Merged
MocA-Love merged 6 commits intomainfrom
feat/reference-graph
Apr 11, 2026
Merged

feat(desktop): reference graph visual polish — Shiki highlighting & original styling#148
MocA-Love merged 6 commits intomainfrom
feat/reference-graph

Conversation

@MocA-Love
Copy link
Copy Markdown
Owner

@MocA-Love MocA-Love commented Apr 11, 2026

Summary

PR #147 のマージ後の追加改善。reference-graphの見た目を元の拡張機能に合わせ、シンタックスハイライトをアプリテーマに統合。

変更内容

  • Shikiシンタックスハイライト: dark-plusハードコードからcreateShikiTheme(activeTheme)に変更。Settings > Appearanceのテーマがリアルタイム反映
  • エッジスタイル: 曲線ベジェ → smoothstep(直角折れ線)に変更
  • ELKレイアウト: ORTHOGONALルーティング、DEPTH_FIRSTサイクル破壊、LAYER_SWEEP交差最小化を追加
  • ノード幅: 固定350px → コードスニペット長に応じて280-500px可変
  • 背景: 線グリッド → ドットパターン
  • ノードCSS: 元の拡張機能のスタイル(ヘッダー、ロケーションバー、コードプレビュー)を再現
  • CodePreviewコンポーネント: Shikiハイライト付き、フォールバック付きプレーンテキスト
  • getCursorPosition: DiffViewerContextMenu用にCodeEditorAdapterに追加

Test plan

  • reference graphのノード内コードがシンタックスハイライトされていることを確認
  • Settings > Appearanceでテーマ変更後、グラフのハイライトカラーが変わることを確認
  • エッジが直角折れ線で表示されることを確認
  • ノードのレイアウトが重ならず整列していることを確認

Summary by CodeRabbit

リリースノート

  • 新機能

    • 参照グラフを PNG 形式でエクスポートできるようになりました
    • コードプレビューにシンタックスハイライト(テーマ対応)を追加しました
  • 改善

    • 設定検索が複数キーワード検索に対応しました
    • 参照グラフのノード幅が内容に応じて動的に調整され、表示性が向上しました
    • 参照グラフペインがタブに永続化されるようになりました
    • ファイル検索クエリの正規化を改善しました

- Add Shiki syntax highlighting with dark-plus theme via CodePreview
  component and lazy-loaded highlighter module
- Change edge type from animated bezier to smoothstep (straight/orthogonal)
- Match original ELK layout options: ORTHOGONAL edge routing, DEPTH_FIRST
  cycle breaking, LAYER_SWEEP crossing minimization, dynamic node widths
- Add reference-graph.css matching original VS Code extension styling:
  node headers, location bars, code preview, handle colors
- Use BackgroundVariant.Dots matching the original extension
- Add getCursorPosition to CodeEditorAdapter for DiffViewerContextMenu
Replace hardcoded dark-plus Shiki theme with the app's active theme
from Settings > Appearance. Uses createShikiTheme() to dynamically
register the app theme with Shiki, matching how chat code blocks and
diff viewers already work. Theme changes are reflected in real-time.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 11, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 93cd0d8f-d12a-4ce7-b2d4-c61c5cbd7719

📥 Commits

Reviewing files that changed from the base of the PR and between 611249f and 8d1fa95.

📒 Files selected for processing (1)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx
✅ Files skipped from review due to trivial changes (1)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx

📝 Walkthrough

Walkthrough

参照グラフにShikiベースのコードハイライトとPNGエクスポートを追加。複数のリサイズハンドルにアクセシビリティLint抑止を追加。検索ロジックといくつかのUIユーティリティを改良し、依存関係を更新。

Changes

Cohort / File(s) Summary
依存関係の更新
apps/desktop/package.json
@xyflow/react の制約を ^12.10.2^12.10.0 に変更。html-to-image@^1.11.13shiki@^3.21.0 を追加。
Reference Graph とハイライト
apps/desktop/src/renderer/screens/.../ReferenceGraphPane.tsx, .../ReferenceNode.tsx, .../CodePreview.tsx, .../lib/highlighter.ts, .../reference-graph.css
Shiki高亮表示用の高階ロジック(highlighter)、新規 memoized CodePreview コンポーネント、動的ノード幅、エッジスタイル変更、テーマ注入、表示用CSSを追加。PNGエクスポート(html-to-image)を実装。
Lint抑止(a11y) for resize handles
apps/desktop/src/renderer/.../ChatSearch/ChatSearch.tsx, .../ChatPane/.../ChatSearch/ChatSearch.tsx, .../MarkdownSearch/MarkdownSearch.tsx, .../TerminalSearch/TerminalSearch.tsx, .../CodeEditorSearchOverlay/CodeEditorSearchOverlay.tsx
左リサイズハンドルの <div> に対して biome-ignore lint/a11y/noStaticElementInteractions を追加(ロジック変更なし)。
検索・正規化改良
apps/desktop/src/renderer/.../settings-search/settings-search.ts, packages/workspace-fs/src/search.ts
searchSettings がクエリを空白でトークン化し全単語一致に変更。searchFiles が先頭の ./ を除去して正規化するよう更新。
細部修正・テスト
apps/desktop/src/main/lib/vscode-shim/api/terminal-shim.ts, .../ChatMessageList.test.tsx, .../PersistentTabRenderer.tsx, .../CodeMirrorDiffViewer.tsx, .../DiffViewerContextMenu.tsx
Biomeコメントの調整、テストの正規表現アサーション化、reference-graph を永続タブ対象に追加、不要なBiome抑止の削除、CodeEditorAdapter.getCursorPosition() を追加。

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant ReferenceGraphPane as ReferenceGraphPane
    participant ReactFlow as React Flow
    participant CodePreview as CodePreview
    participant Highlighter as highlighter.ts
    participant ShikiLib as Shiki
    participant htmlToImage as html-to-image

    User->>ReferenceGraphPane: ノード表示 / ビュー操作
    ReferenceGraphPane->>ReactFlow: ノード・レイアウト取得
    ReactFlow->>ReferenceGraphPane: ビューポート/ノード境界返却

    ReferenceGraphPane->>CodePreview: コード+言語+shikiTheme を渡す
    CodePreview->>Highlighter: highlightCode(code, language, theme)
    Highlighter->>ShikiLib: 高亮要求(テーマを必要なら登録)
    ShikiLib-->>Highlighter: ハイライト済HTMLを返却
    Highlighter-->>CodePreview: HTML を返す
    CodePreview->>ReferenceGraphPane: ハイライト表示(或いはプレーンテキスト)

    User->>ReferenceGraphPane: 「Export PNG」クリック
    ReferenceGraphPane->>ReactFlow: 隠す/ビューポート調整
    ReferenceGraphPane->>htmlToImage: ビューをキャプチャ
    htmlToImage-->>ReferenceGraphPane: PNG Blob を返却
    ReferenceGraphPane->>User: タイムスタンプ付きPNGをダウンロード
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 参照の森で跳ねるよ
色づくコードに目を輝かせ
一枚のPNGに景色を閉じて
ハイライトで道が光るよ ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed プルリクエストのタイトルは「feat(desktop): reference graph visual polish — Shiki highlighting & original styling」であり、main changeである「reference graphの見た目改善とShikiハイライト統合」を明確に要約している。
Description check ✅ Passed プルリクエストの説明はテンプレートの主要セクションを満たしており、変更内容が詳細に記述されているが、テンプレートの完全な構造(Related Issues、Type of Changeチェックボックス等)が完全には満たされていない。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/reference-graph

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…switch

- Add Export PNG button using html-to-image, matching original extension
  behavior (captures viewport, hides controls/background during export)
- Fix graph state reset on tab/workspace switch by adding "reference-graph"
  to PersistentTabRenderer's persistent pane types, keeping the component
  mounted when switching away
Match apps/desktop dependency versions to packages/ui to fix sherif
multiple-dependency-versions errors in CI.
Lint fixes:
- Add biome-ignore for resize handle divs in ChatSearch, MarkdownSearch,
  TerminalSearch, and CodeEditorSearchOverlay (noStaticElementInteractions)
- Fix terminal-shim.ts biome suppression to target specific rule
  (noExplicitAny) instead of blanket lint suppression
- Remove stale biome-ignore in CodeMirrorDiffViewer (unused suppression)

Test fixes:
- Fix settings search to split query into words and match all of them
  independently, so "sidebar split width" finds the setting
- Fix ChatMessageList subagent test: use regex negative lookbehind to
  distinguish SUBAGENT_EXECUTION_MESSAGE from INLINE_SUBAGENT_EXECUTION_MESSAGE
- Fix searchFiles to strip leading "./" from queries before fuzzy lookup
@MocA-Love MocA-Love marked this pull request as ready for review April 11, 2026 06:10
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 611249f4b7

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/components/CodeEditor/components/CodeEditorSearchOverlay/CodeEditorSearchOverlay.tsx (1)

175-180: ⚠️ Potential issue | 🟠 Major

アクセシビリティlintの抑止だけでなく、キーボード操作も実装してください

Line 175 で noStaticElementInteractions を無効化していますが、Line 177 のリサイズ操作はマウス前提のままです。role="separator"tabIndexonKeyDown を追加して、抑止コメント不要の実装に寄せるのが安全です。

♿ 提案差分
@@
 	const handleResizeMouseDown = useCallback(
@@
 	);
+
+	const handleResizeKeyDown = useCallback(
+		(event: ReactKeyboardEvent<HTMLDivElement>) => {
+			if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") {
+				return;
+			}
+			event.preventDefault();
+			const delta = event.key === "ArrowLeft" ? 16 : -16;
+			setWidth((prev) => Math.max(MIN_WIDTH, Math.min(800, prev + delta)));
+		},
+		[],
+	);
@@
-			{/* biome-ignore lint/a11y/noStaticElementInteractions: resize handle */}
 			<div
+				role="separator"
+				aria-orientation="vertical"
+				aria-label="Resize search panel"
+				tabIndex={0}
 				onMouseDown={handleResizeMouseDown}
+				onKeyDown={handleResizeKeyDown}
 				className="absolute left-0 top-0 h-full w-1 cursor-ew-resize rounded-l opacity-0 transition-opacity hover:opacity-100 hover:bg-blue-500/40"
 				title="Drag to resize"
 			/>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/components/CodeEditor/components/CodeEditorSearchOverlay/CodeEditorSearchOverlay.tsx`
around lines 175 - 180, The resize handle currently only supports mouse via the
onMouseDown handler (handleResizeMouseDown) and is suppressed by the
biome-ignore; implement keyboard accessibility by adding role="separator", a
tabIndex (e.g. tabIndex={0}), and an onKeyDown handler that maps arrow keys /
Home / End (and optionally PageUp/PageDown) to the same resize logic or to a new
helper (e.g. handleResizeKeyDown) that adjusts the width and calls the same
resizing primitive; update focus/aria attributes as needed
(aria-orientation="vertical", aria-valuenow/valuemin/valuemax if tracking
value), attach onFocus/onBlur for visual feedback, and remove the biome-ignore
lint comment so the element no longer bypasses the a11y rule.
🧹 Nitpick comments (3)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx (1)

68-73: 空文字列に対するエッジケース処理

codeSnippetが空文字列の場合、lines[""]となりmaxLineLengthは0になります。これは問題ありませんが、Math.max(...lines.map())は空配列に対して-Infinityを返すため、理論上のエッジケースがあります。現状の実装ではsplit("\n")が必ず少なくとも1要素を返すため問題ありませんが、防御的にデフォルト値を追加することを検討してください。

♻️ 防御的な実装案
 function estimateNodeWidth(codeSnippet: string): number {
 	const lines = codeSnippet.split("\n");
-	const maxLineLength = Math.max(...lines.map((line) => line.length));
+	const maxLineLength = Math.max(0, ...lines.map((line) => line.length));
 	const estimatedWidth = maxLineLength * CHAR_WIDTH + NODE_PADDING;
 	return Math.min(NODE_MAX_WIDTH, Math.max(NODE_MIN_WIDTH, estimatedWidth));
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx`
around lines 68 - 73, The max-length calculation in estimateNodeWidth can
produce -Infinity if the mapped array is empty; update the function
(estimateNodeWidth) to defensively provide a default when computing max — e.g.,
compute maxLineLength as Math.max(0, ...lines.map(line => line.length)) or use a
fallback like lines.length ? Math.max(...mapped) : 0 — so the subsequent
estimatedWidth calculation never uses -Infinity.
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/CodePreview.tsx (1)

67-77: フォールバックレンダリングのkeyについて

key={${lineNum}:${line}}は行番号と内容を組み合わせているため、同じ内容の行が異なる位置にあってもユニークになります。ただし、配列のインデックスを含めることでより堅牢になります。

♻️ より堅牢なkey
-							<div key={`${lineNum}:${line}`} className="ref-graph-code-line">
+							<div key={`${lineNum}-${index}`} className="ref-graph-code-line">
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/CodePreview.tsx`
around lines 67 - 77, The current JSX key in the lines.map render uses
key={`${lineNum}:${line}`}, which can still collide for identical line content
moved around; update the key in the lines.map callback (the render inside
lines.map in CodePreview.tsx) to include the index (or startLine and index) so
it becomes unique and stable across reorders (e.g., combine lineNum, index, and
line into the key), ensuring you reference the variables used there (lines.map,
startLine, index, line).
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceNode.tsx (1)

51-53: useCallbackの依存配列でdataオブジェクト全体を指定

dataオブジェクト全体を依存配列に含めると、ノードが再レンダリングされるたびにコールバックが再生成されます。memoでラップされているため大きな問題にはなりませんが、必要な値のみを依存配列に含める方がより正確です。

♻️ リファクタリング案
 function ReferenceNodeComponent({ data }: { data: ReferenceNodeData }) {
+	const { onDoubleClick, absolutePath, line } = data;
 	const handleClick = useCallback(() => {
-		data.onDoubleClick(data.absolutePath, data.line);
-	}, [data]);
+		onDoubleClick(absolutePath, line);
+	}, [onDoubleClick, absolutePath, line]);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceNode.tsx`
around lines 51 - 53, handleClick の useCallback が依存配列に data
オブジェクト全体を使っているためコールバックが不必要に再生成されます。handleClick の依存を個別プロパティに置き換え、例えば
data.onDoubleClick, data.absolutePath, data.line のみを依存配列に含める(あるいは関数コンポーネント内で
const { onDoubleClick, absolutePath, line } = data してそれらを依存にする)ように修正してください(参照:
handleClick, data.onDoubleClick, data.absolutePath, data.line)。
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/desktop/src/main/lib/vscode-shim/api/terminal-shim.ts`:
- Around line 58-62: Replace the unsafe any casts by importing the
DaemonTerminalManager type from "../../terminal" and use it in the shim: change
the getDaemonTerminalManager signature to return DaemonTerminalManager (i.e.,
getDaemonTerminalManager: () => DaemonTerminalManager) and cast the dynamic
module call to DaemonTerminalManager when returning
mod.getDaemonTerminalManager(); remove the biome-ignore noExplicitAny comments
since any is no longer used.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/reference-graph.css`:
- Around line 7-8: The CSS max-width (reference-graph.css: max-width: 400px) is
inconsistent with the JavaScript constant NODE_MAX_WIDTH in
ReferenceGraphPane.tsx (500px); update one so both match—either set CSS
max-width to 500px or expose NODE_MAX_WIDTH to CSS (e.g., via a CSS variable or
inline style) and use that value in reference-graph.css—to ensure the ELK layout
and rendered node container widths are aligned and prevent overlapping.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx`:
- Around line 234-291: The export routine (handleExportPng) hides
.react-flow__controls and .react-flow__background before calling toPng but
restores them only after the await, so if toPng throws the UI elements remain
hidden; fix by declaring controls and background variables outside the try,
perform the display = "none" inside the try as you do now, and move the
restoration logic (if (controls) controls.style.display = ""; if (background)
background.style.display = "";) into the finally block alongside
setIsExporting(false) so they are always restored even on exceptions; reference
handleExportPng, controls, background and toPng when making this change.

---

Outside diff comments:
In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/components/CodeEditor/components/CodeEditorSearchOverlay/CodeEditorSearchOverlay.tsx`:
- Around line 175-180: The resize handle currently only supports mouse via the
onMouseDown handler (handleResizeMouseDown) and is suppressed by the
biome-ignore; implement keyboard accessibility by adding role="separator", a
tabIndex (e.g. tabIndex={0}), and an onKeyDown handler that maps arrow keys /
Home / End (and optionally PageUp/PageDown) to the same resize logic or to a new
helper (e.g. handleResizeKeyDown) that adjusts the width and calls the same
resizing primitive; update focus/aria attributes as needed
(aria-orientation="vertical", aria-valuenow/valuemin/valuemax if tracking
value), attach onFocus/onBlur for visual feedback, and remove the biome-ignore
lint comment so the element no longer bypasses the a11y rule.

---

Nitpick comments:
In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/CodePreview.tsx`:
- Around line 67-77: The current JSX key in the lines.map render uses
key={`${lineNum}:${line}`}, which can still collide for identical line content
moved around; update the key in the lines.map callback (the render inside
lines.map in CodePreview.tsx) to include the index (or startLine and index) so
it becomes unique and stable across reorders (e.g., combine lineNum, index, and
line into the key), ensuring you reference the variables used there (lines.map,
startLine, index, line).

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx`:
- Around line 68-73: The max-length calculation in estimateNodeWidth can produce
-Infinity if the mapped array is empty; update the function (estimateNodeWidth)
to defensively provide a default when computing max — e.g., compute
maxLineLength as Math.max(0, ...lines.map(line => line.length)) or use a
fallback like lines.length ? Math.max(...mapped) : 0 — so the subsequent
estimatedWidth calculation never uses -Infinity.

In
`@apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceNode.tsx`:
- Around line 51-53: handleClick の useCallback が依存配列に data
オブジェクト全体を使っているためコールバックが不必要に再生成されます。handleClick の依存を個別プロパティに置き換え、例えば
data.onDoubleClick, data.absolutePath, data.line のみを依存配列に含める(あるいは関数コンポーネント内で
const { onDoubleClick, absolutePath, line } = data してそれらを依存にする)ように修正してください(参照:
handleClick, data.onDoubleClick, data.absolutePath, data.line)。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d124883e-a659-4026-8e54-e0075db1d792

📥 Commits

Reviewing files that changed from the base of the PR and between be0af3d and 611249f.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (18)
  • apps/desktop/package.json
  • apps/desktop/src/main/lib/vscode-shim/api/terminal-shim.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/WorkspaceChatInterface/components/ChatMessageList/ChatMessageList.test.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/WorkspaceChatInterface/components/ChatMessageList/components/ChatSearch/ChatSearch.tsx
  • apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/PersistentTabRenderer.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/components/ChatMessageList/components/ChatSearch/ChatSearch.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/FileViewerPane/components/CodeMirrorDiffViewer/CodeMirrorDiffViewer.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/FileViewerPane/components/DiffViewerContextMenu/DiffViewerContextMenu.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/FileViewerPane/components/MarkdownSearch/MarkdownSearch.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/CodePreview.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceGraphPane.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/ReferenceNode.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/lib/highlighter.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ReferenceGraphPane/reference-graph.css
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/TerminalSearch/TerminalSearch.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/components/CodeEditor/components/CodeEditorSearchOverlay/CodeEditorSearchOverlay.tsx
  • packages/workspace-fs/src/search.ts
💤 Files with no reviewable changes (1)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/FileViewerPane/components/CodeMirrorDiffViewer/CodeMirrorDiffViewer.tsx

Comment thread apps/desktop/src/main/lib/vscode-shim/api/terminal-shim.ts
…re UI on error

- Use container ref instead of global document.querySelector to scope
  viewport/controls/background queries to the active pane (fixes P1
  when multiple reference-graph panes are mounted via PersistentTabRenderer)
- Move controls/background visibility restore to finally block so UI
  is always restored even when toPng throws (fixes P2)
@MocA-Love MocA-Love merged commit beaec2c into main Apr 11, 2026
11 of 14 checks passed
Sign up for free to 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