Fix: Remove element selector tooltip in Tweaks mode#697
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6115e3afa1
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
Hi @1119302165! 🎉 Thanks for the contribution — the detailed before/after analysis and screenshots are really helpful. I will run a deep review and get back to you within 24h. Thanks for making open-design better! |
lefarcen
left a comment
There was a problem hiding this comment.
Hey @1119302165! The fix addresses the immediate overflow issue well, and I appreciate the detailed before/after analysis. I found two suggestions for making the tooltip more robust across different screen sizes:
Summary:
- ✅ Solves the long selector overflow problem
⚠️ The fixed280pxwidth introduces responsive clipping risk- 💡
word-break: break-allcan split selectors awkwardly
See inline comments for concrete suggestions.
|
Hey @1119302165! I see your comment, but I'm not seeing any new commits yet — the current head is still Your comment mentions "Removed the floating tooltip entirely," but the current diff still shows the tooltip with the fixed 280px width + word-break changes. If you're planning to push a new approach: If you'd like to discuss the suggestions before coding:
Let me know which direction you'd like to go! |
6115e3a to
c35b413
Compare
|
@lefarcen try review, change Solution Removed the floating tooltip entirely. Users can now inspect elements without visual obstruction. |
lefarcen
left a comment
There was a problem hiding this comment.
Thanks for the quick update, @1119302165! I see you went with a different approach — removing the tooltip entirely.
My take:
✅ Solves the overflow problem — no tooltip means no overflow
Alternative suggestion:
Instead of removing it completely, what if we:
- Keep the tooltip but show it on hover instead of always-on?
- Or show just the essential info (element ID only) in a compact format?
This way users get the info when they need it, without it being visually obtrusive or overflowing.
Your choice:
If you prefer the "no tooltip" approach for simplicity, that's valid too — less visual clutter. But I wanted to point out that we're trading off discoverability/debugging info.
Let me know which direction you'd like to go!
@lefarcen |
|
Ah, that makes perfect sense! 💡 If the element info is already displayed in the top-left card, then the tooltip is redundant — removing it is the cleaner solution. Thanks for the clarification and the photo! This approach is better than I initially thought. The PR removes noise while keeping the useful debugging info visible where it matters. Updated verdict: Looks good to me. Ready for maintainer review. 👍 |
|
|
@lefarcen Why is the job ci / Validate workspace (pull_request) failing? |
|
Good catch, @1119302165! 👍 The CI failure is not caused by your changes — it's a main-branch issue that's affecting multiple recent PRs. Root cause: Evidence:
What this means for your PR: Next steps:
cc @mrcfps — this PR is ready for merge from a code perspective; CI failure is upstream. |
|
Hey @1119302165! 👋 Good catch — the CI failure is not caused by your PR. Here's what's happening: Root cause: Your PR only changed: What happens next:
Your PR is clean — the CI failure is a pre-existing issue from another merged PR. I'll flag this to the team. Thanks for raising this! 🙏 |
mrcfps
left a comment
There was a problem hiding this comment.
@1119302165 I reviewed the current changed ranges in FileViewer.tsx and index.css: the tooltip markup/styles are removed while the target overlay remains in place for both single-element and pod selections, so the overflow/obstruction path is eliminated without changing the selection overlay behavior. Thanks for the quick iteration and for clarifying that the same element details remain available in the top-left card — this is a clean simplification. 🙏
mrcfps
left a comment
There was a problem hiding this comment.
@1119302165 I reviewed the current changed ranges in FileViewer.tsx, index.css, and the locale fallback lists: removing the tooltip markup/styles keeps the selection overlay path intact while eliminating the overflow/obstruction case, and the added English fallback IDs cover the newly present social-media-dashboard skill and totality-festival design system across DE/RU/FR. I also verified pnpm --filter @open-design/web typecheck and pnpm test tests/localized-content.test.ts from e2e pass locally. Thanks for the quick iteration and for keeping the useful element details available outside the tooltip — this is a clean fix. 🙏
|
@1119302165 Wow, thank you for fixing the CI failure! 🙌 You identified the root cause (missing localizations from PR #678) and added the entries for Your PR is now:
Waiting for CI to re-run and confirm the fix passes. If it does, this should be ready to merge. Great work! 👏 |
|
@1119302165 Yes — the i18n part I pushed here is the same fallback-list approach as #702: add I kept the follow-up on this branch because #697 already needed a push to unblock its CI. I also added a small test-facing/accessibility label for the comment target overlay and fixed the e2e mock skill data so the updated full CI suite remains compatible after merging latest I’ll leave a note on #702 that it duplicates the i18n portion now present here, so maintainers can close #702 if #697 lands first (or merge #702 first and then we can drop the duplicate fallback commits here if preferred). A new CI run was already triggered by the latest push: https://github.com/nexu-io/open-design/actions/runs/25446173128 |
|
Thanks for the contribution, @1119302165! 🎉 The tooltip removal + localization fix are now merged and live in If you spot any issues or have more ideas, feel free to open another PR or issue anytime. — open-design team |
…as failed (#700) * fix(daemon): surface OpenCode error frames + treat empty-output runs as failed Closes #691. OpenCode runs would silently complete in ~3 seconds without producing any visible chat output and still be rendered as a successful turn — three independent bugs along the structured-stream path conspired to produce this silent-failure shape. ## Bug 1 — `apps/daemon/src/json-event-stream.ts:85-91` OpenCode emits structured error frames on stdout (e.g. provider auth failures, network errors, schema mismatches) and still exits 0. The parser was downgrading these to `{type: 'raw', line: ...}`, which the chat UI does not render as an assistant message. The error string was discarded as "no-op output." Fix: emit a proper `{type: 'error', message, raw}` event matching the qoder-stream contract that the daemon's existing error-handling path already recognises. ## Bug 2 — `apps/daemon/src/server.ts:4199-4205` Even after Bug 1 was fixed, the json-event-stream branch wired the parser to a bare `(ev) => send('agent', ev)` lambda — bypassing the `sendAgentEvent` wrapper that interprets `type:'error'` events and sets the `agentStreamError` flag the close handler reads to flip the run to `failed`. So an emitted `error` event would just be forwarded as a no-op `agent` SSE event with no lifecycle effect. Fix: route json-event-stream through `sendAgentEvent`, mirroring the qoder-stream-json wiring at line 4175. ## Bug 3 — `apps/daemon/src/server.ts:4220-4234` Even after Bugs 1 and 2 are fixed, there's still a class of runs where OpenCode never emits any error frame, never emits any substantive event, and exits 0. Pre-fix this was marked `succeeded` and the user saw a blank chat with no diagnostic. Fix: track `agentProducedOutput` inside `sendAgentEvent` (set on `text_delta`, `thinking_delta`, `tool_use`, `tool_result`, `artifact` — deliberately NOT on `status` / `usage`, since a model can emit token-usage numbers for an empty completion). When the close handler sees `code === 0 && trackingSubstantiveOutput && !agentProducedOutput` the run is marked `failed` with an explicit AGENT_EXECUTION_FAILED SSE error so the chat shows a clear reason instead of a silent empty turn. The check is gated by `trackingSubstantiveOutput` so it only fires on streams that actually contribute to the output flag (currently qoder-stream-json and json-event-stream). ACP sessions and plain stdout streams keep their existing success/failure determination. ## Tests - 3 new unit tests in `apps/daemon/tests/json-event-stream.test.ts` pin the OpenCode error event shape: full repro (`error.data.message`), `error.name` fallback, and the generic-fallback shape when `error` is empty. - All 60 daemon test files (851 tests) pass on `pnpm --filter @open-design/daemon test`. All 42 web test files (309 tests) pass on `pnpm --filter @open-design/web test`. - Full repo `pnpm typecheck` clean. ## Live verification Verified end-to-end via a stub `opencode` binary that mimics each of the failure shapes against `pnpm tools-dev run web`: 1. Stub emits `{"type":"error",...}` then `exit 0` — run now ends as `failed` with the OpenCode error message surfaced as an SSE `error` event. Pre-fix this was `succeeded` with an empty chat. 2. Stub emits nothing then `exit 0` — run now ends as `failed` with "Agent completed without producing any output…" diagnostic. Pre-fix this was `succeeded` with an empty chat. 3. Stub emits a normal `step_start` / `text` / `step_finish` sequence then `exit 0` — run still succeeds. (Regression check.) ## Out of scope (mentioned for the next person) - `claude-stream-json` and `copilot-stream-json` still wire to a bare `(ev) => send('agent', ev)` and don't currently parse `type:'error'` frames. If their CLIs ever start emitting structured error events the same pattern (route through `sendAgentEvent` + emit proper `type:'error'`) applies. Not in scope here because we have no evidence those CLIs do this today, and changing the wiring without a confirmed failure mode risks regressing currently-working flows. - ACP sessions (`pi-rpc`, `acp-json-rpc`) own their own success / failure determination via `acpSession?.hasFatalError()` and the empty-output guard explicitly skips them via `trackingSubstantiveOutput`. - Plain stdout streams have no event-level tracking, so the empty- output guard skips them too. Diagnosing a no-output plain-stream agent is a separate problem that needs different signals. * chore: retrigger CI on top of green main (post #697 i18n backfill)
- bump 13 monorepo package.json files to 0.5.0 (root + apps/{web,daemon,desktop,packaged,landing-page} + packages/{contracts,platform,sidecar,sidecar-proto} + tools/{dev,pack} + e2e); apps/packaged was already at 0.4.2 from beta lane, all others at 0.4.1
- add CHANGELOG.md [0.5.0] - 2026-05-07 entry covering 51 merged PRs since 0.4.1:
- Added: Inspect mode (#362), accent color control + launcher (#683), connection tests for execution settings (#507), four Live Dashboard templates / skill (#778, #795, #799, #801), waitlist-page / social-media-dashboard / Orbit briefing skills (#555, #678, #671), Critique Theater Phase 5 (#524), Qoder CLI agent (#626), Nano Banana image provider (#631), HyperFrames video previews (#293), project transcript export (#493), Linux headless lifecycle (#686), Windows beta packaging + R2 publishing (#768, #805), Indonesian locale (#414), form-validation craft module (#625)
- Changed: project file watcher ignores .venv (#531), portless Origin in CORS (#735), extended OpenAI image timeouts (#788), surfaced @nexudotio X account (#696)
- Fixed: Copilot stdin (#727), OpenCode error frames (#700), GUI-launched agent PATH discovery (#614), Tweaks-mode tooltip (#697), chat pane overflow (#740), ws-tabs-bar scrollbar (#781), settings dialog scroll (#667), settings subtitle width (#747), design system selection persistence (#621) + test fixture (#708), PDF popup blocked alert (#664), Windows link-code-folder dialog (#698), desktop entry chrome (#655), Claude Design ZIP import on Node 24 (#591), missing Next package diagnostics (#675), README.es alignment (#611), Ukrainian template fixes (#674, #680), batch fixes (#530)
- Documentation/Internal: OD_LEGACY_DATA_DIR migrator (#712), Linux tools-pack namespace doc (#670), pi-ai link split fix (#277), desktop e2e coverage (#306), Discord notify on resolved (#685), generated GitHub metrics + contributors wall (#718, #720)
Release workflow validation runs after merge via release-stable.
- bump 13 monorepo package.json files to 0.5.0 (root + apps/{web,daemon,desktop,packaged,landing-page} + packages/{contracts,platform,sidecar,sidecar-proto} + tools/{dev,pack} + e2e); apps/packaged was already at 0.4.2 from beta lane, all others at 0.4.1
- add CHANGELOG.md [0.5.0] - 2026-05-07 entry covering 51 merged PRs since 0.4.1:
- Added: Inspect mode (#362), accent color control + launcher (#683), connection tests for execution settings (#507), four Live Dashboard templates / skill (#778, #795, #799, #801), waitlist-page / social-media-dashboard / Orbit briefing skills (#555, #678, #671), Critique Theater Phase 5 (#524), Qoder CLI agent (#626), Nano Banana image provider (#631), HyperFrames video previews (#293), project transcript export (#493), Linux headless lifecycle (#686), Windows beta packaging + R2 publishing (#768, #805), Indonesian locale (#414), form-validation craft module (#625)
- Changed: project file watcher ignores .venv (#531), portless Origin in CORS (#735), extended OpenAI image timeouts (#788), surfaced @nexudotio X account (#696)
- Fixed: Copilot stdin (#727), OpenCode error frames (#700), GUI-launched agent PATH discovery (#614), Tweaks-mode tooltip (#697), chat pane overflow (#740), ws-tabs-bar scrollbar (#781), settings dialog scroll (#667), settings subtitle width (#747), design system selection persistence (#621) + test fixture (#708), PDF popup blocked alert (#664), Windows link-code-folder dialog (#698), desktop entry chrome (#655), Claude Design ZIP import on Node 24 (#591), missing Next package diagnostics (#675), README.es alignment (#611), Ukrainian template fixes (#674, #680), batch fixes (#530)
- Documentation/Internal: OD_LEGACY_DATA_DIR migrator (#712), Linux tools-pack namespace doc (#670), pi-ai link split fix (#277), desktop e2e coverage (#306), Discord notify on resolved (#685), generated GitHub metrics + contributors wall (#718, #720)
Release workflow validation runs after merge via release-stable.
- bump 13 monorepo package.json files to 0.5.0 (root + apps/{web,daemon,desktop,packaged,landing-page} + packages/{contracts,platform,sidecar,sidecar-proto} + tools/{dev,pack} + e2e); apps/packaged was already at 0.4.2 from beta lane, all others at 0.4.1
- add CHANGELOG.md [0.5.0] - 2026-05-07 entry covering 51 merged PRs since 0.4.1:
- Added: Inspect mode (#362), accent color control + launcher (#683), connection tests for execution settings (#507), four Live Dashboard templates / skill (#778, #795, #799, #801), waitlist-page / social-media-dashboard / Orbit briefing skills (#555, #678, #671), Critique Theater Phase 5 (#524), Qoder CLI agent (#626), Nano Banana image provider (#631), HyperFrames video previews (#293), project transcript export (#493), Linux headless lifecycle (#686), Windows beta packaging + R2 publishing (#768, #805), Indonesian locale (#414), form-validation craft module (#625)
- Changed: project file watcher ignores .venv (#531), portless Origin in CORS (#735), extended OpenAI image timeouts (#788), surfaced @nexudotio X account (#696)
- Fixed: Copilot stdin (#727), OpenCode error frames (#700), GUI-launched agent PATH discovery (#614), Tweaks-mode tooltip (#697), chat pane overflow (#740), ws-tabs-bar scrollbar (#781), settings dialog scroll (#667), settings subtitle width (#747), design system selection persistence (#621) + test fixture (#708), PDF popup blocked alert (#664), Windows link-code-folder dialog (#698), desktop entry chrome (#655), Claude Design ZIP import on Node 24 (#591), missing Next package diagnostics (#675), README.es alignment (#611), Ukrainian template fixes (#674, #680), batch fixes (#530)
- Documentation/Internal: OD_LEGACY_DATA_DIR migrator (#712), Linux tools-pack namespace doc (#670), pi-ai link split fix (#277), desktop e2e coverage (#306), Discord notify on resolved (#685), generated GitHub metrics + contributors wall (#718, #720)
Release workflow validation runs after merge via release-stable.

Fix: Remove element selector tooltip in Tweaks mode
Problem
When the "Tweaks" mode is enabled and users click on elements, a floating tooltip appeared displaying the CSS selector path. This tooltip was:
Solution
Removed the floating tooltip entirely. Users can now inspect elements without visual obstruction.
Changes
Files modified:
apps/web/src/components/FileViewer.tsx- Removed tooltip JSX rendering fromCommentTargetOverlaycomponentapps/web/src/index.css- Removed.comment-target-tooltipand related CSS stylesBehavior Change
after fix:
