Every board root keys once at its store — the hover path stops walking the filesystem
`DragLocality.isSameBoard` resolved symlinks on both URLs, which stats every path component. It ran five-plus times per `dropUpdated` and again per lane per body evaluation through `renderedCards` → `hiddenMembers` — order of 50–100 stat calls per mouse-move, and worse on iCloud-backed paths. A pickup stall sample had it on ~47 of 943 stacks. `BoardRootKey` mints that canonical spelling once, where the root is, and every locality comparison downstream is an `==` on two strings. The drag carriers hold keys rather than URLs, so re-deriving under the cursor is no longer expressible. `rootURL` keeps the user's spelling — the folder name is the display-name fallback, and canonicalizing there would visibly rename a board opened through a pin. The key follows the folder through `relocate(to:)`: a key frozen at open would collide with a new board opened at the vacated path, and two boards comparing as one is a cross-board drag silently behaving as a move. Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
@@ -720,7 +720,7 @@ struct CardFaceView: View {
|
||||
/// ▸ The trash), and the trash column's own delegate clears the file highlight rather than
|
||||
/// proposing one — so this is a second, structural statement of the same rule.
|
||||
private var isFileHovered: Bool {
|
||||
role.container == .board && drops.session.fileAttachTarget(onBoardRooted: store.rootURL) == card.id
|
||||
role.container == .board && drops.session.fileAttachTarget(onBoardRooted: store.rootKey) == card.id
|
||||
}
|
||||
|
||||
/// **Board-only** — "everything edit-shaped is disabled on trash selections … Rename"
|
||||
|
||||
Reference in New Issue
Block a user