Skip to content

feat: redesign branch cards, timeline actions, and card layout consistency#98

Merged
taylorkmho merged 24 commits intomainfrom
feat/collapsible-sidebar
Feb 13, 2026
Merged

feat: redesign branch cards, timeline actions, and card layout consistency#98
taylorkmho merged 24 commits intomainfrom
feat/collapsible-sidebar

Conversation

@taylorkmho
Copy link
Contributor

@taylorkmho taylorkmho commented Feb 13, 2026

Summary

Redesign branch card headers, move note/commit action buttons into the timeline, and align remote cards with local card layout. Frontend-only changes (8 files).

  • BranchCard header: flatten to icon + column layout (branch name over base branch), remove separator; replace hasCommits with hasCodeChanges (checks for actual SHAs); make primary action button icon-only at 14px; remove standalone diff button
  • BranchTimeline: accept onNewNote / onNewCommit / footerActions props; render empty-state with large action buttons and a footer row with inline "New note" / "New commit" buttons; both local and remote cards now delegate action buttons here
  • RemoteBranchCard: match local card header (icon left, column layout, workspace name as subtitle); remove card footer entirely — action buttons live in BranchTimeline now
  • TimelineRow: add isNote derived; consolidate duplicate icon conditionals
  • ProjectSection: sort branches by updatedAt descending; move "New Branch" button to top of list
  • Color tokens: fix var(--ui-success) / var(--ui-success, #22c55e)var(--status-added) in NoteModal and SessionLauncher
  • navigation.svelte.ts (new): lightweight client-side nav state (selectedProjectId, selectProject, selectProjectAndBranch, goHome)

Files changed

File What changed
BranchCard.svelte Header redesign, icon-only action button, delegate note/commit/diff to timeline footer
RemoteBranchCard.svelte Header aligned with local card, footer removed, action buttons moved to timeline
BranchTimeline.svelte New props for inline action buttons, empty-state and footer-row rendering
TimelineRow.svelte isNote derived, consolidated icon conditionals
ProjectSection.svelte Sort by updatedAt, "New Branch" button moved to top
NoteModal.svelte --ui-success--status-added
SessionLauncher.svelte --ui-success--status-added
navigation.svelte.ts New — client-side project/branch navigation state

taylorkmho and others added 18 commits February 12, 2026 21:49
- Create projectStore.svelte.ts: shared reactive singleton for projects
  and branches, lifting state out of ProjectHome so the sidebar and main
  view share data without double-fetching
- Create Sidebar.svelte: collapsible left sidebar that fetches timelines
  for all tracked branches and renders a cumulative, recency-sorted list
  of commits and notes across all projects
  - Group-by-project toggle organizes items under project headings
  - Flat mode shows all items sorted by timestamp descending
  - Clicking an item scrolls to its parent branch card with a highlight flash
  - Colored icons distinguish commits (timeline-commit) from notes (timeline-note)
  - Each item shows title, branch name, and compact relative time
- Refactor ProjectHome.svelte to consume projectStore instead of owning
  state; sort each project's branches by updatedAt descending
- Update App.svelte layout from single column to horizontal flex below
  TopBar, with sidebar on left and content on right; add Cmd+B keyboard
  shortcut to toggle sidebar visibility
- Add PanelLeft toggle button to TopBar with active state accent color
- Add sidebar-open and sidebar-group-by-project preferences with Tauri
  persistent store backing (defaults: both true)
- Add data-branch-id attribute to BranchCard and RemoteBranchCard root
  elements for scroll-to-branch targeting
- Add scroll-highlight CSS animation for visual feedback on navigation

Co-authored-by: Cursor <cursoragent@cursor.com>
- Add sidebarWidth preference (default 220px, clamped 140–480px)
  with Tauri store persistence via new sidebar-width key
- Add setSidebarWidth() action to preferences module
- Replace fixed 220px sidebar width with dynamic style:width
  driven by preferences.sidebarWidth
- Add resize handle on right edge of Sidebar.svelte with
  mousedown/mousemove/mouseup tracking on document
- Handle highlights with var(--ui-accent) on hover and during drag
- Prevent text selection globally during resize via body style overrides

Co-authored-by: Cursor <cursoragent@cursor.com>
- Add "Builds" section at the top of the sidebar list showing all
  currently running (and recently finished) actions across all branches
- Listen to action_status Tauri events to track builds in real-time
  with live elapsed time counter that ticks every second
- Each build item shows status icon (spinner/check/alert), action name,
  branch name, and elapsed/total duration
- Clicking a build scrolls to its branch card and opens the
  ActionOutputModal via a new staged:show-action-output custom event
- Add event listener in BranchCard to handle staged:show-action-output
  and open the output modal when triggered from the sidebar
- Builds auto-remove after completion (3s) or failure (6s) so the
  section disappears when no builds are active
- Builds section scrolls inline with the activity feed (not fixed)

Co-authored-by: Cursor <cursoragent@cursor.com>
- Move the "New Branch" dashed button from the bottom to the top of the
  branches list in ProjectSection.svelte for easier access
- Update file header comment to reflect new button placement

Co-authored-by: Cursor <cursoragent@cursor.com>
…gress

- Add navigation state module (navigation.svelte.ts) with selectedProjectId,
  selectProject(), and goHome() for lightweight client-side view switching
- Add ProjectCard.svelte showing project name, branch count, last activity
  (relative timestamp), and up to 5 recent commits per project
- Add ProjectsList.svelte as the new landing page rendering project cards
  with timeline metadata fetched from existing getBranchTimeline API
- Move empty/loading/store-update states from ProjectHome to ProjectsList
- Refactor ProjectHome.svelte to accept a required projectId prop, filter
  to a single project, and add a back button to return to the projects list
- Add Projects navigation section to the top of Sidebar.svelte with
  clickable project items, active state highlighting, and last-activity times
- Filter the sidebar Activity feed to the selected project when one is active
- Make TopBar "+" button context-aware: dispatches staged:new-project on
  the landing page and staged:new-branch when viewing a project detail
- Navigate to the new project's detail view after creation
- Update App.svelte to switch between ProjectsList and ProjectHome based
  on navigation.selectedProjectId

Co-authored-by: Cursor <cursoragent@cursor.com>
- Replace plain-text "Projects" section header with a prominent nav item
  featuring a Folder icon, hover state, and active highlight when on the
  projects list view
- Remove individual project list from the sidebar (navigation to projects
  now goes through the Projects nav item to the landing page)
- Bump nav-item font to --size-base, activity items (timeline, builds,
  groups, empty state) to --size-base, and item-meta bylines to --size-sm
- Clean up dead code: remove unused Home and selectProject imports,
  getProjectLastActivity helper, and all .project-nav-* CSS rules

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
- Rework ProjectCard from a filled card (bg/border/radius) to a flat
  section with a clickable header row showing project name, branch count,
  and a hover-reveal chevron for navigation affordance
- Replace recent commits list with a vertical list of recent branches
  (up to 5, sorted by updatedAt) using --branch-color semantic tokens
- Clicking a branch navigates to the project detail and scrolls to that
  branch's card via selectProjectAndBranch() in navigation.svelte.ts
- Add selectProjectAndBranch() helper that sets selectedProjectId then
  dispatches staged:scroll-to-branch after a delay for mount timing
- Remove all timeline-fetching logic from ProjectsList (commitsByProject,
  fetchAllTimelines, stripXmlTags, formatRelativeTime, getRecentCommits,
  getLastActivity, getBranchCount) since commits are no longer shown
- Add "Projects" page title with a "+" new project button on the right
- Use negative horizontal margins on project entries for optical
  alignment of project names with the page title

Co-authored-by: Cursor <cursoragent@cursor.com>
…pective sections

- Split BranchTimeline into two visual sections: horizontal notes strip
  and vertical commit timeline, each with its own inline add button
- Add "New note" button as the last chip in the notes strip (dashed border,
  1/3-width slot, highlights with --note-color on hover)
- Add "New commit" button at the bottom of the commit timeline (dashed border,
  highlights with --commit-color on hover)
- Add onNewNote, onNewCommit, and newSessionDisabled props to BranchTimeline
- Wire new props from BranchCard and RemoteBranchCard
- Move note rendering out of TimelineRow into BranchTimeline as horizontal
  chips (TimelineRow now only handles commits and reviews)
- Keep existing footer buttons in both card components

Co-authored-by: Cursor <cursoragent@cursor.com>
- Restructure card header into two-row layout: branch name title on top,
  base branch with icon below, replacing the single-row inline format
- Convert primary run action button from pill-shaped text button to
  circular icon-only button with white fill (idle) and muted background
  (running/stop state)
- Replace Spinner with StopCircle icon when action is running for
  stop-button affordance; action name shown via title tooltip
- Move diff button from header actions to footer, grouped with Create PR
  button in a new footer-left container
- Remove branch separator character, base branch now shown as smaller
  metadata text beneath the title
- Header actions (play, running actions, more menu) vertically centered
  against the combined title + metadata height

Co-authored-by: Cursor <cursoragent@cursor.com>
- Change note chip default background from var(--note-bg) to
  var(--bg-hover) for a neutral muted appearance
- Change hover background from var(--note-bg-emphasis) to
  var(--note-bg) so chips transition to yellow on hover
- Note icon retains its yellow color (var(--note-color)) at all times

Co-authored-by: Cursor <cursoragent@cursor.com>
…e branch rows

- Pull GitBranch icon out of header-bottom into card-header as a
  standalone element, vertically centered against the stacked text
- Flatten header-left to contain branch-name and base-branch-name
  directly, removing the intermediate header-top/header-bottom wrappers
- Add gap to card-header for consistent icon-to-text spacing

Co-authored-by: Cursor <cursoragent@cursor.com>
…th spinner

- Change primary action button fill from white to var(--bg-elevated)
  with white (#fff) icon color, inverting the previous color scheme
- Replace StopCircle with Spinner component when action is running
  for a loading indicator instead of a stop affordance

Co-authored-by: Cursor <cursoragent@cursor.com>
…imeline

- Default sidebar to closed (sidebarOpen: false) so new users start
  with a wider workspace; persisted preference still overrides
- BranchCard: remove "New note" / "New commit" footer buttons and
  associated styles; use Spinner instead of StopCircle for running
  actions; apply theme variables to primary-action-button
- BranchTimeline: add empty-state with large dashed "Add Note" /
  "Add Commit" action buttons when timeline is empty
- BranchTimeline: restyle note chips with transparent background and
  subtle border, highlight border color on hover instead of fill

Co-authored-by: Cursor <cursoragent@cursor.com>
- Move Create PR and diff viewer buttons from card footer into the
  commit timeline row, inline with the New commit button (PR left, diff right)
- Only show PR/diff buttons when there are code changes (at least one
  finalized commit with a SHA on the branch)
- Add `hasCodeChanges` derived state in BranchCard based on timeline commits
- Pass buttons to BranchTimeline via Svelte 5 `footerActions` snippet prop
- Remove card-footer section and its styles from BranchCard
- Update empty state action buttons: muted bg (--bg-elevated), no dashed border
- Add flex layout with gap to add-commit-row for inline button alignment

Co-authored-by: Cursor <cursoragent@cursor.com>
- Restructure header to use .header-left flex-column with branch name
  and workspace name subtitle, matching the local card's two-line layout
- Move workspace name from separate .card-subheader into the header as
  a .base-branch-name subtitle
- Update .card-header styles: padding 12px 16px, gap 12px, add
  border-bottom to match local card
- Add .header-left and .base-branch-name styles, remove unused
  .branch-info, .card-subheader, and .workspace-name styles
- Reduce Cloud icon size from 16 to 14 to match GitBranch icon sizing
- Tighten .header-actions gap from 8px to 4px for consistency

Co-authored-by: Cursor <cursoragent@cursor.com>
- Remove note/commit button footer that appeared when workspace was running
- Remove associated CSS for .card-footer, .new-btn-group, .new-item-btn
- Clean up unused GitCommitHorizontal and StickyNote imports

Co-authored-by: Cursor <cursoragent@cursor.com>
- Redesign Sidebar as a rounded floating pane (border-radius, margin,
  subtle bg color) instead of bordered edge-to-edge panel
- Replace commit/note activity feed with flat list of recent branches
  sorted by updatedAt, shown across all projects
- Remove group-by-project toggle, per-project filtering, and async
  timeline fetching (SidebarItem type, fetchAllTimelines, etc.)
- Clicking any sidebar item now navigates to the correct project first,
  then scrolls to and highlights the branch card
- Make selectProjectAndBranch skip the 150ms mount delay when already
  viewing the target project for instant scroll
- Add projectId to RunningBuild type so build clicks also navigate
  to the correct project before opening the output modal
- Increase font sizes throughout sidebar (nav: xl, items: lg, meta: base,
  titles: sm, empty: lg)
- Increase padding around Projects button for better touch target
- Remove all internal borders (activity-header, builds-section)
- ProjectSection: reorder header to show name first, always-visible menu
  icon, increase project name to size-xl
- ProjectCard: add cloud icon for remote branches with running state color

Co-authored-by: Cursor <cursoragent@cursor.com>
taylorkmho and others added 5 commits February 13, 2026 13:48
- Merge notes back into the single sorted timeline list alongside
  commits and reviews, reverting the horizontal note-chip strip
- Add FileText icon and note-color styling to TimelineRow for note items
- Handle pending/failed states for notes (spinner, alert triangle)
- Use type-specific icons on footer buttons (FileText for notes,
  GitCommitHorizontal for commits) instead of generic Plus
- Remove ~140 lines of unused note-chip CSS and related imports
  (Spinner, MessageSquare, Trash2, AlertTriangle from BranchTimeline)

Co-authored-by: Cursor <cursoragent@cursor.com>
…ts navigation

- Remove Sidebar.svelte, ProjectsList.svelte, ProjectCard.svelte,
  projectStore.svelte.ts, navigation.svelte.ts, detailPanelState.svelte.ts
- Restore App.svelte to render TopBar + ProjectHome directly (no sidebar,
  no conditional routing between projects list and project detail)
- Restore TopBar.svelte to simple layout without sidebar toggle or
  context-aware "+" button
- Restore ProjectHome.svelte as self-contained page with local state for
  projects, branches, loading, error, and all modal management
- Remove sidebar-related preferences (sidebarOpen, sidebarWidth,
  sidebarGroupByProject) from preferences.svelte.ts
- Remove sidebar event handler (staged:show-action-output) from BranchCard
- Sort branches by most recently updated (descending) in ProjectSection
- Move "New Branch" button to top of branch list
- Preserve independent UI improvements: header layout redesign, circular
  action buttons, timeline-integrated note/commit buttons, cleaner
  TimelineRow conditionals

Co-authored-by: Cursor <cursoragent@cursor.com>
* origin/main:
  fix: surface worktree setup errors instead of showing infinite spinner (#106)
  feat: store data in platform-conventional directories (XDG) (#104)
  feat(notes): add copy-to-clipboard button in NoteModal (#103)
  feat: add use github repo based projects to avoid cloning when using remote branches (#102)
  fix: always branch new worktrees from remote-tracking refs (#100)
  fix: remove debug console.log statements from BranchCard (#97)
  feat: improve PR button UX with push support and conditional visibility (#89)
…mits

- Resolve 5 merge conflicts in BranchCard.svelte:
  - Keep hasCodeChanges (snippet gate) over hasCommits (unused footer gate)
  - Take main's !worktreeError guard + HEAD's data-branch-id attribute
  - Keep HEAD's snippet-based PR button (no separate card-footer)
  - Add main's .worktree-error styles alongside HEAD's .footer-actions
  - Drop .new-btn-group styles (note/commit now in BranchTimeline)
- Update snippet PR button with main's push state handling
  (pushing, push errors, force push dialogs, unpushed commits)
- Remove unused hasCommits derived variable

Co-authored-by: Cursor <cursoragent@cursor.com>
…success states

- Replace hardcoded `color: #fff` with `var(--ui-accent)` in
  .primary-action-button so the play icon is visible in light mode
- Replace undefined `var(--ui-success)` with `var(--status-added)` across
  three files — the token was never defined in theme.ts or app.css:
  - BranchCard.svelte: completed action button and running action badge
  - NoteModal.svelte: copied state on share button
  - SessionLauncher.svelte: completed session indicator (also removes
    inline fallback that was papering over the missing token)

Co-authored-by: Cursor <cursoragent@cursor.com>
@taylorkmho taylorkmho changed the title feat: collapsible sidebar with project navigation and UI redesign feat: UI redesign with improved branch cards, timeline, and GitHub project flow Feb 13, 2026
- BranchCard: keep both data-branch-id and drag-over class
- BranchTimeline: integrate pendingDropNotes with inline action buttons

Co-authored-by: Cursor <cursoragent@cursor.com>
@taylorkmho taylorkmho changed the title feat: UI redesign with improved branch cards, timeline, and GitHub project flow feat: UI redesign with improved branch cards, timeline, and backend reliability Feb 13, 2026
@taylorkmho taylorkmho merged commit c0b1924 into main Feb 13, 2026
3 checks passed
@taylorkmho taylorkmho deleted the feat/collapsible-sidebar branch February 13, 2026 23:14
@taylorkmho taylorkmho changed the title feat: UI redesign with improved branch cards, timeline, and backend reliability feat: redesign branch cards, timeline actions, and card layout consistency Feb 13, 2026
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