Ariver
2026-05-19 554dce57269e2ae24f5de9c39972cacbc0a350dc
Apptag/AppGridItem.swift
@@ -10,7 +10,7 @@
    var sourceTag: String? = nil
    var dragModeActive: Bool = false
    var onDragModeChange: ((Bool) -> Void)? = nil
    var onBubbleHover: ((AppInfo, CGRect, Bool) -> Void)? = nil
    var onBubbleHover: ((AppInfo, CGRect, AppBubbleHoverEvent) -> Void)? = nil
    var onEditNote: ((AppInfo, CGRect) -> Void)? = nil
    var bubbleDisabled: Bool = false
    var itemID: String
@@ -75,16 +75,15 @@
                interactionFrame = frame
                if bubbleDisabled || dragModeActive {
                    setHoverState(false)
                    onBubbleHover?(app, frame, false)
                    onBubbleHover?(app, frame, .exited)
                    return
                }
                if hovering {
                    setHoverState(true)
                    guard shouldShowAppBubble else { return }
                    onBubbleHover?(app, frame, hovering)
                    onBubbleHover?(app, frame, .entered(canShowBubble: shouldShowAppBubble))
                } else if isHovered {
                    setHoverState(false)
                    onBubbleHover?(app, frame, hovering)
                    onBubbleHover?(app, frame, .exited)
                } else {
                    setHoverState(false)
                }
@@ -102,19 +101,19 @@
        .onChange(of: dragModeActive) { _, active in
            if active {
                setHoverState(false)
                onBubbleHover?(app, interactionFrame, false)
                onBubbleHover?(app, interactionFrame, .exited)
            }
        }
        .onChange(of: bubbleDisabled) { _, disabled in
            if disabled {
                setHoverState(false)
                onBubbleHover?(app, interactionFrame, false)
                onBubbleHover?(app, interactionFrame, .exited)
            }
        }
        .onDisappear {
            if hoveredAppItemID == itemID {
                hoveredAppItemID = nil
                onBubbleHover?(app, interactionFrame, false)
                onBubbleHover?(app, interactionFrame, .exited)
            }
        }
    }
@@ -138,6 +137,11 @@
    }
}
enum AppBubbleHoverEvent {
    case entered(canShowBubble: Bool)
    case exited
}
private struct AppGridItemHoverTracker: NSViewRepresentable {
    let onHover: (Bool, CGRect) -> Void