Radial toolbar, UI polish, and startup log streaming#118
Merged
Conversation
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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan
cargo fmt --checkpassescargo clippypassescargo test— 125 Rust tests passnpm test— 380 frontend tests pass (including 2 new toolbar overflow tests)npm run previewfromcrates/veld-daemon/frontend/, verify radial toolbar, panel, draw mode, iconsveld startwith a broken service, verify log streaming after 10s and log dump on failure🤖 Generated with Claude Code