Skip to content

Radial toolbar, UI polish, and startup log streaming#118

Merged
boennemann merged 33 commits into
mainfrom
start-feedback
Mar 24, 2026
Merged

Radial toolbar, UI polish, and startup log streaming#118
boennemann merged 33 commits into
mainfrom
start-feedback

Conversation

@boennemann

Copy link
Copy Markdown
Contributor

Summary

  • Startup log streaming: When a service takes >10s to pass health checks, veld now streams its log output above the progress spinner. On failure, the last ~20 lines are dumped below the error message.
  • Radial toolbar: Tool buttons fan out in a curved arc around the FAB instead of a linear pill. Arc direction adapts based on FAB position. The ⋯ button swaps between primary tools and settings in-place.
  • FAB edge nudging: FAB can be dragged freely near edges; when toolbar opens it smoothly animates inward to ensure the arc fits.
  • Panel fixes: Truncated URLs with ellipsis, segmented control no-wrap, claim banner inline with messages by timestamp, Release button in bottom action bar (blue), mark-read hidden in detail view, full thread ID copied on click.
  • Icon refresh: Visually distinct icons — mouse cursor (select), camera (screenshot), map pin (page comment), two-bubble conversation (threads).
  • Draw toolbar intro: Starts at full opacity then fades to idle, so users notice it.
  • Tooltip suppression during FAB drag: No more tooltip fighting while dragging.
  • Dev preview page: Standalone HTML with mocked API for debugging UI without the daemon.

Test plan

  • cargo fmt --check passes
  • cargo clippy passes
  • cargo test — 125 Rust tests pass
  • npm test — 380 frontend tests pass (including 2 new toolbar overflow tests)
  • Manual: npm run preview from crates/veld-daemon/frontend/, verify radial toolbar, panel, draw mode, icons
  • Manual: veld start with a broken service, verify log streaming after 10s and log dump on failure

🤖 Generated with Claude Code

boennemann and others added 30 commits March 24, 2026 21:52
When a service takes longer than 10 seconds to pass health checks, veld
now streams its log output above the progress spinner so the user can
see what's happening without manually running `veld logs`. On startup
failure, the last ~20 log lines are dumped below the error message.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e --vf-primary

- Replace the ugly ⚙ gear Unicode character with the existing ICONS.robot
  SVG in both the thread detail claim section and thread card badge
- Show relative timestamp ("· 2m ago") next to "Being worked on by" text
  using the thread's claimed_at field
