Conversation
erri120
previously approved these changes
Sep 9, 2026
r1chm8
marked this pull request as draft
September 9, 2026 09:29
r1chm8
marked this pull request as ready for review
September 9, 2026 12:36
r1chm8
marked this pull request as draft
September 9, 2026 13:20
Nothing confirmed that a download had started; the flyout names the file and its time left, then gets out of the way until hovered. Tooltip gains a controlled open state and shares its arrow, so the tray's beak matches.
A pause now reports the percent still to fetch, and the clock keeps the leading zero the downloads page has. The speed sits above the progress ring with a halo behind it so it stays legible where the two cross, and hovering the button holds the flyout open rather than letting its countdown close it. The notification error icon joins the outlined set the other severities use.
r1chm8
marked this pull request as ready for review
September 9, 2026 13:50
erri120
approved these changes
Sep 10, 2026
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.
Adds the download flyout from LAZ-999: a panel that pops out beside the spine's download button when a download starts, and comes back on hover.
Why
Nothing in the UI confirmed that a download had actually started. The issue asks the flyout to do three things: confirm the download began, teach people where progress lives, and let them check it without losing their place.
How it works
The download button's click has to keep navigating to the Downloads page, so it can't become a Headless UI
PopoverButtonthe way the notification bell is. Instead the flyout is a richTooltip, which gains two optional additions:open/onOpenChange(open, reason)— a controlled open state, so the flyout can show itself with nothing on the trigger. Omit both and hover owns it exactly as before.persistent— for a tooltip that shows itself rather than answering a hover: a press anywhere, or a neighbour in the same delay group opening, leaves it up. Escape still closes it. It's dropped the moment the pointer takes over, so from then on it behaves like any other tooltip.Three hooks sit behind it in
Spine/download_button/:useDownloadProgress— lifted out ofDownloadButtonso the button and the flyout share one aggregate. Rebuilt as two narrow subscriptions plus auseMemo: it previously returned a fresh object from insideuseSelector, re-rendering on every dispatch while the download adapter pushes batched progress about once a second per download.useDownloadEta— samples one download's ownreceived. Neither store field can give a per-file rate:downloads.speedis the aggregate across every download, andstartTimeis dead — nothing has written it since theinit → startedflip moved into the progress reducer, which is whySpeedOMeteralready sorts onNaNthere.useDownloadFlyout— announces, dismisses itself after 5s, hands over to the pointer. Seeded at mount, so a session resuming with downloads already in flight doesn't announce them as news.The arrow moved into a shared
OverlayArrow+.nxm-overlay-arrowrule, and the notification tray now uses it. The tray's beak was a rotated square — a 90° tip, so necessarily 2:1, which could never match the tooltip's 12×8 SVG. The tray's anchor gap also went 8 → 16 (8 + arrow height, matching the tooltip's own offset), and that is what actually made the two panels' edges line up.Two bugs found on the way
Tooltipwasn't inert.disabledonly short-circuited the render;useHover,useFocus,useDismissanduseDelayGroupall still ran. The invisible tooltip claimed the delay group'scurrentId, the group closes whichever member isn't current, and that close cleared the real tooltip's pending open timeout — so the download button needed two hovers to show anything, its plain label included.disablednow reaches the interactions.ToolbarPanelButtonuses the sametooltipDisabledtrick, so this was latent there too.useDownloadEtacouldn't measure a fast cadence. It replaced its stored sample on every update before checking the interval, so a run of updates closer together than the threshold never added up to a measurable gap. It only worked at all because the real adapter throttles to ~1/s.What changes visibly
+N morefor the rest of the queue, and time remaining. It shows a single "Download starting…" line until a name and a rate exist.