Skip to content

Fix bottom bar layout - #450

Merged
Kitenite merged 8 commits into
mainfrom
guilty-snake-e85b46
Dec 20, 2025
Merged

Kitenite merged 8 commits into
mainfrom
guilty-snake-e85b46

Conversation

@Kitenite

@Kitenite Kitenite commented Dec 20, 2025 •

Copy link
Copy Markdown
Member
  • update footer
  • update layout

Summary by CodeRabbit

  • New Features
    • New workspace footer showing current Git branch/base branch, help menu, and a path display with dropdown to open the workspace in apps and copy-path action.
  • Removed
    • Previous workspace header component removed and replaced by the footer.
  • Improvements
    • Sidebar now remembers and restores its previous size when toggling open/closed.
  • UI Changes
    • Adjusted padding, overflow handling, borders, resizable handle styling, and window chrome for a tighter, cleaner layout.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitai Bot commented Dec 20, 2025 •

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

Walkthrough

Removes WorkspaceHeader and adds a new WorkspaceFooter (with WorkspaceFooterLeft and WorkspaceFooterRight) that surface branch and worktree-path UI; updates WorkspaceView to use the footer, constrains overflow across panels, and adds persistent lastOpenSidebarSize logic to the sidebar store and resizing behavior.

Changes

Cohort / File(s) Change Summary
WorkspaceFooter core
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
New WorkspaceFooter component that renders left and right regions when worktreePath is present; exported via index.
Footer — Left
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
New WorkspaceFooterLeft component queries active workspace (TRPC) and renders branch info (current/base) plus HelpMenu and tooltips.
Footer — Right
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
New WorkspaceFooterRight component formats/displays the worktree path, provides open-in-app (including JetBrains submenu) and copy-path actions, and uses TRPC queries/mutations and last-used-app tracking.
WorkspaceHeader removal
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/WorkspaceHeader.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/index.ts
Deleted WorkspaceHeader implementation and its re-export; header UI/logic removed.
WorkspaceView layout
apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
Replaced header with footer; added overflow-hidden to panels/containers; use lastOpenSidebarSize for default/expand behavior; adjusted ResizablePanel and handle styling.
Sidebar state
apps/desktop/src/renderer/stores/sidebar-state.ts
Added lastOpenSidebarSize to store and logic: preserve last non-zero size, restore on open, update on resize, collapse sets size to 0.
UI spacing / styling tweaks
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx, apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/mosaic-theme.css
Layout and spacing adjustments (padding, overflow, border/shadow tweaks); removed right border from Sidebar; adjusted mosaic window chrome.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Pay special attention to:
    • TRPC wiring and success/error handling in WorkspaceFooterRight (open-in-app, copy path, last-used-app updates).
    • Preservation/restore semantics of lastOpenSidebarSize across resize, collapse, and toggle flows.
    • Layout/overflow changes across ResizablePanelGroup to avoid clipping or scroll regressions.
    • Path formatting/truncation and tooltip edge cases.
    • Ensure no remaining imports/usages of removed WorkspaceHeader.

Possibly related PRs

Poem

🐰 I hopped where headers once grew, now a footer softly sings,
Branches hum and paths gleam bright, with tooltips on their wings.
The sidebar remembers its width as I nuzzle and peek,
Click to open, copy, or roam — I nibble carrots, cheek to cheek. 🥕

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is incomplete and largely off-topic. It contains only two bullet points ('update footer' and 'update layout') with no substance, missing required template sections like Related Issues, Type of Change, Testing, and Screenshots. Complete the description using the provided template. Add Related Issues, specify Type of Change (Refactor), detail Testing steps, and explain the motivation for splitting WorkspaceHeader into separate footer components.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'Fix bottom bar layout' is vague and does not clearly convey what was actually changed in the PR (e.g., moving WorkspaceHeader to WorkspaceFooter, splitting components, refactoring sidebar state management). Use a more descriptive title such as 'Refactor workspace header to footer components' or 'Split WorkspaceHeader into WorkspaceFooter and WorkspaceFooterLeft/Right components' to better reflect the main structural changes.

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7ced05a and e6f92fb.

📒 Files selected for processing (2)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (3 hunks)
  • apps/desktop/src/renderer/stores/sidebar-state.ts (2 hunks)

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx (2)

109-111: Hardcoded macOS keyboard shortcuts may not work cross-platform.

The keyboard shortcut hints (⌘O, ⌘⇧C) are macOS-specific. If this Electron app targets Windows/Linux users as well, consider using a utility to display platform-appropriate shortcuts (e.g., Ctrl+O on Windows/Linux).


