Skip to content

fix(desktop): startup flash, titlebar overlap, clickable file cards#146

Merged
oratis merged 9 commits into
mainfrom
fix/desktop-ui-feedback
Jun 3, 2026
Merged

fix(desktop): startup flash, titlebar overlap, clickable file cards#146
oratis merged 9 commits into
mainfrom
fix/desktop-ui-feedback

Conversation

@oratis

@oratis oratis commented Jun 1, 2026

Copy link
Copy Markdown
Owner

Three issues from live tauri:dev review:

  1. Startup B&W "cat" flash — in dev, Vite injects index.css via JS, so the first paint was unstyled and the BrandMark <svg> (no explicit size, fill=currentColor) ballooned to a full-size black silhouette on white. Added render-blocking critical CSS to index.html (dark surface + pinned .mark box) so the first paint matches the app — no flash.
  2. Transparent titlebar overlapped content (sidebar brand / chat-header pills / inspector head were clipped). Added a 30px top inset on .app-shell so all columns clear the macOS traffic-light/title region. Chat text stays selectable (no shell-wide app-region: drag); the native title strip stays draggable.
  3. File outputs get a clickable card. ToolCard gains an onOpen affordance; the Repl passes it for any tool with a file_path (Read/Write/Edit), wired App → renderScreen → ReplScreen → fp.open. Clicking loads the file into the right-side preview panel (the §3.11 panel from feat(desktop): right-side file panel — Source/Diff/History + tabs + resize (#11) #145).

Typecheck + desktop build green.

🤖 Generated with Claude Code

oratis and others added 9 commits June 2, 2026 01:17
…cards

Three issues from live tauri:dev review:

1. Startup B&W "cat" flash — in dev, Vite injects index.css via JS, so the
   first paint was unstyled and the BrandMark <svg> (no explicit size,
   fill=currentColor) ballooned to a full-size black silhouette on white.
   Add render-blocking critical CSS to index.html (dark surface + pinned
   .mark box) so the first paint matches the app — no flash.

2. Transparent titlebar overlapped content (sidebar brand / chat-header pills
   / inspector head clipped). Add a 30px top inset on .app-shell so all
   columns clear the macOS traffic-light/title region (box-sizing is global
   border-box; the native title strip stays OS-draggable; no app-region drag
   so chat text stays selectable).

3. File outputs now get a clickable card. ToolCard gains an `onOpen`
   affordance; Repl passes it for any tool with a `file_path` (Read/Write/
   Edit), wired through App → renderScreen → ReplScreen to fp.open — clicking
   loads the file into the right-side preview panel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When DeepSeek emits a Write/Edit/Read call with no arguments (typically
output-token truncation on a large file before the args stream), the tool
returned a cryptic "missing file_path". Now it explains the likely cause
(ran out of output tokens — raise Effort / smaller file) or lists the keys
that did arrive, which both helps the user and gives the model a usable hint.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sidebar sessions showed raw ids and had no management actions.

- Titles: title a brand-new session from its first user message
  (mac-agent sessionSetTitle) so the sidebar shows a human label immediately
  instead of the id; the Rust read-time derive remains the fallback.
- Archive / Delete: new session_delete + session_archive Rust commands
  (archive moves the .jsonl into sessions/archived/, excluded from the list;
  delete removes it — both guarded against path-traversal ids) + tauri-api
  wrappers. Sidebar rows reveal 🗄/🗑 on hover (delete confirms); removing the
  active session resets the chat via a new onSessionRemoved callback.
- Freshness: the sidebar now polls (8s) + reloads on active-session change so
  titles and new sessions surface without a remount.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The dock icon (.icns) was stale — generated from an older render — so it
showed washed-out while the PNGs were already the crisp white-cat-on-blue
mark. Regenerated icon.icns from icon.svg via `tauri icon` so the dock /
Finder icon matches the intended design. (Non-macOS assets that tauri icon
emits — Windows/Android/iOS — were discarded; this is a macOS-only app.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reshape the message stream toward Claude Code: a centered ~760px readable
column instead of full-bleed, drop the heavy YO/DC avatar chips, give user
turns a soft bubble while assistant/system are plain prose, and tighten the
inter-message spacing. Sidebar search + top-bar cleanup land in pass 2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Desktop sessions tag each message line type:"message", but CLI/headless
sessions persist bare {role,content} lines with no type field. session_read
and derive_session_title both filtered on type=="message", so CLI sessions
loaded as an empty chat and showed their id instead of a title. Accept a
line as a message when type=="message" OR (type absent AND role is
user/assistant). Verified: a CLI session went 0→1 messages with a derived
title.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…earch, compact project

- Composer now aligns to the centered message column (760px) instead of
  spanning full width — cohesive chat area like Claude Code.
- Sidebar: add a session search/filter box; replace the heavy boxed PROJECT
  chip with a compact one-line project row (the header breadcrumb carries the
  path already).
- Add a dev-only full-app preview harness (preview-app.html/.tsx) that renders
  <App/> with a mocked Tauri invoke, so layout can be screenshotted + iterated
  without a rebuild. Not in the prod bundle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…er icon

The inspector rail's four hint icons (▤◐📁ⓘ) all expanded the same Inspector
panel, so "clicking anything on the right is just the inspector". Rework it
into a VS Code-style activity bar: the 48px rail is always present on the far
right and each icon opens its OWN panel to its left, exactly one at a time.

- ⓘ Inspector — plan / context / recent files / session (plan badge + context tint)
- 📄 Files     — the file preview panel (Source / Diff / History)
- ⚙ Settings   — the Settings shell (main-area screen)

App: replace inspectorExpanded/inspectorFocus/expandInspector with
inspectorOpen + a filesCollapsed flag; toggleInspector/toggleFiles/openFile
enforce single-panel mutual exclusion (opening one closes the other; an active
icon closes its panel; Files with no tabs invokes the picker). The rail is now
rendered unconditionally as the last grid child; .inspector-open gains the 48px
rail track so the inspector squeezes chat beside the rail instead of replacing
it. Monochrome SVG icons replace the unicode glyphs.

preview-app: mock plugin:dialog|open + correct tool_read ({content}) so the
file panel is exercisable in the browser preview.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r inset

The 30px shell padding already clears the macOS traffic lights, so each column's
extra top padding (sidebar 18 / chat-header 12 / rail 14 / inspector-head 18)
was pure dead space — content sat ~46px down with an empty strip above it.
Trim those so the brand / breadcrumb / pills / inspector title align ~34px from
the window top, just below the titlebar (Claude-Code-style compact top).

The inspector loses its panel top padding and the sticky head's −18px margin
trick (top:0 now), keeping its title aligned with the rest.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@oratis oratis merged commit 40c91cf into main Jun 3, 2026
3 checks passed
@oratis oratis deleted the fix/desktop-ui-feedback branch June 3, 2026 17:01
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