Repository navigation
feat(onboarding): add one-time feature tips - #318
Merged
Merged
Conversation
Tips point at a feature the first time it has something to work on, rather than touring the app up front: - change tour, once the active task has changes - readiness and evidence, when the Finish dialog opens - delegating to sub-tasks, in the New Task panel once other tasks exist and the agent supports orchestration, with an example prompt One tip shows at a time, and only while its anchor is on screen and not covered by a dialog. Dismissing one holds the next back for a minute. Tips float over the page, so they never move content. New installs get tips on; installs that predate them keep them off and can turn them on in Settings, which also shows every tip again. New installs also no longer see the keyboard shortcut migration notice, since there is nothing to migrate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
- Wait 600ms before a tip shows, so it does not pop up while a dialog opens or for a task the user is only switching past. - Fade tips in (no motion with reduced motion) and label them as tips. - Escape dismisses a tip without closing the dialog around it. - The change tour tip stays away once a tour is generating or ready, and starting a tour from the Finish dialog also counts as seeing it. - The readiness tip offers "Set up checks" only when the project has no verify command, and using the section counts as seeing it. - The sub-task tip only promises a review before merging while sub-tasks are not merged automatically. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
A tip now carries a caret toward the control it explains. Inside a dialog it sits beside the panel, else under or over it, so it no longer covers the dialog's own buttons; it overlaps only without room around. A tip above its anchor is held by its bottom edge, so a card shorter than estimated leaves no gap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
- Follow the anchor every frame while a tip shows, so it stays attached through opening animations, split drags and tiles shifting; measure the card instead of estimating its height. - Treat an anchor scrolled out of its container as off screen. - Tell the top dialog from the dialog stack instead of DOM order. - Count any open of the change tour as seen, including the brief's walk through, and wait until the agent stops working before suggesting it. - Using a feature while its tip shows starts the cooldown too. - Keep the tour's hover help out of the way of its tip. - Clicking a tip's buttons leaves focus where the user was typing. - Correct the readiness tip, which claimed to show merge blockers, and keep "Set up checks" quiet, since it leaves the Finish dialog. - Ask for Parallel Code tasks, not sub-tasks, in the example prompt. - Measure placement once per frame while a tip waits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
When a follow step hid the tip, its cleanup ran inside that step and cancelled the frame already running; the step then asked for another, which nothing cancelled, so measuring went on after unmount. A shown tip now also drops to a check every 250ms once its anchor holds still for 30 frames, and measures its content's natural height rather than its clamped box, which crept 2px a frame near the bottom of the window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
The readiness tip offered to set up checks whenever the project had no verify command, even with evidence checks configured. It now uses the evidence panel's own test and button label, Configure checks. The change-tour tip hides the tour's hover help while it shows, so it now names the model that receives the diff, as that help does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ
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
This is the first step of an optional onboarding. Rather than a tour of the app up front, which on a fresh install would point at empty panels, it shows one-time tips. Each tip appears the first time its feature has something to work on:
How tips behave
data-dialog-id, so a tip can tell which dialog is on top without relying on DOM order.Settings and saved state
featureHintsEnabledandseenFeatureHintsare saved instate.json.featureHintsEnabled, start with them off, so long-time users aren't suddenly shown tips.Code
src/store/onboarding.ts: the single tip slot, the cooldown and the seen list.src/lib/feature-hint-placement.ts: pure placement logic, with unit tests.src/components/FeatureHint.tsx: the tip card.Test plan
npm run checkandnpm run check:static(typecheck, lint, knip, dependency-cruiser, Prettier)npm run test:changed; the push hook also rannpm testnpm run dev.Not in this PR
🤖 Generated with Claude Code
https://claude.ai/code/session_017Cf9ACGvzjah4kib977pkZ