diff --git a/webui/src/web-components/sketch-diff2-view.ts b/webui/src/web-components/sketch-diff2-view.ts
index 7ca33b3..1514fcd 100644
--- a/webui/src/web-components/sketch-diff2-view.ts
+++ b/webui/src/web-components/sketch-diff2-view.ts
@@ -2,7 +2,7 @@
 import { customElement, property, state } from "lit/decorators.js";
 import "./sketch-monaco-view";
 import "./sketch-diff-range-picker";
-import "./sketch-diff-file-picker";
+// import "./sketch-diff-file-picker"; // No longer needed for multi-file view
 import "./sketch-diff-empty-view";
 import {
   GitDiffFile,
@@ -42,6 +42,53 @@
   }
 
   /**
+   * Handle height change events from the Monaco editor
+   */
+  private handleMonacoHeightChange(event: CustomEvent) {
+    try {
+      // Get the monaco view that emitted the event
+      const monacoView = event.target as HTMLElement;
+      if (!monacoView) return;
+      
+      // Find the parent file-diff-editor container
+      const fileDiffEditor = monacoView.closest('.file-diff-editor') as HTMLElement;
+      if (!fileDiffEditor) return;
+      
+      // Get the new height from the event
+      const newHeight = event.detail.height;
+      
+      // Only update if the height actually changed to avoid unnecessary layout
+      const currentHeight = fileDiffEditor.style.height;
+      const newHeightStr = `${newHeight}px`;
+      
+      if (currentHeight !== newHeightStr) {
+        // Update the file-diff-editor height to match monaco's height
+        fileDiffEditor.style.height = newHeightStr;
+        
+        // Remove any previous min-height constraint that might interfere
+        fileDiffEditor.style.minHeight = 'auto';
+        
+        // IMPORTANT: Tell Monaco to relayout after its container size changed
+        // Monaco has automaticLayout: false, so it won't detect container changes
+        setTimeout(() => {
+          const monacoComponent = monacoView as any;
+          if (monacoComponent && monacoComponent.editor) {
+            // Force layout with explicit dimensions to ensure Monaco fills the space
+            const editorWidth = fileDiffEditor.offsetWidth;
+            monacoComponent.editor.layout({
+              width: editorWidth,
+              height: newHeight
+            });
+          }
+        }, 0);
+      }
+      
+    } catch (error) {
+      console.error('Error handling Monaco height change:', error);
+    }
+  }
+
+  /**
    * Handle save events from the Monaco editor
    */
   private async handleMonacoSave(event: CustomEvent) {
@@ -96,13 +143,10 @@
   private currentRange: DiffRange = { type: "range", from: "", to: "HEAD" };
 
   @state()
-  private originalCode: string = "";
+  private fileContents: Map<string, { original: string; modified: string; editable: boolean }> = new Map();
 
   @state()
-  private modifiedCode: string = "";
-
-  @state()
-  private isRightEditable: boolean = false;
+  private fileExpandStates: Map<string, boolean> = new Map();
 
   @state()
   private loading: boolean = false;
@@ -177,21 +221,146 @@
 
     .diff-container {
       flex: 1;
-      overflow: hidden;
+      overflow: auto;
       display: flex;
       flex-direction: column;
-      min-height: 0; /* Critical for flex child to respect parent height */
-      position: relative; /* Establish positioning context */
-      height: 100%; /* Take full height */
+      min-height: 0;
+      position: relative;
+      height: 100%;
     }
 
     .diff-content {
       flex: 1;
-      overflow: hidden;
-      min-height: 0; /* Required for proper flex behavior */
-      display: flex; /* Required for child to take full height */
-      position: relative; /* Establish positioning context */
-      height: 100%; /* Take full height */
+      overflow: auto;
+      min-height: 0;
+      display: flex;
+      flex-direction: column;
+      position: relative;
+      height: 100%;
+    }
+
+    .multi-file-diff-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      min-height: 100%;
+    }
+
+    .file-diff-section {
+      display: flex;
+      flex-direction: column;
+      border-bottom: 3px solid var(--border-color, #e0e0e0);
+      margin-bottom: 0;
+    }
+
+    .file-diff-section:last-child {
+      border-bottom: none;
+    }
+
+    .file-header {
+      background-color: var(--background-light, #f8f8f8);
+      border-bottom: 1px solid var(--border-color, #e0e0e0);
+      padding: 12px 16px;
+      font-family: var(--font-family, system-ui, sans-serif);
+      font-weight: 500;
+      font-size: 14px;
+      color: var(--text-primary-color, #333);
+      position: sticky;
+      top: 0;
+      z-index: 10;
+      box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+
+    .file-header-left {
+      display: flex;
+      align-items: center;
+      gap: 8px;
+    }
+
+    .file-header-right {
+      display: flex;
+      align-items: center;
+    }
+
+    .file-expand-button {
+      background-color: transparent;
+      border: 1px solid var(--border-color, #e0e0e0);
+      border-radius: 4px;
+      padding: 4px 8px;
+      font-size: 14px;
+      cursor: pointer;
+      transition: background-color 0.2s;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      min-width: 32px;
+      min-height: 32px;
+    }
+
+    .file-expand-button:hover {
+      background-color: var(--background-hover, #e8e8e8);
+    }
+
+    .file-path {
+      font-family: monospace;
+      font-weight: normal;
+      color: var(--text-secondary-color, #666);
+    }
+
+    .file-status {
+      display: inline-block;
+      padding: 2px 6px;
+      border-radius: 3px;
+      font-size: 12px;
+      font-weight: bold;
+      margin-right: 8px;
+    }
+
+    .file-status.added {
+      background-color: #d4edda;
+      color: #155724;
+    }
+
+    .file-status.modified {
+      background-color: #fff3cd;
+      color: #856404;
+    }
+
+    .file-status.deleted {
+      background-color: #f8d7da;
+      color: #721c24;
+    }
+
+    .file-status.renamed {
+      background-color: #d1ecf1;
+      color: #0c5460;
+    }
+
+    .file-changes {
+      margin-left: 8px;
+      font-size: 12px;
+      color: var(--text-secondary-color, #666);
+    }
+
+    .file-diff-editor {
+      display: flex;
+      flex-direction: column;
+      min-height: 200px;
+      /* Height will be set dynamically by monaco editor */
+      overflow: visible; /* Ensure content is not clipped */
+    }
+
+    .file-count {
+      font-size: 14px;
+      color: var(--text-secondary-color, #666);
+      font-weight: 500;
+      padding: 8px 12px;
+      background-color: var(--background-light, #f8f8f8);
+      border-radius: 4px;
+      border: 1px solid var(--border-color, #e0e0e0);
     }
 
     .loading,
@@ -218,15 +387,12 @@
     sketch-monaco-view {
       --editor-width: 100%;
       --editor-height: 100%;
-      flex: 1; /* Make Monaco view take full height */
-      display: flex; /* Required for child to take full height */
-      position: absolute; /* Absolute positioning to take full space */
-      top: 0;
-      left: 0;
-      right: 0;
-      bottom: 0;
-      height: 100%; /* Take full height */
-      width: 100%; /* Take full width */
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      min-height: 200px;
+      /* Ensure Monaco view takes full container space */
+      flex: 1;
     }
   `;
 
@@ -285,21 +451,20 @@
     }
   }
 
-  // Toggle hideUnchangedRegions setting
-  @state()
-  private hideUnchangedRegionsEnabled: boolean = true;
-
-  // Toggle hideUnchangedRegions setting
-  private toggleHideUnchangedRegions() {
-    this.hideUnchangedRegionsEnabled = !this.hideUnchangedRegionsEnabled;
-
-    // Get the Monaco view component
-    const monacoView = this.shadowRoot?.querySelector("sketch-monaco-view");
+  // Toggle hideUnchangedRegions setting for a specific file
+  private toggleFileExpansion(filePath: string) {
+    const currentState = this.fileExpandStates.get(filePath) ?? false;
+    const newState = !currentState;
+    this.fileExpandStates.set(filePath, newState);
+    
+    // Apply to the specific Monaco view component for this file
+    const monacoView = this.shadowRoot?.querySelector(`sketch-monaco-view[data-file-path="${filePath}"]`);
     if (monacoView) {
-      (monacoView as any).toggleHideUnchangedRegions(
-        this.hideUnchangedRegionsEnabled,
-      );
+      (monacoView as any).toggleHideUnchangedRegions(!newState); // inverted because true means "hide unchanged"
     }
+    
+    // Force a re-render to update the button state
+    this.requestUpdate();
   }
 
   render() {
@@ -314,24 +479,8 @@
           </div>
 
           <div class="file-row">
-            <sketch-diff-file-picker
-              .files="${this.files}"
-              .selectedPath="${this.selectedFilePath}"
-              @file-selected="${this.handleFileSelected}"
-            ></sketch-diff-file-picker>
-
-            <div style="display: flex; gap: 8px;">
-              <button
-                class="view-toggle-button"
-                @click="${this.toggleHideUnchangedRegions}"
-                title="${this.hideUnchangedRegionsEnabled
-                  ? "Expand All: Show all lines including unchanged regions"
-                  : "Collapse Expanded Lines: Hide unchanged regions to focus on changes"}"
-              >
-                ${this.hideUnchangedRegionsEnabled
-                  ? this.renderExpandAllIcon()
-                  : this.renderCollapseIcon()}
-              </button>
+            <div class="file-count">
+              ${this.files.length > 0 ? `${this.files.length} file${this.files.length === 1 ? '' : 's'} changed` : 'No files'}
             </div>
           </div>
         </div>
@@ -356,21 +505,10 @@
       return html`<sketch-diff-empty-view></sketch-diff-empty-view>`;
     }
 
-    if (!this.selectedFilePath) {
-      return html`<div class="loading">Select a file to view diff</div>`;
-    }
-
     return html`
-      <sketch-monaco-view
-        .originalCode="${this.originalCode}"
-        .modifiedCode="${this.modifiedCode}"
-        .originalFilename="${this.selectedFilePath}"
-        .modifiedFilename="${this.selectedFilePath}"
-        ?readOnly="${!this.isRightEditable}"
-        ?editable-right="${this.isRightEditable}"
-        @monaco-comment="${this.handleMonacoComment}"
-        @monaco-save="${this.handleMonacoSave}"
-      ></sketch-monaco-view>
+      <div class="multi-file-diff-container">
+        ${this.files.map((file, index) => this.renderFileDiff(file, index))}
+      </div>
     `;
   }
 
@@ -404,19 +542,20 @@
         this.files = [];
       }
 
-      // If we have files, select the first one and load its content
+      // Load content for all files
       if (this.files.length > 0) {
-        const firstFile = this.files[0];
-        this.selectedFilePath = firstFile.path;
-
-        // Directly load the file content, especially important when there's only one file
-        // as sometimes the file-selected event might not fire in that case
-        this.loadFileContent(firstFile);
+        // Initialize expand states for new files (default to collapsed)
+        this.files.forEach(file => {
+          if (!this.fileExpandStates.has(file.path)) {
+            this.fileExpandStates.set(file.path, false); // false = collapsed (hide unchanged regions)
+          }
+        });
+        await this.loadAllFileContents();
       } else {
         // No files to display - reset the view to initial state
         this.selectedFilePath = "";
-        this.originalCode = "";
-        this.modifiedCode = "";
+        this.fileContents.clear();
+        this.fileExpandStates.clear();
       }
     } catch (error) {
       console.error("Error loading diff data:", error);
@@ -425,19 +564,20 @@
       this.files = [];
       // Reset the view to initial state
       this.selectedFilePath = "";
-      this.originalCode = "";
-      this.modifiedCode = "";
+      this.fileContents.clear();
+      this.fileExpandStates.clear();
     } finally {
       this.loading = false;
     }
   }
 
   /**
-   * Load the content of the selected file
+   * Load content for all files in the diff
    */
-  async loadFileContent(file: GitDiffFile) {
+  async loadAllFileContents() {
     this.loading = true;
     this.error = null;
+    this.fileContents.clear();
 
     try {
       let fromCommit: string;
@@ -455,65 +595,82 @@
         isUnstagedChanges = toCommit === "";
       }
 
-      // Set editability based on whether we're showing uncommitted changes
-      this.isRightEditable = isUnstagedChanges;
-
-      // Load the original code based on file status
-      if (file.status === "A") {
-        // Added file: empty original
-        this.originalCode = "";
-      } else {
-        // For modified, renamed, or deleted files: load original content
-        this.originalCode = await this.gitService.getFileContent(
-          file.old_hash || "",
-        );
-      }
-
-      // For modified code, always use working copy when editable
-      if (this.isRightEditable) {
+      // Load content for all files
+      const promises = this.files.map(async (file) => {
         try {
-          // Always use working copy when editable, regardless of diff status
-          // This ensures we have the latest content even if the diff hasn't been refreshed
-          this.modifiedCode = await this.gitService.getWorkingCopyContent(
-            file.path,
-          );
-        } catch (error) {
-          if (file.status === "D") {
-            // For deleted files, silently use empty content
-            console.warn(
-              `Could not get working copy for deleted file ${file.path}, using empty content`,
-            );
-            this.modifiedCode = "";
-          } else {
-            // For any other file status, propagate the error
-            console.error(
-              `Failed to get working copy for ${file.path}:`,
-              error,
-            );
-            throw error; // Rethrow to be caught by the outer try/catch
-          }
-        }
-      } else {
-        // For non-editable view, use git content based on file status
-        if (file.status === "D") {
-          // Deleted file: empty modified
-          this.modifiedCode = "";
-        } else {
-          // Added/modified/renamed: use the content from git
-          this.modifiedCode = await this.gitService.getFileContent(
-            file.new_hash || "",
-          );
-        }
-      }
+          let originalCode = "";
+          let modifiedCode = "";
+          let editable = isUnstagedChanges;
 
-      // Don't make deleted files editable
-      if (file.status === "D") {
-        this.isRightEditable = false;
-      }
+          // Load the original code based on file status
+          if (file.status !== "A") {
+            // For modified, renamed, or deleted files: load original content
+            originalCode = await this.gitService.getFileContent(
+              file.old_hash || "",
+            );
+          }
+
+          // For modified code, always use working copy when editable
+          if (editable) {
+            try {
+              // Always use working copy when editable, regardless of diff status
+              modifiedCode = await this.gitService.getWorkingCopyContent(
+                file.path,
+              );
+            } catch (error) {
+              if (file.status === "D") {
+                // For deleted files, silently use empty content
+                console.warn(
+                  `Could not get working copy for deleted file ${file.path}, using empty content`,
+                );
+                modifiedCode = "";
+              } else {
+                // For any other file status, propagate the error
+                console.error(
+                  `Failed to get working copy for ${file.path}:`,
+                  error,
+                );
+                throw error;
+              }
+            }
+          } else {
+            // For non-editable view, use git content based on file status
+            if (file.status === "D") {
+              // Deleted file: empty modified
+              modifiedCode = "";
+            } else {
+              // Added/modified/renamed: use the content from git
+              modifiedCode = await this.gitService.getFileContent(
+                file.new_hash || "",
+              );
+            }
+          }
+
+          // Don't make deleted files editable
+          if (file.status === "D") {
+            editable = false;
+          }
+
+          this.fileContents.set(file.path, {
+            original: originalCode,
+            modified: modifiedCode,
+            editable,
+          });
+        } catch (error) {
+          console.error(`Error loading content for file ${file.path}:`, error);
+          // Store empty content for failed files to prevent blocking
+          this.fileContents.set(file.path, {
+            original: "",
+            modified: "",
+            editable: false,
+          });
+        }
+      });
+
+      await Promise.all(promises);
     } catch (error) {
-      console.error("Error loading file content:", error);
-      this.error = `Error loading file content: ${error.message}`;
-      this.isRightEditable = false;
+      console.error("Error loading file contents:", error);
+      this.error = `Error loading file contents: ${error.message}`;
     } finally {
       this.loading = false;
     }
@@ -532,12 +689,150 @@
   }
 
   /**
-   * Handle file selection event from the file picker
+   * Render a single file diff section
    */
-  handleFileSelected(event: CustomEvent) {
-    const file = event.detail.file as GitDiffFile;
-    this.selectedFilePath = file.path;
-    this.loadFileContent(file);
+  renderFileDiff(file: GitDiffFile, index: number) {
+    const content = this.fileContents.get(file.path);
+    if (!content) {
+      return html`
+        <div class="file-diff-section">
+          <div class="file-header">
+            ${this.renderFileHeader(file)}
+          </div>
+          <div class="loading">Loading ${file.path}...</div>
+        </div>
+      `;
+    }
+
+    return html`
+      <div class="file-diff-section">
+        <div class="file-header">
+          ${this.renderFileHeader(file)}
+        </div>
+        <div class="file-diff-editor">
+          <sketch-monaco-view
+            .originalCode="${content.original}"
+            .modifiedCode="${content.modified}"
+            .originalFilename="${file.path}"
+            .modifiedFilename="${file.path}"
+            ?readOnly="${!content.editable}"
+            ?editable-right="${content.editable}"
+            @monaco-comment="${this.handleMonacoComment}"
+            @monaco-save="${this.handleMonacoSave}"
+            @monaco-height-changed="${this.handleMonacoHeightChange}"
+            data-file-index="${index}"
+            data-file-path="${file.path}"
+          ></sketch-monaco-view>
+        </div>
+      </div>
+    `;
+  }
+
+  /**
+   * Render file header with status and path info
+   */
+  renderFileHeader(file: GitDiffFile) {
+    const statusClass = this.getFileStatusClass(file.status);
+    const statusText = this.getFileStatusText(file.status);
+    const changesInfo = this.getChangesInfo(file);
+    const pathInfo = this.getPathInfo(file);
+
+    const isExpanded = this.fileExpandStates.get(file.path) ?? false;
+    
+    return html`
+      <div class="file-header-left">
+        <span class="file-status ${statusClass}">${statusText}</span>
+        <span class="file-path">${pathInfo}</span>
+        ${changesInfo ? html`<span class="file-changes">${changesInfo}</span>` : ''}
+      </div>
+      <div class="file-header-right">
+        <button
+          class="file-expand-button"
+          @click="${() => this.toggleFileExpansion(file.path)}"
+          title="${isExpanded
+            ? "Collapse: Hide unchanged regions to focus on changes"
+            : "Expand: Show all lines including unchanged regions"}"
+        >
+          ${isExpanded
+            ? this.renderCollapseIcon()
+            : this.renderExpandAllIcon()}
+        </button>
+      </div>
+    `;
+  }
+
+  /**
+   * Get CSS class for file status
+   */
+  getFileStatusClass(status: string): string {
+    switch (status.toUpperCase()) {
+      case "A":
+        return "added";
+      case "M":
+        return "modified";
+      case "D":
+        return "deleted";
+      case "R":
+      default:
+        if (status.toUpperCase().startsWith("R")) {
+          return "renamed";
+        }
+        return "modified";
+    }
+  }
+
+  /**
+   * Get display text for file status
+   */
+  getFileStatusText(status: string): string {
+    switch (status.toUpperCase()) {
+      case "A":
+        return "Added";
+      case "M":
+        return "Modified";
+      case "D":
+        return "Deleted";
+      case "R":
+      default:
+        if (status.toUpperCase().startsWith("R")) {
+          return "Renamed";
+        }
+        return "Modified";
+    }
+  }
+
+  /**
+   * Get changes information (+/-) for display
+   */
+  getChangesInfo(file: GitDiffFile): string {
+    const additions = file.additions || 0;
+    const deletions = file.deletions || 0;
+
+    if (additions === 0 && deletions === 0) {
+      return "";
+    }
+
+    const parts = [];
+    if (additions > 0) {
+      parts.push(`+${additions}`);
+    }
+    if (deletions > 0) {
+      parts.push(`-${deletions}`);
+    }
+
+    return `(${parts.join(", ")})`;
+  }
+
+  /**
+   * Get path information for display, handling renames
+   */
+  getPathInfo(file: GitDiffFile): string {
+    if (file.old_path && file.old_path !== "") {
+      // For renames, show old_path → new_path
+      return `${file.old_path} → ${file.path}`;
+    }
+    // For regular files, just show the path
+    return file.path;
   }
 
   /**
diff --git a/webui/src/web-components/sketch-monaco-view.ts b/webui/src/web-components/sketch-monaco-view.ts
index f472058..aaf186f 100644
--- a/webui/src/web-components/sketch-monaco-view.ts
+++ b/webui/src/web-components/sketch-monaco-view.ts
@@ -231,23 +231,21 @@
       --editor-width: 100%;
       --editor-height: 100%;
       display: flex;
-      flex: 1;
+      flex: none; /* Don't grow/shrink - size is determined by content */
       min-height: 0; /* Critical for flex layout */
       position: relative; /* Establish positioning context */
-      height: 100%; /* Take full height */
       width: 100%; /* Take full width */
+      /* Height will be set dynamically by setupAutoSizing */
     }
     main {
-      width: var(--editor-width);
-      height: var(--editor-height);
+      width: 100%;
+      height: 100%; /* Fill the host element completely */
       border: 1px solid #e0e0e0;
-      flex: 1;
-      min-height: 300px; /* Ensure a minimum height for the editor */
-      position: absolute; /* Absolute positioning to take full space */
-      top: 0;
-      left: 0;
-      right: 0;
-      bottom: 0;
+      flex: none; /* Size determined by parent */
+      min-height: 200px; /* Ensure a minimum height for the editor */
+      /* Remove absolute positioning - use normal block layout */
+      position: relative;
+      display: block;
     }
 
     /* Comment indicator and box styles */
@@ -582,6 +580,10 @@
   setOptions(value: monaco.editor.IDiffEditorConstructionOptions) {
     if (this.editor) {
       this.editor.updateOptions(value);
+      // Re-fit content after options change
+      if (this.fitEditorToContent) {
+        setTimeout(() => this.fitEditorToContent!(), 50);
+      }
     }
   }
 
@@ -598,6 +600,10 @@
           revealLineCount: 10,
         },
       });
+      // Re-fit content after toggling
+      if (this.fitEditorToContent) {
+        setTimeout(() => this.fitEditorToContent!(), 100);
+      }
     }
   }
 
@@ -619,15 +625,21 @@
 
       // First time initialization
       if (!this.editor) {
-        // Create the diff editor only once
+        // Create the diff editor with auto-sizing configuration
         this.editor = monaco.editor.createDiffEditor(this.container.value!, {
-          automaticLayout: true,
-          // Make it read-only by default
-          // We'll adjust individual editor settings after creation
+          automaticLayout: false, // We'll resize manually
           readOnly: true,
           theme: "vs", // Always use light mode
           renderSideBySide: true,
           ignoreTrimWhitespace: false,
+          scrollbar: {
+            vertical: 'hidden',
+            horizontal: 'hidden',
+            handleMouseWheel: false, // Let outer scroller eat the wheel
+          },
+          minimap: { enabled: false },
+          overviewRulerLanes: 0,
+          scrollBeyondLastLine: false,
           // Focus on the differences by hiding unchanged regions
           hideUnchangedRegions: {
             enabled: true, // Enable the feature
@@ -650,6 +662,9 @@
           this.editor.getModifiedEditor().updateOptions({ readOnly: false });
         }
 
+        // Set up auto-sizing
+        this.setupAutoSizing();
+
         // Add Monaco editor to debug global
         this.addToDebugGlobal();
       }
@@ -660,21 +675,19 @@
       this.setupContentChangeListener();
 
       // Fix cursor positioning issues by ensuring fonts are loaded
-      // This addresses the common Monaco editor cursor offset problem
       document.fonts.ready.then(() => {
         if (this.editor) {
           monaco.editor.remeasureFonts();
-          this.editor.layout();
+          this.fitEditorToContent();
         }
       });
 
       // Force layout recalculation after a short delay
-      // This ensures the editor renders properly, especially with single files
       setTimeout(() => {
         if (this.editor) {
-          this.editor.layout();
+          this.fitEditorToContent();
         }
-      }, 50);
+      }, 100);
     } catch (error) {
       console.error("Error initializing Monaco editor:", error);
     }
@@ -1067,6 +1080,21 @@
           original: this.originalModel,
           modified: this.modifiedModel,
         });
+        
+        // Set initial hideUnchangedRegions state (default to enabled/collapsed)
+        this.editor.updateOptions({
+          hideUnchangedRegions: {
+            enabled: true, // Default to collapsed state
+            contextLineCount: 3,
+            minimumLineCount: 3,
+            revealLineCount: 10,
+          },
+        });
+        
+        // Fit content after setting new models
+        if (this.fitEditorToContent) {
+          setTimeout(() => this.fitEditorToContent!(), 50);
+        }
       }
       this.setupContentChangeListener();
     } catch (error) {
@@ -1086,12 +1114,13 @@
       if (this.editor) {
         this.updateModels();
 
-        // Force layout recalculation after model updates
+        // Force auto-sizing after model updates
+        // Use a slightly longer delay to ensure layout is stable
         setTimeout(() => {
-          if (this.editor) {
-            this.editor.layout();
+          if (this.fitEditorToContent) {
+            this.fitEditorToContent();
           }
-        }, 50);
+        }, 100);
       } else {
         // If the editor isn't initialized yet but we received content,
         // initialize it now
@@ -1100,27 +1129,72 @@
     }
   }
 
+  // Set up auto-sizing for multi-file diff view
+  private setupAutoSizing() {
+    if (!this.editor) return;
+
+    const fitContent = () => {
+      try {
+        const originalEditor = this.editor!.getOriginalEditor();
+        const modifiedEditor = this.editor!.getModifiedEditor();
+        
+        const originalHeight = originalEditor.getContentHeight();
+        const modifiedHeight = modifiedEditor.getContentHeight();
+        
+        // Use the maximum height of both editors, plus some padding
+        const maxHeight = Math.max(originalHeight, modifiedHeight) + 18; // 1 blank line bottom padding
+        
+        // Set both container and host height to enable proper scrolling
+        if (this.container.value) {
+          // Set explicit heights on both container and host
+          this.container.value.style.height = `${maxHeight}px`;
+          this.style.height = `${maxHeight}px`; // Update host element height
+          
+          // Emit the height change event BEFORE calling layout
+          // This ensures parent containers resize first
+          this.dispatchEvent(new CustomEvent('monaco-height-changed', {
+            detail: { height: maxHeight },
+            bubbles: true,
+            composed: true
+          }));
+          
+          // Layout after both this component and parents have updated
+          setTimeout(() => {
+            if (this.editor && this.container.value) {
+              // Use explicit dimensions to ensure Monaco uses full available space
+              const width = this.container.value.offsetWidth;
+              this.editor.layout({
+                width: width,
+                height: maxHeight
+              });
+            }
+          }, 10);
+        }
+      } catch (error) {
+        console.error('Error in fitContent:', error);
+      }
+    };
+
+    // Store the fit function for external access
+    this.fitEditorToContent = fitContent;
+
+    // Set up listeners for content size changes
+    this.editor.getOriginalEditor().onDidContentSizeChange(fitContent);
+    this.editor.getModifiedEditor().onDidContentSizeChange(fitContent);
+
+    // Initial fit
+    fitContent();
+  }
+
+  private fitEditorToContent: (() => void) | null = null;
+
   // Add resize observer to ensure editor resizes when container changes
   firstUpdated() {
     // Initialize the editor
     this.initializeEditor();
 
-    // Create a ResizeObserver to monitor container size changes
-    if (window.ResizeObserver) {
-      const resizeObserver = new ResizeObserver(() => {
-        if (this.editor) {
-          this.editor.layout();
-        }
-      });
-
-      // Start observing the container
-      if (this.container.value) {
-        resizeObserver.observe(this.container.value);
-      }
-
-      // Store the observer for cleanup
-      this._resizeObserver = resizeObserver;
-    }
+    // For multi-file diff, we don't use ResizeObserver since we control the size
+    // Instead, we rely on auto-sizing based on content
 
     // If editable, set up edit mode and content change listener
     if (this.editableRight && this.editor) {
@@ -1209,11 +1283,14 @@
         this.modifiedModel = undefined;
       }
 
-      // Clean up resize observer
+      // Clean up resize observer (if any)
       if (this._resizeObserver) {
         this._resizeObserver.disconnect();
         this._resizeObserver = null;
       }
+      
+      // Clear the fit function reference
+      this.fitEditorToContent = null;
 
       // Remove document click handler if set
       if (this._documentClickHandler) {
