Skip to content

Commit de89c2f

Browse files
committed
release: 0.5.5
1 parent 2212608 commit de89c2f

3 files changed

Lines changed: 239 additions & 30 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ All notable changes to this project are documented in this file.
44

55
## [Unreleased]
66

7+
## [0.5.5] - 2026-04-23
8+
9+
### Fixed
10+
11+
- Fixed overlay reopen not scrolling back to the top of the history when the previous session had been scrolled down. The open/reset path now deterministically resets the rendered window, selection, and scroll position regardless of how the async filter recompute races with the overlay-present signal.
12+
- Fixed keyboard arrow-nav occasionally skipping rows during active QMD result streaming by aligning `moveSelection` with the rendered snapshot and dropping viewport re-centering on passive list re-ranks.
13+
- Fixed a stale selection from the prior session surviving reopen — occasionally leaving the highlighted row off-screen with no way to reach the top via keyboard — by clearing it on the open path.
14+
- Fixed the first row being visually clipped under the section header after a reset by scrolling to an invisible top-sentinel row above the first section instead of to the first entry id.
15+
- Fixed undo-restore not centering the restored entry when the row wasn't yet in the rendered window. The centered-scroll intent is now sticky and replayed once the row becomes renderable, then cleared on selection drift / query / filter / reopen so it can't leak.
16+
- Fixed filter changes preserving a grown visible window against the new result set, which reintroduced list-jank on large histories.
17+
- Fixed preview (⌘Y) dismissal collapsing the overlay's selection and scroll by splitting the store's open/resume signals. Fresh opens still reset; resume from preview now preserves selection/scroll while still picking up any store updates (AI titles, OCR, new clips) that landed while the preview was in front.
18+
719
### Changed
820

921
- Updated GitHub Actions workflow dependencies to the latest upstream releases: `actions/checkout@v6.0.2` and `softprops/action-gh-release@v2.6.1`, removing the release job's Node 20 deprecation path.

Sources/CBManager/ClipboardStore.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ final class ClipboardStore: ObservableObject {
232232
@Published private(set) var isQMDAvailable = false
233233
@Published private(set) var canUndoDelete = false
234234
@Published private(set) var overlayPresentedToken = UUID()
235+
@Published private(set) var overlayResumedToken = UUID()
235236
@Published private(set) var lastRestoredEntryID: String?
236237
@Published private(set) var isOverlayVisible = false
237238

@@ -563,15 +564,22 @@ final class ClipboardStore: ObservableObject {
563564
if selectedFilter != .all {
564565
selectedFilter = .all
565566
}
566-
} else if isQMDAvailable {
567-
let normalizedQuery = ClipboardSearch.normalize(query)
568-
let semanticNeeded = ClipboardSearch.shouldRunSemanticQMD(normalizedQuery: normalizedQuery)
569-
if !normalizedQuery.isEmpty,
570-
(qmdKeywordIDs == nil || (semanticNeeded && qmdSemanticIDs == nil)) {
571-
scheduleQMDSearch()
567+
// Signal a fresh open — view should reset scroll and selection.
568+
overlayPresentedToken = UUID()
569+
} else {
570+
if isQMDAvailable {
571+
let normalizedQuery = ClipboardSearch.normalize(query)
572+
let semanticNeeded = ClipboardSearch.shouldRunSemanticQMD(normalizedQuery: normalizedQuery)
573+
if !normalizedQuery.isEmpty,
574+
(qmdKeywordIDs == nil || (semanticNeeded && qmdSemanticIDs == nil)) {
575+
scheduleQMDSearch()
576+
}
572577
}
578+
// Signal a resume (e.g. returning from ⌘Y preview) — view
579+
// should refocus search but keep selection and scroll where
580+
// they were.
581+
overlayResumedToken = UUID()
573582
}
574-
overlayPresentedToken = UUID()
575583
}
576584

577585
func overlayDidClose() {

0 commit comments

Comments
 (0)