Commit Graph
27 Commits
Author SHA1 Message Date
Nelson Pires 2e08501ea5 Refactor inline comment architecture across plan/files/diff and fix diff overlay rendering (#461) 2026-02-20 23:20:33 +02:00
Nelson Pires 49170fe242 Restore embedded inline comments in Plan/File/Diff views (#456)
* fix(plan-comments): restore embedded inline comment widgets in Plan view

Reinstate CodeMirror block-widget comments so plan annotations stay anchored to selected lines and preserve drag/selection behavior without floating overlays.

* fix(file-comments): return Files editor comments to embedded widgets

Use inline block widgets for file drafts while keeping full-path draft scoping, so similarly named files no longer risk comment collisions.

* fix(diff-comments): render inline comments through annotation portals

Replace absolute floating positioning with annotation-target portals to keep diff comments attached to their lines across shadow DOM updates.

* chore(comments): remove deprecated floating comment hook

Drop the unused floating-comment implementation now that plan, file, and diff views all use embedded comment rendering paths.

* fix(codemirror): expose gutter width as CSS variable

Measure the current CodeMirror gutter and publish --oc-editor-gutter-width on the editor host so inline widgets can size to the visible code area without hardcoded dimensions.

* fix(context-panel): publish panel width for embedded widgets

Set --oc-context-panel-width on the context panel in both docked and expanded modes so comment widgets can follow the active panel width dynamically.

* fix(file-comments): constrain inline input to editor content width

Use context-panel and editor-gutter CSS variables to cap comment input width to the visible editor content area, keeping action buttons fully visible in no-wrap mode.

* fix(file-comments): constrain inline comment cards to content area

Apply the same variable-based width cap to saved comment cards so card actions stay visible when long lines force horizontal scrolling.

* fix(diff-comments): stabilize new comment annotation identity

Derive new-comment annotation ids from selection side and line range, and reuse that id for portal target lookup and keys to avoid remount glitches.
2026-02-20 16:52:01 +02:00
Bohdan Triapitsyn 47c943b487 feat(ui): redesign workspace shell with context panel, tabbed sidebars, and faster diff UX (#433)
* feat: tabbed right sidebar, context panel, floating diff comments

* fix: auto-close left sidebar when context panel opens

- Increase default context panel width from 520 to 600 pixels
- Increase sidebar minimum width from 200 to 300 pixels
- Replace collapsible component with custom button in diff view

* refactoring: rework sidebars, tabs, and file tree layout

- Rewrite AnimatedTabs as segment-style with sliding indicator
- Upgrade SidebarFilesTree to match FilesView features (context menus,
  git status, file icons, CRUD dialogs, fuzzy search ranking)
- Restructure FilesView header: tabs row + actions row, remove breadcrumbs
- Show relative path in context panel header, track active tab
- Allow left sidebar to stay open alongside context panel
- Hide diff/files tabs from header on desktop (mobile-only)
- Move chevron after group name in session sidebar
- Compact tab heights in right sidebar and git view
- Size PreviewToggleButton to match other action buttons
- Remove directory loading spinner from folder icons

* feat: add project icon and color customization

- Enable users to assign custom icons to projects
- Allow users to choose accent colors for projects
- Stabilize repo status UI during project switching

* feat: add scroll fade indicators to editor tabs

* style: reduce spacing and icon sizes in header

* style: adjust tab component padding from uniform to vertical-horizontal

* feat: Add session state indicators to project tabs

* feat: Enhance session status handling and improve UI responsiveness

* fix: preserve upstream tracking on branch rename

* fix: improve initial remote selection for pull requests

- Uses saved remote name from previous session when available
- Selects remote based on tracking branch when possible
- Falls back to origin or first available remote

* perf(diff): faster highlight, stable stacked scroll

- split/unified Pierre worker pools; prefer shiki-wasm
- align diff CSS line-height; disable scroll anchoring; drop WebKit compositing hacks
- harden stacked pin/align (cancel on user scroll/input); prevent overscroll
- make overlay scrollbar MutationObserver optional; disable for diff container

* feat: handle binary files in diff view

* fix: adjust project tabs layout and drag regions

* style: update drag overlay visual styling

* feat: enable number keys to switch projects in the sidebar

* fix: recognize octet-stream as text-based MIME type

* feat: add keyboard navigation to context panel

* feat: add session pinning to sidebar

- Pin important sessions to keep them at the top
- Pinned sessions persist across browser sessions

* refactor: move context usage display from chat input to header
2026-02-16 14:15:19 +02:00
Bohdan Triapitsyn 523eafdf65 perf(diff): Pierre diff optimizations (#419)
* perf: implement virtualized rendering for diff viewer

- Enables efficient rendering of large diffs by only rendering visible content
- Uses shared virtualizer cache to optimize memory across multiple diff viewers
- Configures virtual scrolling with 24px line height for consistent layout

* fix: improve diff viewer line selection and annotation rendering

* fix: normalize line ranges to prevent selection bugs

* chore: upgrade @opencode-ai/sdk to v1.1.65
2026-02-13 19:05:31 +02:00
Iuliia Ivashko 1efe8a1cba fix(PierreDiffViewer): use currentTheme.variant for dark mode (#376) 2026-02-09 19:13:55 +02:00
Nelson Pires 3fff7a1475 feat: Remove notifications when comments are added/edited/removed (#369)
* fix: remove comment toast notifications

Remove success toasts after updating a comment
Remove success toasts after saving a comment draft
Keep saving logic and line reset intact without toast feedback

* fix(ui): remove success toast on draft save

Remove success toast after saving a draft
Suppress toast when updating an existing draft

* fix(planview): suppress toast on save and reset state

Remove toast notification after saving or updating a draft
Clear comment input and line selection after commit
Preserve draft save/update logic without triggering toast
2026-02-09 16:52:54 +02:00
Nelson Pires 0de201e042 Fix: Resolve Comment Draft Collisions by Using Full File Path (#370)
* fix(FilesView): use file path for drafts labeling

Use file path for draft labels instead of file name for precise grouping
Filter and associate drafts by file path to ensure correct per-file draft retrieval
Improve handling of files with identical names across directories

* fix(PierreDiffViewer): use fileName as label for drafts

Use fileName as the draft label when editing or adding diffs
Fallback to 'unknown' if fileName is missing for draft labels
Align draft filtering to the provided fileName rather than basename

* refactor(ui): remove unused fileLabel computation
2026-02-09 16:52:41 +02:00
Nelson Pires 1e012d37b4 Opencode/daring jackal (#356)
* feat: export inline comment components

Expose InlineCommentCard and InlineCommentInput from the comments index
Enable importing both components from a single module path

* feat: add InlineCommentCard for inline comments with collapse

Enable collapsing for long comments with Show more and Show less
Provide dropdown menu with edit and delete actions
Show file label and line range in the header

* feat: add InlineCommentInput component

Add InlineCommentInput component for per-line comments
Enable Cmd/Ctrl+Enter to save and Escape to cancel
Show file label and line range when provided and focus input on mount

* feat: render block widgets in CodeMirrorEditor

Add blockWidgets prop to configure widgets after lines
Render React portals into per-widget containers within the editor
Introduce BlockWidget and DOM container mapping to host widgets

* feat(PierreDiffViewer): enable inline comment drafting and theming

Add inline comment draft management for diff lines
Render InlineCommentInput and InlineCommentCard for comments in diff
Integrate theme system to support dark and light modes

* feat: improve inline comment editing in PlanView

Enable auto-scroll for mobile when editing inline comments
Cancel edits when clicking outside comment widgets or code gutter
Extend save handler to accept explicit range and guard against empty text

* feat(pierre-diff-viewer): enable mobile tap-to-extend selection

Extend selection on mobile when tapping the same side to include range
Show saved annotation cards on all devices

* fix(plan): show saved cards on all devices

Render saved cards on all devices
Ensure saved cards appear for mobile layouts as well

* refactor: simplify state usage and remove focus hacks

Remove pending focus state and related effects in PlanView and PierreDiffViewer
Initialize UI store usage via useUIStore() without destructuring values in PlanView and PierreDiffViewer
Align annotation handling to DiffLineAnnotation metadata and include side in lineRange for inline comments
2026-02-08 15:42:50 +02:00
Nelson Pires 16d7a1820b Add edit comment in plan and diff panel (#328)
* feat: add view ready and destroy callbacks to CodeMirrorEditor

Provide onViewReady callback that receives the EditorView once created
Provide onViewDestroy callback invoked when the editor is destroyed

* feat: render inline drafts in PlanView with portal

Add editorView state to track the active CodeMirror instance
Render inline drafts through a portal anchored to the editor scroll container
Position drafts relative to the corresponding start line in the editor

* feat(PierreDiffViewer): enable editing inline diff drafts

Enable editing of existing inline diff drafts with draftID handling
Auto-focus comment input when opening editor and place cursor at end

* feat: enable editing inline drafts and auto focus

Enable editing of existing inline drafts via new editingDraftId state and updateDraft
Auto focus the comment input and place cursor at end when a line is selected
Add edit action button in the inline actions bar to start editing

* feat: add updateDraft to inline comment drafts store

Add updateDraft action to modify a specific draft by session and id
Merge updates into the target draft without altering other fields
Retains existing draft management actions like remove and clear
2026-02-06 02:51:03 +02:00
Nelson Pires c119d89084 Introduce inline comment in plan and diff panel (#277)
* feat(chat): support inline comment drafts in chat input

Add per-session inline comment draft tracking
Append inline drafts to outgoing messages when queuing
Consume drafts after sending to clear state

* feat: add actions menu to PierreDiffViewer

Add a dropdown actions menu in the diff viewer with More and Delete options
Enable inline comment drafting support and selection synchronization to prevent loops
Replace previous action icon with contextual actions in the header

* feat(plan): enable inline comment drafting in PlanView

Add inline comment draft support with addDraft, removeDraft and drafts state
Compute session key for drafts based on currentSessionId and draft state
Prepare dropdown and toast utilities for draft actions in PlanView

* feat: add inline comment formatting utilities

Introduce formatInlineCommentDraft to render inline comments for diff and plan views
Add appendInlineComments to attach comments to existing messages with proper separation
Provide hasInlineComments to detect inline comment blocks in text

* feat: add inline comment draft store

Persist drafts per session key for inline comments
Add, remove, and clear drafts with unique IDs per session
Consume drafts to move them out of store after submission
2026-02-03 20:05:01 +02:00
Bohdan Triapitsyn d846f039e6 chat: redesign chat input stop/send buttons
- stop button replaces send button in footer instead of overlay
- floating queue button above stop when input has content
- buttons same size, stop icon larger for emphasis
2026-02-01 22:43:46 +02:00
Bohdan Triapitsyn 630c41cd1a perf: optimize stacked diff view and Pierre diff rendering
- Compute default expanded count for stacked view to reduce DOM load
- Move diff processing to worker pool to improve UI responsiveness
- Add content cache key to avoid recomputing large diffs on render
2026-02-01 20:53:10 +02:00
Bohdan Triapitsyn ddedc02687 feat: introduced a token-based theming system across the UI
* feat: added themes system

* feat: smart sidebar auto-hide for files/diff tabs + lower files sidebar threshold

* feat: added Checkbox component and update theming

- Add reusable Checkbox component for toggles across UI
- Replace several inputs with Checkbox in settings and commands panels
- Add DiffIcon and apply surface/border theming to key UI areas

* feat: Add convert-vscode-theme.cjs to convert VS Code themes to OpenChamber format

* refactor: remove unused permission logic from ChatInput

- Remove unused permission rules parsing logic from ChatInput
- Memoize renderTheme in DiffWorkerProvider to avoid unnecessary recalculations
- Remove forceOpaque helper in vscode theme adapter

* fix: guard VSCode theme loading in MarkdownRenderer

* feat: add custom user themes loading and reload

- Load user themes from ~/.config/openchamber/themes at runtime
- Expose /api/config/themes to fetch custom themes
- Allow theme reloading from Settings → Theme → Reload themes in the UI
2026-02-01 18:29:34 +02:00
Bohdan Triapitsyn 5950a31632 fix: Chrome diff scroll in All Files layout (#213)
Replace nested ScrollableOverlay with simple div in inline diff to fix vertical scroll blocking in Chrome. Add explicit h-full to stacked view flex container and disableHorizontal to main ScrollableOverlay for proper scroll behavior.
2026-01-25 18:52:58 +02:00
Bohdan Triapitsyn 75f781f940 fix(chat): make sendMessage calls fire-and-forget with error handling 2026-01-24 21:11:50 +02:00
Bohdan Triapitsyn d97181bcd2 feat(UI): Introduce new UI components for file attachments and related views (#191)
Add file management API and UI components
Implement directory listing, search and CRUD operations in desktop backend
Expose new Files API on frontend to list, search, and modify files
2026-01-22 12:21:19 +02:00
JovinesandJovines 06c5e821a4 feat: lazy load large diffs to prevent page freeze (#186)
When diff content exceeds 1500 lines or 150KB, show a placeholder with
"Load Diff" button instead of parsing immediately. This prevents the page
from freezing when viewing large diffs.

Co-authored-by: Jovines <jovines@qq.com>
2026-01-21 21:32:19 +02:00
Bohdan Triapitsyn ce1622b1e2 refactor: replace 'sonner' toast import with local toast component (#177) 2026-01-19 02:50:40 +02:00
Bohdan Triapitsyn cf9b7a6516 feat: implement process cleanup for OpenCode server and enhance internal function handling 2026-01-16 01:22:43 +02:00
Bohdan Triapitsyn 1be5dfda05 feat: add Files tab for browsing workspace files (#154)
* feat: add Files tab for browsing workspace files

- Add Files tab between Diff and Terminal in header
- Implement hierarchical file tree with expand/collapse
- Add fuzzy search with debouncing and relevance ranking
- Support gitignore filtering via `git check-ignore` (web + desktop)
- Add syntax highlighting for 150+ file types
- Add image preview (SVG, PNG, JPG, etc.)
- Add line numbers, wrap toggle, and copy button
- Desktop: split-pane layout matching DiffView
- Mobile: drill-in navigation with full-width sidebar
- Update help dialog with Cmd+3 shortcut
- Increase header breakpoint to 940px for new tab

* feat: enhance context and session stores to track agent/model/variant choices for historical sessions

* feat: implement line selection and commenting functionality in FilesView
2026-01-15 20:19:06 +02:00
Bohdan Triapitsyn ecf81c901d feat: enhance DiffViewer with asking agent for comment functionality and mobile support (#153) 2026-01-15 18:59:23 +02:00
Nelson Pires e95bfdebaf feat: Add stacked diff mode controls and mobile dropdown mode selector (#142)
* feat: add diffViewMode to UI store

* feat(PierreDiffViewer): add layout prop for inline diff

* feat: add diff view modes and change descriptors

* feat(openchamber): add diff view mode toggle

* feat: add diff view mode selector
2026-01-14 15:15:16 +02:00
Bohdan Triapitsyn 34353e1970 feat: add image preview support in Diff tab and improve diff view visuals 2025-12-17 14:10:23 +02:00
Bohdan Triapitsyn 764a48018f feat: enhance font styling in Diff Viewer and Streamdown components 2025-12-16 13:26:03 +02:00
Bohdan Triapitsyn 6b78ad0b49 feat: optimized diff viewer element sizes layout 2025-12-15 13:56:01 +02:00
Bohdan Triapitsyn 2b50f365bd feat: add Flexoki themes for Shiki syntax highlighting 2025-12-15 00:20:26 +02:00
Bohdan Triapitsyn 0b92bbc487 feat: Replaced Monaco diff editor with Pierre/diffs for better performance 2025-12-14 02:29:46 +02:00