Ariver
2026-05-19 af330f983ec38a49969283073a534eb271c3b199
Apptag/TagGroupView.swift
@@ -11,11 +11,17 @@
    var showNames: Bool = true
    var dragModeActive: Bool = false
    var onDragModeChange: ((Bool) -> Void)? = nil
    var onBubbleHover: ((AppInfo, CGRect, Bool) -> Void)? = nil
    var onEditNote: ((AppInfo, CGRect) -> Void)? = nil
    var bubbleDisabled: Bool = false
    var dragResetToken: Int = 0
    @Binding var hoveredAppItemID: String?
    var onDropApp: ((String, String, Bool) -> Void)? = nil
    /// Adaptive columns — auto-fit based on icon size and available width.
    private var columns: [GridItem] {
        [GridItem(.adaptive(minimum: iconSize + 28, maximum: iconSize + 64), spacing: 6)]
        let itemWidth = AppGridItem.stableWidth(iconSize: iconSize)
        return [GridItem(.adaptive(minimum: itemWidth, maximum: itemWidth + 36), spacing: 6)]
    }
    // Subtle separator line color — adapts to light/dark mode
@@ -52,6 +58,12 @@
                        sourceTag: group.name,
                        dragModeActive: dragModeActive,
                        onDragModeChange: onDragModeChange,
                        onBubbleHover: onBubbleHover,
                        onEditNote: onEditNote,
                        bubbleDisabled: bubbleDisabled,
                        itemID: "\(group.name)|\(app.path.path)",
                        dragResetToken: dragResetToken,
                        hoveredAppItemID: $hoveredAppItemID,
                        onSelect: { onSelectApp(app) }
                    )
                }