59-62: Consider adding error handling for mutations.

The openInApp and copyPath mutations lack onError callbacks. If these operations fail (e.g., app not installed, clipboard access denied), the user receives no feedback. Consider adding toast notifications or similar feedback for failure cases.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (1)

4-6: Consider exporting WorkspaceFooterProps for reusability.

If other components need to type-check props passed to WorkspaceFooter, exporting the interface would be helpful.

🔎 Optional change
-interface WorkspaceFooterProps {
+export interface WorkspaceFooterProps {
 	worktreePath: string | undefined;
 }
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f9009f9 and 8204731.

📒 Files selected for processing (10)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/WorkspaceHeader.tsx (0 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/index.ts (0 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (3 hunks)
  • apps/desktop/src/renderer/stores/sidebar-state.ts (2 hunks)
💤 Files with no reviewable changes (2)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/WorkspaceHeader.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceHeader/index.ts
🧰 Additional context used
📓 Path-based instructions (9)
apps/desktop/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/desktop/AGENTS.md)

apps/desktop/**/*.{ts,tsx,js,jsx}: For Electron interprocess communication, ALWAYS use trpc as defined in src/lib/trpc
Use alias as defined in tsconfig.json when possible
Prefer zustand for state management if it makes sense. Do not use effect unless absolutely necessary.

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/stores/sidebar-state.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Avoid using any type in TypeScript - maintain type safety unless absolutely necessary

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/stores/sidebar-state.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Run Biome for formatting, linting, import organization, and safe fixes at the root level using bun run lint:fix

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/stores/sidebar-state.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
**/{components,features}/**/*.{ts,tsx,test.ts,test.tsx,stories.tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Co-locate component dependencies (utils, hooks, constants, config, tests, stories) next to the file using them

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
apps/desktop/src/renderer/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never import Node.js modules in renderer process or shared code - use only in main process (src/main/)

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/stores/sidebar-state.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
apps/desktop/src/{main,renderer,preload}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use type-safe IPC communication - define channel types in apps/desktop/src/shared/ipc-channels.ts before implementing handlers

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/stores/sidebar-state.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
**/{components,features}/**/[!.]*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

Organize project structure with one folder per component: ComponentName/ComponentName.tsx with index.ts barrel export

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
**/*.{tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use React + TailwindCSS v4 + shadcn/ui for UI development

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
**/{components,features}/**/*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

**/{components,features}/**/*.tsx: Nest components in parent's components/ folder if used only once, promote to highest shared parent's components/ if used 2+ times
Use one component per file - do not combine multiple components in a single file

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
🧠 Learnings (3)
📚 Learning: 2025-12-18T23:19:10.405Z
Learnt from: CR
Repo: superset-sh/superset PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T23:19:10.405Z
Learning: Applies to **/{components,features}/**/[!.]*.tsx : Organize project structure with one folder per component: ComponentName/ComponentName.tsx with index.ts barrel export

Applied to files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
📚 Learning: 2025-12-18T23:19:10.405Z
Learnt from: CR
Repo: superset-sh/superset PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T23:19:10.405Z
Learning: Applies to apps/desktop/src/renderer/**/*.{ts,tsx} : Never import Node.js modules in renderer process or shared code - use only in main process (src/main/)

Applied to files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
📚 Learning: 2025-12-18T23:19:10.405Z
Learnt from: CR
Repo: superset-sh/superset PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T23:19:10.405Z
Learning: Applies to src/components/{ui,ai-elements,react-flow}/**/*.tsx : Use kebab-case single files for shadcn/ui components in src/components/ui/, src/components/ai-elements, and src/components/react-flow/ directories

Applied to files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
🧬 Code graph analysis (4)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (2)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx (1)
  • WorkspaceFooterLeft (6-45)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx (1)
  • WorkspaceFooterRight (52-183)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx (2)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts (1)
  • WorkspaceFooterLeft (1-1)
packages/ui/src/components/ui/tooltip.tsx (3)
  • Tooltip (76-76)
  • TooltipTrigger (76-76)
  • TooltipContent (76-76)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (3)
apps/desktop/src/renderer/stores/sidebar-state.ts (1)
  • useSidebarStore (24-83)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx (1)
  • ContentView (5-19)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (1)
  • WorkspaceFooter (8-21)
apps/desktop/src/renderer/stores/sidebar-state.ts (2)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ModeCarousel/types.ts (1)
  • SidebarMode (5-5)
apps/cli/src/lib/storage/lowdb-adapter.ts (1)
  • set (162-172)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (11)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx (1)

1-45: LGTM! Clean component implementation.

The component correctly uses trpc for data fetching, follows the single-component-per-file pattern, and properly implements conditional rendering with tooltips. The use of asChild on TooltipTrigger is the correct pattern for these UI primitives.

One minor observation: the baseBranch span (line 33) lacks a max-w-[...] constraint unlike currentBranch (line 18). If base branch names can be long, consider adding truncation for visual consistency.

apps/desktop/src/renderer/stores/sidebar-state.ts (1)

54-69: Well-structured sidebar size management.

The logic correctly preserves the last non-zero size and the comments clearly explain the intent. The branching on size > 0 properly distinguishes between resizing and collapsing operations.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/WorkspaceFooterRight.tsx (1)

30-46: Clean path formatting implementation.

The formatWorktreePath function handles edge cases well (no slash in path) and the logic is clear. Good separation of concerns by keeping this as a pure function outside the component.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/index.ts (1)

1-1: LGTM!

Correctly follows the barrel export pattern as per coding guidelines.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts (1)

1-2: LGTM!

Correctly follows the barrel export pattern as per coding guidelines.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts (1)

1-2: LGTM!

Clean barrel export following the project's component organization pattern. As per coding guidelines, this correctly provides the index.ts barrel export for the WorkspaceFooterLeft component folder.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (4)

15-15: LGTM!

Import correctly updated to reflect the UI shift from header to footer component.


94-99: LGTM!

Good use of lastOpenSidebarSize from the sidebar store to persist the user's preferred sidebar width across toggle cycles.


119-132: LGTM!

The ResizablePanel configuration correctly uses lastOpenSidebarSize for both:

  • Initial defaultSize when sidebar is open
  • Restoring size in onExpand callback

This ensures the sidebar remembers its width across toggle cycles. The overflow-hidden class is a good addition to prevent content overflow.


137-144: LGTM!

Layout structure is well-organized:

  • Content area uses flex-1 min-h-0 to properly fill available space while respecting the footer
  • WorkspaceFooter is positioned at the bottom with the required worktreePath prop
  • Consistent overflow-hidden prevents layout issues
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (1)

8-21: LGTM!

Clean component implementation:

  • Early return for missing worktreePath prevents rendering an empty footer
  • Flex layout with ml-auto correctly positions left and right sections
  • min-w-0 on the left container allows proper text truncation in child components
  • Consistent styling with the design system (bg-tertiary, text-xs, select-none)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8204731 and de57f69.

📒 Files selected for processing (7)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx (3 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts (1 hunks)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/WorkspaceFooterLeft.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterRight/index.ts
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/components/WorkspaceFooterLeft/index.ts
🧰 Additional context used
📓 Path-based instructions (9)
apps/desktop/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (apps/desktop/AGENTS.md)

apps/desktop/**/*.{ts,tsx,js,jsx}: For Electron interprocess communication, ALWAYS use trpc as defined in src/lib/trpc
Use alias as defined in tsconfig.json when possible
Prefer zustand for state management if it makes sense. Do not use effect unless absolutely necessary.

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Avoid using any type in TypeScript - maintain type safety unless absolutely necessary

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Run Biome for formatting, linting, import organization, and safe fixes at the root level using bun run lint:fix

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/{components,features}/**/[!.]*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

Organize project structure with one folder per component: ComponentName/ComponentName.tsx with index.ts barrel export

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/{components,features}/**/*.{ts,tsx,test.ts,test.tsx,stories.tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Co-locate component dependencies (utils, hooks, constants, config, tests, stories) next to the file using them

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
apps/desktop/src/renderer/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Never import Node.js modules in renderer process or shared code - use only in main process (src/main/)

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
apps/desktop/src/{main,renderer,preload}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use type-safe IPC communication - define channel types in apps/desktop/src/shared/ipc-channels.ts before implementing handlers

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/*.{tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use React + TailwindCSS v4 + shadcn/ui for UI development

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
**/{components,features}/**/*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

**/{components,features}/**/*.tsx: Nest components in parent's components/ folder if used only once, promote to highest shared parent's components/ if used 2+ times
Use one component per file - do not combine multiple components in a single file

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx
🧠 Learnings (1)
📚 Learning: 2025-12-18T23:19:10.405Z
Learnt from: CR
Repo: superset-sh/superset PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-18T23:19:10.405Z
Learning: Applies to src/components/{ui,ai-elements,react-flow}/**/*.tsx : Use kebab-case single files for shadcn/ui components in src/components/ui/, src/components/ai-elements, and src/components/react-flow/ directories

Applied to files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx
🧬 Code graph analysis (1)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (3)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx (1)
  • Sidebar (7-29)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx (1)
  • ContentView (5-19)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/WorkspaceFooter/WorkspaceFooter.tsx (1)
  • WorkspaceFooter (8-21)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (10)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/index.tsx (1)

13-13: LGTM! Border removal aligns with layout update.

The removal of the right border (border-r border-border/50) from the sidebar is consistent with the PR's layout changes and the introduction of the new WorkspaceFooter system.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/ChangesView/ChangesView.tsx (1)

152-152: LGTM! Consistent padding improves layout cohesion.

The addition of p-2 padding across all placeholder states (no workspace, loading, error) and the root container creates uniform spacing that aligns with the PR's layout overhaul objectives. The early-return states now have consistent visual treatment, and the main content benefits from the root container padding.

Also applies to: 160-160, 175-175, 200-200

apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/index.tsx (1)

10-11: The styling changes are correct and necessary for the layout. Remove the verification request.

The nested overflow-hidden declarations are intentional: the outer container constrains the layout boundary with padding, while the inner container applies styling and visual borders. The ChangesContent component properly manages the flex layout with its toolbar and scrollable content area below. Monaco DiffEditor handles scrolling internally via its configuration, not through CSS overflow properties, so no content clipping occurs. The asymmetry with TabsContent is appropriate given their different UI patterns.

Likely an incorrect or invalid review comment.

apps/desktop/src/renderer/screens/main/components/WorkspaceView/index.tsx (7)

15-15: LGTM: Import updated correctly.

The import change from WorkspaceHeader to WorkspaceFooter aligns with the PR objective to move the header UI to the bottom of the layout.


110-113: LGTM: Overflow control improved.

Adding overflow-hidden to the outer container and ResizablePanelGroup ensures proper layout containment and prevents unwanted scrollbars.


133-135: LGTM: Proper flexbox overflow handling.

Adding overflow-hidden to the panel and min-h-0 to the content wrapper is correct. The min-h-0 is essential for allowing flex children to shrink below their content size, enabling proper overflow control in nested flexbox layouts.


138-138: LGTM: Footer component properly integrated.

The WorkspaceFooter component is correctly positioned at the bottom of the flex column layout and receives the appropriate worktreePath prop. The component handles the undefined case gracefully by returning null.


125-125: LGTM: Sidebar overflow properly constrained.

Adding overflow-hidden to the sidebar panel ensures content stays within bounds, consistent with the overall overflow control strategy in this layout.


94-94: The sidebar store correctly preserves lastOpenSidebarSize when collapsing.

The store implementation includes proper guards: setSidebarSize() only updates lastOpenSidebarSize when the new size is greater than 0. When collapsing (size = 0), it sets sidebarSize: 0 and isSidebarOpen: false while leaving lastOpenSidebarSize unchanged, ensuring the expand behavior correctly restores the sidebar to its previous width.


117-124: The sidebar store properly initializes lastOpenSidebarSize to DEFAULT_SIDEBAR_SIZE (15), not 0 or undefined. On first app launch, the store defaults to this sensible value, making the fallback suggestion unnecessary.

Likely an incorrect or invalid review comment.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/mosaic-theme.css (1)

10-12: Consider removing ineffective CSS properties.

With border: none and box-shadow: none now set, the following properties no longer produce visual effects:

  • Lines 10-12: Transitions for border-color and box-shadow
  • Line 15: border-color assignment on focused windows

You may optionally clean these up for clarity, or retain them if you anticipate re-introducing borders in the future.

🔎 Optional cleanup

Lines 10-12:

-	transition:
-		border-color 0.15s ease,
-		box-shadow 0.15s ease;

Lines 14-16:

 .mosaic-theme-dark .mosaic-window-focused {
-	border-color: var(--color-tertiary-active);
 }

Also applies to: 15-15

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between de57f69 and 7ced05a.

📒 Files selected for processing (1)
  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/mosaic-theme.css (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use React + TailwindCSS v4 + shadcn/ui for UI development

Files:

  • apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/mosaic-theme.css
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (1)
apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/mosaic-theme.css (1)

6-6: LGTM - Borderless mosaic windows.

The removal of borders and box-shadow creates a cleaner, more modern appearance for mosaic windows.

Also applies to: 9-9

@Kitenite
Kitenite merged commit def54ba into main Dec 20, 2025
4 of 5 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

Service Status
Neon Database (Neon) ✅

Thank you for your contribution! 🎉


Preview resources have been processed for cleanup

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