- Define the missing --vf-primary CSS variable across all theme variants
  (dark: #60a5fa, light: #2563eb) — it was referenced but never declared
- Fix thread card overflow: add overflow:hidden and min-width:0 to cards,
  compensate border-left padding for claimed and unread card states

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Agents calling `veld feedback answer` from bash double-quoted strings
often produce `\!` and `\?` artifacts because bash preserves the
backslash before history-expansion characters. Add strip_shell_escapes()
to clean these before storing the message.

Applied to answer, ask, and release --message commands.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ching (#117)

- `veld feedback listen` now shows full UUIDs instead of truncated 8-char
  IDs, so agents can use the output directly with `--thread`
- All display of thread IDs in human-readable output now uses full UUIDs
- Add resolve_thread_id() and resolve_prefix() to FeedbackStore — accepts
  short ID prefixes (like git short hashes) and resolves to the full UUID
- get_thread() falls back to prefix scan when exact match not found
- modify_thread() resolves prefixes before file lookup
- answer and release commands resolve prefixes upfront so event logs also
  get the full UUID
- Ambiguous prefixes produce a clear error ("matches N threads")

Closes #117

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds dev/index.html with mocked feedback API and sample page content,
allowing the veld overlay to render in a browser without the daemon.
Run with `npm run preview` from the frontend directory.

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

Panel detail title now uses text-overflow: ellipsis instead of wrapping.
Mark-all-as-read button uses attachTooltip instead of native title attr.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The "Being worked on by" banner now appears in the message timeline at
its chronological position based on claimed_at, using the same avatar
alignment as regular messages instead of a separate fixed header.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The green listening dot now sits inside a 30×30 flex container (same
size as tool buttons) with the 10px dot rendered via ::after, properly
centered both horizontally and vertically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shortcuts, theme, dashboard, and hide buttons are now collapsed behind
a ⋯ button. Clicking it expands the overflow group. Closing the toolbar
automatically collapses the overflow back to hidden.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Release button now sits in the detail header for easy access while
the "Being worked on by" row stays inline in the message timeline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tooltip was re-appearing during drag as mouseenter re-fired on the FAB.
Now suppressTooltip(true) blocks all tooltip shows during drag, released
300ms after mouseup to match the drag-click prevention window.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tool buttons now fan out in a 180° arc around the FAB instead of a
linear pill. The arc direction adapts based on FAB position — always
opening toward the viewport center to avoid edge clipping. Secondary
buttons (shortcuts, theme, dashboard, hide) appear in a second ring
at larger radius when the ⋯ button is clicked.

The arc repositions in real-time during FAB drag for smooth feedback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Radius increased from 55px to 75px so buttons no longer overlap.
FAB margin increased from 16px to 75px so the full arc stays visible
even when the FAB is dragged near screen edges.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace individual bordered buttons with a shared SVG arc-shaped
backdrop. Buttons are now borderless icons sitting on a continuous
curved bar, allowing tight spacing and a smaller radius (48px).
Both primary and overflow rings get their own arc backdrop.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arc backdrop now has semicircular endcaps instead of flat edges.
Overflow ring starts from the ⋯ button's angle and extends outward
on the same side, avoiding edge clipping.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arc endcap padding reduced to just clear the button center (was too
wide). Overflow ring now extends toward the primary arc center instead
of away from it, keeping it in the same screen region.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arc padding reduced to 60% of cap radius for snugger fit. Overflow
button spacing now computed from actual button size (32px) at the
overflow radius instead of a fixed 90° arc.

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

The ⋯ button now swaps the arc contents between primary tools and
secondary options in the same ring. No second ring at all — cleaner
and avoids edge clipping entirely.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FAB can now be dragged freely near edges (16px margin). When the
toolbar opens, if the FAB is too close for the arc, it smoothly
animates inward to the 50px toolbar-safe margin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Select element: crosshair → mouse cursor arrow (diagonal pointer)
- Screenshot: corner-marks rectangle → camera with lens
- Page comment: page with lines → chat bubble with + (create new)
- Threads: single chat bubble → rounder speech bubble (distinct shape)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Threads: chat bubble with text lines (conversation)
- Page comment: document with folded corner and text lines (page note)

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

- Threads: two overlapping speech bubbles (left + right conversation)
- Page comment: map pin with circle — completely different silhouette

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Cursor: integer coordinates for crisp diagonal
- Camera: symmetric body with even padding
- Threads: two overlapping rectangular bubbles with opposing tails
- Page pin: clean circle arc with integer radius

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Release now sits alongside Resolve and Send in the input actions row
instead of the header. Uses --vf-primary (blue) to visually distinguish
it from the green Send/Resolve actions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
updateMarkReadBtn now checks for expanded thread and stays hidden in
detail view. makeCopyRow accepts an optional copyValue so the display
can be truncated while the clipboard gets the full ID.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Release button now shows the robot SVG icon before the label, matching
the visual weight of Resolve (✓) and Send (⌘↵). btn-sm uses inline-flex
with aligned SVG sizing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Matches the pattern of Resolve ✓ and Send ⌘↵ which have their
indicators on the right.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
boennemann and others added 3 commits March 24, 2026 23:25
Draw toolbar now starts fully visible for 1 second, then fades to 0.25
opacity over the next second. This ensures users notice it before it
dims. Hovering still brings it back to full opacity.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@boennemann boennemann merged commit 1761c45 into main Mar 24, 2026
16 checks passed
@boennemann boennemann deleted the start-feedback branch March 24, 2026 22:37
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